Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Buchhaltungsprobelm / Grundlage (https://www.delphipraxis.net/129170-buchhaltungsprobelm-grundlage.html)

manfred_h 13. Feb 2009 20:21

Datenbank: Firbird • Version: 2.1 • Zugriff über: Fibplus 6.50

Buchhaltungsprobelm / Grundlage
 
Hallo zusammen

bin dabei in eine Anwendung ein "Buchhaltungsmodul" zu interieren.
Die Tabellen die dazu erstellt wurden sind:
( für den Kontenramen)
SQL-Code:
CREATE TABLE BOOKKEEPING_CHART_ACCOUNTS (
    ID       ID NOT NULL /* ID = CHAR(38) NOT NULL */,
    C_NO     T10 /* T10 = VARCHAR(10) */,
    U_NO     T10 /* T10 = VARCHAR(10) */,
    ACNO     INTEGER,
    ACTYPE   INTEGER,
    TEXT     T130 /* T130 = VARCHAR(130) */,
    LANG     T10 /* T10 = VARCHAR(10) */,
    L_UPDATE TIME_S /* TIME_S = TIMESTAMP */
);
( für die Buchungen)
SQL-Code:
CREATE TABLE BOOKKEEPING_BOOKING (
    ID          ID NOT NULL /* ID = CHAR(38) NOT NULL */,
    C_NO        T10 /* T10 = VARCHAR(10) */,
    U_NO        T10 /* T10 = VARCHAR(10) */,
    "DATE"      "DATE" /* "DATE" = DATE */,
    VOUCHER_NO  INTEGER,
    TEXT        T130 /* T130 = VARCHAR(130) */,
    DEBIT_ACNO  INTEGER,
    CREDIT_ACNO INTEGER,
    ACTYPE      INTEGER,
    AMOUNT      AMOUNT /* AMOUNT = DECIMAL(18,2) */,
    L_UPDATE    TIME_S /* TIME_S = TIMESTAMP */
);
Bis jetzt sieht mein Buchungsüberblick ( im Ausdruck so aus)
----------------------------------------------------Soll----------Haben
1010 PC
--13.02.2009--1--Testbuchung--4010-----200,00
--13.02.2009--2--Testbuchung--4010-----100,00

1020 Bank
--11.02.2009--3--Testbuchung--4010-----250,00

Das Problem ist nun dass bei einem Ausdruck aller Buchungen das so aussehen sollte:
----------------------------------------------------Soll----------Haben------Total
1010 PC
--13.02.2009--1--Testbuchung--4010-----200,00--------------------200,00
--13.02.2009--2--Testbuchung--4010-----100,00--------------------300,00

1020 Bank
--11.02.2009--3--Testbuchung--3010------------------250,00-------250,00

Es sollen die Buchungen direct unter dem jeweiligen Soll oder Haben Titel befinden.
Mir ist leider nicht klar wie das umzusetzten ist.
Ich hoffe ich konnte das Problem verständlich schildern.

PS: Als Reportgenerator verwende ich FastReport.

Besten dank für Eure Tipps.
Manfred

mkinzler 13. Feb 2009 20:36

Re: Buchhaltungsprobelm / Grundlage
 
Über würde es mit einem Gruppierungs-Band versuchen.

manfred_h 13. Feb 2009 20:39

Re: Buchhaltungsprobelm / Grundlage
 
Hallo mkinzler

Zitat:

würde es mit einem Gruppierungs-Band versuchen.
Das habe ich schon drin. ( Danke )
Aber das Probelm ist dass ich in der DB ja nur eine Spalte habe in der der Betrag steht
und mir nicht klat ist wie ich den jeweils unter haben oder soll darstelle.

Manfred

mkinzler 13. Feb 2009 20:44

Re: Buchhaltungsprobelm / Grundlage
 
Am Besten in der Abfrage (CASE...WHEN bzw. iif())

haentschman 14. Feb 2009 07:43

Re: Buchhaltungsprobelm / Grundlage
 
Hallo,

wenn ich das richtig sehe, hast du die Werte für Soll/Haben in einer Tabellenspalte. Den Unterschied macht das Feld ACTYPE ?

versuchs mal so:
- für Soll und Haben je ein Memo (auf deren gewünschten Platz)
- beide mit dem Feld verbinden
- im OnBeforePrint des einen je nach Soll oder Haben das eine und das andere Memo visible:= True/visible:= False setzen.
...damit ist nur das Memo sichtbar was für den Datensatz zutrifft. Soll/Haben

hoffe geholfen zu haben. :hi:

manfred_h 14. Feb 2009 10:14

Re: Buchhaltungsprobelm / Grundlage
 
Wichtig zu erwähnen ( habe ich leider vergessen ) es soll eine doppelte Buchhaltung werden
Und da liegt auch noch das Problem dass die Buchungen ja doppelt angeseit werden müssen.

Hallo mkinzler
Zitat:

Am Besten in der Abfrage (CASE...WHEN bzw. iif())
Bin das am Anschauen. Leider habe ich gestern vergessen das bige ( doppelte Buchhaltung ) zu erwähnen.

Hallo haentschman

Zitat:

Zitat von haentschman
wenn ich das richtig sehe, hast du die Werte für Soll/Haben in einer Tabellenspalte. Den Unterschied macht das Feld ACTYPE ?

Der Betrag steht nur in einer Spalte. Hier eine Beschreibung der Buchungstabelle.
SQL-Code:
VOUCHER_NO  INTEGER, >> Belegnummer
TEXT        T130 /* T130 = VARCHAR(130) */,
DEBIT_ACNO  INTEGER, >> Debitoren Konto Nummer
CREDIT_ACNO INTEGER, >> Kreditoren Konto Nummer
ACTYPE      INTEGER, >> Kontentyp // Aktiv / Passiv ...
AMOUNT      AMOUNT /* AMOUNT = DECIMAL(18,2) */, >> Betrag
Habe auch schon in andere Buchhaltungen reingeschaut ( die Datenbanken ) und da wird es auch so "gelöst"

für Tips dankbar
Manfred

mkinzler 14. Feb 2009 10:27

Re: Buchhaltungsprobelm / Grundlage
 
Wie schon geschrieben in der Abfrage beide Betragsfelder erzeugen und anhand des Feldes ACTYPE den Wert zuweisen

BTW.: Sollte es statt Debitor/Kreditorenkonto nicht Konto/Gegenkonto heissen?

manfred_h 14. Feb 2009 10:34

Re: Buchhaltungsprobelm / Grundlage
 
Zitat:

Zitat von mkinzler
Wie schon geschrieben in der Abfrage beide Betragsfelder erzeugen und anhand des Feldes ACTYPE den Wert zuweisen

Das Problem ist aber noch das der gleiche Datensatz 2x vorkommen muss.
Das heisst wenn eine Buchung vom Konto 1020 auf 4050 erstellt wir wird diese 2x dargestellt.
1x im Kontoblatt beim Konto 1020 und
1x im Kontoblatt beim Konto 4050 mit dem unterschied das der Berag einmal bei Haben und einmal bei Soll steht.
Hofe ich habe die richtigen Bez. verwendet. :roll:

Zitat:

BTW.: Sollte es statt Debitor/Kreditorenkonto nicht Konto/Gegenkonto heissen?
Die Anwendung wird zuerst in englisch erstellun und dann mehrsprachig "gemacht". Aus diesem
Grund versuche ich die DB auch in englisch zu halten.

Manfred

mkinzler 14. Feb 2009 10:40

Re: Buchhaltungsprobelm / Grundlage
 
Ich verstehe halt unter "Debitor/Kreditor" spezielle Konten (Personen- Forderungs-/Verbindlichkeitskonto)
Zitat:

Das Problem ist aber noch das der gleiche Datensatz 2x vorkommen muss.
Das heisst wenn eine Buchung vom Konto 1020 auf 4050 erstellt wir wird diese 2x dargestellt.
1x im Kontoblatt beim Konto 1020 und
1x im Kontoblatt beim Konto 4050 mit dem unterschied das der Berag einmal bei Haben und einmal bei Soll steht.
Hofe ich habe die richtigen Bez. verwendet. Rolling Eyes
Sollte ja kein Problem sein.
Ist der Buchungssatz dann auch doppelt vorhanden?

manfred_h 14. Feb 2009 11:06

Re: Buchhaltungsprobelm / Grundlage
 
Zitat:

Zitat von mkinzler
Ich verstehe halt unter "Debitor/Kreditor" spezielle Konten (Personen- Forderungs-/Verbindlichkeitskonto)

Werde die Namesgebung überprüfen.
Zitat:

Sollte ja kein Problem sein.
Ist der Buchungssatz dann auch doppelt vorhanden?
Nein ist er nicht. Das ist es ja was mich irritiert. In einer Buchhaltung bei der ich die DB angeschaut habe
ist die Buchung auch nur einmal vorhanden... :gruebel:

Wenn Die Buchung 2x vorahnden ist währe es logischer.
Ist diese normalerweise 2x vorhanden?

mkinzler 14. Feb 2009 11:08

Re: Buchhaltungsprobelm / Grundlage
 
Zitat:

Ist diese normalerweise 2x vorhanden?
Kommt darauf an.

Du könntest auch eine SP schreiben, welche dir den Buchungssatz entsprechend verdoppelt.

manfred_h 14. Feb 2009 11:13

Re: Buchhaltungsprobelm / Grundlage
 
Zitat:

Zitat von mkinzler
Du könntest auch eine SP schreiben, welche dir den Buchungssatz entsprechend verdoppelt.

.. Was ist eine SP

Bestehen Deiner Meinung nach Nachteile wenn der Datensatz 2x verhanden ist.

mkinzler 14. Feb 2009 11:15

Re: Buchhaltungsprobelm / Grundlage
 
Zitat:

.. Was ist eine SP
eine Stored Procedure
Zitat:

Bestehen Deiner Meinung nach Nachteile wenn der Datensatz 2x verhanden ist.
Nicht nötig zudem wäre diese dann redundant -> bei Änderung müssten 2 DS angepasst werden ( was bei Anwendung der GOB hier sowieso nicht gemacht werden dürfte )

manfred_h 14. Feb 2009 11:18

Re: Buchhaltungsprobelm / Grundlage
 
Zitat:

Zitat von mkinzler
Zitat:

.. Was ist eine SP
eine Stored Procedure

Dann schaue ich mal wie ich das mit einer Stored Procedure hinbekomme.

Hansa 14. Feb 2009 11:19

Re: Buchhaltungsprobelm / Grundlage
 
Zitat:

Zitat von manfred_h

.. Was ist eine SP

"SP" sollte besser unterstrichen sein. Das steht für "Stored Procedure" und ist eindeutig zu lang. Zumindest für mkinzler. :mrgreen:

Man kann nicht mal schnell genug editieren. :shock: Mir fällt aber noch was auf, was ich niemals so machen würde : "Date" oder "Text" als eigenen Bezeichner verwenden !! Sieht so aus, als wenn das bei Date nur wegen der unnötigen "" überhaupt ging.

mkinzler 14. Feb 2009 11:23

Re: Buchhaltungsprobelm / Grundlage
 
Zitat:

Zitat von Hansa
Zitat:

Zitat von manfred_h

.. Was ist eine SP

"SP" sollte besser unterstrichen sein. Das steht für "Stored Procedure" und ist eindeutig zu lang. Zumindest für mkinzler. :mrgreen:

[OT]Es handelt sich doch um eine gebräuchliche Abkürzung im Datenbankjargon. Genauso wie UDF; niemand spricht von der Entwicklung einer "User Defined Function" sondern von einer UDF.[/OT]

mjustin 14. Feb 2009 11:24

Re: Buchhaltungsprobelm / Grundlage
 
Zitat:

Zitat von manfred_h
Das Problem ist aber noch das der gleiche Datensatz 2x vorkommen muss.
Das heisst wenn eine Buchung vom Konto 1020 auf 4050 erstellt wir wird diese 2x dargestellt.
1x im Kontoblatt beim Konto 1020 und
1x im Kontoblatt beim Konto 4050 mit dem unterschied das der Berag einmal bei Haben und einmal bei Soll steht.

Immer nur zwei? Bei Fibuprogrammen geläufig ist der Begriff 'Splitbuchung', hier sind drei (oder mehr) Konten betroffen. Das ist nichts exotisches oder technisch bedingtes, es entsteht einfach aus dem Umstand, dass ein Buchungsbetrag sich aus mehreren Teilen zusammensetzen kann, die durch die Buchung abgebildet werden.

Bekanntestes Beispiel ist eine Buchung eines Warenverkaufs mit Umsatzsteuer, der Bruttobetrag steht auf der einen Seite in einem Konto, die Umsatzsteuerschuld und der Netto-Verkaufserlös verteilen sich auf zwei Konten auf der anderen Seite.

manfred_h 14. Feb 2009 15:12

Re: Buchhaltungsprobelm / Grundlage
 
Zitat:

Zitat von Hansa
:shock: Mir fällt aber noch was auf, was ich niemals so machen würde : "Date" oder "Text" als eigenen Bezeichner verwenden !! Sieht so aus, als wenn das bei Date nur wegen der unnötigen "" überhaupt ging.

Danke für Deinen Tip, werde mir das merken!

Manfred

mkinzler 14. Feb 2009 15:21

Re: Buchhaltungsprobelm / Grundlage
 
Zitat:

Sieht so aus, als wenn das bei Date nur wegen der unnötigen "" überhaupt ging.
Das sieht nicht nur so aus sonder ist so

manfred_h 14. Feb 2009 15:21

Re: Buchhaltungsprobelm / Grundlage
 
Zitat:

Zitat von mjustin
Bei Fibuprogrammen geläufig ist der Begriff 'Splitbuchung', hier sind drei (oder mehr) Konten betroffen. Das ist nichts exotisches oder technisch bedingtes, es entsteht einfach aus dem Umstand, dass ein Buchungsbetrag sich aus mehreren Teilen zusammensetzen kann, die durch die Buchung abgebildet werden.

Bekanntestes Beispiel ist eine Buchung eines Warenverkaufs mit Umsatzsteuer, der Bruttobetrag steht auf der einen Seite in einem Konto, die Umsatzsteuerschuld und der Netto-Verkaufserlös verteilen sich auf zwei Konten auf der anderen Seite.

Hallo mjustin
da dies meine erstes Buchhaltunsprogramm wird möchte ich dies gleich richtig umsetzten ( lernen ).
Wenn Du mir einen guten Link zu einer Doku. oder so hast wöhre dies sehr hilfreich.

PS: Danke für Deinen Tipp.

mkinzler 14. Feb 2009 15:28

Re: Buchhaltungsprobelm / Grundlage
 
Ein Beispiel:
Kauf von Ware auf Ziel (Buchung bei Wareneingang)

Code:
Waren   1000    an   1160 Verbindlichkeiten
Vorsteuer 160
würde zu

Code:
Konto    Soll: Haben:
Waren    1000
Vorsteuer 160
Vb.a.L.L.       1160

manfred_h 14. Feb 2009 15:34

Re: Buchhaltungsprobelm / Grundlage
 
Zitat:

Zitat von mkinzler
würde zu

Code:
Konto    Soll: Haben:
Waren    1000
Vorsteuer 160
Vb.a.L.L.       1160

Das heisst dann das 3 Datensätze in der DB sind. Verstehe ich das richtig?

mkinzler 14. Feb 2009 15:41

Re: Buchhaltungsprobelm / Grundlage
 
Nicht zwingend. es sind aber 3 Konten angesprochen
man kann das auch durch Buchungsschlüssel, Autokonten oder Felder zur Steuersatzangabe lösen.

mjustin 14. Feb 2009 16:04

Re: Buchhaltungsprobelm / Grundlage
 
Zitat:

Zitat von manfred_h
Hallo mjustin
da dies meine erstes Buchhaltunsprogramm wird möchte ich dies gleich richtig umsetzten ( lernen ).
Wenn Du mir einen guten Link zu einer Doku. oder so hast wöhre dies sehr hilfreich.

Fachwissen gibt es z.B. hier:

Industrielles Rechnungswesen IKR, EURO, Lehrbuch: Finanzbuchhaltung - Analyse und Kritik des Jahresabschlusses - Kosten- und Leistungsrechnung - von Manfred Deitermann, Siegfried Schmolke, und Wolf-Dieter Rückwart (Taschenbuch - 2008) - gebraucht ca. 6 Euro wegen des geringen Unterhaltungswertes ;)

