none
BeforeUpdate - Datenbankänderungen selbst mit SQL durchführen?

    Frage

  • Hallo,

    in einer Datenblattansicht wird ein mit ODBC verknüpfter View von einem SQL-Server angezeigt.

    Der View enthält die Verknüpfung zweier Tabellen:

    • Person (id,Vorname,Nachname)
    • Telefon (Person_ID,Rufnummer)

    Der View fasst diese Spalten zusammen:

    ID,Vorname,Nachname,Rufnummer
    (Enthält die Tabelle Telefon keine Nummer für eine Person, bleibt das Feld leer.)

    Der Benutzer soll die Daten im View über eine per ODBC-verknüpfte Datenbblattansicht in Access ändern können. Diese Änderungen kann Access aber nicht immer selbständig durchführen.

    Beispiel:
    Der Benutzer gibt eine Telefonnummer in ein Feld ein, das vorher leer war. Dann gibt es in der Tabelle Telefon noch gar keinen Eintrag. In diesem Fall würde die automatische Aktualisierung per Access fehlschlagen.

    Ich würde dies daher gerne so lösen:

    • Der Benutzer darf die Änderungen eingeben.
    • Im Before-Update-Ereignis fange ich diese ab und führe sie selbst durch
      (Currentdb.Execute "...")
    • Damit Access danach nicht noch selbst versucht, die Daten zu ändern, setze ich Cancel auf 1.

    Das funktioniert aber leider nicht. Dadurch, dass ich Cancel auf 1 setze, kann man das bearbeitete Feld gar nicht mehr verlassen.

    So sieht mein Code aus:

    Private Sub Form_BeforeUpdate(Cancel As Integer)
        Dim sql As String
        
        sql = "UPDATE dbo_tkv_anschluss_p SET Rufnummer='" & Rufnummer & "' WHERE (Person_ID='" & id & "');"
        CurrentDb.Execute sql
        Cancel = 1
    End Sub

    Gibt es noch eine andere Möglichkeit?

    Danke

    Magnus

    Montag, 13. April 2015 05:40

Alle Antworten

  • Hallo ,

    ich würde das UPDATE und das unter Umständen erforderliche INSERT nicht in Access ausführen, sondern wie unten gezeigt in einem INSTEAD OF Trigger auf dem SQL Server.

    Vorteil: Du brauchst keinen Code in Access und sparst dir nicht nur den Fehler sondern auch die hässliche Konstruktion der SQL-Anweisung. Außerdem hast Du auf dem Server die ganze Mächtigkeit von TSQL und musst die Anweisungen nicht durch den ODBC-Provider schicken.

    Viele Grüße,

    Mario Muja

    CREATE TRIGGER [dbo].[MeinUpdateTrigger] ON [dbo].[MeinView] INSTEAD OF Update AS begin

    -- erstmal schauen, ob ein Datensatz in Telefon erstellt werden muss...

    IF NOT EXISTS (select * from telefon where Person_ID = inserted.ID)
    INSERT INTO telefon (person_id, rufnummer) VALUES (inserted.ID, inserted.Rufnummer)

    -- wenn nicht, ist es ein einfaches Update
    -- um die richtige Nummer zu aktualisieren, benutzen wir Telefon_ID
    -- (Primärschlüssel in Tabelle Telefon - gibt es in Deinem DB-Modell noch nicht)

    ELSE UPDATE telefon SET Rufnummer = inserted.Rufnummer WHERE telefon_id = inserted.telefon_id

    end

    Montag, 13. April 2015 21:42