2017-11-08 3 views
0

Ich verfüge über ein Formular zum Nachschlagen von Nachrichten, das die Informationen eines einzelnen Datensatzes anzeigt. Es gibt ein ungebundenes Kombinationsfeld in dem Datensatz, den der Benutzer verwendet, um die Elementnummer einzugeben und direkt über DoCmd.SearchForRecord zu diesem Datensatz zu gehen. Dieser Teil funktioniert gut.Zugriff Ungebundene Combobox zum Suchen und Hinzufügen von Datensätzen verwenden

Was ich auch tun möchte, ist, dass die ungebundeneKombobox in der Lage ist, neue Elemente zur Tabelle hinzuzufügen. Ich habe den NotInList jetzt auf diesen Satz:

If MsgBox("Create new inventory item " & NewData & "?", _ 
    vbQuestion + vbYesNo) = vbNo Then 
    Me.PartNumberList.Undo 
    Response = acDataErrContinue 
    Exit Sub 
Else 
    CurrentDb.Execute "INSERT INTO Inventory (PartNumber) VALUES ('" & NewData & "');" 
    Response = acDataErrAdded 
End If 

die Tabelle ist die neuen Daten empfängt, aber jetzt brauche ich die Form, bevor das Formular erneut abfragen kann die Daten finden. Wenn ich unmittelbar nach diesem Code eine "Me.Requery" -Funktion hinzufüge, denkt das Formular, dass ich versuche, dasselbe Element in das Formular einzugeben, es hat es jedoch immer noch nicht in der Tabelle gefunden, und es wird erneut gefragt, ob ich dieses Element hinzufügen möchte. Wenn ich versuche, die Combobox zuerst erneut zu fragen, sagt es mir, dass ich die Daten zuerst speichern muss. Wenn Me.Dirty hinzugefügt wird, dann wird Me.Dirty = False direkt vor dem Requery nicht behoben.

Also nach einigem Suchen fand ich, dass ich versuchen sollte, zum ersten Datensatz in der Combobox vor einer Anfrage zu bewegen. Das funktioniert, außer jetzt bekomme ich einen Hinweis "Der eingegebene Wert ist für dieses Feld nicht gültig." Ich drücke OK und dann wird alles abgefragt und ich kann jetzt manuell zu meiner neuen Teilenummer navigieren. Aber ich kann nicht genau herausfinden, was diese Nachricht wirft. On Error Resume Next wird diese Benachrichtigung nicht umgehen. Wenn ich den Code durchtrete, scheint die Benachrichtigung nach NotInList zu erfolgen und überspringt alle anderen Ereignisse. Ich werde mein BeforeUpdate oder AfterUpdate nicht auslösen.

Vielleicht gehe ich nur um meine Artikel Lookup alles falsch. Vielleicht sollte der Benutzer Elemente mit einem anderen Formular hinzufügen. Es wäre einfach praktisch, alles in einer einzigen Form zu halten. Oh, vielleicht ist es erwähnenswert, dass dieses Formular als Dialog im Add-Modus geöffnet wird. Aber die Fehler bleiben gleich, auch wenn ich das Formular selbst mit Dateneingabe aus öffne.

Antwort

0

Anstatt das Formular erneut abzufragen, nachdem Sie die Zeile erfolgreich zur Tabelle hinzugefügt haben, legen Sie möglicherweise stattdessen die Datensatzquelle des Formulars programmatisch fest? Stellen Sie daher sicher, dass das Formular in der Entwurfsansicht keine Recordsource enthält, und speichern Sie das Formular. Öffnen Sie das Dialogfeld, wo erforderlich, und stellen Sie sicher, dass die ComboBox über eine RecordSource verfügt. Der Benutzer gibt einen Wert ein, der nicht in der Liste enthalten ist, Sie verwenden das NotInList-Ereignis, um ihn der Datenbank hinzuzufügen, speichern den Wert, den der Benutzer in eine Variable eingegeben hat, fragen nur Ihre ComboBox erneut, setzen die Combobox auf die Variable, damit der neue Eintrag ausgewählt wird und dann würden sie den Code verwenden:

Me.RecordSource = "SELECT * FROM Inventory WHERE PartNumber= " & Me!YourComboboxValue 

ODER

Me.RecordSource = "SELECT * FROM Inventory WHERE PartNumber= '" & Me!YourComboboxValue & "'" 

Wenn "Part" es ein String-Wert ist.

Dies sollte viel schneller als DoCmd.SearchForRecord sein. Wenn Sie das Formular direkt öffnen, ziehen Sie Zeilen in die Form, die nie benötigt wird.

Nachdem Sie die Combobox erneut abgefragt haben, wird der neue Wert in der Liste angezeigt, aber nicht ausgewählt. Das kann für deine Situation in Ordnung sein. Wenn Sie die Teilenummer in einer Variablen speichern zuerst, können Sie etwas tun:

Dim sPartNumber as String 
sPartNumber = NewData 
<ADD YOUR DATA TO THE TABLE> 
Me!ComboBox.Requery 
Me.RecordSource = "SELECT * FROM Inventory WHERE PartNumber = '" & sPartNumber & "'" 
Me!Combobox = sPartNumber (Optional) 

-Code kann nicht perfekt sein, wie es aus dem Gedächtnis zu tun. :-)

Lass es mich wissen, und viel Glück!

+0

Vielen Dank! Das machte alles lächerlich einfach, ich versuchte viel zu schwer, es vorher zu überspielen.Die Combobox-Abfrage ist nicht notwendig, da (wie ich es verstehe) acDataErrAdded die Combobox requery automatisch nach dem NotInList-Ereignis erstellt und die Combobox als neu hinzugefügte Daten belässt. Dann übernimmt mein AfterUpdate-Code und ändert die Recordsource in den neu hinzugefügten Datensatz. –

+0

Kühl. Ich habe nie das NotInList-Ereignis verwendet und nicht bemerkt, dass es das Requery-Ereignis intern behandelt hat. Hut ab ins Access Team, um darüber nachzudenken! Viel Glück für Sie. – DanielG

Verwandte Themen