Bücher darüber, wie man eine Buchhaltung entwickelt, kenne ich leider nicht. Es gibt in diesem Bereich aber eine Reihe von Gesetzen / Verordnungen die man schon mal näher ansehen sollte, so z.B.


Grundsätze ordnungsmäßiger DV-gestützter Buchführungssysteme

Hansa 14. Feb 2009 17:43

Re: Buchhaltungsprobelm / Grundlage
 
Zitat:

Zitat von mkinzler
Das sieht nicht nur so aus sonder ist so

Guck mal genauer. :shock: Das KANN gar nicht gehen. Das hier ginge eventuell : "datE" DATE.

manfred_h 14. Feb 2009 17:57

Re: Buchhaltungsprobelm / Grundlage
 
Zitat:

Zitat von Hansa
Zitat:

Zitat von mkinzler
Das sieht nicht nur so aus sonder ist so

Guck mal genauer. :shock: Das KANN gar nicht gehen. Das hier ginge eventuell : "datE" DATE.

Habs inziwschen abeändert. Danke für den Hinweis. Ist immer gut das gleich am Anfang zu bemerken.

Manfred

manfred_h 18. Feb 2009 09:12

Re: Buchhaltungsprobelm / Grundlage
 
Habe jezt eine Lösung gefunden.
@mkinzler: Danke für deinen Denkanstoss.
@mjustin: Danke für Deine Anregugen.
@Hansa: Danke für die Anmerkung betreffs der Feldnamen

Habe eine zusätzliche Tabelle BOOKKEEPING_BOOKING_PRINT erstellt. Darin werden die Daten vor dem Ausdruck "gesammelt" und "aufbereitet".

Delphi-Quellcode:
  dm.pFIBScript.Script.Text :='INSERT INTO BOOKKEEPING_BOOKING_PRINT (C_NO, U_NO, ACNO, ACTEXT, BDATE, VOUCHER_NO, BTEXT, DEBIT_AMOUNT, CREDIT_AMOUNT, ACNO_CROSS, DEBIT_ACNO, CREDIT_ACNO, DEBIT_ACTYPE, CREDIT_ACTYPE)'+
                              'SELECT '+
                              'BOOKKEEPING_BOOKING.C_NO,'+
                              'BOOKKEEPING_BOOKING.U_NO,'+
                              'BOOKKEEPING_CHART_ACCOUNTS.ACNO,'+
                              'BOOKKEEPING_CHART_ACCOUNTS.ACTEXT,'+
                              'BOOKKEEPING_BOOKING.BDATE,'+
                              'BOOKKEEPING_BOOKING.VOUCHER_NO,'+
                              'BOOKKEEPING_BOOKING.BTEXT,'+
                              '(CASE '+
                              'WHEN BOOKKEEPING_BOOKING.DEBIT_ACTYPE > 999 AND BOOKKEEPING_BOOKING.DEBIT_ACTYPE < 2000 '+
                              'THEN BOOKKEEPING_BOOKING.AMOUNT END )DEBIT_AMOUNT,'+
                              '(CASE '+
                              'WHEN BOOKKEEPING_BOOKING.DEBIT_ACTYPE > 1999 AND BOOKKEEPING_BOOKING.DEBIT_ACTYPE < 3000 '+
                              'THEN BOOKKEEPING_BOOKING.AMOUNT END )CREDIT_AMOUNT,'+
                              '(CASE '+
                              'WHEN BOOKKEEPING_BOOKING.DEBIT_ACNO = BOOKKEEPING_CHART_ACCOUNTS.ACNO '+
                              'THEN BOOKKEEPING_BOOKING.CREDIT_ACNO ELSE BOOKKEEPING_BOOKING.DEBIT_ACNO END ) ACNO_CROSS,'+
                              'BOOKKEEPING_BOOKING.DEBIT_ACNO,'+
                              'BOOKKEEPING_BOOKING.CREDIT_ACNO,'+
                              'BOOKKEEPING_BOOKING.DEBIT_ACTYPE,'+
                              'BOOKKEEPING_BOOKING.CREDIT_ACTYPE '+
                              'FROM BOOKKEEPING_BOOKING '+
                              'INNER JOIN BOOKKEEPING_CHART_ACCOUNTS ON (BOOKKEEPING_BOOKING.CREDIT_ACNO = BOOKKEEPING_CHART_ACCOUNTS.ACNO);'+
                              'COMMIT WORK;'+
                              'INSERT INTO BOOKKEEPING_BOOKING_PRINT (C_NO, U_NO, ACNO, ACTEXT, BDATE, VOUCHER_NO, BTEXT, DEBIT_AMOUNT, CREDIT_AMOUNT, ACNO_CROSS, DEBIT_ACNO, CREDIT_ACNO, DEBIT_ACTYPE, CREDIT_ACTYPE)'+
                              'SELECT '+
                              'BOOKKEEPING_BOOKING.C_NO,'+
                              'BOOKKEEPING_BOOKING.U_NO,'+
                              'BOOKKEEPING_CHART_ACCOUNTS.ACNO,'+
                              'BOOKKEEPING_CHART_ACCOUNTS.ACTEXT,'+
                              'BOOKKEEPING_BOOKING.BDATE,'+
                              'BOOKKEEPING_BOOKING.VOUCHER_NO,'+
                              'BOOKKEEPING_BOOKING.BTEXT,'+
                              '(CASE '+
                              'WHEN BOOKKEEPING_BOOKING.DEBIT_ACTYPE > 999 AND BOOKKEEPING_BOOKING.DEBIT_ACTYPE < 2000 '+
                              'THEN BOOKKEEPING_BOOKING.AMOUNT END )DEBIT_AMOUNT,'+
                              '(CASE '+
                              'WHEN BOOKKEEPING_BOOKING.DEBIT_ACTYPE > 1999 AND BOOKKEEPING_BOOKING.DEBIT_ACTYPE < 3000 '+
                              'THEN BOOKKEEPING_BOOKING.AMOUNT END )CREDIT_AMOUNT,'+
                              '(CASE '+
                              'WHEN BOOKKEEPING_BOOKING.DEBIT_ACNO = BOOKKEEPING_CHART_ACCOUNTS.ACNO '+
                              'THEN BOOKKEEPING_BOOKING.CREDIT_ACNO ELSE BOOKKEEPING_BOOKING.DEBIT_ACNO END ) ACNO_CROSS,'+
                              'BOOKKEEPING_BOOKING.DEBIT_ACNO,'+
                              'BOOKKEEPING_BOOKING.CREDIT_ACNO,'+
                              'BOOKKEEPING_BOOKING.DEBIT_ACTYPE,'+
                              'BOOKKEEPING_BOOKING.CREDIT_ACTYPE '+
                              'FROM BOOKKEEPING_BOOKING '+
                              'INNER JOIN BOOKKEEPING_CHART_ACCOUNTS ON (BOOKKEEPING_BOOKING.DEBIT_ACNO = BOOKKEEPING_CHART_ACCOUNTS.ACNO);'+
                              'COMMIT WORK;';
  dm.pFIBScript.ExecuteScript;
Shalom
Manfred


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:22 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz