2016-12-16 3 views
-1

In der Hoffnung, dass jemand hier helfen kann, bin ich ziemlich neu in SQL, aber immer noch die erfahrenste Person im Büro, so dass dieser Job zu mir gefallen ist.Sequenzielle Nummer in Access-Formular basierend auf Feldauswahl

Ich versuche ein Formular zu erstellen, das Kundenaufträge in die Produktionsplanung einfügt. Das Formular ermöglicht es Benutzern, einen Computer aus der Maschinenliste auszuwählen. Ich muss jedoch die letzte Jobnummer für diesen bestimmten Computer suchen und die nächste fortlaufende Nummer in einem Textfeld anzeigen. und da stecke ich fest. Das Ziel besteht darin, dass, wenn der Produktionsbenutzer der Datenbank einen Auftrag hinzufügt, durch Auswahl seines Rechners automatisch die nächste verfügbare Auftragsnummer ausgefüllt wird. Die eingegebenen Informationen werden in einer Hauptterminierungstabelle gespeichert.

Ich habe eine Abfrage erstellt, die die gesamte Liste der Maschinen und Job-Kombinationen zieht, da mein Ziel war, ein Makro zu erstellen, das von dieser Liste suchen konnte, aber bis jetzt habe ich keine Traktion gewonnen. Jede Hilfe/Beratung wäre willkommen!

+1

Willkommen bei SO, aber ich kann Ihnen sagen, dass Sie nicht den Abschnitt "Wie stelle ich eine Frage?" Auf dieser Website gelesen haben, bevor Sie Ihren ersten Beitrag verfassen.Sie haben sich auch nicht die Mühe gemacht, die 2-minütige Site-Tour zu unternehmen. Bitte teilen Sie Ihre relevanten Code-Schnipsel zur Lösung so viel wie Sie können. Schlagen Sie einen Blick auf http://stackoverflow.com/help/how-to-ask, bevor Sie erneut buchen. –

+0

Das ist möglich, aber wie können wir Ihnen helfen? Wir kennen Ihre Tabellenstruktur, den Datentyp usw. nicht. Sie können einen Screenshot Ihrer Formular- und Tabellendaten (Beispieldaten) erstellen. – harun24hr

Antwort

0

Wie ich verstehe, müssen Sie einen Vorschlagswert für die Jobnummer hinzufügen, wenn Sie einen neuen Datensatz zur Tabelle hinzufügen. Wenn ja, können Sie beispielsweise die Funktion DMax verwenden. Hier ist Beispiel für VBA-Code für diese, kann es aufgerufen werden, wenn Sie neue Datensatz hinzufügen:

Me.MyTextBox = DMax("JobField", "JobsTable") + 1 

sollte ich die JobField, die enthält Auftragsnummern hat Number Datentyp. Sie können diese Funktion auch in jeder Abfrage als berechnetes Feld verwenden.

1

Willkommen bei SO.

Mein Vorschlag wäre, eine Tabelle zu erstellen, um die Sequenznummern zu halten. Für dieses Beispiel nennen wir es ProdSeq, was bedeutet Produktion Sequenzen. Als Teil dieser Tabellendefinition würde ich Datenmakros (Access 2010 und höher) verwenden, um die Sequenzen zuzuweisen, wenn Datensätze hinzugefügt werden. Ich würde einen eindeutigen Index verwenden, um sicherzustellen, dass keine Duplikate erstellt werden.

Tabelle: ProdSeq (Felddefinitionen)

  • MachineID (Number - Long) - Referenzen ID Maschine in Maschinen Tabelle
  • ProdSeq (Number - Long) - inkrementiert für jede Maschine
  • OrderID (Nummer - Lang) - Referenzen Bestellnummer in Bestellungen Tabelle

Indizes
Unter dem Entwurf Band Registerkarte, wenn die ProdSeq Tabelle entwerfen, klicken Sie auf die Indizes Taste.

  1. einen Index erstellen genannt UniqueKey
    • Zeile 1: Index Name = UniqueKey, Feldname = MachineID
    • Row 2: Index Name = Leave Blank, Feldname = ProdSequence
  2. Klicken Sie auf Zeile 1, Spalte 1, und legen Sie die folgenden Indexeigenschaften fest:
    • Primary = Yes
    • Unique = Yes
    • Ignore Nulls = No

Daten Macros
Unter dem Entwurf Band Registerkarte, wenn die ProdSeq Tabelle entwerfen, klicken Sie auf die Erstellen von Daten Makros Schaltfläche und dann die vor der Änderung Schaltfläche. Geben Sie folgende Daten Makro: (Pastebin link)

Erstellen Sie die Vor Ändern Daten Makro- und setzen Sie ihn wie folgt:

If [IsInsert] Then 
    SetLocalVar 
      Name LatestProdSequence 
    Expression = 0 

    Look Up A Record In ProdSeq 
     Where Condition =[ProdSeqLookup].[MachineID]=[ProdSeq].[MachineID] And 
          [ProdSeqLookup].[LatestSeq] = True 
        Alias ProdSeqLookup 
     SetLocalVar 
       Name LatestProdSequence 
      Expression =[ProdSeqLookup].[ProdSequence] 
    SetField 
      Name ProdSeq.ProdSequence 
      Value = [LatestProdSequence]+1 
    SetField 
      Name ProdSeq.LatestSeq 
      Value = True 
End If 

Achten Sie besonders auf die Tatsache, dass nur eine SetLocalVar innerhalb der LookUpRecord Klausel ist. Verwenden Sie die Schaltfläche zum Minimieren/Erweitern (-/+) in LookUpRecord, um sich zu vergewissern.

Erstellen Sie die Nach Einfügen Daten Makro und legen Sie es wie folgt: (Pastebin Link)

For Each Record In ProdSeq 
    Where Condition = [ProdSeqFlagFix].[MachineID]=[ProdSeq].[MachineID] And 
         [ProdSeqFlagFix].[LatestSeq]=True And 
         [ProdSeqFlagFix].[ProdSequence]<>[ProdSeq].[ProdSequence] 
    EditRecord 
     SetField 
       Name ProdSeqFlagFix.LatestSeq 
       Value = False 
    End EditRecord 

testen Sie es aus
Sie dies, um in eine leere Datenbank erstellen können, um zu sehen, was ich bin sprechen über. Sie sollten in der Lage sein, es an Ihre spezifische Situation anzupassen.

Formular
auf dem Formular, wenn der Benutzer eine Maschine und Ordnung auswählt, können Sie VBA verwenden, um für einen vorhandenen Datensatz in ProdSeq zu überprüfen, und die ID holen. Wenn kein Datensatz vorhanden ist, können Sie einen erstellen und dann die ProdSeq-ID an das Formular zurückgeben.

Hinweis: Abhängig von Ihrem Entwurf müssen Sie möglicherweise auch ein Datenmakro in der Tabelle Schedules erstellen. Angenommen, jemand erstellt einen Zeitplan mit einer bestimmten Maschine und Bestellung und reserviert einen Produktions-Slot. Nehmen wir nun an, sie ändern die Order ID. Wir haben einen Produktions-Slot, der fälschlicherweise reserviert wurde. Wenn dies zutrifft, benötigen Sie außerdem ein AfterUpdate-Datenmakro in der Terminplanungstabelle, das prüft, ob [alt] .OrderID <> [Zeitplan] .OrderID - und falls sie sich unterscheiden, den Produktions-Slot aus dem Zeitplan entfernt Tabelle und die Prod Sequence-Tabelle.

Verwandte Themen