Seite 1 von 1

[Gelöst] - Leider nochmal Thema Rechnungsnummer

Verfasst: So 12. Mär 2023, 11:57
von Dietmar_Schütz
Hallo LO Fans,
mache gerade meinen ersten Gehversuche mit LibreBase. Hatte mir mal eine Datenbank mit MS Access aufgebaut um Rechnungen zu erstellen.
Ich weis, das Thema wurde schon oft angesprochen. Hab eine Abfrage gefunden in einer Beispiel_DB.

Die darin enthaltende Beispiel Abfrage hab ich auf meine Datenbank (Tabelle) angepasse. Der SQL Code sieht so aus:

SELECT "Rg_Kopf".*, RIGHT( '00' || MONTH( "Leistungsdatum" ), 2 ) AS "Monat", RIGHT( '000' || ( SELECT COUNT( "ID" ) FROM "Rg_Kopf" WHERE YEAR( "Leistungsdatum" ) = YEAR( "Rg_Kopf"."Leistungsdatum" ) AND MONTH( "Leistungsdatum" ) = MONTH( "Rg_Kopf"."Leistungsdatum" ) AND "ID" <= "Rg_Kopf"."ID" ), 4 ) AS "lfdNrMonat", RIGHT( '000' || MONTH( "Leistungsdatum" ), 4 ) || RIGHT( '00' || ( SELECT COUNT( "ID" ) FROM "Rg_Kopf" WHERE YEAR( "Leistungsdatum" ) = YEAR( "Rg_Kopf"."Leistungsdatum" ) AND MONTH( "Leistungsdatum" ) = MONTH( "Rg_Kopf"."Leistungsdatum" ) AND "ID" <= "Rg_Kopf"."ID" ), 3 ) AS "Monat_lfdNrMonat", RIGHT( '000' || YEAR( "Leistungsdatum" ), 4 ) AS "Jahr", RIGHT( '000' || ( SELECT COUNT( "ID" ) FROM "Rg_Kopf" WHERE YEAR( "Leistungsdatum" ) = YEAR( "Rg_Kopf"."Leistungsdatum" ) AND "ID" <= "Rg_Kopf"."ID" ), 4 ) AS "LfdNrJahr" FROM "Rg_Kopf"

Was ich erreichen wollte, ist die Erstellung einer fortlaufenden Rechnungsnummer pro Monat innerhalb eines Jahres. Kann auch geändert werden in fortlaufend über das ganze Jahr. Das wäre auch ok.

In der Beispiel DB wird korrekt gezählt. Bei meinem Versuch wird nichts hochgezählt sondern nur die Anzahl der vorhandenen Datensätze (hier = 39) angezeigt. Hab mal einen Screenshot angehängt. Ich bin kein SQL Experte und finde nicht wo hier der Fehler liegt.
Kann mir einer helfen?

Mein Ansatz war die durch die Abfrage ermittelte Lfd Nr per Makro in die Tabelle Rg_Kopf in eine Spalte "Rg_Nummer" einzutragen, gesteuert durch ein Formularereignis z. B. "nach Datensatzaktion", während man eine neue Rechnung über ein Formular erfasst, wenn so geht. Anregungen sind willkommen.

Wenn später dann die Rechnung gedruckt werden soll, möchte ich die generierte Rechnungsnummer aus der Tabelle per Abfrage für den Bericht auslesen.

Ist mein Ansatz zielführend?

Re: Leider nochmal Thema Rechnungsnummer

Verfasst: So 12. Mär 2023, 12:54
von gogo

Code: Alles auswählen

...
SELECT COUNT( "ID" ) FROM "Rg_Kopf" 
   WHERE 
	YEAR( "Leistungsdatum" ) = YEAR( "Rg_Kopf"."Leistungsdatum" ) 
   AND 
	"ID" <= "Rg_Kopf"."ID"
...
YEAR( "Leistungsdatum" ) = YEAR( "Rg_Kopf"."Leistungsdatum" ) ergibt immer WAHR weil (1=1) = TRUE
"ID" <= "Rg_Kopf"."ID" ergibt immer WAHR weil (1<=1) = TRUE
daher liefert SELECT COUNT( "ID" ) immer die Anzahl aller Datensätze in der Tabelle.

Einfacher wäre so was:

Code: Alles auswählen

Select count(1) as MaxReNr from "Rg_Kopf" where TO_CHAR("Leistungsdatum", 'YYYY-MM') = '2023-03'

[Gelöst]Re: Leider nochmal Thema Rechnungsnummer

Verfasst: Mo 13. Mär 2023, 10:22
von Dietmar_Schütz
Danke gogo für deine Hilfe.
hab zwar Deinen Ansatz nicht versucht, da ich verstehen wollte, warum meine Korrekturen nicht funktioniert hatten.
Daher hab ich den Original SQL in der Entwurfsansicht noch mal genau angesehen, und erst dann fiel mir auf, dass der Ersteller der Musterabfrage auf eine Tabelle zugreift, die gar nicht existiert = "a.".
Ich wusste nicht, das man eine - wie soll ich sagen - temporäre Tabelle in einer Abfrage erschaffen kann, auf die man zugreift.

Mein korrigierter Code sieht jetzt so aus und der funktioniert auch:

SELECT "a".*, RIGHT( '000' || MONTH( "Leistungsdatum" ), 4 ) AS "Monat", RIGHT( '000' || ( SELECT COUNT( "ID" ) FROM "Rg_Kopf" WHERE YEAR( "Leistungsdatum" ) = YEAR( "a"."Leistungsdatum" ) AND MONTH( "Leistungsdatum" ) = MONTH( "a"."Leistungsdatum" ) AND "ID" <= "a"."ID" ), 4 ) AS "lfdNrMonat", RIGHT( '000' || MONTH( "Leistungsdatum" ), 4 ) || RIGHT( '0' || ( SELECT COUNT( "ID" ) FROM "Rg_Kopf" WHERE YEAR( "Leistungsdatum" ) = YEAR( "a"."Leistungsdatum" ) AND MONTH( "Leistungsdatum" ) = MONTH( "a"."Leistungsdatum" ) AND "ID" <= "a"."ID" ), 2 ) AS "Monat_lfdNrMonat", RIGHT( '000' || YEAR( "Leistungsdatum" ), 4 ) AS "Jahr", RIGHT( '000' || ( SELECT COUNT( "ID" ) FROM "Rg_Kopf" WHERE YEAR( "Leistungsdatum" ) = YEAR( "a"."Leistungsdatum" ) AND "ID" <= "a"."ID" ), 4 ) AS "LfdNrJahr" FROM "Rg_Kopf" AS "a"

Deinen Ansatz versuch ich vielleicht später noch einmal.... Vielen Dank.