AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi StoredProcedure Problem

StoredProcedure Problem

Ein Thema von DirkG · begonnen am 27. Dez 2008 · letzter Beitrag vom 28. Dez 2008
Antwort Antwort
Seite 2 von 2     12
Benutzerbild von DirkG
DirkG

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

Re: StoredProcedure Problem

  Alt 27. Dez 2008, 18:46
Panik
Jetzt meckert IB-Console an INTO rum.
Solangsam habe ich keinen Plan mehr..
Human are Human to make mistakes.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.859 Beiträge
 
Delphi 11 Alexandria
 
#12

Re: StoredProcedure Problem

  Alt 27. Dez 2008, 18:48
NEWNUMBER = lyear || lmonth|| lid;
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von DirkG
DirkG

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

Re: StoredProcedure Problem

  Alt 27. Dez 2008, 18:53
Is richtig, aber problem bleibt immer noch...
SQL-Code:
SET TERM ^ ;

CREATE PROCEDURE GetNUMBER RETURNS (NEWNUMBER VARCHAR(10)) AS
 DECLARE VARIABLE lyear VARCHAR(4);
 DECLARE VARIABLE lmonth VARCHAR(2);
 DECLARE VARIABLE lid VARCHAR(2);
BEGIN
 /* Jahr und Monat für die Suche ermitteln */
 SELECT EXTRACT(YEAR FROM CURRENT_TIMESTAMP) [color=#ff0000]INTO[/color] :lyear FROM RDB$DATABASE; /* Hier gehts nicht weiter */
 SELECT EXTRACT(MONTH FROM CURRENT_TIMESTAMP) INTO :lmonth FROM RDB$DATABASE;
 /* Suche Anzahl der bisher in Jahr+Monat erstellten Rechnungen */
 SELECT COUNT(RNUMBER) FROM Rechnungen WHERE (RNUMBER LIKE (lyear||lmonth||'%')) INTO :lid;
 /* Setze neue Rechnungsnummer zusammen */
 NEWNUMBER = lyear||lmonth||lid;
 SUSPEND;
END
^

COMMIT WORK ^
SET TERM ;^
Human are Human to make mistakes.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.859 Beiträge
 
Delphi 11 Alexandria
 
#14

Re: StoredProcedure Problem

  Alt 27. Dez 2008, 18:57
Es fehlt das For
for select ... INTO ...
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Wunni
Wunni

Registriert seit: 1. Mai 2003
Ort: Hamburg
46 Beiträge
 
FreePascal / Lazarus
 
#15

Re: StoredProcedure Problem

  Alt 27. Dez 2008, 18:58
das into :variable muss immer am Ende stehen!!!

Beispiel:
SQL-Code:
CREATE PROCEDURE MGLGETNUMBER
RETURNS (
    NEWNUMBER VARCHAR(20))
AS
declare variable y char(4);
declare variable m char(2);
declare variable lfdnr integer;
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;
  /* mit count ist das allerdings nicht sehr elegant,
  da die Nummern ja nicht fortlaufend existieren werden */
 

  newnumber = :y||:m||:lfdnr;

  suspend;
end
Andreas Wunnenberg
  Mit Zitat antworten Zitat
Benutzerbild von Wunni
Wunni

Registriert seit: 1. Mai 2003
Ort: Hamburg
46 Beiträge
 
FreePascal / Lazarus
 
#16

Re: StoredProcedure Problem

  Alt 27. Dez 2008, 19:01
Zitat:
Es fehlt das For
bei count() kommt immer nur ein Datensatz zurück, daher benötigt man kein for select. Es reicht ein einfacher select.
Andreas Wunnenberg
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#17

Re: StoredProcedure Problem

  Alt 28. Dez 2008, 16:10
SQL-Code:
CREATE PROCEDURE MGLGETNUMBER
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(*)+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
  Mit Zitat antworten Zitat
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, 23: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
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:32 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz