Office: Wer hat zuletzt bearbeitet

Helfe beim Thema Wer hat zuletzt bearbeitet in Microsoft Access Hilfe um das Problem gemeinsam zu lösen; trottlbua: > hab alle als string definiert (passt das so??) Yep. > also die bereits vorhandenen weder anzeigen noch bearbeiten Aktiviere mal... Dieses Thema im Forum "Microsoft Access Hilfe" wurde erstellt von Antje, 20. April 2007.

  1. miriki Erfahrener User

    Wer hat zuletzt bearbeitet


    trottlbua:
    > hab alle als string definiert (passt das so??)

    Yep.

    > also die bereits vorhandenen weder anzeigen noch bearbeiten

    Aktiviere mal (siehe Screenshot) im Fenster "Eigenschaft" des Formulars den Eintrag "Daten eingeben" und drücke F1. Ist es vielleicht das?

    Gruß, Michael
     
  2. trottlbua Erfahrener User
    perfekt - vielen Dank!

    So ein Anfängerfehler Wer hat zuletzt bearbeitet :oops: :-? :-x :evil:
     
    trottlbua, 13. September 2007
    #17
  3. trottlbua Erfahrener User
    halt - alles zurück - war zu schnell!

    Also:

    tbl_Aktion gibt's
    mit ID als AutoWert, aktiontext, aktiondatumzeit, aktionuser, aktioncomputer

    Modul mit dem Namen Aktion gibt's:

    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

    Dim wscomputername As String
    Dim wsusername As String
    Dim wsLanGroup As String
    Dim wsLogonDomain As String



    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("tbl_aktion", 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

    und in dem Formular hab ich die Ereignisprozedur before update mit

    Private Sub Form_BeforeUpdate(Cancel As Integer)

    LogUserAction ("Aktion")

    End Sub

    ABER: er schreibt keine Datensätze in die Tabelle tbl_aktion bei Änderungen im Formular - was habe ich da noch falsch?!?
     
    trottlbua, 13. September 2007
    #18
  4. miriki Erfahrener User

    Wer hat zuletzt bearbeitet

    trottlbua:

    > ABER: er schreibt keine Datensätze in die Tabelle tbl_aktion

    Ich würd als Ansatz mal einen "breakpoint" (Haltepunkt) in den VBA-Source setzen. Am besten erstmal auf die Zeile:

    Code:
    On Error GoTo Err_LogUserAction
    Damit kannst du überprüfen, ob die Routine "loguseraction" überhaupt aufgerufen wird, also ob das Ereignis auch wirklich ausgelöst wird.

    Stoppt die Ausführung an der Stelle, ist das schon mal gesichert. Dann kannst du mit F8 (Einzelschritt) die einzelnen Zeilen des Sourcecodes durchklickern. Ich vermute mal, ohne es jetzt genauer angesehen zu haben, daß die "on error" Zeile dazu führt, daß effektiv nichts passiert.

    Wahrscheinlich tritt irgendwann im Verlauf der Routine ein Fehler auf und der führt dann dazu, daß direkt zum Ende der Routine gesprungen wird. Wo jetzt aber der Fehler auftritt, kannst eigentlich nur Du (mit obiger Methode) herausfinden.

    Interessant wäre halt, ob der Fehler beim Öffnen der Tabelle, beim Setzen der Feldwerte oder beim Update des Datensatzes auftritt, oder ob er vielleicht sogar ganz woanders auftritt. (Immer unter der Voraussetzung, daß tatsächlich ein Fehler auftritt natürlich.)

    Alternativ könntest Du übrigens natürlich auch die "on error" Zeile mit einem ' auskommentieren und schauen, wann und wo eine Fehlermeldung kommt.

    Gruß, Michael
     
  5. trottlbua Erfahrener User
    Servus!

    also - hab gesucht was ein Anfänger halt suchen kann - in der Tabelle musste ich den aktionuser und den aktioncomputer auf Text umstellen - jetzt geht's! Danke, dein Tip mit dem Code rausnehmen war dafür entscheidend!

    Noch eine Frage: kann mir dieser Code auch sagen was geändert wurden - im Aktiontext steht nur "Aktion" - kann der mir auch irgendwie hinschreiben was geändert wurde :?:

    Mfg
    Herbert
     
    trottlbua, 17. September 2007
    #20
  6. miriki Erfahrener User
    trottlbua:
    > kann mir dieser Code auch sagen was geändert wurden
    > im Aktiontext steht nur "Aktion"

    Nunja, "Aktion" sollte hier eigentlich durch etwas wie "Datensatz verändert" ersetzt werden. Sinnvoll ist natürlich auch das Aufnehmen von Merkmalen, die den veränderten Datensatz auch kennzeichnen; also z.B. den Primärschlüssel mit in tbl_aktion ablegen.

    Parallel dazu würden beim Lösch-Ereignis "Datensatz gelöscht" und beim Neuanlegen-Ereignis "Datensatz hinzugefügt" als Aktionstext Sinn machen.

    Weitere Ereignisse mit entsprechenden Aktionstexten können dann wahlfrei und je nach Fantasie belegt werden. (Löschen abbrechen, Datensatz anzeigen, ...)

    > kann der mir auch irgendwie hinschreiben was geändert wurde :?:

    So ohne weiteres nicht. Aber wenn Du entsprechenden Aufwand betreiben möchtest, kann man das auch in die Richtung erweitern.

    Das würde aber bedeuten, daß Du vor der Änderung bereits eine Kopie des Datensatzes angefertigt haben mußt (wo auch immer, im Speicher oder in der Tabelle oder ...) und dann hier Feld für Feld vergleichen müßtest, ob sich der ursprüngliche vom aktuellen Feldwert unterscheidet.

    Dann könntest Du aber auch das "Bei Änderung" Ereignis jedes einzelnen Feldes auf dem Formular nehmen und die Log-Tabelle mit entsprechenden Einträgen fluten.

    Weitere Möglichkeiten gibt es sicherlich. Alles eine Frage der Kreativität...

    Gruß, Michael
     
  7. trottlbua Erfahrener User
    Servus Michael!

    Ich glaube, dass die Speicherung von Änderungen aller Felder zuviel Aufwand wird. Könntest du mir beschreiben, wie ich in die Tabelle eintragen lassen kann, welcher Datensatz geändert wurde.

    Entweder mit dem Primärschlüssel, lieber wär's mir allerdings mit dem Feld "Projektname".

    Hab keine Ahnung wie das mit dem Code zu machen ist - bitte um deine Hilfe.

    Danke
    Herbert
     
    trottlbua, 20. September 2007
    #22
  8. miriki Erfahrener User

    Wer hat zuletzt bearbeitet

    trottlbua:
    >welcher Datensatz geändert wurde.

    Wenn Du Dir später die Logdatei ansiehst und Dir den geänderten Datensatz genauer ansehen willst, z.B. zur Überprüfung, dann wirst Du nur mit einem Feld weiterkommen, daß eben diesen Datensatz genau und eindeutig kennzeichnet. Von daher kommst Du hier nur mit dem Primärschlüssel sinnvoll weiter.

    Grober Ansatz:

    * Die Aktionstabelle muß mit einem Feld erweitert werden, um den Primärschlüssel (ich nehm i.a. Autowert/Zufall, also entsprechend Longint, dafür) der anderen Tabelle aufnehmen zu können.

    * Die Log-Funktion muß den Primärschlüssel aus der aktuellen Maske auslesen und in das entsprechende Feld des Datensatzes übernehmen. Die passende Stelle dafür ist

    Code:
    ' ...
    in dem Code. Denn genau damit wollte ich anzeigen, daß ggf. weitere Informationen in andere Felder übernommen werden können.

    Also könnte dort so etwas wie (untested!)

    Code:
    !aktiondatensatz = Me!DatensatzId.Value
    rein. Bin mir jetzt nur nicht ganz sicher, ob ! oder . und ob .Value oder .Text da jetzt hingehören. Ausprobieren... Aber in jedem Fall ist aktiondatensatz das (neue) Feld in der Log-Tabelle und datensatzid das Feld mit dem Primärschlüssel des aktuellen Datensatzes.

    Gruß, Michael
     
  9. trottlbua Erfahrener User
    Muss ehrlich gestehen, mir is des noch ein bischen zu "hoch"- versteh ich noch nicht.

    Also, das Modul "aktion" kennst du ja (steht oben)

    ich mach in die Tabelle "tbl_aktion" ein Feld mit dem Name aktiondatenID

    Darin soll die ID des geänderten Datensatzes stehen - das Feld mit der welches die ID enthält heißt ProjektNr und kommt aus der Tabelle "tbl_Projektdaten". Das Modul "aktion" ist im forumular "Projektdaten" hinterlegt bei "vor aktualisierung"

    1) Ich definiere in der Tabelle aktiondatenID als Zahl und Long Integer - da das Feld ProjektNr ja ein Autowert mit Long Integer ist - richtig?
    2) Muss ich wieder "Dim AktiondatenID as String" schreiben?!?
    3) wie ist der Code genau zu behandeln, so zB?


    Code:
    !aktiondatenID=Me!ProjektNr.Value
    Aber damit weiß er doch nicht in welcher Tabelle das zu speichern ist - oder?
    4) Wo gehört das im Modulcode hin?

    Kann mir vorstellen, dass dies primitive Anfängerfragen sind, aber leider hab ich derzeit noch keinen Tau wie das alles funktioniert!

    Danke schon mal!
     
    trottlbua, 21. September 2007
    #24
  10. miriki Erfahrener User
    trottlbua:
    > 1) Ich definiere in der Tabelle aktiondatenID als Zahl und Long Integer - da das Feld ProjektNr ja ein Autowert mit Long Integer ist - richtig?

    Yep

    > 2) Muss ich wieder "Dim AktiondatenID as String" schreiben?!?

    Nein, denn durch "!aktiondatensatz = Me!DatensatzId.Value" wird der Wert aus dem aktuellen Datensatz (des Formulars) direkt in das Feld des Datensatzes (in der Log-Tabelle) übertragen, ohne Zwischenstop über eine Variable.

    Also nochmal zur Klarstellung:

    "!xxx" stellt die Felder der Log-Tabelle dar.
    Genau genommen ist es im Code "RS!xxx", was aber ein paar Zeilen weiter oben durch das "with RS" abgekürzt wird.

    "Me!xxx" ist das Feld des aktuell bearbeiteten / angezeigten Datensatzes.

    > 3) wie ist der Code genau zu behandeln, so zB?
    > !aktiondatenID=Me!ProjektNr.Value

    Yep, so auf den ersten Blick müßte es das sein.

    > Aber damit weiß er doch nicht in welcher Tabelle das zu speichern ist - oder?

    Doch, das weiß er dadurch, daß der Datensatz (RS) mit .AddNew in der Log-Tabelle erstellt wurde, die einzelnen Felder !xxx danach mit Werten belegt wurden und der Datensatz zum Schluß mit .Update gespeichert wurde.

    > 4) Wo gehört das im Modulcode hin?

    Dort, wo ganz ursprünglich mal ' ... stand, um anzuzeigen, daß dort der Code ggf. erweitert werden kann.

    Gruß, Michael
     
  11. trottlbua Erfahrener User
    Vielen Dank für die rasche Antwort!

    1,2 und 4 sind erledigt!

    Ich bekomm den Fehler "Fehler beim Kompilieren: Unzulässige Verwendung des Schlüsselworts Me"

    Leider kann ich in der Hilfe über Me nicht anschauen - genau lädt die Hilfe nicht den Inhalt - komisch, bei allen anderen Suchwörten funzts!

    Hast du eine Idee?

    Schönes WE!

    Herbert
     
    trottlbua, 21. September 2007
    #26
  12. miriki Erfahrener User
    trottlbua:
    > Ich bekomm den Fehler
    > "Fehler beim Kompilieren: Unzulässige Verwendung des Schlüsselworts Me"

    Keine wirkliche Idee jetzt, aber eine Möglichkeit, den Fehler einzukreisen bzw. zu finden.

    Bau Dir mal über den Assistenten einen Button in Dein Formular. Nimm am besten "Anwendung - Anwendung beenden" bei der Auswahl der Funktionen.

    Nach "Fertigstellen" drück mal rechte Maustaste auf dem Button im Formular und wähle "Ereignis" aus. Du siehst dann den Code zu dem Button und ersetzt eine Zeile in der Prozedur wie folgt:

    Code:
    Private Sub B_Test_Click()
    On Error GoTo Err_B_Test_Click
        MsgBox Me!ProjektNr.Value
    Exit_B_Test_Click:
        Exit Sub
    Err_B_Test_Click:
        MsgBox Err.Description
        Resume Exit_B_Test_Click
    End Sub
    Statt Zeile 3 "docmd.quit" setzt Du die Zeile mit der msgbox rein. In meinem Test-Formular ging sowohl Me. wie auch Me! übrigens, unabhängig davon, ob die ID in einem Feld auf dem Formular war oder nicht.

    Öffnest Du jetzt das Formular und drückst den Button, sollte er Dir die ID des Datensatzes anzeigen. Wenn nicht, wäre ich jetzt zuerst einmal etwas ratlos...

    Gruß, Michael
     
  13. trottlbua Erfahrener User

    Wer hat zuletzt bearbeitet

    Servus Michael!

    Button funktioniert - ich glaube es liegt an der Position der Zeile
    Code:
    !aktiondatensatz = Me!ProjektNr.Value
    weil er mir bei der vorher genannte Fehlermeldung die Zeile "Sub LogUserAction(wsAction$)" gelb markiert.
    Könntest du das bitte nochmal überprüfen?

    Ehrlich gesagt, hab ich keinen blassen Schimmer wieso das nicht funzt. Wie gesagt, ich habe nur in tbl_aktion das Feld hinzugefügt und in das Model den Code an der Stelle wo du es mir gesagt hast.

    Soll ich den ganzen Code nochmal posten?
     
    trottlbua, 24. September 2007
    #28
  14. miriki Erfahrener User
    trottlbua:
    > ich glaube es liegt an der Position der Zeile

    Sie muß zwischen den Zeilen .AddNew und .Update stehen, das ist wichtig. Die Reihenfolge der Zeilen dort in dem Block ist dann aber nicht relevant.

    > Soll ich den ganzen Code nochmal posten?

    Wenn's das nicht war: Ja, aber nicht den ganzen, sondern nur das betreffende Sub .. End Sub.

    Ach, Mist, ich Torfkopp... Das kann so nicht gehen, fällt mir gerade ein! Das Sub hat nicht wirklich einen Bezug zum Formular. Deswegen müßte die ID per Parameter vom aufrufenden Ereignis übergeben werden. Du müßtest also folgende Zeile

    Sub LogUserAction(wsAction$)
    ändern in
    Sub LogUserAction(dsID&, wsAction$)
    Somit erwartet die Routine neben dem Aktionstext auch noch die ID des Datensatzes als Parameter.

    Die in den Datensatz schreibende Zeile
    !aktiondatensatz = Me!ProjektNr.Value
    muß dann angepaßt werden auf
    !aktiondatensatz = dsID
    Damit wird die ID, die als Parameter übergeben wurde, in den Datensatz geschrieben.

    Und die aufrufende Zeile im Formular
    LogUserAction("Aktion")
    ändern in
    LogUserAction(Me!ProjektNr.Value,"Aktion")
    Damit wird die ID aus dem aktuellen Formular als Parameter an die Log-Routine übergeben. ("Aktion" ist, wie gehabt, nur ein Beispiel, das durch den eigentlichen Wert ersetzt werden sollte...)

    Sorry, da stand ich etwas auf der Leitung. Aber so müßte es dann aber gehen.

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

    Danke für deine Hilfe bis jetzt - ich hoffe es ist bald geschafft, damit du dich wieder anderen Problemen zuwenden kannst!

    2 Sachen noch:

    1)

    Code:
    Private Sub Form_BeforeUpdate(Cancel As Integer)
    LogUserAction (Me!ProjektNr.Value;"Aktion")
    End Sub
    
    da bekomm ich einen Syntaxfehler 1. Zeile ist gelb untermalt und 2. Zeile ist rot markiert


    2) wie muss der Code dann aussehen (vorausgesetzt ich bring mit dir gemeinsam mal den ersten zum rennen), damit ich eventuell weitere Felder hinzufügen kann?!?

    Danke schon mal für die ausführliche Hilfe bis jetzt!!!

    Herbert
     
    trottlbua, 25. September 2007
    #30
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