Neuigkeiten:

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

Mobiles Hauptmenü

Feld nach Datenänderung im Datensatz ändern per VBA, wie?

Begonnen von Andreas Irmer, Januar 05, 2023, 20:51:58

⏪ vorheriges - nächstes ⏩

Andreas Irmer

Hallo zusammen,

ich möchte nach Änderung eines Datensatzes in einem Formular ein Tabellenfeld (Boolean) auf True setzen. Alternativ könnte auch das Feld Termine.GeaendertAm im Datensatz mit dem aktuellen Zeitpunkt beschrieben werden, damit ich es mit Lastmodified in Outlook vergleichen kann. (Ich glaube, das wäre noch deutlich eleganter als ein zusätzliches Feld in der Tabelle zu führen.)

Dadurch könnte ich später die Menge an Datensätzen, die es nach Outlook zu schreiben gilt, deutlich minimieren.

Es wäre schön, wenn mir hier jemand helfen könnte, wie ich die VBA Routine aufbauen muss, um diese Daten unter "nach Aktualisierung" auszulösen.

Übrigens: Falls es jemanden interessiert, habe ich den Code für den Schreibprozess nach Outlook hier veröffentlicht.
Andreas Irmer
für jede Hilfe dankbar und für Tipps zum Thema Wohnmobil, Wohnwagen auch für jeden erreichbar
  •  

MzKlMu

Hallo,
im Formularereignis "Nach Aktualiserung" folgenden Code:
Me.GeaendertAm = Now()Schreibt das aktuelle Datum mit Zeit in das Feld.
Gruß
Klaus
  •  

Lampedusa

Hallo Klaus,
ich quäle mich mit dem selben Problem rum, aber die Lösung funktioniert bei mir nicht. Ich erhalte immer eine Fehlermeldung dass Access 'ME' nicht erkennt? Wenn ich 'Me.' weglasse, erkennt den Auasdruck erfasst nicht. Wie muss der Ausdruck korrekt eingebunden werden? Ich binneu bei Access und VBA.
Gruß Günter
  •  

MzKlMu

Hallo,
Deine Frage ist nichtsagend. Du solltest schon genau beschreiben was Du wo mit welchem Ausdruck machst.
Und ohne den Ausdruck zu sehen kann man doch nicht sehen wo der Fehler ist, oder ?
Gruß
Klaus
  •  

Beaker s.a.

Hallo Günter,
Als Ausdruck sollte dies funktionieren
[DeinFeld]=Now()
gruss ekkehard
--
Frauen aller Länder vereinigt euch! Wir brauchen eine Wiedergeburt des Matriarchats.
Und schickt den Papst in die Wüste! Da kann er 40 Tage auf God(o)t warten.
  •  

Lampedusa

Hallo Klaus, hallo Ekkehard, Hallo zusammen,
wenn ich die Anregungen richtig verstanden habe, dann müsste der benötigte Code wie folgt aussehen, wäre das korrekt? Datenbank: Strassen Tabelle: Berge im Formular, das ebenfalls ,,Berge" heißt, den ich bei der Neuerfassung im Feld ,,erfasst" das Datum mit Date() füllen und wenn irgend ein Feld im Formular geändert wird, will ich im Feld ,,geaendert" das Datum mit NOW() aktualisieren, sodass immer die letzte Bearbeitungszeit angezeigt wird. Wenn kein Feld im Formular verändert wird, bleibt der aktuelle Bearbeitungsstand erhalten, wenn erneut ein Feld geändert wird, soll der Wert im Feld ,,geaendert" ersetzt werden.
Meine Idee für den Part im Feld geaendert:
___________________________________________
Private Sub Form_AfterUpdate()
    With Strassen.Berge
        Dim intnewrec As Integer
        intnewrec = frm.NewRecord
            If intnewrec = false
            Select Case .Status1
            Case 1
                .geaendert = Now()
            End Select
        End If
        .geaendert = Now()
    End With
End Sub

Private Sub geaendert_AfterUpdate(Cancel As Integer)

End Sub
______________________

Wie muss ich die Prozedur im VBA-Editor speichern, damit Sie mir unter Makros oder Module angezeigt wird und zur Verfügung steht? Wie ihr seht, bibn ich bei Access und VBA wirklich neu,
Vielen Dank
Günter
  •  

Andreas Irmer

Zitat von: MzKlMu am Januar 05, 2023, 23:40:21Hallo,
im Formularereignis "Nach Aktualiserung" folgenden Code:
Me.GeaendertAm = Now()Schreibt das aktuelle Datum mit Zeit in das Feld.

Hallo Klaus,

bitte entschuldige, dass ich jetzt seit drei Monaten offline war. Wir hatten im Januar eine große Messe, die sehr erfolgreich und daher auch sehr zeitraubend war.

Ich kann jetzt die aktuelle Zeit mit dem Befehl hinzufügen aber stelle im Nachhinein fest, dass es immer wieder Abweichungen zum LastModified des Kalendereintrags gibt. Dies merke ich dann, wenbn ich den Zeiteintrag später mit dem LAstmodified vergleiche. Die Abweichung ist mal nur wenige Sekunden, manchmal aber auch zwei oder drei Minuten.

Damit gelingt es mir nicht, die nicht geänderten Datensätze auszublenden und so dauert der Schreibprozess vonn aktuell 100 Aufträgen mit zusammen etwa 400 Termineinträgen inzwischen fast acht Minuten.

Dies hier nur zur Info. Ich mache ein neues Thema auf mit konkreten Fragen und konkreter Beschreibung, wenn es soweit ist.

Danke und viele Grüße
Andreas
Andreas Irmer
für jede Hilfe dankbar und für Tipps zum Thema Wohnmobil, Wohnwagen auch für jeden erreichbar
  •  

ebs17

ZitatAlternativ könnte auch das Feld Termine.GeaendertAm im Datensatz mit dem aktuellen Zeitpunkt beschrieben werden, damit ich es mit Lastmodified in Outlook vergleichen kann.
Wenn Du etwa einschätzen kannst, wie lang Deine Bearbeitungszeiten sind, kannst Du solche zum Vergleich heranziehen:
If Abs(ZeitInAccess - ZeitInOutlook) < 1/48 Then ...    ' kleiner halbe Stunde
Mit freundlichem Glück Auf!

Eberhard
  •  

Andreas Irmer

Hallo ebs,

ich habe gebraucht wieder Zeit zum Testen zu finden und hänge leider wieder fest. Irgend etwas funktioniert an Deiner Lösung nicht oder ich stelle mich zu dumm an.

Als erstes habe ich mich entschlossen die Zeitstempel nur auf eine Spanne von 15 Minuten zu vergleichen. Dann möchte ich nur die Zeilen schreiben, deren Unterschied größer als 15 Minuten ist, was ich so abfrage
If Abs(rst!GeandertAm - objAppointmentItem.LastModificationTime) > 1 / 96 Then
Dies hat jedoch nicht funktioniert und ich habe versucht etwas zu analysieren. Daher sieht mein Code jetzt so aus:

If rst!Termin >= Now() Then
            Set objAppointmentItem = objMAPI.GetItemFromID(rst!OL_TerminID)
            'If rst!GeandertAm <> objAppointmentItem.LastModificationTime Then
            Terminstempel = Abs(rst!GeandertAm)
            Debug.Print "Terminstempel =" & Terminstempel
            If Abs(rst!GeandertAm - objAppointmentItem.LastModificationTime) > 1 / 96 Then
                Debug.Print "Ergebnis = " & Abs(rst!GeandertAm - objAppointmentItem.LastModificationTime) & " Ende"
                Debug.Print rst!GeaendertAm & " " & objAppointmentItem.LastModificationTime
                Debug.Print "vorhanden " & rst!AB_Nr
                With objAppointmentItem
                    .Subject = rst!Taetigkeit & ", " & rst!AdrNr_ID_F & ", " & rst!Re_Na2 & ", " & rst!AB_Nr & ", " & rst!Re_Tel & ", " & rst!Re_EMail1
                    .Start = rst!Termin_Datum & " " & rst!Termin_Beginn


Ich wollte wissen, was als Ergebnis aus Abs(rst!GeandertAm) herauskommt und schreibe das Ergenis in die Variable Terminstempel. Die Ausgabe
Debug.Print "Terminstempel =" & Terminstempel liefert aber nur Terminstempel =

Und die Zeile Debug.Print "Ergebnis = " & Abs(rst!GeandertAm - objAppointmentItem.LastModificationTime) & " Ende" bringt gar keine Anzeige.

Wo liegt der Fehler?
Andreas Irmer
für jede Hilfe dankbar und für Tipps zum Thema Wohnmobil, Wohnwagen auch für jeden erreichbar
  •  

ebs17

Zitatliefert aber nur Terminstempel =
Dann enthält die Variable und vorangegangen das Recordsetfeld NULL.

In Folge: Mit NULL (unknown) kann man nicht rechnen, der Berechnungsausdruck bringt wieder NULL.
Mit freundlichem Glück Auf!

Eberhard
  •  

Andreas Irmer

Hallo Ebs,

danke für Dein Feedback. Die Geschichte ruht auf deinem Vorschlag.
ZitatIf Abs(ZeitInAccess - ZeitInOutlook) < 1/48 Then ...    ' kleiner halbe Stunde

Also habe ich versucht das umzusetzen und entsprechend den Code, wie bereits geschrieben, gesetzt.

Terminstempel = Abs(rst!GeandertAm)
Wenn also dieser Code Null liefert, kann doch etwas nicht stimmen.

Das Feld geaendertAm ist als Datum/Zeit belegt...
Andreas Irmer
für jede Hilfe dankbar und für Tipps zum Thema Wohnmobil, Wohnwagen auch für jeden erreichbar
  •  

ebs17

ZitatDas Feld geaendertAm ist als Datum/Zeit belegt...
Die Frage an Dich ist, ob in jenem konkreten Feld auch ein Inhalt ist. Mit einem NICHTS laufen manche Berechnungen "überraschend" anders ...

