Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi StoredProcedure Problem (https://www.delphipraxis.net/126539-storedprocedure-problem.html)

DirkG 27. Dez 2008 18:06

Datenbank: Interbase • Version: 6 • Zugriff über: IBX

StoredProcedure Problem
 
Hallo Leute!
Wieder einmal ein Problem zwischen meinen Ohren...

Also folgendes würde ich gerne erreichen. Um ein Rechnungsnummer zu erzeugen, wurde bisher auf der Client-Seite die Nummer zusammengestellt und geprüft, ob diese noch frei ist. Die Nummer basiert auf einem Schlüssel, der wie folgt aus sieht:
Code:
yyyy mm xx
---- -- --
 |    |  |.. Laufende Nummer 01-99
 |    |..... Nummer des aktuellen Monat
 |.......... Nummer des aktuellen Jahr
Nun war meine Überlegung, das ganze durch den Server mit einer StoredProcedure machen zu lassen.
Die einzelnen Funktionen, um an die Werte zu kommen habe schon:
SQL-Code:
SELECT EXTRACT(YEAR FROM CURRENT_TIMESTAMP) FROM RDB$DATABASE;
SELECT EXTRACT(MONTH FROM CURRENT_TIMESTAMP) FROM RDB$DATABASE;
SELECT COUNT(RNUMBER) FROM Rechnungen WHERE (RNUMBER LIKE ('yyyymm%'));
Nun das Problem. Wie bokomme ich die einzelnen Werte in den Rückgabewert der Procedure und wie stelle ich den String-Ausdruck für die letzte Abfrage zusammen? Ich hatte gedacht, es so machen zu können, aber IB hat da was dagegen:
SQL-Code:
SET TERM ^ ;

CREATE PROCEDURE MglGetNUMBER RETURNS (NEWNUMBER VARCHAR(20)) AS
BEGIN
  lyear VARCHAR(4);
  lmonth VARCHAR(2);
  lid VARCHAR(2);

  SELECT EXTRACT(YEAR FROM CURRENT_TIMESTAMP) INTO :lyear FROM RDB$DATABASE;
  SELECT EXTRACT(MONTH FROM CURRENT_TIMESTAMP) into :lmonth FROM RDB$DATABASE;
  SELECT COUNT(RNUMBER) FROM Rechnungen WHERE (RNUMBER LIKE (lyear+lmonth+'%')) INTO :lid;

  SELECT lyear+lmonth+lid INTO :NEWNUMBER;

  SUSPEND;
END
^

COMMIT WORK ^
SET TERM ;^

Mr_G 27. Dez 2008 18:11

Re: StoredProcedure Problem
 
Such mal nach RETRUN und CONCAT... ich denke das müsste helfen.

mkinzler 27. Dez 2008 18:14

Re: StoredProcedure Problem
 
SQL-Code:
SELECT lyear || lmonth || lid INTO :NEWNUMBER;

DirkG 27. Dez 2008 18:15

Re: StoredProcedure Problem
 
:gruebel: RETRUN und CONACT
bist du da sicher in der Onlinehilfe zu sql ist kein Eintrag mit CONACT

Mr_G 27. Dez 2008 18:17

Re: StoredProcedure Problem
 
Oje... das tut mir leid... ist eine MySQL-Funktion. :oops:
Sorry!

mkinzler 27. Dez 2008 18:18

Re: StoredProcedure Problem
 
Zitat:

Zitat von DirkG
:gruebel: RETRUN und CONACT
bist du da sicher in der Onlinehilfe zu sql ist kein Eintrag mit CONACT

RETURN ist bei IB/FB SUSPEND und CONCAT mit Hilfe des SQL-Konkatenators ||

DirkG 27. Dez 2008 18:24

Re: StoredProcedure Problem
 
@Mr_G
Is OK. Hatte ich schon mir gedacht.

@mkinzler
Zitat:

SELECT lyear || lmonth || lid INTO :NEWNUMBER;
Das scheint mir richtig zu sein. Die IB-Console meckert noch in der Zeile 3
TOKEN UNKNOW VARCHAR
Keine Ahnung warum. Sollte doch so aussehen?

Wunni 27. Dez 2008 18:26

Re: StoredProcedure Problem
 
eventuell so?

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

mkinzler 27. Dez 2008 18:28

Re: StoredProcedure Problem
 
Oder ganz ohne lokale Variablen

DirkG 27. Dez 2008 18:44

Re: StoredProcedure Problem
 
@mkinzler
Zitat:

Oder ganz ohne lokale Variablen
Wäre schön gewesen doch bekomme ich das so nicht hin, da ja die Suchanfrage für die bisher vergebenen Nummern mit den Werten von Monat und Jahr gefüllt werden muss. Ich versuche mal folgendes.
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) INTO :lyear FROM RDB$DATABASE;
  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 */
  SELECT lyear||lmonth||lid INTO :NEWNUMBER;
  SUSPEND;
END
^

COMMIT WORK ^
SET TERM ;^


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:43 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz