Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

VBA - Änderungshistorie

Begonnen von AMB, April 05, 2017, 12:53:26

⏪ vorheriges - nächstes ⏩

AMB

Hallo Zusammen!

Ich habe im Netz ein Code für eine Änderungshistorie gefunden.
Darin gibt es die Variable, die den Tabellennamen speichert (rstSource = Me.RecordSource).
Der Tabellenname ist die Datensatzquelle. Die Datensatzquelle kann aber auch ein SQL-String sein, daher würde ich lieber auf die Beschriftung verweisen.
Kann mir jemand sagen, wie ich RecordSource ersetzen muss?

Gruß
Michael



Beaker s.a.

Hallo Michael,
ZitatDie Datensatzquelle kann aber auch ein SQL-String sein, daher würde ich lieber auf die Beschriftung verweisen.
Welche Beschriftung? Damit kann doch dann die Variable nichts anfangen,
die wahrscheinlich auch einen SQL-String verarbeiten kann. Würde ich aus
der Benamsung jedenfalls schliessen; - kenne allerdings den Code ja nicht.
gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

AMB

Hallo Ekkehard,

Die Variable fragt die Datensatzquelle der Tabelle ab.
Ich würde jedoch gerne die Beschriftung der Tabelle (oder den Namen der Tabelle) abfragen.

Gruß
Michael

Lachtaube

Eine Tabelle kennt von Hause aus keine Eigenschaft Beschriftung.

PS: Und wenn wir hier über eine Fundsache im Internet sprechen, lasse uns bitte den Fundort wissen, damit Geminsamkeiten bei der Beurteilung der Ausgangssituation herstellt werden können.
Grüße von der (⌒▽⌒)

Beaker s.a.

Hallo Michael,
Zitat(oder den Namen der Tabelle) abfragen.
Wenn "Me.RecordSource" eine Tabelle ist, wird genau der übergeben.
Wenn's ein SQL-String ist, wird eben der übergeben.
Beschriftung s. #3
Der Sinn wird auch nicht klar. Ohne den Code gesehen zu haben (s. auch #3)
vermute ich, dass es der Funktion, die mit "rstSource" arbeitet, ziemlich egal
sein dürfte was da ankommt, solange damit ein Recordset geöffnet werden kann.
Wenn "rstSource" bereits eine Referenz auf ein RS ist, müsste die Anweisung
rstSource = Me.RecordSource
eh so lauten
Set rstSource = Me.RecordSource

gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

AMB

Hallo,

hier mal der Code:

Dim Primaerschluesselfeld As String
    Dim db As DAO.Database
    Dim rst As DAO.Recordset
    Dim ctl As Control
    Dim ctlType As Integer
    Dim ctlSource As String
    Dim rstSource As String
    Dim AlterWert As String
    Dim NeuerWert As String
    Dim Aktion As String
    If Me.NewRecord Then
        Aktion = "Neuanlage"
    Else
        Aktion = "Änderung"
    End If
    Primaerschluesselfeld = "Lieferanten-Nr"
    rstSource = Me.RecordSource
    Set db = CurrentDb
    Set rst = db.OpenRecordset("tblAenderungen", dbOpenDynaset)
    For Each ctl In Me.Controls
        ctlType = ctl.ControlType
        Select Case ctlType
            Case acCheckBox, acComboBox, acListBox, acTextBox, acOptionGroup
                ctlSource = ctl.ControlSource
                If Not IsNull(ctlSource) And Not ctlSource = Primaerschluesselfeld Then
                    AlterWert = Nz(ctl.OldValue)
                    NeuerWert = Nz(ctl.Value)
                    If Not (AlterWert = NeuerWert) Then
                        rst.AddNew
                        rst!Aktion = Aktion
                        rst!Tabellenname = rstSource
                        rst!Feldname = ctlSource
                        rst!Primaerschluessel = Me(Primaerschluesselfeld)
                        rst!Datum = Date
                        rst!Uhrzeit = Time
                        rst!Benutzer = CurrentUser
                        rst!AlterWert = AlterWert
                        rst!NeuerWert = NeuerWert
                        rst.Update
                    End If
                End If
        End Select
    Next ctl

Vielleicht hilft das!?
Wenn die Datensatzquelle des geänderten Formulars eine reine Abfrage (z.B. qryLieferanten) ist, dann ist alles super.
Bei mir ist die Datensatzquelle jedoch ein SQL-String.

Gruß
Michael



markusxy

@QMB,
du könntest ja eine gespeicherte Abfrage verwenden.
Was mich aber viel mehr interessiert:
Wozu werden die aufgezeichneten Daten schlussendlich verwendet?
LG Markus

AMB

@markus888
Ja, ich könnte gespeicherte Abfragen erstellen. Das wären aber einige und somit viel Arbeit.

Wozu verwendet? Ich möchte wissen, wer was genau geändert hat.

Gruß
Michael




DF6GL

Hallo,

extrahiere halt den Tabellennamen aus dem SQL-String:

Dim strtbl As String

If InStr(Me.RecordSource, "Select") Then
  strtbl = Me.RecordSource
  strtbl = Mid(strtbl, InStr(strtbl, "from") + 5)
  strtbl = Split(Replace(strtbl, ";", ""), " ")(0)
Else
  strtbl = Me.RecordSource
End If





PhilS

 rst!Tabellenname = Me.Recordset.Fields(ctlSource).SourceTable
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

Beaker s.a.

ZitatVielleicht hilft das!?
Hat es, wie du siehst.
Ich würde Phils Vorschlag folgen.
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

AMB


AMB

Da war ich wohl zu schnell!

Die Testversion (lokal) funktionierte einwandfrei. Dann habe ich die Änderungstabelle auf den Server gezogen und mit Access verknüpft. Jetzt bekomme ich eine Fehlermeldung (Laufzeitfehler 3622).
Mein Wissen ist dafür zu beschränkt. Bitte um Hilfe!

Gruß
Michael


PhilS

Zitat von: QMB am April 06, 2017, 08:33:10Die Testversion (lokal) funktionierte einwandfrei.
Es ist angeraten Test-/Entwicklungsumgebungen möglichst technisch identisch zu der Produktivumgebung aufzubauen, sonst kommt es immer wieder zu unerwarteten Fehlern, die erst dort auffallen (produktiv!), wo sie am meisten stören.
Zitat von: QMB am April 06, 2017, 08:33:10Dann habe ich die Änderungstabelle auf den Server gezogen und mit Access verknüpft. Jetzt bekomme ich eine Fehlermeldung (Laufzeitfehler 3622).
Die Tabelle liegt auf einem SQL-Server? - Das wäre eine wichtige Information, die du deutlicher hättest erwähnen sollen.

Wenn du das Recordset für die Tabelle tblAenderungen öffnest, musst du die dbSeeChanges-Option angeben. Dies sagt aber auch der Text der Fehlermeldung, den du unterschlagen hast, schon sehr klar aus.
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

AMB

Hallo!

ZitatDie Tabelle liegt auf einem SQL-Server? - Das wäre eine wichtige Information, die du deutlicher hättest erwähnen sollen.
Ich wusste nicht, dass das von Bedeutung ist. Wieder etwas gelernt!  ;)

Danke, jetzt funktioniert es!

Gruß
Michael