Mein Vorschlag sah vor, per Abs das Vorzeichen einer Differenz wegzunehmen. Dass es überhaupt eine Differenz und also zwei gültige Werte zum Subtrahieren gibt, habe ich unterstellt, weil ich Dir Erkennen und Sicherstellung dessen eigenständig zugetraut hatte.
Beachten: Programmierung ist Umsetzung von Logik. Daher nicht den Kopf abschalten, wenn man sich vor den Rechner setzt.
Mit freundlichem Glück Auf!

Eberhard
  •  

Andreas Irmer

Hallo Eberhard,

ich verstehe nicht ganz, warum Du so angreifst?

Die Abfrage wird nur für Termine ausgeführt, die bereits in Outlook eingetragen sind. Daher gibt es bei allen Terminen einen Eintrag im Feld geaendertam und natürlich auch in Outlook.

Bei beiden Eintraegen stehen die Werte in der Form TT.MM.YYYY HH:MM:SS

Was jedoch nicht funktioniert ist die Abs() funktion.

Ich kann einfach die Differenz aus beiden Einträgen bilden und erhalte dann Werte, wie z.B. 00:00:23, also 23 Sekunden.

In Excel kann ich einfach die Zeit in Dezimal umrechnen, wenn ich den Wert mit 24 multipliziere.

In Access funktioniert das aber nicht und daher bekomme ich auch die Abfrage nicht hin.

If (rst!GeandertAm - objAppointmentItem.LastModificationTime) > 0.08 Then 'größer als 5 Minutenfunktioniert genausowenig wie
If (rst!GeandertAm - objAppointmentItem.LastModificationTime) > 0,08 Then 'größer als 5 Minutenoder
If (rst!GeandertAm - objAppointmentItem.LastModificationTime) > 00:05:00 Then 'größer als 5 Minuten
Ich lasse mir alle Werte über Debug Print ausgeben und erhalte dies:

ZitatTerminstempel Access =02.04.2023 20:48:30 Terminstempel Outlook = 02.04.2023 20:48:56 Differenz = 00:00:26 Zahl = -7,18612672062591E-03
Terminstempel Access =02.04.2023 20:48:30 Terminstempel Outlook = 02.04.2023 20:48:55 Differenz = 00:00:24 Zahl = -6,77831657230854E-03
Terminstempel Access =02.04.2023 20:48:31 Terminstempel Outlook = 02.04.2023 20:48:48 Differenz = 00:00:18 Zahl = -4,88424219656736E-03
Terminstempel Access =02.04.2023 20:48:31 Terminstempel Outlook = 02.04.2023 20:48:38 Differenz = 00:00:07 Zahl = -2,06363329198211E-03
Terminstempel Access =02.04.2023 20:48:31 Terminstempel Outlook = 02.04.2023 20:48:35 Differenz = 00:00:04 Zahl = -1,03256804868579E-03
Terminstempel Access =02.04.2023 20:48:31 Terminstempel Outlook = 02.04.2023 20:48:34 Differenz = 00:00:03 Zahl = -7,48094636946917E-04

Danke für euer Feedback.

Andreas Irmer
für jede Hilfe dankbar und für Tipps zum Thema Wohnmobil, Wohnwagen auch für jeden erreichbar
  •  

ebs17

Ich weiß nicht, was Du warum rechnest.

1 Stunde = 1 / 24
1 Minute = 1 / (24 * 60)
1 Sekunde = 1 / (24 * 60 * 60)

26 Sekunden = 26 / (24 * 60 * 60) => ergibt einen deutlich anderen Wert als in Deiner Rechnung


? CDate(0.08)
01:55:12

Knapp 2 Stunden sind irgendwie anders als Deine berechneten/angenommenen 5 Minuten

In meiner Welt sind dann auch negative Differenzen IMMER kleiner als selbst eine (positive) Sekunde, da muss ich nicht prüfen.

Wie geschrieben: Ich weiß nicht, was Du warum rechnest.

? Abs(#04/02/2023 20:48:30#)
02.04.2023 20:48:30
Dass Abs aus einem DateTime-Wert ein Nichts erzeugt, halte ich auch für ein Gerücht, das sich nur schwer beweisen lässt.

Ich komme mir einfach nur veräppelt vor und breche da lieber ab.
Mit freundlichem Glück Auf!

Eberhard
  •  

Andreas Irmer

Eberhard,

jetzt reicht es aber langsam.

Die Berechnung Zeit1 - Zeit2 funktioniert ja aber DIE ABFRAGE NICHT

Und eben weil das nicht funktioniert, habe ich das eben probiert.
 
If (rst!GeandertAm - objAppointmentItem.LastModificationTime) > (1 / 96) Then
wird auch mit Werten von 00:00:17 mit ja beantwortet.

Jetzt würde ich mich freuen, wenn Du aufhörst beleidigend zu sein, sondern konstruktiv!

Andreas Irmer
für jede Hilfe dankbar und für Tipps zum Thema Wohnmobil, Wohnwagen auch für jeden erreichbar
  •