Access-o-Mania

Access-Forum (Deutsch/German) => Access Programmierung => Thema gestartet von: smily68 am März 21, 2022, 20:49:07

Titel: Überlauf mit Do Until xxx.EOF / Loop; Meldung kein aktueller Datensatz
Beitrag von: smily68 am März 21, 2022, 20:49:07
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
Titel: Re: Überlauf mit Do Until xxx.EOF / Loop; Meldung kein aktueller Datensatz
Beitrag von: Beaker s.a. am März 22, 2022, 14:21:14
@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
Titel: Re: Überlauf mit Do Until xxx.EOF / Loop; Meldung kein aktueller Datensatz
Beitrag von: PhilS am März 22, 2022, 15:15:13
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.
Titel: Re: Überlauf mit Do Until xxx.EOF / Loop; Meldung kein aktueller Datensatz
Beitrag von: Beaker s.a. am März 22, 2022, 16:10:45
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.
Titel: Re: Überlauf mit Do Until xxx.EOF / Loop; Meldung kein aktueller Datensatz
Beitrag von: Maxel am März 22, 2022, 22:16:51
ZitatSet db = CurrentDb
Fällt db vom Himmel?
Titel: Re: Überlauf mit Do Until xxx.EOF / Loop; Meldung kein aktueller Datensatz
Beitrag von: ebs17 am März 23, 2022, 08:01:24
... 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.