Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Beträge im Endlosformular addieren

Begonnen von AbsolutNeu, Mai 04, 2014, 11:06:09

⏪ vorheriges - nächstes ⏩

AbsolutNeu

Hallo mal wieder,

mein Haushaltsbuch nimmt langsam (vorallem mühselig ;D) Gestalt an.

Meine letzte Aufgabe oder Wunsch ist es, in einem Formular in dem ich Einnahmen und Ausgaben eingebe und im Endlos - Unterformular die Daten anzeigen lasse, das dort der aktuelle Kontostand angezeigt werden soll.

Situation:
1. Tabelle für Konten:         ID      Kontoname       Startwert          StartDatum

2. Tabelle für Ein-Ausgabe   ID      Datum       KontoID     Kategorie     Betrag     

Im Endlosformular sollen folgende Informationen stehen:
ID      Datum       KontoID     Kategorie     Betrag        Kontostand (nach Ein/Ausgabe)

Sprachlich formuliert würde das so lauten:(meiner Meinung nach)
Addiere alle Ein/Ausgaben der Tabelle EinAusgaben, die die aktuelle KontoID haben und bei denen das Datum <= dem Datum des aktuellen Datensatzes ist und addiere den Startwert des Kontos.

Zuerst habe ich versucht im Endlosformular einem Textfeld mit DSum den Wert zu ermitteln. Geht aber nicht, weil keine wirklichen Bezüge zu den Objekten im Endlosformular bestehen. Der erste Datensatz wird berechnet und in den anderen Feldern dann nur angezeigt.

Also muss ich eine Abfrage erstellen, die obiges filtert und in einem neuen Feld speichert. Diese Abfrage dient als Datensatzherkunft des Unterformulares. Auf dem ich das neue Feld anzeigen lasse.

Oder gibt es eine andere Lösung?

Wie kann ich obige Filterung realisieren?

Mfg
AbsolutNeu

MzKlMu

#1
Hallo,
der Startwert des Kontos sollte in die Tabelle mit den Ein und Ausgaben, als Kategorie Startwert. Der Startwert ist ja auch nichts anderes als einen Betrag, der natürlich auch negativ sein kann. Auch das Startdatum ist überflüssig, das ist das Buchungsdatum für die Kategorie "Startwert".
Wie speicherst Du den Betrag für Ausgaben, mit negativem Vorzeichen?

Der Saldo (=aktueller Kontostand) ist die Summe der Beträge, wenn die Ausgabe negativ gespeichert (oder berechnet) wird.

Dazu kannst Du einfach im Fuß des Endlosformulars eine Feld anlegen mit
=Summe(Betrag)

Mehr benötigst Du nicht, Du benötigst weder eine Abfrage noch sonst irgendwelche Hilfsfunktionen,  korrekter Aufbau der DB vorausgesetzt.

Gruß Klaus

AbsolutNeu

Hallo MzKlMu,

die Idee mit dem Startwert ist einfach aber genial. Den Betrag speichere ich als Währung. Keine separate Speicherung der negativen Beträge. Oder ist das wichtig?

Was vielleicht nicht so rüber gekommen ist,

1. ich habe mehrere Konten (Sparbuch, Girokonto, Portemonnaie....)

2. möchte ich im Endlosformular nach jeder Buchung den neuen Kontostand sehen. (Damit kann ich besser die Buchungen kontrollieren. So habe ich es zur Zeit noch in Excel - leider mehrere einzelne Tabellen - daher Access)

Mfg
AbsolutNeu

MzKlMu

Hallo,
ZitatKeine separate Speicherung der negativen Beträge. Oder ist das wichtig?
und wie unterscheidest Du die Einnahmen von den Ausgaben?
Gruß Klaus

AbsolutNeu

hallo MzKlMu,

ich habe gedacht, man unterscheidet den Betrag unter 0 Ausgabe und über 0 als Einnahme. Deiner Frage nach, sollte ich also anders machen.

1. Möglichkeit: Für Einnahmen und Ausgaben je ein Feld

2. Möglichkeit: Ein Feld mit Text Einnahme oder Ausgabe

