LaufSumme -DomSumme- klappt überhaupt nicht
Hallo Access-ler ,
Ich krieg einfach keine laufende Summe in Access 2003 auf die Reihe.
Ich lade mal ne
Beispieldatei hoch, damit ihr seht wo ich hänge.
Trotz Google-Suche und inzwischen tagelang rumprobieren krieg ich keine laufende Summe für jeden Datensatz in der Abfrage hin.
Dabei war ich schon froh, eine laufende Nr hinzukriegen, die auch
gelöschte Datensätze aus der Haupttabelle wieder durch nummeriert.
Zeilensumme (Buchungssatz) ist ja noch einfach, aber schon bei Summe nach Datum gelang mir nur die Gesamtsumme eines Bereichs (im Beispiel "EinHaben") aber nicht nach Datensatz und schon gar nicht zusammen mit "AusSoll".
Mir wäre am liebsten neben der Spalte "Buchsumme" eine mit "LaufSumme" in der eben der Saldo nach jeder Buchung erscheint (wie bei einem Kontoauszug)
In Excel hab ich das schon, aber mit access hätte ich bessere Möglichkeiten zur weiteren Bearbeitung.
Wer kann helfen?
Einer meiner Versuche wird mit Fehler 3075 - Syntaxfehler (Komma) in Abfrageausdruck – abgelehnt:
Format(DomSumme("EinHaben";"Abrechnung";"[AbrNr]<=" & [EinHaben] & "");"0.000,00 Euro")-("AusSoll";"Abrechnung";"[AbrNr]<=" & [AusSoll] & "";"0.000,00 Euro")
Und da blick ich nicht mehr wirklich durch :-(
Danke für die Hilfe
Antwort schreiben
Antwort 1 von Paul1 vom 19.08.2022, 23:09 Options
Hallo!
In einer Abfrage mit herkömmlichen Rechenfunktionen einen Saldo hinzubekommen ist mir leider nicht gelungen, zumal immer der Hinweis (Fehlermeldung) kam ich hätte ein Feld nicht mitgenommen.
Die Tagesumsätze jedoch hab ich auch hingebracht.
Ich glaube, dass ist nur mit Programmierung zu lösen, aber davon habe ich leider keine Ahnung.
In einem Bericht wäre es zu machen (da gibt es aber keine Datenblattansicht):
>Bericht Entwurfsansicht
>Im Detailbereich dementsprechendes Feld anklicken
>Steuerelementinhalt Formel eingeben:
=[Einnahmen] - [Ausgaben]
>anschließend In den Eigenschaften des Textfeldes
>"Laufende Summe". auswählen
>auf "Über Alles" stellen
Im Bericht ist dann in jeder Zeile der Tagessaldo zu sehen.
Eine Lösung im Sinne der Frage kann ich leider nicht anbieten.
Schöne Grüße
Paul1
Hallo Paul1,
erst mal danke für deine Mühe - das geht schon so im Bericht wie von dir vorgeschlagen - siehe mein
Beispiel-Update.
Aber ich hätte schon gerne die Abfrage oder ein Formular mit diesem Ergebnis
Mit Hilfe dieses
Beitrags (aus der Google-Suche) habe ich versucht die Formel
DomSumme("C-D";"Tabelle";"DATUM<=" & ZLong([DATUM]))
(von Karl Donaubauer - die vorletzte Antwort des Threads) auf meine Tabelle wie folgt umzubauen:
DomSumme("EinHaben - AusSoll";"Abrechnung";"AbrDatum<=" & ZLong([AbrDatum]))
Was da jetzt dabei rauskam ist aber nicht wirklich –für mich- erhellend (siehe mein Beispielupdate).
Wie kann evtl. die LaufNr aus der Abfrage mit dem Datum so verbunden werden, daß sich die gewünschte Reihenfolge und korrektes Ergebnis - wie im Bericht - ergibt?
Kann jemand der anderen supportler weiter helfen?
Marie hat doch mal geschrieben ich soll fragen, fragen, fragen...
Nun, es dauert vielleicht immer etwas, bis ich durchprobiert hab und zum Feedback komme aber es kommt bestimmt :-)
Danke und Gruß
Gringo
Antwort 3 von Paul1 vom 20.08.2022, 19:09 Options
Hallo Gringo!
Deine Beispieldatei habe ich mir angesehen und mußte feststellen, daß alles sehr gründlich aufbereitet ist.
Ich könnte sogar damit leben, daß im Formular der Saldo "nur" per Tag aufgelistet wird (das ist ja schon was!).
Deine Vorstellung ist aber, dass auch innerhalb eines Tages neben jeder Bewegung (Datensatz) ein Saldo ausgeworfen wird, am liebsten in einer Abfrage und im Formular.
Dazu wäre eine Formel mit Einbeziehung der LaufNr.(in der Beispieldatenbank, Felddatentyp Autowert und mit einem Primärschlüssel versehen) erforderlich.
Wie bereits erwähnt habe ich diesbezüglich derzeit noch keine Ahnung, aber ich habe die Absicht es zu lernen.
Auch bei Recherchen im Web konnte ich kein ähnliches Problem mit Lösungsvorschlägen finden.
Wie Du schon angesprochen hast, wären für dieses Problem versiertere AntworterInnen gefragt.
Ich bin überzeugt, dass es hierfür auch eine Lösung gibt.
Schöne Grüße
Paul1
Hallo Paul1,
Danke dir schon mal mit der Beschäftigung meines Problems. Auch ich bin ja ein Access-Neuling und dabei, mir so nach und nach die Thematik anzueignen.
Und da braucht man schon ab und an Hilfe :-)
Das mit der LaufNr hast du schon richtig erkannt (das sie in der Saldo-Formel mit dem Datum verknüpft werden muß), da es ja für ein Tagesdatum auch mehrere Buchungen geben kann.
Schwierigkeiten bei der Saldoberechnung mit der Primär-ID entstehen dann, wenn ein Datensatz mal gelöscht wird, da mit Felddatentyp "Autowert" natürlich diese Zahl nicht mehr ersetzt wird.
Folglich würde der gesamte Saldo nicht mehr stimmen.
Daher habe ich (nach längerer Web-Suche)
diese Seite gefunden und hier speziell "FAQ 3.11: Laufende Nummer/Summe in Abfragen" für meine Abfrage!
- also nicht in der Tabelle – bearbeitet.
Wenn du die abf in meiner Beispiel-Update-db in der Entwurfsansicht öffnest siehst du eine Formel im Feld
"LaufNr" der Abfrage! für die DomAnzahl einer fortlaufenden Nummer die sich zwar auf die
"AbrNr" der Tabelle bezieht, aber im Gegensatz zu deren "Autowert" bei einem gelöschten Datensatz in der Tabelle, die
"Laufnr" in der Abfrage beim folgenden Datensatz wieder anschließen läst.
Zu sehen in diesem Datensatz:
Feldnamen: "AbrDatum" 04.02.2010, "EinHaben" 20,00 €
In der Tabelle hat dieser Datensatz die "AbrNr 3" und der Datensatz von 151,00 € zum gleichen Datum die "AbrNr 1" (hier wurde ein Datensatz dazwischen gelöscht). In der Abfrage hat derselbe Datensatz ("AbrDatum" 04.02.2010, "EinHaben" 20,00 €) aber die richtige Reihenfolge und so die "LaufNr 2"
Nun sollte es möglich sein (und ist auch möglich) diese "LaufNr" aus der abf in Verbindung mit AbrDatum sowie Ein- und Ausgang einen fortlaufenden Saldo pro Datensatz zu errechnen und anzuzeigen.
Nur da bin ich eben bis dato (wie man am Formular sieht) noch nicht wirklich durchgestiegen.
Die einzelnen Datensätze beinhalten verschiedene Positionen und durch gezielte Abfragen können Bestände sowohl nach Haben- als auch nach Soll-Summen (bezahlt oder noch nicht bezahlt) abgefragt werden, daher die einzelnen Datensätze pro Position. In der Beispiel-db sind diese natürlich nicht extra aufgeführt, da sie für diese Anfrage (nach meiner Meinung) nicht relevant sind.
Vielleicht fällt ja dir oder anderen Supportlern nach dieser Erklärung noch etwas dazu ein
MfG
Gringo
Antwort 5 von Paul1 vom 21.08.2022, 20:10 Options
Hallo Gringo!
Du wirst es nicht glauben, ich bin draufgekommen.
In der Entwurfsansicht der Abfrage muß folgende Formel stehen, zumal ja in der Lauf Nr auf die AbNr.bezug genommen wurde:
LaufSumme:DomSumme("EinHaben-AusSoll";"Abrechnung";
"AbrNr<=&ZLong([AbrNr]))
oder einfach das in der vorherigen Formel angegebene " Abr.Datum" durch "AbrNr" ersetzen.
Es ist jetzt der Saldo in jeder Zeile der Abfrage ersichtlich, so wie Du es wolltest.
Ich habs getestet und es hat funktioniert.
Wie das eventuell mit dem Formular geht, muß ich mir erst anschauen.
Schöne Grüße
Paul1
Antwort 6 von Marie vom 22.08.2022, 15:04 Options
Zitat:
Kann jemand der anderen supportler weiter helfen?
Marie hat doch mal geschrieben ich soll fragen, fragen, fragen...
Ja sorry, habe ich eben erst gelesen aufgrund deines Privatpostings. Dazu muss ich folgendes sagen:
Erstens lade ich mir grundsätzlich keine fremden Datenbanken auf den Rechner,
zweitens könnte ich vermutlich Deine Datenbank gar nicht öffnen, je nachdem welche Version Du hast,
drittens ist das ein Forum, wo die Fragen und Antworten bestehen bleiben und Deine hochgeladene Datenbank ist nach 120 Tagen weg, also kann keiner mehr mit der Antwort etwas anfangen.
Ich mache hier Support auch für diejenigen, die später mal dasselbe Problem haben wie Du und ärgere mich persönlich tierisch, wenn ich selbst mal was suche, finde mein Problem mehrfach im Internet und die zugehörigen Antworten sind nicht brauchbar, weil überall auf tote Links verwiesen wird.
Zitat:
Einer meiner Versuche wird mit Fehler 3075 - Syntaxfehler (Komma) in Abfrageausdruck – abgelehnt:
Format(DomSumme("EinHaben";"Abrechnung";"[AbrNr]<=" & [EinHaben] & "");"0.000,00 Euro")-("AusSoll";"Abrechnung";"[AbrNr]<=" & [AusSoll] & "";"0.000,00 Euro")
Und da blick ich nicht mehr wirklich durch :-(
Diesen Syntaxfehler kann ich Dir sicher beheben, wenn Du mir mal schreibst was das für Felder sind (Textfelder, Zahlenfelder?), wenn es eine Abfrage ist wäre mir der SQL-Ausdruck lieber. Ich könnte mir vorstellen, dass der Fehler hier ist: "[AbrNr]<=" & [EinHaben] , dahinter und davor hast Du Schlussstriche. Aber ich habe halt keine Ahnung was [EinHaben] ist (Tabellenfeld, Formularfeld??). Und wo steht diese Abfrage?
gruß marie
Antwort 7 von Marie vom 22.08.2022, 15:17 Options
Äh, irgendwelche Felder müssten auch Datumsfelder sein, keine Ahnung welche. Ich muss dazusagen, ich habe von Buchhaltung nicht die Bohne einer Ahnung. Wäre super, wenn Du einfach ein Beispiel dazuschreibst. Also welche Daten Du wo eingibst und was das Ergebnis sein müsste.
Gruß marie
Antwort 8 von RaHi vom 22.08.2022, 17:39 Options
Hallo Hobby-Sammler,
ich lade DBs und finde es hilfreich, nicht alles verbal beschreiben zu müssen, und wozu gibt es Virenscanner. OK, soviel dazu.
Ich will mal ganz anders anfangen. Die Sache mit DSum etc. ist furchtbar ineffektiv! Mein Ansatz geht über ein kleines Modul mit einer Prozedure "calcSaldo". Ich habe in deine Tabelle "Abrechnung" noch ein Feld "Saldo" vom Typ Währung aufgenommen. Die Prozedur berechnet dann den Saldowert (Sortiert nach AbrDatum und Abrnr) und legt die laufende Summe in dem Feld "Saldo" ab. Die Berechnung ist schnell und effektiv, gerade bei vielen Datensätzen. Der Nachteil: Du muss, nachdem neue Daten eingegeben worden sind, den Soaldo neu berechnen. Dies kann z.B. vor dem Aufruf eines Reports oder nach der Übernahme von Daten passieren. Hier die Prozedure:
Option Compare Database
Option Explicit
Public Sub CalcSaldo()
Dim rec As New ADODB.Recordset
Dim tmpSaldo
tmpSaldo = 0
rec.Open "SELECT * FROM Abrechnung Order by AbrDatum, Abrnr", CurrentProject.Connection, adOpenDynamic, adLockOptimistic
While Not rec.EOF
tmpSaldo = tmpSaldo + rec!Einhaben - rec!Aussoll
rec!saldo = tmpSaldo
rec.Update
rec.MoveNext
Wend
rec.Close
Set rec = Nothing
End Sub
Falls zu Fragen dazu hast, melde dich.
Gruß
Ralf
Hallo Marie,
danke erst mal für deine Antwort. Tja so unterschiedlich sind die supportler hier …
Einer will 'ne Beispieldatei, andere wieder nicht – wobei ich deine Begründung aber durchaus verstehe und auch nachvollziehen kann.
Daher Antwort1: Ich habe Office 2003 pro
Nun versuch ich mal deine Fragen zu meiner Datei zu beantworten:
A-Die Tabelle
Beschreibung der Tabellenfelder:
1) Feldname: "AbrNr" Felddatentyp: "Autowert"
2) Feldname: "AbrDatum" Felddatentyp: "Datum/Uhrzeit" Format: " ttt tt mmm jjjj"
(hier sind meist mehrere Buchungen an einem AbrDatum)
3) Feldname: "BuchHinweis" Felddatentyp: "Text"
(die Art bzw. der Name der Verbuchung)
4) Feldname: "EinHaben" Felddatentyp: "Währung" Format: "Euro"
(bezahlte Artikel bzw. Buchungseingang)
5) Feldname: "AusSoll" Felddatentyp: Währung" Format: "Euro"
(gelieferte Artikel bzw. Buchungsausgang)
B-Die Abfrage
Beschreibung der Abfragefelder:
1) "LaufNr":
FeldCode:
LaufNr: DomAnzahl("AbrNr";"Abrechnung";" AbrNr<" & [AbrNr])+1
SQLCode:
SELECT DCount("AbrNr","Abrechnung"," AbrNr<" & [AbrNr])+1 AS LaufNr, Abrechnung.AbrDatum, Abrechnung.EinHaben, Abrechnung.AusSoll, ([EinHaben]-[AusSoll]) AS BuchSumme, DSum("EinHaben - AusSoll","Abrechnung","AbrDatum<=" & CLng([AbrDatum])) AS LaufSummeA
FROM Abrechnung;
2) "AbrDatum"
3) "EinHaben"
4) "AusSoll"
5) "BuchSumme" (hier wird die einzelne Datensatzsumme ausgegeben)
FeldCode:
BuchSumme: ([EinHaben]-[AusSoll])
6) LaufSummeA: (hier sollte eigentlich ein laufender Saldo erscheinen)
FeldCode:
LaufSummeA: DomSumme("EinHaben - AusSoll";"Abrechnung";"AbrDatum<=" & ZLong([AbrDatum]))
Es sind in der Musterdatei 6 Datensätze belegt – Reihenfolge der Felder:
Tabelle: AbrNr – AbrDatum – BuchHinweis – EinHaben – AusSoll
1) 1 - Mo 04 Jan 2010 - Artikel 1 - 151,00 € - 0,00 €
2) 3 - Mo 04 Jan 2010 - Artikel 2 - 20,00 € - 0,00 €
3) 4 - Di 05 Jan 2010 - Artikel 1 - 0,00 € - 225,00 €
4) 5 - Di 05 Jan 2010 - Artikel 1 - 1.180,00 € - 0,00 €
5) 6 - Di 05 Jan 2010 - Artikel 1 - 0,00 € - 485,30 €
6) 7 - Mi 06 Jan 2010 - Artikel 2 - 0,00 € - 3,50 €
Abfrage: LaufNr – AbrDatum – EinHaben – AusSoll – BuchSumme - LaufSummeA
1) 1 - Mo 04 Jan 2010 - Artikel 1 - 151,00 € - 0,00 € - 151,00 € - 171
2) 2 - Mo 04 Jan 2010 - Artikel 2 - 20,00 € - 0,00 € - 20,00 € - 171
3) 3 - Di 05 Jan 2010 - Artikel 1 - 0,00 € - 225,00 € - -225,00 € - 640,7
4) 4 - Di 05 Jan 2010 - Artikel 1 - 1.180,00 € - 0,00 € - 1.180,00 € - 640,7
5) 5 - Di 05 Jan 2010 - Artikel 1 - 0,00 € - 485,30 € - 485,30 € - 640,7
6) 6 - Mi 06 Jan 2010 - Artikel 2 - 0,00 € - 3,50 € - -3,50 € - 637,2
Bis hier war ich bei meiner Anfangsfrage im supportnet und es kam zu diesen falschen Berechnungen.
Mit der umgestellten Formel von Paul1 - FeldCode:
LaufSummeB: DomSumme("EinHaben-AusSoll";"Abrechnung";"AbrNr<=" & ZLong([AbrNr]))
Wurde zwar das Ergebnis in "LaufSummeB" (hab ne neue Spalte genommen) korrekt als Zahl dargestellt - Danke Paul! - , scheint aber als Text so formatiert zu sein,das ich kein Währungsformat mehr einstellen kann.
In der Entwurfsansicht bleibt unter "Eigenschaften" --> das Auswahlfenster "Format" leer (sowohl in der Abfrage ais auch im Formular)
Jedenfalls danke ich erst mal bis hierher für alle Hilfe und hoffe doch noch, das auch die letzte "Kleinigkeit" noch gut behoben werden kann.
Gruß und noch einen schönen Rest-Sonntag
Gringo
@Ralf,
Danke auch dir erst mal ein für deine Mühe :-)
Ich wäre wirklich froh, wenn ich schon ein wenig Ahnung von VBA hätte (deine Prozedur ist doch VBA oder?)
Wo und wie muß dieses "kleine Modul" eingetragen werden?
Bisher war ich auch immer der Meinung, Berechnungen in access sind nur in Abfragen, Formularen oder Berichten möglich und nicht in den Tabellen.
Aber scheinbar ist mit VBA doch einiges möglich ...
Könntest du mir nicht die db mit deiner Änderung zukommenlassen?
Dann kann ich mich intensiver damit auseinander setzen :-)
Auch dir wünsche ich noch einen schönen Sonntag abend sowie allen anderen supportlern
Gruß
Gringo
Antwort 11 von Marie vom 22.08.2022, 18:16 Options
Zitat:
ich lade DBs und finde es hilfreich, nicht alles verbal beschreiben zu müssen, und wozu gibt es Virenscanner. OK, soviel dazu.
@Rahi. ich habe ihm doch nur geantwortet, weil er mich persönlich angesprochen und privat angeschrieben hat.
Dass ich die Datei gar nicht lesen könnte, weil Ich kein Access 2003 auf diesem Rechner habe, hast Du ignoriert.
Und wenn das hier auch einreißt, dass die Leute aufgefordert werden Dateien hochzuladen, dann macht mir das hier keinen
Spaß mehr.
Gruß Marie
Antwort 12 von Marie vom 22.08.2022, 19:01 OptionsLösung
Okay, ganz einfach, ZCurrency vor DomSumme. habs mal LaufSummeC genannt:
LaufSummeC: ZCurrency(DomSumme("EinHaben-AusSoll";"Abrechnung";"AbrNr<=" & ZLong([AbrNr])))
oder in der SQL:
CCur(DSum("EinHaben-AusSoll","Abrechnung","AbrNr<=" & CLng([AbrNr]))) AS LaufSummeC
Gruß marie
Antwort 13 von RaHi vom 22.08.2022, 19:11 Options
Hallo Hobby-Sammler,
das Datenbankfenster hat nebem Abfragen und Tabellen auch eine Rubrik "Module". Gehe dort rein und erstelle ein neues Modul und füge den Text aus meinem Posting ein (erste Zeile sollte danach nicht doppelt drin stehen). Gehe mit den Cursor zunächst in eine Zeile der Prozedure (z.B. tmpSaldo = 0) und drücke die Taste "F5". Zuvor solltest du natürlich das Saldofeld in deiner Tabelle aufgenommen haben.
Du wirst bei der Ausführung mit "F5" nicht viel sehen. Wenn du aber die Tabelle neu öffnest, wird die Saldo-Spalte gefüllt sein. Ob korrekt muss du prüfen.
Wie du die Prozedure dann in deiner MDB automatisch ansprichst, hängt davon ab, wie die Daten in deine Tabelle kommen. Übernimmst du die Daten aus einem Textfile? Brauchst du den Saldo nur zur Anzeige in einem Bericht? Gibst du die Daten manuell ein und benötigst du den Saldo dann nach jeder Eingabe mit dem neuen Wert?
@Marie: Ich gebe dir recht, wenn nur eine MDB eingestellt wird, nutzt dies wirklich keinem hier und ich hätte dann auch keine Lust darauf. Die verbale Beschreibung ist absolut notwendig. Als unterstützende Hilfe, ist es gerade bei einer Beantwortung aber sehr hilfreich, die MDB zu haben. Man muss die Sachen nicht alle anlegen, um die Fehler ggf. nachvollziehen zu können.
Gruß
Ralf
Hallo @Marie,
das wars – was die von mir befragte Formel betrifft.
Kannst du mir vielleicht noch erklären was dieses "Zcurrency" vor "DomSumme" bewirkt und warum in der Formel von Paul1 keine Formatierung in Währung möglich ist?
Das Ergebnis deiner Formel stimmt auf jeden Fall korrekt und ich bedanke mich nochmals extra für die Hilfe.
@Paul1,
Ich nehme mal an, das du auch diesen thread weiter verfolgt hast und nun, genau wie ich, um eine Erfahrung (eigentlich sogar Zwei – mit der Lösung von RaHi) reicher geworden bist.
Ich denke mal wir können uns auch weiterhin gegenseitig versuchen zu helfen und beim "nicht Weiterkommen" die größeren Profis befragen.
Jedenfalls auch dir mein Danke, schließlich hast du den entscheidenden Anstoß für die Umstellung meiner Formel gegeben.
@RaHi,
dir danke ich für das neue Feld, auf das du mich mit diesem ersten Schritt geführt hast. Ich werde das mal gründlich durchprobieren und dann nochmal berichten.
Von der DomSummen-Formel her, die Ausgang meiner Anfrage war, hat Marie mir den richtigen Code geschrieben.
Zu dem kleinen Disput bezüglich einer hochgeladenen Datei stimme ich sowohl Marie zu als auch dir im Sinne deiner Antwort an Marie aus Antwort 13.
und nun weiter frisch in eine neue Woche :-)
Gruß
Gringo
- mein Nickname ist mein Vorname plus einer Abkürzung
für "Greenhorn" – in access ;-)
Antwort 15 von Marie vom 24.08.2022, 01:26 Options
Zitat:
Kannst du mir vielleicht noch erklären was dieses "Zcurrency" vor "DomSumme" bewirkt und warum in der Formel von Paul1 keine Formatierung in Währung möglich ist?
<Zitat>Sie können Ihren Code mit Hilfe der Funktionen zum Umwandeln von Datentypen dokumentieren, um anzuzeigen, daß das Ergebnis einer Operation einen bestimmten, vom Standarddatentyp abweichenden Datentyp haben soll. Mit CCur können Sie zum Beispiel Berechnungen explizit im Währungsformat durchführen, die normalerweise ganzzahlige Werte oder Werte einfacher bzw. doppelter Genauigkeit verwenden würden. Die CCur-Funktion stellt eine Alternative zu Val dar, die international gültige Umwandlungen eines beliebigen Datentyps in einen anderen ermöglicht. So werden zum Beispiel durch die Verwendung von Ccur verschiedene, vomGebietsschema des Computers abhängige Dezimalzeichen ebenso erkannt wie unterschiedliche Tausendertrennzeichen und Währungseinstellungen. </Zitat>
Hab Dir das einfach mal hier reinkopiert.
Gruß marie