Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Datensatzänderungen protokolliern funktioniert, aber Fehler beim duplizieren...

Begonnen von derilzemer, Januar 28, 2015, 19:24:55

⏪ vorheriges - nächstes ⏩

derilzemer

Hallo,
vor kurzem dachte ich aufgrund "erlebtem" darüber nach, Datensatzänderungen zu protokollieren. Da ich in VBA nich tfit bin, habe ich im Internet gesucht und auch eine Ausführung gefunden, welche den Ansatz von mir erfüllt. Diese habe ich an meine Umgebung angepasst und sie funktioniert auch, bis heute :-). Erst einmal sieht der Code dazu so aus:

Public Function Aenderungsprotokoll() As Boolean
    Dim xAlt As String
    Dim xNeu As String
    Dim XFeldName As String
    Dim FNAME As String, FCONTROL As String
    Dim frm As Form, ctl As Control
   
    Set frm = Screen.ActiveForm
    Set ctl = Screen.ActiveControl
    XFeldName = ctl.Name
    xNeu = Nz(ctl)
    xAlt = Nz(ctl.OldValue)
    If xNeu <> xAlt Then
        If MsgBox("Wert geändert!" & vbNewLine & "alt: " & _
                  xAlt & vbNewLine & "neu: " & xNeu & vbNewLine & _
                  "Die Änderungen wurden protokolliert", vbOKOnly) = vbOK Then
            'Änderungsprotokoll schreiben
            DBEngine(0)(0).Execute _
            "INSERT INTO tblProtokoll (Datum, User, FeldName," & _
                                      "AlterWert, NeuerWert) " & _
            "VALUES (Now(),'" & Environ("Username") & "','" & XFeldName & "','" & _
                     xAlt & "','" & xNeu & "')"
            Aenderungsprotokoll = False
          Else
            Aenderungsprotokoll = True
        End If
    End If
End Function

Selbstverständlich habe ich eine Tabelle (tblProtokoll) erstellt und weiterhin musste ich dann in den Feldern des Datenformulares, welche ich protokollieren will ein Ereignis vor und nach Aktualisierung machen

Private Sub Titel_BeforeUpdate(Cancel As Integer)
    Cancel = Aenderungsprotokoll
End Sub
Private Sub Titel_AfterUpdate()
    DoCmd.RunCommand acCmdSaveRecord
End Sub

Wie erwähnt, geht auch. Heute habe ich jedoch einen Datensatz dupliziert, und dann hat das Teil gespuckt: Der Debugger hat mich auf Set ctl = Screen.ActiveControl hingewiesen. Was muss man tun bzw. ergänzen, damit das protokollieren nur bei Änderungen und nicht bei Neu oder duplizierten Datensätzen stattfindet? Geht das überhaupt zu kombinieren?
Danke vorab und Gruß
Andreas
Grüße und Dank im voraus
Andreas

MaggieMay

Hi,
ZitatDer Debugger hat mich aufSet ctl = Screen.ActiveControl
hingewiesen.
und was genau hat er dazu gesagt?!

Welchen Grund gibt es, neu angelegte bzw. kopierte Datensätze nicht zu protokollieren? Nur so kannst du doch die komplette Historie nachvollziehen.
Freundliche Grüße
MaggieMay

derilzemer

Hi Maggie,
Laufzeitfehler 2474:
Für den von Ihnen eingegebenen Ausdruck ist es erforderlich, dass sich das Steuerelement im aktiven Fenster befindet.
Wenn ich dann auf Debuggen gehe, dann springt er zur gelb markierten Zeile Set ctl = Screen.ActiveControl.

Nun ja, es reicht mir ganz einfach nur die Änderungen zu protokollieren. Ich hatte diese Woche zufällig festgestellt, dass ich in einer Optionsgruppe etwas ungewollt verändert hatte, keine kritische Sache, aber dass ich es gar nicht gemerkt habe ist das eher ärgerliche daran. Und wenn ich es mal verstellt haben sollte, dann kann ich eben im Log nachschauen. Ich will auch nicht alle Felder überwachen weil zuviel aus meiner Sicht.

Gruß Andreas
Grüße und Dank im voraus
Andreas

MaggieMay

Hi,

