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
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.
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
Hallo,
ZitatKeine separate Speicherung der negativen Beträge. Oder ist das wichtig?
und wie unterscheidest Du die Einnahmen von den Ausgaben?
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
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..
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!
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...
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
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.
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
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.
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
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 (http://www.donkarl.com?FAQ3.11)
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
Hallo,
Soweit ich das überblicken kann, läuft meine Datenbank so wie ich es will. Natürlich werde ich sie an manchen Stelle noch verbessern und optimieren. Jetzt werde ich erstmal Testdaten von Excel übertragen(mit dem Importieren möchte ich mich jetzt nicht beschäftigen).
Wenn das alles funktioniert und ich auf den neuesten Stand bin, werde ich meine Datenbank noch mal optimieren und mehr mit den Grundlagen beschäftigen.
Also vielen Dank fürs durchhalten (schwere Geburt ;D).
Ich habe hier im Forum schon viel gelernt.Danke.
Mfg
AbsolutNeu
Hier noch ein Nachtrag,
Das obige Beispiel von mir funktioniert so nicht!!!!
Da ich gerade meine Daten von Excel übertrage, konnte ich das Beispiel erst genauer untersuchen. Und es funktioniert nicht.
Dann habe ich überlegt, woran es liegt.
Nimmt man nur das EingabeDatum als Kriterium summiert er auch von anderen Tagen. Nimmt man das Buchungsdatum dazu, kommt auch nicht das richtige Ergebnis.
Dann habe ich mich an den Hinweis von MzKlMu errinnert.
Zitatin dem einen Feld mit dem Datum kannst Du auch die Zeit erfassen
Also addiere ich die Uhrzeit der Eingabe zu dem Buchungsdatum. So hat man eine zeitliche Ordnung für Buchungen am gleichen Tag.
die Funktion für die Uhrzeit:
TimeValue(Now())
Jetzt muss man diesen Wert zu dem Buchungsdatum addieren und in der Abfrage nur noch das Kriterium <= Buchungsdatum eintragen, falls mehrere Konten noch vorhanden sind, natürlich noch die gleiche ID
Mfg
AbsolutNeu