webentwicklung-frage-antwort-db.com.de

Verwendung von VBA zum Hinzufügen eines neuen Datensatzes in MS Access

Ich verwende gebundene Formulare für den Benutzer, um Informationen zu neuen oder bestehenden Kunden zu aktualisieren. Im Moment verwende ich ein Makro zum Hinzufügen eines neuen Datensatzes für die Schaltfläche zum Senden (da ich nicht sicher bin, wie ich einen neuen Datensatz über VBA hinzufügen oder speichern kann). 

Ich habe ein Ereignis vor dem Update (mithilfe von VBA) hinzugefügt, damit der Benutzer bestätigen kann, dass er die Änderungen speichern möchte, bevor er das Formular beendet. Aus irgendeinem Grund wird die Schaltfläche zum Hinzufügen von Datensätzen überschrieben. Jetzt können Benutzer keinen neuen Datensatz hinzufügen, bis die Formulare beendet sind.

Wie kann ich VBA verwenden, um neue Kundeninformationen zur richtigen Tabelle hinzuzufügen? Ist dies etwas, das stattdessen mit Makros gemacht werden sollte?

Formular vor dem Aktualisierungscode:

Private Sub Form_BeforeUpdate(Cancel As Integer) 
Dim strmsg As String 
strmsg = "Data has been changed." 
strmsg = strmsg & " Save this record?" 
If MsgBox(strmsg, vbYesNo, "") = vbNo Then 
    DoCmd.RunCommand acCmdUndo 
Else 
End If 
End Sub

Datensatz hinzufügen:

Private Sub btnAddRecord_Click() 
Dim tblCustomers As DAO.Recordset 

Set tblCustomers = CurrentDb.OpenRecordset("SELECT * FROM [tblCustomers]") 
tblCustomers.AddNew 
tblCustomers![Customer_ID] = Me.txtCustomerID.Value 
tblCustomers![CustomerName] = Me.txtCustomerName.Value 
tblCustomers![CustomerAddressLine1] = Me.txtCustomerAddressLine1.Value 
tblCustomers![City] = Me.txtCity.Value 
tblCustomers![Zip] = Me.txtZip.Value 
tblCustomers.Update 
tblCustomers.Close 
Set tblCustomers = Nothing 
DoCmd.Close 
End Sub
7
New2This

Um einen Datensatz mit VBA zu senden, erstellen Sie ein On Click-Ereignis für die Schaltfläche, und führen Sie in der Sub den folgenden Befehl aus:

Private Sub submitButton_Click()

'All the code to validate user input. Prompt user to make sure they want to submit form, etc.

DoCmd.RunSQL "INSERT INTO tblCustomers (txtCustomerID.Value, txtCustomerName.Value, txtCustomerAddressLine1.Value, txtCity.Value, txtZip.Value)"

End Sub

In diesem Sub können Sie den gesamten Code hinzufügen, den Sie für die vom Benutzer eingegebenen Werte überprüfen möchten, und festlegen, ob Sie den Datensatz senden möchten. Es gibt eine Menge Kontrolle über VBA, um Ihre Formulare zu übermitteln, sodass Sie kein BeforeUpdate-Ereignis benötigen.

Verwenden Sie auch KEINE gebundenen Formulare mit dieser Methode. Ich weiß nicht, was die Auswirkungen sind, aber ich würde es nicht versuchen. Der Zugriff ist großartig für den Start, aber da Sie komplexere Aufgaben ausführen möchten, ist es einfacher, VBA zu verwenden.

7
Michael

Es scheint seltsam, dass Sie vor dem Update ein Ereignis vor dem Update erstellen, um eine Eingabeaufforderung zu erstellen. Vielleicht sollten Sie stattdessen das Ereignis "close" versuchen. Wenn Sie vba verwenden möchten, um einen neuen Datensatz aus dem Formular hinzuzufügen, können Sie Ihre Aussage vereinfachen. Beim Entwerfen eines eigenen Formulars für meine Access-Datenbank bin ich auf eine ähnliche Situation gestoßen. Dieser Code ist getestet und funktioniert:

Dim sVIN, sMake, sModel, sColor, sType As String
Dim intYear As Integer

Me.txtVIN.SetFocus: sVIN = Me.txtVIN.Value
Me.txtMake.SetFocus: sMake = Me.txtMake.Value
Me.txtModel.SetFocus: sModel = Me.txtModel.Value
Me.txtColor.SetFocus: sColor = Me.txtColor.Value
Me.comboType.SetFocus: sType = Me.comboType.SelText
Me.txtVehicleYear.SetFocus: intYear = Me.txtVehicleYear.Value

DoCmd.RunSQL "INSERT INTO Vehicles (VIN, Make, Model, VehicleYear, Color, Type) VALUES ('" & sVIN & "', '" & sMake & "', '" & sModel & "', " & intYear & ", '" & sColor & "', '" & sType & "')"

Wenn Sie nur eine Datenbank in Ihrem Projekt verwenden und beim Start eine Verbindung herstellen, können Sie manchmal einfache DoCmd.RunSQL-Anweisungen wie diese ausführen. Sie können die Syntax hier verwenden und sie an Ihr eigenes Projekt anpassen. Ich selbst habe die Grundsyntax von W3-Schulen bekommen. Gute Seite für das Schreiben von SQL-Abfragen. Es sei auch darauf hingewiesen, dass Validierungsprüfungen hier nicht enthalten sind. Sie sollten sicherstellen, dass es in den Formularüberprüfungsregeln oder im VBA-Code enthalten ist. Eine weitere Sache ... in Ihrem SQL scheint es, als würden Sie versuchen, der ID-Spalte einen Wert aus einem Textfeldeintrag zuzuweisen. Wenn ID eine automatische Nummernspalte ist, tun Sie dies nicht. ID-Spalten werden normalerweise automatisch eine Nummer zugewiesen, sodass Sie keinen Einfügewert dafür angeben müssen (oder möchten).

0
technoman23

Als Randnotiz: Mir ist aufgefallen, dass das Hinzufügen von Datensätzen über die VBA-Funktionalität (wie in Ihrem Code "Add Record Button") 400-mal schneller ist als die Verwendung von DoCmd.Run SQL "INSERT INTO ...": ~ 55.000 Datensätze/s im Vergleich zu 140 Datensätze/s für eine Tabelle mit 5 Spalten (ID + 4 kurze Zeichenfolgen).

Dies hat keine praktische Bedeutung in Bezug auf ein Formular, bei dem Daten manuell eingegeben werden. Wenn das Formular jedoch mehr Datensätze generiert, spart dies viel Zeit.

0
Krzychu C