September 27, 2022, 23:25:24

Neuigkeiten:

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


Programm funktioniert nur beim ersten Mal

Begonnen von Canarito, November 10, 2021, 22:25:55

⏪ vorheriges - nächstes ⏩

Canarito

Durch Anklicken und Aktualisierung eines logischen Feldes wird ein Programm aufgerufen. Dieses läuft problemlos beim allerersten Mal. Bei weiteren Aufrufen wird lediglich das Feld aktualisiert, der Programmablauf wird ignoriert. Hat jemand eine Idee ?

MzKlMu

Hallo,
und wie genau (Code) ist das realisiert ?
Gruß
Klaus

ebs17

ZitatHat jemand eine Idee ?
Das beschriebene Verhalten wird gewünscht und so programmiert sein.
Wenn Du andere Wünsche hast, musst Du umprogrammieren.
Mit freundlichem Glück Auf!

Eberhard

Beaker s.a.

Kann es mir nicht verkneifen
ZitatDie Antwort auf die Große Frage ..."
,,Ja...!"
,,... nach dem Leben, dem Universum und allem ..."
,,Ja ...!"
,,... lautet ..."
,Ja ...!"
,,... lautet ..."
,,Ja ...!!! ... ??"
,,Zweiundvierzig."
--
Beaker s.a., der lieber an seinem eigenen Projekt arbeiten würde/sollte, aber irgendwie immer gerne seinen Senf dazu gibt ;-)
S.M.I².L.E.

Canarito

November 11, 2021, 22:28:05 #4 Letzte Bearbeitung: November 11, 2021, 22:32:12 von MzKlMu
Hallo MzKIMU, hier der Code:

Private Sub Rgzurueck_AfterUpdate()
Dim db As DAO.Database
Set db = Application.CurrentDb
Dim rst0 As DAO.Recordset
Dim rst As DAO.Recordset
Set rst = CurrentDb.OpenRecordset("SELECT rgnr_act, zaehler from tbl_rgnr_actual")
Set rst0 = CurrentDb.OpenRecordset("SELECT rgnr, orgfactura, rgzurueck, rgdatum from tbl_auftrag")
Dim Mrgnr As Variant
rst0.MoveLast
Do While rst0.Fields(3) = Date
If rst0.Fields(2) = True And rst0.Fields(3) = Date Then
rst0.Edit
    Mrgnr = rst0.Fields(0)
    If rst0.Fields(1) = 0 Then
    rst0.Edit
        rst0.Fields(1) = rst0.Fields(0)
    rst0.Update
        rst.MoveFirst
        rst.Edit
        rst.Fields(0) = Mrgnr
        rst.Fields(1) = rst.Fields(1) + 1
        rst.Update
    End If
    rst0.Edit
        rst0.Fields(0) = 0
    rst0.Update
End If
rst0.MovePrevious
Loop
Set rst = Nothing
Set rst0 = Nothing
Set db = Nothing
End Sub

Canarito

Hallo ebs17,
wenn das Programmverhalten so gewünscht wäre, hätte ich kein Problem und würde mich nicht an Euch wenden.

Canarito

Hallo Beaker s.a.,
meinst Du wirklich, Dein Kommentar sei in irgendeiner Hinsicht konstruktiv oder hilfreich? Ich wende mich an Euch, weil ich ein Problem habe und nicht, weil ich Unterhaltung brauche.

Xoar

Setz mal in VBA nen Haltepunkt am Anfang der Sub und schaue warum er beim zweiten Mal überspringt. Mit F8 gehst Du immer ein Schritt weiter.

Sollte der Haltepunkt nicht angesprochen werden, ist evtl. das Ereignis falsch.


ebs17

Programmablauf ...?
ZitatDo While rst0.Fields(3) = Date
If rst0.Fields(2) = True And rst0.Fields(3) = Date Then ...
Die Schleife wird nur ausgeführt, wenn Tabellendaten die Bedingungen erfüllen, wobei die markierte Doppelprüfung zusätzlich wenig Sinn macht.
Also müsstest Du Deine realen Tabellendaten in eine Betrachtung einbeziehen.

Im Recordset rst wird immer der eine Datensatz bearbeitet. Wenn sich da ein Eingangswert nicht ändert, ist das ein Überschreiben mit sich selbst, womit man kaum eine Änderung bemerken wird.

Dim db As DAO.Database
Set db = Application.CurrentDb
Wofür dieses? Benutzt wird die Variable nicht.

Dafür fehlt das Schließen der Recordsets, was sich "plötzlich und überraschend" als Problem hinzugesellen könnte.
Den eigentlichen Sinn der Maßnahme kann man nicht beurteilen.
Mit freundlichem Glück Auf!

Eberhard

Canarito

Danke für die Anregungen!
Das logische Feld, das angeklickt wird, um es auf TRUE zu setzen, ruft gleichzeitig die Prozedur auf. Ich habe festgestellt, dass die Prozedur aufgerufen wird nach Anklicken des Feldes aber VOR dessen Aktualisierung, obwohl sie laut Programmierung aufgerufen werden soll "nach Aktualisierung". Ich finde den Fehler nicht!

ebs17

In Deinen Recordsets fragst Du Werte aus Tabellen ab. Die Aktualisierung des Wertes eines gebundenen Steuerelements im Formular wird aber nicht unmittelbar in der Tabelle gespeichert.

Gespeichert werden immer Datensätze, automatisch z.B. bei Datensatzwechsel. Notfalls muss man eine Speicherung explizit veranlassen, um sofort mit dem geänderten Wert arbeiten zu können:
' erste Zeile im Code
If Me.Dirty Then Me.Dirty = False
Mit freundlichem Glück Auf!

Eberhard

Canarito

Hallo Eberhard,
if Me.[...] then me.[...] = TRUE
mit anschliessendem REFRESH
funktioniert! Vielen Dank für Eure Hilfe !!!

Canarito

Da habe ich mich zu früh gefreut. Beim ersten Mal funktionierte es perfekt, danach wieder das selbe wie vorher.

MzKlMu

Hallo,
was ist denn die eigentliche Aufgabe des Codes?
Möglicherweise lässt sich diese ja mit einer einfacheren Methode erledigen.
Gruß
Klaus

Canarito

Ich habe das Problem gefunden, allerdings noch keine Lösung. Es sollen nur Datensätze des heutigen Tages gesucht und bearbeitet werden. Beim ersten Durchlauf funktioniert es einwandfrei. Allerdings wird an irgendeiner Stelle aus mir bisher unbekannten Gründen das Datum des Datensatzes überschrieben mit dem Datum plus der Uhrzeit. Bei nochmaligem Durchlauf ist dann das Datum der Tabelle <> DATE, woraus der Fehler resultiert. Das ist auch nicht zu verhindern durch Definieren des Datums der Tabelle als kurzes Datum ohne Uhrzeit.