Da mich die auf dem markt befindlichen Programme zur Führung von
Kassenbüchern arg anwiedern, möchte ich mich jetzt (endlich) dran setzen
ein eigenes zu schreiben. Da ich der Sprache C bzw. C++ einigermassen
sicher bin und diese Sprachen liebe, bietet es sich natürlich an, diese
zu verwenden. Bei meinen ersten Versuchen stellte sich mir nur ein dummes
Problem. Die Lösung wird wahrscheinlich banal sein, aber ich komme
derzeit nicht drauf. Daher bitte ich um Eure Mithilfe ;-)
Zuerst ein paar Informationen für Programmierer ohne
Buchhaltungserfahrung: Das Kassenbuch ist eine Art Kontoauszug für die
bar bezahlten Sachen. Mehr braucht man eigentlich nicht zu wissen.
Jetzt kommt es aber - gerade im Gastronomiebereich sehr häufig - vor,
dass ein Barbeleg mehrere (meistens zwei) Steuersätze haben kann bzw. die
Buchhaltung die eingekauften Artikel nach Sachkonten (z. B. Kfz-Kosten,
Reinigungsmittel, Wareneinkauf usw.) trennen muss. Daher kann ein Beleg
mehrere Buchungen notwendig machen. Ein Beispiel: Der Unternehmer kauft
am 31.10. in einem Großmarkt ein. Er packt neben Büromaterial auch noch
Kaffee für sein Personal in seinen Einkaufswagen, geht zur Kasse und
bezahlt. Die Rechnung sieht in etwa so aus:
31.10.2000 Großmarkt & Sohn GmbH
Menge Artikel Betrag M
1 Kaffee 7,99 DM 2
1 Kaffeefilter 1,29 DM 1
5 Ordner A4 9,99 DM 1
1 Fensterreiniger 2,39 DM 1
1 Scheibenwischer 8,99 DM 1
Nettosumme 30,65 DM
MwSt-1 16,00% aus 22,66 DM 3,63 DM
MwSt-2 7,00% aus 7,99 DM 0,56 DM
Zahlbetrag 34,84 DM
Bar 40,00 DM
Restgeld 5,16 DM
Vielen Dank für Ihren Einkauf
Im Kassenbuch muss jetzt stehen:
Datum Nr. Text Einnahme Ausg. Konto
31.10. 25 Großmarkt, Einkauf vom 31.10.
Kaffee 8,55 DM 4280
Kaffeefilter 1,50 DM 4280
Bürobedarf 11,59 DM 4930
Reingungsmittel 2,77 DM 4250
Kfz-Kosten 10,43 DM 4580
Es gibt aber auch einfacherer Belege, z. B. dann wenn der Unternehmer
aufpasst und positionsgetreu einkauft. Naja, es ergibt sich jetzt die
Problematik, dass ein Beleg aus einer Zeile oder aus mehreren Zeilen
bestehen kann. Ganz einfach könnte ich jetzt einen struct bilden:
struct buchung {
char **date;
int nr;
char **text;
float in, out;
int account;
}
Das ganze könnte man hübsch in eine verkettete Liste einbauen und hätte
für alle einzeiligen Buchung eine Lösung. Wie bekomme ich aber hin, dass
man eine solche Buchung splitten kann? Eine Lösung hatte ich schon...
naja, keine echte Lösung. Ich könnte jede Buchung sofort in ein File
schreiben (dumpen halt) und danach wieder abfragen. Auf der einen Seite
eine sehr einfach Methode aber ich finde sie ungemein unschön.
Wenn jemand eine Idee hat würde ich mich serh über jeden Vorschlag freuen
Besten Dank schonmal im voraus und sorry für das viel zu lange Posting.
Allerdings finde ich es schwer diesen Sachverhalt kürzer zu erklären ;-)
--
Ciao,
Karsten M. Rother
http://www.wiwi.uni-frankfurt.de/~krother
Das Kassenbuch ist eine Liste von Belegen, und jeder Beleg erzeugt 1..n
Buchungen. Richtig? Also hälst du im Kassenbuch eine {verkettete
Liste|Array|whatever} von Belegen (Datum, Belegnummer, Liste von
Buchungen).
Du bist schon nahe dran.
Hope it helps,
- Marcus [www.ohlhaut.de,PGP]
KMR>Es gibt aber auch einfacherer Belege, z. B. dann wenn der Unternehmer
KMR>aufpasst und positionsgetreu einkauft. Naja, es ergibt sich jetzt die
KMR>Problematik, dass ein Beleg aus einer Zeile oder aus mehreren Zeilen
KMR>bestehen kann. Ganz einfach könnte ich jetzt einen struct bilden:
KMR>
KMR>struct buchung {
KMR> char **date;
KMR> int nr;
KMR> char **text;
KMR> float in, out;
KMR> int account;
KMR>}
KMR>Das ganze könnte man hübsch in eine verkettete Liste einbauen und
KMR>hätte für alle einzeiligen Buchung eine Lösung. Wie bekomme ich aber
KMR>hin, dass man eine solche Buchung splitten kann? Eine Lösung hatte
KMR>ich schon... naja, keine echte Lösung. Ich könnte jede Buchung sofort
KMR>in ein File schreiben (dumpen halt) und danach wieder abfragen. Auf
KMR>der einen Seite eine sehr einfach Methode aber ich finde sie ungemein
KMR>unschön.
KMR>
KMR>Wenn jemand eine Idee hat würde ich mich serh über jeden Vorschlag
KMR>freuen Besten Dank schonmal im voraus und sorry für das viel zu lange
KMR>Posting. Allerdings finde ich es schwer diesen Sachverhalt kürzer zu
KMR>erklären ;-)
- Ich würde eine SQL-Datenbank nehmen. Die Struktur, die sich anbietet,
läßt sich aber natürlich auch auf structs in Dateien abbilden.
In dem Fall würde ich eine B-Tree-Bibliothek kaufen, das ist sozusagen
die Arme-Leute-Version einer Datenbank: Unverschämt schnell, aber ohne die
Suchmöglichkeiten einer echten Datenbank.
- Als Datenstruktur bietet sich an:
1. Datei oder Datenbanktabelle für Konten (Name, Kontonummer)
2. ... für Belege
3. ... für Belegpositionen
Das führt zu der Unschönheit, für Belege mit nur einer Position trotzdem
eine Belegposition anlegen zu müssen (oder Du steckst die jeweils erste
Position in den gleichen struct wie den Beleg, aber das ist unästhetisch
und fehleranfällig). Es dürfte aber die beste Lösung sein.
- Zu Deiner Datenstruktur:
C ist eine sehr fehleranfällige Sprache, ich würde C++ nehmen und die
Pointeroperationen wegkapseln, so gut es geht.
Ich würde die Beträge auf Pfenning- bzw. Cent-Basis in einem
Integerdatentyp speichern. Ein Fließkommadatentyp ist für kaufmännische
Zwecke nicht geeignet, weil er bei größeren Beträgen zwangsläufig zu
Rundungsfehlern führt.
Ciao, Matthias