Office: Wer hat zuletzt bearbeitet

Helfe beim Thema Wer hat zuletzt bearbeitet in Microsoft Access Hilfe um das Problem gemeinsam zu lösen; Guten Tag, ich möchte anzeigen 1. wer 2. wann zuletzt an den Daten geändert, bzw gearbeitet wurde Fällt jemandem dazu was ein. Vielen Dank für... Dieses Thema im Forum "Microsoft Access Hilfe" wurde erstellt von Antje, 20. April 2007.

  1. Antje User

    Wer hat zuletzt bearbeitet


    Guten Tag,
    ich möchte anzeigen
    1. wer
    2. wann zuletzt an den Daten geändert, bzw gearbeitet wurde
    Fällt jemandem dazu was ein.

    Vielen Dank für jede Anregung !
     
  2. Antje User
    Nachsatz:
    Ich arbeite mit Access 2003
     
  3. miriki Erfahrener User
    Antje:
    > 1. wer 2. wann zuletzt an den Daten geändert [...]

    Die einfachste Methode wäre, das Ereignis "VorAktualisierung" oder "NachAktualisierung" des Formulars (und damit des Datensatzes) zu benutzen.

    Tritt das Ereignis ein, wurden Daten geändert. Damit hat man den Zeitpunkt, an dem man einen Log-Eintrag erstellen kann. Dies geschieht typischerweise in einer eigenen Tabelle. Dort könnte dann sowas wie "Benutzername", "Datum/Uhrzeit", "Aktion" und ggf. noch "Rechnername" eingetragen werden. Außerdem ist es sinnvoll, zumindest die "DatensatzId" des Datensatzes mit aufzunehmen, damit man die Referenz für später hat, wo eigentlich was geändert wurde.

    Ein weiteres Ereignis wäre vielleicht noch "BeimLöschen", obwohl dann die DatensatzId nicht mehr unbedingt reicht, um später sehen zu können, was gelöscht wurde. Hier könnte also bei "Aktion" (oder ein weiteres Feld "Datensatzinfo") dann vielleicht noch das eine oder andere Feld (Nachname, Firmaname, ...) mit in den Text aufgenommen werden.

    Das Log läßt sich auch durch Ereignisse wie "BeimKlicken" (eines Buttons z.B.) oder "BeimÖffnen" / "BeimSchliessen" (eines Formulars) erweitern. Möglichkeiten gibt es da viele...

    Das Problem ist an sich nur:
    a) Wie kriege ich Benutzer-, Rechner-Name heraus?
    b) Wie schreibe ich auf die Schnelle einen Datensatz?

    Im Anhang ist mal ein Modul, das ein paar Routinen enthält, die genau das machen. Die Routinen habe ich, wenn ich mich recht entsinne, aus einer KnowledgeBase, und dann leicht für meine Bedürfnisse angepaßt.

    Benutzung: Im jeweiligen Ereignis einfach
    Code:
    LogUserAction("Aktion")
    aufrufen. Im Modul kann im letzten SUB angepaßt werden, welche Informationen neben dem Meldungstext noch in die Tabelle (und vor allem: in welche!) geschrieben werden soll.

    Anregung genug? ;-)

    Gruß, Michael
     
    miriki, 23. April 2007
    #3
  4. miriki Erfahrener User

    Wer hat zuletzt bearbeitet

    Irgendwie klappt das nicht mit dem Attachment, weder txt, noch bas noch vba. Also direkt als Posting:

    Code:
    Option Compare Database
    Option Explicit
    
    Type WKSTA_INFO_101
        wki101_platform_id As Long
        wki101_computername As Long
        wki101_langroup As Long
        wki101_ver_major As Long
        wki101_ver_minor As Long
        wki101_lanroot As Long
    End Type
    
    Type WKSTA_USER_INFO_1
        wkui1_username As Long
        wkui1_logon_domain As Long
        wkui1_logon_server As Long
        wkui1_oth_domains As Long
    End Type
    
    Declare Function WNetGetUser& Lib "Mpr" Alias "WNetGetUserA" (lpName As Any, ByVal lpUserName$, lpnLength&)
    Declare Function NetWkstaGetInfo& Lib "Netapi32" (strServer As Any, ByVal lLevel&, pbBuffer As Any)
    Declare Function NetWkstaUserGetInfo& Lib "Netapi32" (reserved As Any, ByVal lLevel&, pbBuffer As Any)
    Declare Sub lstrcpyW Lib "Kernel32" (dest As Any, ByVal src As Any)
    Declare Sub lstrcpy Lib "Kernel32" (dest As Any, ByVal src As Any)
    Declare Sub RtlMoveMemory Lib "Kernel32" (dest As Any, src As Any, ByVal size&)
    Declare Function NetApiBufferFree& Lib "Netapi32" (ByVal buffer&)
    
    Function GetWorkstationInfo()
    
        Dim ret As Long
        Dim buffer(512) As Byte
        Dim i As Integer
        Dim wk101 As WKSTA_INFO_101
        Dim pwk101 As Long
        Dim wk1 As WKSTA_USER_INFO_1
        Dim pwk1 As Long
        Dim cbusername As Long
    
        wsComputerName = "": wsLanGroup = "": wsUserName = "": wsLogonDomain = ""
    
        wsUserName = Space(256)
        cbusername = Len(wsUserName)
        ret = WNetGetUser(ByVal 0&, wsUserName, cbusername)
        If ret = 0 Then
            wsUserName = Left(wsUserName, InStr(wsUserName, Chr(0)) - 1)
          Else
            wsUserName = ""
        End If
    
        ret = NetWkstaGetInfo(ByVal 0&, 101, pwk101)
        RtlMoveMemory wk101, ByVal pwk101, Len(wk101)
        lstrcpyW buffer(0), wk101.wki101_computername
    
        i = 0: Do While buffer(i) <> 0
            wsComputerName = wsComputerName & Chr(buffer(i))
            i = i + 2
        Loop
    
        lstrcpyW buffer(0), wk101.wki101_langroup
    
        i = 0: Do While buffer(i) <> 0
            wsLanGroup = wsLanGroup & Chr(buffer(i))
            i = i + 2
        Loop
    
        ret = NetApiBufferFree(pwk101)
    
        ret = NetWkstaUserGetInfo(ByVal 0&, 1, pwk1)
        RtlMoveMemory wk1, ByVal pwk1, Len(wk1)
        lstrcpyW buffer(0), wk1.wkui1_logon_domain
    
        i = 0: Do While buffer(i) <> 0
            wsLogonDomain = wsLogonDomain & Chr(buffer(i))
            i = i + 2
        Loop
    
        ret = NetApiBufferFree(pwk1)
    
    End Function
    
    Function GetWsUsername()
    
        GetWorkstationInfo
    
        GetWsUsername = wsUserName
    
    End Function
    
    Function GetWsComputername()
    
        GetWorkstationInfo
    
        GetWsComputername = wsComputerName
    
    End Function
    
    Sub LogUserAction(wsAction$)
    On Error GoTo Err_LogUserAction
    
        Dim DB As Database
        Dim RS As Recordset
    
        Set DB = CurrentDb()
        Set RS = DB.OpenRecordset("t_aktionen", dbOpenDynaset)
        With RS
            .AddNew
            !aktiondatumzeit = Now()
            !aktionuser = GetWsUsername()
            !aktioncomputer = GetWsComputername()
    ' ...
            !aktiontext = wsAction
            .Update
            .Bookmark = .LastModified
        End With
        RS.Close
        DB.Close
    
    Exit_LogUserAction:
        Exit Sub
    
    Err_LogUserAction:
        Resume Exit_LogUserAction
    
    End Sub
     
    miriki, 23. April 2007
    #4
  5. Antje User
    Vielen Dank erstmal, werde es morgen ausprobieren !! :-D
     
  6. Antje User
    Also Miriki erstmal danke, aber ich bin halt ein Neuling und bekomme folgendes nicht hin:

    Mein Formular hat vielleicht 200 Felder und 15 Unterfomulare, ich kann jederzeit ändern und speichern, dann muss ich den Code bei jedem Feld als Ereignis engeben oder ?
     
    Antje, 7. Mai 2007
    #6
  7. miriki Erfahrener User
    Antje:
    > Mein Formular hat vielleicht 200 Felder und 15 Unterfomulare,

    AUTSCH!!!

    Da solltest Du Dir in jedem Fall mal angucken, ob Dein Design (Struktur der Tabellen) nicht vielleicht ein grundlegendes Problem hat...

    > ich kann jederzeit ändern und speichern,

    Da versteh ich jetzt leider nicht ganz, was du meinst. Sowas in der Art, daß du einen "Speichern"-Button im Formular hast? Ansonsten wird der Datensatz ja automatisch gespeichert, z.B. wenn er verlassen wird.

    > dann muss ich den Code bei jedem Feld als Ereignis engeben oder ?

    Welchen Code?

    Die Relationen zwischen Haupt- und Unterformular (also das Füllen der entsprechenden Ref-Felder mit den passenden Id-Feldern) werden übrigens, wie ich sagte, automatisch geschaffen. Also da ist (normalerweise) kein Code notwendig.

    Manuell / per VBA-Code läßt sich sicher auch was machen (Füllen der Felder im Unterformular mit Werten aus Feldern des Hauptformulars), aber das ist nicht zwingend notwendig.

    Aber ich hab sicher irgendwas mißverstanden. Beschreib ggf. nochmal genauer, bitte.

    Gruß, Michael
     
    miriki, 8. Mai 2007
    #7
  8. Antje User

    Wer hat zuletzt bearbeitet

    Hallo Michael,
    also es handelt sich um ein Personalverwaltung für Übersetzer. Dafür habe ich ein Hauptformular zur Erfassung der Stammdaten und darin wirklich viele Unterformular als Register, wo ich die Sprachkenntnisse, Übersetzungskenntnisse, berufliche Referenzen, Lebenslauf und so weiter (am Ende 400 Felder, mußte sie heute zählen) abfrage. Natürlich habe ich dafür jede Menge Tabellen angelegt, damit die Daten wirklich nur an einer Stelle abgelegt werden.

    Es gibt keine Speicherbuttons. Gespeichert wird, wenn das Feld verlassen wird.

    Das Ganze hat eine benutzerspezifische Sicherung. Ich kenne also den User, der gerade exklusiv auf meinen Datensatz zugreift und ändert.

    So, jetzt soll derjenige gespeichert werden, der geändert oder gelöscht hat.

    Ich weiß nicht, wo genau dein Programmcode hin soll.

    Versuchst du es noch einmal mit mir ? :cry:
     
    Antje, 8. Mai 2007
    #8
  9. miriki Erfahrener User
    Antje:
    > So, jetzt soll derjenige gespeichert werden, der geändert oder gelöscht hat.

    Arghl... Jetzt war ich völlig auf dem falschen Dampfer und hab zwei Threads miteinander vermischt. Sorry, das war jetzt meine Begriffsstutzigkeit...

    Also, der Code oben (längeres Code-Posting) muß als eigenes Modul in die Datenbank eingesetzt werden (Module - Neu).

    In den einzelnen Formularen muß dann jeweils der Code für die Aktivierung des Log-Eintrags gesetzt werden:

    Also zuerst Formular-Eigenschaften aufrufen (formular-eigenschaften.gif), bis zum Ereignis "VorAktualisierung" scrollen, reinklicken (leeres Feld) und danach rechts auf die 3 "..." klicken, "Code-Generator" (ereignistyp.gif) auswählen und dann im VBA-Editor (vba-editor.gif) den Aufruf eintragen. Danach ist das Feld in den Formular-Eigenschaften auch nicht mehr leer.

    Gruß, Michael
     
    miriki, 9. Mai 2007
    #9
  10. Antje User
     
    Antje, 9. Mai 2007
    #10
  11. Antje User
    Hallo,
    ich schaffe es nicht.

    Habe eine eigene Datei für die Logdaten erzeugt.
    Die heisst tblAktion und hat die Felder
    ID=Autowert
    aktionID=integer (hier soll die Personalnummer rein)
    aktiontext =text ,
    aktiondatumzeit=datum/zeit,
    aktionuser=long integer und
    aktioncomputer=long integer

    Beim Modul habe ich auf die neue Tabelle hingewiesen :

    Set RS = DB.OpenRecordset("tblAktion", dbOpenDynaset)
    With RS
    .AddNew
    !aktionID = tblPersonal!PersonalNr (ist hier der Fehler ?)
    !aktiondatumzeit = Now()
    !aktionuser = GetWsUsername()
    !aktioncomputer = GetWsComputername()
    !aktiontext = wsAction
    .Update
    .Bookmark = .LastModified

    Bei dem Ereignis im Formular :
    Private Sub Form_BeforeUpdate(Cancel As Integer)
    LogUserAction ("Aktion")
    End Sub

    und es geht nicht , er lässt mich den geänderten Datensatz nicht speichern

    Oh jeh !
     
    Antje, 9. Mai 2007
    #11
  12. miriki Erfahrener User
    Antje:
    >ich schaffe es nicht.

    Ach doch, sieht nur noch nach einer Kleinigkeit aus, wie Du schon selbst vermutest:

    > aktionID=integer (hier soll die Personalnummer rein)
    [...]
    > !aktionID = tblPersonal!PersonalNr (ist hier der Fehler ?)

    Fragen wir mal so: Wenn die Routine aufgerufen wird, woher soll diese dann wissen, welche Zeile (welcher Datensatz) in tblPersonal jetzt die PersonalNr enthält, die er hier eintragen soll? Ganz so einfach geht es dann doch nicht... (Um Werte aus einer Tabelle zu holen, kannst Du mal nach "DbLookUp" / "DomWert" und Verwandten in der Hilfe gucken.)

    Reichen denn User-und Stations-Name nicht? Normalerweise sollte doch UserName und PersonalNr mit 1:1 verknüpfbar sein, von "Gast"-Accounts mal abgesehen, die ja eher keine Änderungsrechte in einer DB haben sollten...

    Welches zusätzliche Identifikationskriterium steht denn überhaupt sonst noch zur Verfügung? Einfach nur (irgendeine) ID aus der Personaldatei zu greifen, bringt es auf alle Fälle nicht. Wenn ihr eure DB mit Login versehen habt, gibt es noch CurrentUser(). Aber der ist immer "Admin", wenn die DB ohne Login arbeitet.

    Ich tippe aber mal stark darauf, daß Du die PersonalId einfach weglassen kannst, da der Username (wer?) und der Stationsname (wo?) ja schon bekannt sind.

    Gruß, Michael
     
    miriki, 9. Mai 2007
    #12
  13. trottlbua Erfahrener User

    Wer hat zuletzt bearbeitet

    So, das ganze bitte nochmal langsam in "Deppensprache":

    Also, als erstes erstell ich eine Tabelle - mit den entsprechenden Feldern

    Dann muss ich ein "Modul" basteln - wo ich auf die Tabelle verweise

    und dann muss ich im Formular unter den Eigenschaften bei "Vor Aktualisierung" das Modul auswählen?

    Hab ich das richtig kapiert - dann versuch ich's mal!

    Edit: ich krieg einen Fehler, hab den Code von ganz oben kopiert:

    Function GetWsUsername()

    GetWorkstationInfo

    GetWsUsername = wsUserName

    Fehler beim kompilieren - Variable nicht definiert
     
    trottlbua, 10. September 2007
    #13
  14. miriki Erfahrener User
    trottlbua:
    > GetWsUsername = wsUserName
    > Fehler beim kompilieren - Variable nicht definiert[/quote]

    Der Fehler müßte dann (u.a. auch) in der Zeile

    Code:
    wsComputerName = "": wsLanGroup = "": wsUserName = "": wsLogonDomain = ""
    in der Routine "getworkstationinfo" auftreten. Fehlen tut da noch die (globale) Deklaration der String-Variablen:

    Code:
    dim wscomputername as string
    dim ...
    Pack diese Zeilen dann irgendwo in den Header des Moduls, vielleicht am besten hinter die "declare", aber vor das erste "function".

    Ich nehme an, ich hatte diese dim-Zeilen in einem anderen Modul, deswegen tauchten sie hier nicht auf. Sorry...

    Gruß, Michael
     
  15. trottlbua Erfahrener User
    Hallo Michael!

    Danke - hab ich gemacht, hab alle als string definiert (passt das so??) - doch 1) kann ich im Formular, dass zum eingeben und bearbeiten der Datensätze gedacht ist, nur mehr neue Datensätze hinzufügen - also die bereits vorhandenen weder anzeigen noch bearbeiten - Idee???

    Mfg
    Lucky
     
    trottlbua, 11. September 2007
    #15
Thema:

Wer hat zuletzt bearbeitet

Die Seite wird geladen...
  1. Wer hat zuletzt bearbeitet - Similar Threads - bearbeitet

  2. Outlook 365: Weiterleiten von bearbeiteten Anlagen nicht möglich?

    in Microsoft Outlook Hilfe
    Outlook 365: Weiterleiten von bearbeiteten Anlagen nicht möglich?: E-Mail empfangen, auf "Weiterleiten" drücken, Anlage (z.B. Word-Datei) bearbeiten, schließen und mit der Mail weiterleiten. Unter Outlook 2016 kein Problem. Bei 365 geht das angeblich nur mit der...
  3. Eine Form kann nicht bearbeitet werden

    in Microsoft PowerPoint Tutorials
    Eine Form kann nicht bearbeitet werden: Eine Form kann nicht bearbeitet werden PowerPoint 2016 für Mac PowerPoint für Mac 2011 Mehr... Weniger Der Support...
  4. Zuletzt bearbeitete Aufgaben poppen immer wieder im Planner auf

    in Microsoft Teams Hilfe
    Zuletzt bearbeitete Aufgaben poppen immer wieder im Planner auf: Hallo liebe Community, Eine Vielzahl an Kollegen berichten beim Öffnen des Planners in Teams von folgendem Problem: Die zuletzt bearbeitete, ihnen zugewiesene Aufgabe **** immer wieder auf. Dies...
  5. Gelesen/Bearbeitet von Mitarbeiter: xyz

    in Microsoft Outlook Hilfe
    Gelesen/Bearbeitet von Mitarbeiter: xyz: Moin moin... entschuldigt bitte den schwammigen Titel aber ich weiß nicht wirklich wie ich das Thema benennen soll... daher weiß ich auch nicht nach was ich wie suchen muss... Das...
  6. Kalender Outlook.de und Outlook365 kann nicht bearbeitet werden

    in Microsoft Outlook Hilfe
    Kalender Outlook.de und Outlook365 kann nicht bearbeitet werden: Hallo an Alle, ich nutze Outlook2016 am Arbeitsplatz und Outlook.de mobil. Unter Kollegen haben wir unseren Kalender freigegeben was auch funktioniert um gegenseitig Termine zu erstellen. Unter...
  7. Dokumentenschutz- bearbeitet-nun Schrift rot-HILFE!!!!

    in Microsoft Word Hilfe
    Dokumentenschutz- bearbeitet-nun Schrift rot-HILFE!!!!: Hallo Ihr, bitte lacht mich nicht aus, denn ich habe echt keinen Plan! Ich muss in meinem Job mit geschützten Dokumenten in Word (keine Ahnung welches, hätte ich mal auf Arbeit schauen sollen,...
  8. suche text den ich aus dem internet geladen und dann bearbeitet habe

    in Microsoft Word Hilfe
    suche text den ich aus dem internet geladen und dann bearbeitet habe: Hallo!! Ich habe ein Word Dokument von meinem Mail-Account geöffnet und dann weiterbearbeitet. Dann habe ich nur auf "speichern" geklickt und nicht auf "speichern unter". Jetzt finde ich das...
  1. Diese Seite verwendet Cookies, um Inhalte zu personalisieren, diese deiner Erfahrung anzupassen und dich nach der Registrierung angemeldet zu halten.
    Auf dieser Website werden Cookies für die Zugriffsanalyse und Anzeigenmessung verwendet.
    Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden