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
@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
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.
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.
ZitatSet db = CurrentDb
Fällt db vom Himmel?
... 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.