Schnellerfassung 1:n verbundener Daten

By , 15. März 2010

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

Leave a Reply

You must be logged in to post a comment.

OfficeFolders theme by Themocracy