@omata
Vielen Dank für deine Erweiterung.
@Alle
Ich habe seit gestern ein wenig probiert. Es scheint das es nun zufriedenstellend funktioniert. Also Danke für die schnelle Hilfe und für alle hier noch einmal die komplette Umsetzung.
Die Anwendung besitzt nun keine Kontrolle mehr über die Rechnungsnummer. Die komplette Logik für die Vergabe liegt nun ausschliesslich beim Server. Der Ablauf ist der folgende. Die Stored procedure "regetnumber" liefert die neue Nummer, diese wird mit dem Trigger "re_add" in das entsprechende Feld im Datensatz eingetragen, wenn der Datensatz erzeugt wird. Damit diese nicht mehr geändert werden kann, setzt der zweite Trigger "re_set" die alte Nummer immer wieder ein, auch wenn sie geändert wurde. Zum Schluss noch zwei Trigger "re_evmsg_add" und "re_evmsg_set", die die Anwendung über die Änderungen informieren.
!!!Achtung!!!
Achtet darauf, das dieses System der Nummernerstellung nicht mehr konform mit den Anforderungen des Finanzamtes für eine lückenlose Nummerierung von Rechnungen ist. (Vielen Dank an WoGe für diesen Hinweis).
SQL-Code:
SET TERM ^ ;
/* Stored procedures */
CREATE PROCEDURE regetnumber RETURNS(newnumber
VARCHAR(10))
AS
DECLARE VARIABLE y
CHAR(4);
DECLARE VARIABLE m
CHAR(2);
DECLARE VARIABLE lfdnr
INT;
BEGIN
y = EXTRACT(YEAR
FROM current_timestamp);
m = EXTRACT(MONTH
FROM current_timestamp);
SELECT COUNT(rnumber)+1
FROM rechnungen
WHERE rnumber STARTING
WITH :y || :m
INTO :lfdnr;
IF (:lfdnr < 10)
THEN newnumber = :y || :m || '
0' || :lfdnr;
ELSE newnumber = :y || :m || :lfdnr;
SUSPEND;
END
^
/* Triggers only will work for SQL triggers */
CREATE TRIGGER re_add
FOR rechnungen ACTIVE BEFORE
INSERT POSITION 0
AS
BEGIN
:
:
SELECT *
FROM regetnumber
INTO NEW.ReNumber;
:
:
END
^
CREATE TRIGGER re_set
FOR rechnungen ACTIVE BEFORE
UPDATE POSITION 0
AS
BEGIN
NEW.ReNumber = OLD.ReNumber;
:
:
END
^
CREATE TRIGGER re_evmsg_add
FOR rechnungen ACTIVE AFTER
INSERT POSITION 0
AS
BEGIN
POST_EVENT '
TabChange_Rechnungen';
END
^
CREATE TRIGGER re_evmsg_set
FOR rechnungen ACTIVE AFTER
UPDATE POSITION 0
AS
BEGIN
POST_EVENT '
TabChange_Rechnungen';
END
^
SET TERM ; ^
COMMIT WORK;
Human are Human to make mistakes.