![]() |
AW: Firebird: Generator mit dynamischen Namen
Zitat:
Hat mich dann auch nicht gewundert, dass Montag morgens immer noch nichts war. Firebird geht schon gut. Für Netzwerk ist nur wichtig : richtige Transaktionskontrolle. |
AW: Firebird: Generator mit dynamischen Namen
Vielleicht nur Glück oder durch das verwendete MP bedingt. Ich würde das aber an Deiner Stelle ändern, denn ab FB3 könnte das dann schön in dei Hose gehen.
|
AW: Firebird: Generator mit dynamischen Namen
Also bei einer derartigen Konstellation würde ich wirklich empfehlen, eine eigene Funktion dafür zu schreiben. Anhand einer Hilfstabelle werden die Zähler verwaltet. Da das Ganze eh in einer Transaktion ausgeführt wird, sind Dopplungen ausgeschlossen.
Wenn Du einen Generator verwendest, machst Du dich imho implizit von der Implementierung des Generators abhängig bzw. von etwaigen Restriktionen. Das ist zwar hier nicht der Fall, aber unsauber. Finde ich. |
AW: Firebird: Generator mit dynamischen Namen
Jetzt hab ich es "fast" so, wie ich es haben wollte. Meine SP sieht wie folgt aus:
Code:
Ich prüfe als, ob z.B. der Generator ERFNR1503 schon existiert und wenn nicht, erstelle ich ihn. Funktioniert einwandfrei.
CREATE OR ALTER procedure GET_ERFNR (
JAHR varchar(2) not null, WOCHE varchar(2) not null) returns ( ERFNR integer) as declare variable ANZ integer; declare variable GEN_NAME varchar(10); begin /* Procedure Text */ gen_name = 'ERFNR' || Jahr || Woche; SELECT COUNT(1) from rdb$generators where rdb$generator_name = :gen_name into :anz; if (anz <> 1) then execute statement 'create sequence ' || gen_name; execute statement 'SELECT GEN_ID(' || gen_name || ', 1) from rdb$database'; suspend; end Jetzt brauche ich nur noch den nächsten Wert üner GEN_ID, dazu habe ich die zweite execute statement Anweisung. Ich muss aber den Wert von dem Generator als Wert der SP zurückgeben, aber das will nicht funktionieren. Ich kann weder den Wert über "SELECT GE_ID ... into :ERFNR" noch über ERFNR = execute statement 'SELECT ...' oder über execute statement 'ERFNR = SELECT ...' in ERFNR zurückgeben. Hat jemand eine Idee, wie ich den Wert des zweiten EXECUTE Statements zurückgebe? |
AW: Firebird: Generator mit dynamischen Namen
|
AW: Firebird: Generator mit dynamischen Namen
Genial!
Das hat mir noch gefehlt, jetzt funktioniert es:
Code:
CREATE OR ALTER procedure GET_ERFNR (
JAHR varchar(2) not null, WOCHE varchar(2) not null) returns ( ERFNR integer) as declare variable ANZ integer; declare variable GEN_NAME varchar(10); begin /* Procedure Text */ gen_name = 'ERFNR' || Jahr || Woche; SELECT COUNT(1) from rdb$generators where rdb$generator_name = :gen_name into :anz; if (anz <> 1) then execute statement 'create sequence ' || gen_name; execute statement 'SELECT GEN_ID(' || gen_name || ', 1) from rdb$database' into :erfnr; suspend; end |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:09 Uhr. |
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-2025 by Thomas Breitkreuz