Schnellerfassung 1:n verbundener Daten
Montag 15. März 2010 von Andreas Vogt
Stellt euch vor, ihr habt eine ausgedrukte Liste von Daten vor euch liegen, und sollt diese erfassen. Das ist schon Arbeit genug, aber richtig heftig wird es erst, wenn die Daten in verschiedene Tabellen gehören. Das bedeutet, zuerst die Daten in die Stammdatentabelle eintragen, erstellter AutoWert-ID aufschreiben, und danach in die Detaildatentabelle gehen und die restlichen Daten mit der aufgeschriebenen Nummer eintragen. Eigentlich eine Arbeit für Praktikanten?! Aber wie hoch ist die Gefahr von Falscheingabe? Stimmt der übertragene ID nicht überein, sind die Detaildaten nicht mehr auffindbar. Die Lösung ist, wir lassen das von einem Programm erledigen.
Also nur noch 1 Formular mit allen Daten, und per VBA-Code werden die Inhalte in die richtigen Tabellen geschrieben. Das will ich euch mal an einem einfachen Beispiel zeigen. Gegeben ist eine Bücherliste mit Buchtitel, Vor- und Nachname des Autors.
Wer haben also 3 Textfelder im Formular die Vorname, Nachname und Buchtitel heißen. Außerdem brauchen wir eine Logik die es verhindert dass ein Autor mit selben Namen doppelt angelegt wird, und eine Logik die verhindert dass ein Buch mehrmals angelegt wird. Kommen wir mal zum Code. Dieser ist zweckmäßiger Weise in eine Prozedur eingebunden, welche mit einer Befehlsschaltfläche im Formular aufgerufen wird. Wir haben 2 Tabellen, TabelelBuch und TabelleAutor. Die Feldbezeichner sind aus dem Code zu entnehmen, die Schlüsselfelder beider Tabellen heißen jeweils “id”.
Eine kleine Besonderheit ist die Art wir der zu übertragene ID ausgelesen wird, dies geschieht mit folgender Abfrage: SELECT @@IDENTITY AS ID;
@@IDENTITY ist ene Systemfunktion, die den zuletzt eingefügten Identitätswert zurückgibt. Wenn der Einfügevorgang keinen Datensatz eingefügt hat, gibt die Funktion den Wert Null zurück.
Sub Speichern()
Dim autorid As Long
Dim db As Database
Dim rs As Recordset
Set db = CurrentDb
Set rs = db.OpenRecordset("Select id From TabelleAutor Where Vorname = '" & Me!Vorname & "' And Nachname = '" & Me!Nachname & "'", dbOpenDynaset)
If rs.EOF Then
db.Execute "Insert into TabelleAutor (Vorname, Nachname) Values ('" & Me!Vorname & "', '" & Me!Nachname & "')"
Set rs = db.OpenRecordset("SELECT @@IDENTITY AS ID;", dbOpenDynaset)
autorid = rs!ID
Else
Set rs = db.OpenRecordset("Select id From TabelleAutor Where Vorname = '" & Me!Vorname & "' And Nachname = '" & Me!Nachname & "'", dbOpenDynaset)
autorid = rs!ID
End If
Set rs = db.OpenRecordset("Select id From TabelleBuch Where Titel= '" & Me!Titel & "'", dbOpenDynaset)
If rs.EOF Then
db.Execute "Insert into TabelleBuch (Titel, Autorid) Values ('" & Me!Titel & "', " & autorid & ")"
MsgBox "Daten gespeichert"
Else
MsgBox "Buch schon vorhanden!"
End If
rs.Close
Set rs = Nothing
Set db = Nothing
End Sub
Zuerst wird geprüft ob der Autor schon existiert. Falls nicht werden die Autor-Daten in die Tabelle eingefügt und den automatisch erzeugten ID-Wert ausgelesen. Falls bereits vorhanden wird lediglich der ID-Wert des Autors geholt. Der ID-Wert wird in beiden Fällen in der Variable autorid zwischengespeichert.
Danach wird geprüft ob das Buch schon vorhanden ist, falls nicht, wird das Buch gespeichert und eine Erfolgsmeldung ausgegeben, bzw. im anderen Falle die Meldung ausgegeben, dass das Buch schon vorhanden ist. Am Schluss noch wie üblich Aufräumen, Recordset schließen und Objekte zurücksetzen.
Wie immer fehlt eine zusätzliche Fehlerbehandlung, die ihr im Betrieb unbedingt einbauen solltet. Das Beispiel kann man auch auf mehrere 1:n verbundener Tabellen anwenden, man muss dann sorgfältig die Daten trennen was wohin gehört und dann mehrmals mit @@IDENTITY den gespeicherten ID-Wert holen.
AV 2010
Kategorie: Formulardesign, VBA Code | Keine Kommentare »



