Thema: Delphi StoredProcedure Problem

Einzelnen Beitrag anzeigen

Benutzerbild von DirkG
DirkG

Registriert seit: 29. Sep 2003
Ort: Schwerin
67 Beiträge
 
Delphi 5 Enterprise
 
#18

Re: StoredProcedure Problem

  Alt 28. Dez 2008, 22:36
@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.
  Mit Zitat antworten Zitat