Gruß, Kai (liest hier überhaupt noch einer mit?)
Ja, ich lese noch mit. Ich hab aber 6 Std. Zeitunterschied und damit normale Arbeitszeit fuer mich.
- Suche mir alle Belege (egal ob RG oder GU), deren Belegdatum + Tage _bis_zur_Fälligkeit kleiner/gleich einem Stichtag X (Usereingabe) ist und deren Saldo aus RG-Summe und Summe aus Zahlungen*(1+Skonto/100) > Null (0) ist und gruppiere mir das ganze nach dem Lieferanten.
Ist doch schon mal ein Anfang.
Teil 1: Gib mir alle Belege bis zum Stichtag
SELECT
rg.rgid, rg.lieferant, rg.datum, ADDDATE(rg.Datum, rg.Faellig_Tage) AS faellig_datum
FROM rechnungen rg
WHERE ADDDATE(rg.Datum, rg.Faellig_Tage) <= 'stichtag_datum_user_input'
Teil 2:Summiere alle Zahlungen pro RGID die bis zum aktuellen Tag registriert sind
SELECT z.RGID, SUM(z.BRUTTO) AS BETRAG
FROM zahlungen z
WHERE z.DATUM<= 'stichtag' GROUP BY z.RGID
Teil 3 fuege beide Abfragen mithilfe eines Joins zusammen:
SELECT
rg.rgid
, rg.lieferant
, rg.datum
, ADDDATE(rg.Datum, rg.Faellig_Tage) AS faellig_datum
, rg.Betrag - (0.03 * rg.Betrag) AS BETRAG_NACH_SKONTO
, rg.Betrag AS BETRAG
, (rg.Betrag - (0.03 * rg.Betrag)) - ISNULL(z2.BETRAG, 0.0) REST_BETRAG
FROM rechnungen rg
LEFT JOIN (SELECT z.RGID, SUM(z.BRUTTO) AS BETRAG FROM zahlungen z WHERE z.DATUM<= 'stichtag' GROUP BY z.RGID) z2 ON z2.RGID = rg.RGID
WHERE ADDDATE(rg.Datum, rg.Faellig_Tage) <= 'stichtag_datum_user_input'
Also konkret: Was, wenn 3 zahlungen zu einer Rechnung existieren?
Na dazu ist dich die SUM Aggregatsfunktion und das GROUP BY da?!!
Zur korrekten Behandlung von Skonto musst du lediglich pruefen ob alle Zahlungen innerhalb der Skonto Frist gemacht worden sind. Das kannst du recht einfach mit einem zweiten LEFT JOIN ueber das "Faelligkeitsdatum" hinbekommen.
Die Gruppierung der Werte pro Lieferant is auch sehr einfach ... SUM und GROUP BY. Alles was du aus obiger Abfrage eliminieren musst sind RGID und "DATUM". Fuer DATUM kommt dann evt noch ein MIN oder MAX in Frage.
Ich haette eher noch erwartet, dass dir der INNER JOIN ein Problem bereitet wenn es keine einzige Zahlung gibt ... aber diese ganze Abfrage ist wirklich was fuer Datenbank-Grundschule.
Ciao, Frank