Neuigkeiten:

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

Mobiles Hauptmenü

Überlauf mit Do Until xxx.EOF / Loop; Meldung kein aktueller Datensatz

Begonnen von smily68, März 21, 2022, 20:49:07

⏪ vorheriges - nächstes ⏩

smily68

Guten Abend

Beim meinem Script versuche ich Daten in eine Tabelle zu schreiben. Dies funktioniert auch, aber es gibt immer einen Überlauf und es kommt am Schluss die Meldung: "kein aktueller Datensatz" Was ist falsch an meinem Code

Private Sub EndSaldo()
'Saldo des Jahresende pro Saldogruppe errechnen und in Saldotabelle eintragen

    Dim strDatumAnfang As String, strDatumEnde As String
    Dim dblEndSaldo As Double
    Dim rsGrp As DAO.Recordset, rsAnfangSaldo As DAO.Recordset, rsSaldoJahr As DAO.Recordset, rsEndSaldo As DAO.Recordset

    strDatumAnfang = "01.01." & Me.txtJahr
    strDatumAnfang = Format(strDatumAnfang, "\#yyyy\-mm\-dd\#")
    strDatumEnde = "31.12." & Me.txtJahr
    strDatumEnde = Format(strDatumEnde, "\#yyyy\-mm\-dd\#")
   
    Set db = CurrentDb
    Set rsGrp = db.OpenRecordset("SELECT * FROM tblSaldoGrp", dbOpenSnapshot)

    If rsGrp.RecordCount > 0 Then
        rsGrp.MoveFirst
        Do Until rsGrp.EOF
            Set rsAnfangSaldo = db.OpenRecordset("SELECT saldoGrp_Betrag FROM tblSaldo WHERE saldoGrp_Datum = " & strDatumAnfang & " AND saldoGrp_IDF = " & rsGrp!saldoGrp_ID, dbOpenSnapshot)
            Set rsSaldoJahr = db.OpenRecordset("SELECT * FROM qrySaldoBuchungTot WHERE Jahr = " & Me.txtJahr & " AND saldoGrp_IDF = " & rsGrp!saldoGrp_ID, dbOpenSnapshot)
            Set rsEndSaldo = db.OpenRecordset("SELECT * FROM tblSaldo WHERE saldoGrp_Jahr = " & Me.txtJahr & " AND saldoGrp_IDF = " & rsGrp!saldoGrp_ID & " AND saldoGrp_Art = 'ES'", dbOpenSnapshot)
            If rsSaldoJahr.RecordCount > 0 Then
                dblEndSaldo = rsAnfangSaldo!saldoGrp_Betrag + rsSaldoJahr!SummevonBetrag
            Else
                dblEndSaldo = rsAnfangSaldo!saldoGrp_Betrag
            End If
               
            If rsEndSaldo.RecordCount > 0 Then
                db.Execute "Update tblSaldo SET saldoGrp_Betrag = '" & dblEndSaldo & "' WHERE saldoGrp_Jahr = " & Me.txtJahr & " AND saldoGrp_IDF = " & rsGrp!saldoGrp_ID & " AND saldoGrp_Art = 'ES'"
            Else
                db.Execute "INSERT INTO tblSaldo (saldoGrp_IDF, saldoGrp_Datum, SaldoGrp_Jahr, saldoGrp_Betrag, saldoGrp_Art) Values (" & rsGrp!saldoGrp_ID & ", " & strDatumEnde & ", " & Me.txtJahr & ", '" & dblEndSaldo & "', 'ES')"
            End If
           
            Set rsAnfangSaldo = Nothing
            Set rsSaldoJahr = Nothing
            Set rsEndSaldo = Nothing
           
            rsGrp.MoveNext
        Loop
    End If

    Set rsGrp = Nothing
    Set db = Nothing


End Sub

Beaker s.a.

@smily68
Zum Code gäbe es schon etwas zu schreiben. Da der aber vermutlich
grösstenteils unnötig ist, lass ich das erstmal. Ausser einer Anmerkung
zum RecordsetType. Wenn ich es beim schnellen Nachlesen richtig
verstanden habe, könnte "dbOpenSnapshot" das Problem sein; -
versuche es mit "dbOpenDynaset".
Ansonsten könnte ein Designfehler im Datenmodell vorliegen, müsste
man das Beziehungsfenster sehen.
Salden speichert man aber normalerweise nicht in einer Tabelle. Die
lassen sich für beliebige Zeiträume immer aus einer korrekt designten
und gefüllten Bewegungstabelle ableiten. Die Ausnahme wäre in einer
FiBu, wo man am Ende des Jahres die Salden der Konten entweder auf
Sammel- oder Abschlusskonten umbuchen muss.
Dazu würde ich als Basis wohl eine gruppierte Abfrage verwenden
Zitat'Saldo des Jahresende pro Saldogruppe errechnen

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)

PhilS

Die Double-Werte in den SQL-Strings dürften Probleme machen, weil das Komma als Dezimaltrennzeichen verwendet wird.


Eine Ursache für einen Überlauf sehe ich nicht. Ich habe den Verdacht, dass das nur ein Folgefehler ist.
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

Beaker s.a.

War mir gar nicht aufgefallen. Aber ja, "Double" ist eh für kaufmännische
Anwendung der am schlechtesten geeignete Datentyp. "Integer" für Mengen,
wenn nicht Teilmengen < 1 vorkommen, ansonsten "Currency". Der ist genau
genug und man umgeht die Fliesskommaproblematik.
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)

Maxel

Viele Grüße
Maxel

ebs17

... SET saldoGrp_Betrag = '" & dblEndSaldo & "' ...Kannst Du die Textverwendung eines Double-Wertes erklären?
Wenn das Ziel-Tabellenfeld ebenfalls vom Typ Double ist, würde ich bereits einen Laufzeitfehler erwarten.

Bei der Frage nach falsch würde ich eher die Gegenfrage stellen: Warum so ein unübersichtliches Gekreisel mit vielen Recordsetobjekten (und offenbar unbeherrscht) statt einer einzigen richtigen Abfrage (Auswahlabfrage für alle Salden aller Gruppen und Jahre).
Tabelleneinträge erfolgen doch sicher nur, weil das einmalige sofortige Berechnen nicht gelingen mag.
Mit freundlichem Glück Auf!

Eberhard