kann es sein, dass du ungewollt in den Unterbrechungsmodus geraten bist? Es kommt schon mal vor, dass Haltepunkte die man zum Testen setzt, nicht richtig entfernt werden. Und wenn du erstmal im Unterbrechungsmodus bist, kann das Screen-Objekt nicht mehr verwendet werden, bspw. weil es im VBA-Editor kein ActiveControl gibt.
Das wäre eine mögliche Erklärung.

Ansonsten müsste man mehr vom Kontext wissen bzw. das mal selbst austesten können, um zu sehen wie das alles zusammenhängt.
Freundliche Grüße
MaggieMay

derilzemer

Hi,
nein. Ich rufe den zu duplizierenden Datensatz auf, klick auf den entsprechenden Duplicate Button und dann kommen auch gleich die Fehlermeldungen. Ehrlich gesagt, weiss ich auch nicht wirklich, was du mit dem Unterbrechungsmodus meinst.
Ich habe in dem Script keinen solchen Modus gesetzt. Ich lass das mal vorerst sein. Ich habe dazu den Fehler gemacht im Forum zu erwähnen, dass ich im WWW ein Script gefunden habe. Das gefällt den meisten auch nicht wirklich, was ich verstehe. Die Frage ob man das Rad immer neu erfinden muss stellt sich hier nicht. Ergo lass ich es jetzt erst mal. Ich suche hier im Forum noch einmal nach Audit Trail, eventuell finde ich was, dann kann ich den "Entwickler" ja persönlich fargen :)

Gruß und Danke
Andreas
Grüße und Dank im voraus
Andreas

database

Hallo Andreas,

Zitat...weiss ich auch nicht wirklich, was du mit dem Unterbrechungsmodus meinst...

Wenn du in einer deiner Prozeduren einen Haltepunkt gesetzt hast, dann bleibt die Codeausführung dort stehen.
Du kannst dann entweder mit F8 (Schrittmodus) jeden einzelnen Befehl nach Tastendruck ausführen oder mit F5 die die weitere Ausführung des Codes veranlassen.
ZitatIch habe in dem Script keinen solchen Modus gesetzt
da setzt du keinen Modus mit mehreren Auswahlen oder Arbeitsschritten - ein einziger Mausklick auf die graue Leiste links neben dem Code setzt den Haltepunkt ... roter Punkt und die Hinterlegung der Codezeile mit einem roten Balken.
Das kann auch unabsichtlich passiert sein.

Wenn du dann die DB schließt ohne den Haltepunkt zu entfernen, bleibt die gesetzte Stelle gespeichert, den Haltepunkt siehst du aber nach dem Neustart der DB nicht mehr.
Im VBE, Menüpunkt 'Debuggen' kannst du über Auswahl von 'Alle Haltepunkte löschen' oder mittels Tastenkombination Strg+Shift+F9 die unsichtbaren Haltepunkte aus deinem Code entfernen.

Keine große Geschichte wie du siehst - und es kann dabei NICHTS passieren!

HTH

derilzemer

Hallo,
ich habe den Audit noch einmal aktiviert, im Debugger wie von dir beschrieben "Alle Haltepunkte löschen" ausgeführt (es gab keine Meldung, dass er welche gelöscht hat). Ich habe dann das Feld Kartenzahl mit dem Audit belegt, den Wert verändert und er portokolliert sauber in die tblProtokoll. Okay, ich müsste noch die Datensatz-ID mit aufnehmen, da muss ich aber noch schauen, wie man das anstellt. Aber beim duplizieren, und nur da bringt er wieder den Fehler, welchen ich am 29.01. hier im Thread gepostet habe.
Laufzeitfehler 2474:
Für den von Ihnen eingegebenen Ausdruck ist es erforderlich, dass sich das Steuerelement im aktiven Fenster befindet.
und der Sprung in den Code zur Zeile Set ctl = Screen.ActiveControl.
Natürlich hätte ich gerne diese Funktion, aber hier bin ich natürlich schon am Ende was meine Möglichkeiten angeht, sprich wie ich den Fehler analysieren kann. Eventuell habt ihr diese Idee und könnt mich da hin lenken.

Gruß Andreas
Grüße und Dank im voraus
Andreas