Welche Möglichkeit ist sinnvoller ?

Mfg
AbsolutNeu

PS.:Ich bin froh das mich das mit dem Kontostand noch gestört hat, so sind noch ein paar Unstimmigkeiten in meiner Datenbank sichtbar geworden. Ich wollte schon meine Buchungen für dieses Jahr eintragen :o

DF6GL

Hallo,

warum orientierst Du Dich denn nicht daran, wie auch Dein Bankkonto (Buchungen)  geführt wird?
Dort sind Einnahmen positiv und Ausgaben negativ in EINEM Feld geführt.

Zudem ist die Kennzeichnung eines Kontos (Kontonummer) sowie die Kennzeichnung der "Verwendung" vorhanden.  Soll heißen, es sind (mindestens) solche Tabellen erforderlich:



tblKonten
tblVerwendung (wenn "strukturiert" erfasst werden soll/kann)
tblBuchungen 
tblBuchungsarten (z.B.  Bar, Überweisung, etc.)

in tblBuchungen finden sich neben dem Primärschlüssel(feld) die Fremdschlüssel zu den Primärschlüsseln der anderen Tabellen , das Betragsfeld, das (Buchungs-)Datumsfeld und evtl. weitere Felder wie "Bemerkung" oder sonstige Felder, die eine bestimmte Buschung weiter beschreiben..


Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

AbsolutNeu

Hallo Franz,

ich versuche mal dein Konzept zu verstehen und umzusetzen.
Ich brauche forlgende Tabellen:
1. Tabelle Depot (Portemonnaies haben ja keine Kontonummer)
ID       Bezeichnung              Besitzer     KontoID

2. Tabelle Konten
ID       IBAN                   swiftbic               Name

3. Tabelle Verwendung (ich habe Kategorien, Unterkategorien und Firmen abhängig; je eine Tabelle mit Zwischentabellen gespeichert für abhängige Kombinatoinsfelder) die könnte ich hier speichern.

ID      Kategorie            Unterkategorie           Firma

4. Tabelle Buchungen
ID       Datum           DepotID             VerwendungID            Betrag

Die Tabelle Buchungsarten möchte ich mir sparen, da ich durch die Zuordnungen der Kategorien zum Beispiel Dauerauftrag - GEZ - Gebührenzentrale zuordnen kann und im Portemonaie sind die Ausgaben immer bar.

Soweit sind die Tabellen auch vorhanden.

ZitatDort sind Einnahmen positiv und Ausgaben negativ in EINEM Feld geführt.
Davon bin ich auch ausgegangen. Nur:
die Frage von MzKlMu
Zitatund wie unterscheidest Du die Einnahmen von den Ausgaben?

Machte mich stutzig.

Meine Frage ist halt, gibt es eine Möglichkeit, eine Abfrage zu erstellen, die mir die Summe der Beträge bis zum Datum des aktuellen Datensatzes in der Tabelle Buchungen unter der Berücksichtigung des Depots/Konto in einem neuen Feld berechnet / anzeigt?

Mfg
AbsolutNeu

P.:Ich führe gleich ein Ortswechsel durch, melde mich daher erst heute Abend wieder. Bis denne!

DF6GL

Hallo,

die Frage von Klaus sollte m. E. nur zur Klärung Deines Konzeptes beitragen und keinen Zweifel an der Verwendung EINES (Betrag)Feldes mit negativen/positiven Werten  darstellen.


Die Verbindung von Punkt 1 zu Punkt 2 erschließt sich mir gerade (noch) nicht...


Zur Frage:  klar gibt es die Möglichkeit:  Geh in den Abfrageentwurf, füge alle benötigten Tabellen hinzu, verknüpfe die, falls noch nicht geschehen und setz die entspr. Filter-Kriterien ein..  Wenn Berechnungen durchgeführt werden sollen, klick auf das Summenzeichen in der Icon-Leiste und definiere die Funktion für die Berechnung...
Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

AbsolutNeu

Hallo Franz,

Die Verbindung von 1. und 2. ist jetzt überflüssig geworden. (Ist mir auf der Fahrt klar geworden!). Ich hatte dort den Besitzer, die Bezeichnung, Startwert, Startdatum und KontoID gespeichert. Startwert und Startdatum habe ich ja durch die erste Buchung. Also ist es sinnvoller nur noch eine Tabelle zu nutzen, auch wenn ich bei Portemonnaie keine Zusatzinformationen brauche.

Ich hab bei meiner Datenbank schon öfter gezweifelt, das wird langsam zur Gewohnheit ;D

Nun zu Deiner Antwort:
Bei Abfragen habe ich noch viel Lernbedarf.

Mein Ziel:  ein Feld für jeden Datensatz in dem der aktuelle Kontostand nach der Buchung steht

Also nach meinem Vertsändnis kann ich nicht eine Auswahl Abfrage erstellen und dort die Kriterien eingeben, dann bleibt ja nur ein Datensatz übrig oder so.

Demnach muss ich ein berechnetes Feld nehmen. Nur wie so eine Berechnung aussehen soll, habe ich nicht die geringste Ahnung? :'(

Kannst Du mir da mal auf die Sprünge helfen?

Mfg
AbsolutNeu

MzKlMu

Hallo,
so, ich bin wieder da.
Zitatman unterscheidet den Betrag unter 0 Ausgabe und über 0 als Einnahme. Deiner Frage nach, sollte ich also anders machen.
nein, natürlich sollst Du das nicht anders machen. Eine Zahl unter 0 ist negativ und eine Zahl über 0 ist positiv.
Und das ist die Unterscheidung nach der ich gefragt habe.
Zitatein Feld für jeden Datensatz in dem der aktuelle Kontostand nach der Buchung steht
Ein Feld in jedem Datensatz ist doch überflüssig, es genügt doch ein Feld das nach jeder Buchung den aktuellen Kontostand errechnet und anzeigt.

Gruß Klaus

AbsolutNeu

Hallo MzKlMu,

Das mit den negativen und positiven Beträgen ist mir jetzt klar, war nur kurz unsicher.

Vielleicht habe ich mich falsch ausdgedrückt, ich wollte nicht ein neues Feld in der Tabelle anlegen, um dort den Kontostand zu speichern. Das macht ja keinen Sinn,  wenn ich eine Buchung dazwischen packe stimmt das alles nicht mehr.

Das berechnete Feld muss in einer Abfrage erscheinen.
Ich habe bis vorhin nicht mal gewußt, dass man bei einer Abfrage den Ausdrucksgenerator benutzen kann.

Meine Idee ist es halt mit dem Ausdrucksgenerator folgendes zu berechnen:

Summiere alle Beträge der tblBuchungen, die die gleiche KontoID haben und das Datum kleiner gleich dem vorhandenen Datensatzes ist.

Nur was ist, wenn ich an einem Tag 2 oder mehr Buchungen habe, dann wird die Datumsfilterung nicht helfen oder?

Wie würde man obige Filterung im Ausdrucksgenerator darstellen?
Und wo finde ich Beispiele Informationen zu dem Ausdrucksgenerator?

Mfg
AbsolutNeu

P.S:Melde mich morgen wieder. Für heute hatte ich genug Access. Obwohl ich das Problem gerne gelöst hätte. :D

MzKlMu

Hallo,
Du willst doch nur immer den aktuellen Kontostand wissen und dazu benötigst Du nur ein Feld, das nach jeder Buchung neu berechnet wird.

Das andere wäre eine laufende Summe und wenn Du diese willst, und Du mehrere Buchungen je Tag hast, muss im einfachsten fall auch die Uhrzeit zum Datum.

Im Anhang ein einfaches Beispiel.


Gruß Klaus

AbsolutNeu

Hallo,

da hast Du mir ein gutes Beispiel geliefert. Ich möchte auch gar nicht wissen, wie schnell das bei Dir geht.  :o

Ich habe aus dem Beispiel wieder einiges gelernt.

1. Es ist praktischer die Buchungen nach Konten zu filtern (hab ich bis jetzt noch nicht)
2. Das man bei Steuerelementeninhalt auch Formeln schreiben kann

Nur, was ich meinte, das hinter jeder einzelnen Buchung der Kontostand steht. Also hinter Deiner Bemerkung den Kontostand anzeigen.

Wenn das überhaupt möglich ist, dann brauche ich noch ein weiteres Feld in der Tabelle, in dem ich dann Datum und Uhrzeit der Eingabe speichere, um Buchungen am gleichen Tag zu unterscheiden.

Dann würde theoretisch die Berechnung so lauten:

Nimm alle Datensätze aus der Tabelle Buchungen, die die gleiche KontoID haben, <= Buchungstag und <= dem Eingabe Datum/Zeit

Aber ich weiß nicht wie ich das umsetzen soll!
Geht das überhaupt in einem Endlosformular?

Mfg
AbsolutNeu

MzKlMu

Hallo,
ZitatEs ist praktischer die Buchungen nach Konten zu filtern
wo siehst Du da einen Filter, ich habe keinen Filter verwendet.

Was Du willst ist eine laufende Summe.
ZitatGeht das überhaupt in einem Endlosformular?
das geht nur mit einem Endlosformular, bzw. macht nur damit Sinn.
Zitatdann brauche ich noch ein weiteres Feld in der Tabelle, in dem ich dann Datum und Uhrzeit der Eingabe speichere
nein, wozu ein weiteres Feld, in dem einen Feld mit dem Datum kannst Du auch die Zeit erfassen.

Für laufende Summe siehe hier:
FAQ 3.11 Laufende Nummer/Summe in Abfragen
Gruß Klaus

AbsolutNeu

Hallo mal wieder,

hat ein bisschen gedauert. Hab einiges gelesen und probiert. Der Tipp mit der laufenden Summe war richtig.

Das Grundprinzip ist doch einfacher als man denkt. Man erstellt seine Abfrage so wie man sie zu dem Endlosformular braucht, nach Datum sortiert. Dann erstellt man ein zusätzliches Feld mit folgendem Ausdruck: (alles in einer Zeile)

Kontostand:                                                                      'Feldname
(Select Sum (Betrag)                                                         'Nimm die Summe des Fedldes Betrag
FROM [tbl_Buchungen] as Temp                                         'von der Tabelle tbl_Buchungen und speicher die Tabelle temporär als Temp
WHERE [Temp].[KontoID]  = [tbl_Buchungen].[KontoID]    'Nimm die Beträge bei der die ID der Temp Tabelle = der Bungstabelle ist
AND [Temp].[EingabeDatumZeit] <= [tbl_Buchungen].[EingabeDatumZeit])   'und die EingabeZeit der Temp Tabelle kleiner gleich der                                                                                                                                Eingabezeit der Tabelle Buchungen

Nochmal zusammen:
(Select Sum (traBetrag) FROM [tbl_Buchungen] as Temp WHERE [Temp].[KontoID]  = [tbl_Buchungen].[KontoID] AND [Temp].[EingabeDatumZeit] <= [tbl_Buchungen].[EingabeDatumZeit])

In den meisten Beispielen wird nach der BuchungsID gefiltert, also <= BuchungsID. Das hat den Nachteil, bei einer nachträglichen Eintragung für ein älteres Datum hat man eine höhere ID und der Kontostand stimmt nicht mehr.

Wenn ich zu dem Buchungsdatum nur die aktuelle Zeit der Eingabe zurechne, könnte es passieren, (was aber sehr unwahrscheinlich ist, da Sekunden mit berechnet wird), das ich für das gleiche Buchungsdatum (wenn ich die an verschiedenen Tagen eingebe) die gleiche Zeit habe. Deshalb finde ich es besser ein Feld mit dem aktuellem Datum und Uhrzeit zu speichern, da kann es nicht zur Verwechslung kommen.

Wie müsste ich das denn machen, wenn ich die Zeit zu dem Buchungsdatum speichern wollte? Ich habe doch nur den Kalender zur Datumsauswahl. Oder gebe ich die Zeit dann manuell dazu ein?

Mfg
AbsolutNeu