Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Interbase: Generierte ID ermitteln ? (https://www.delphipraxis.net/3907-interbase-generierte-id-ermitteln.html)

kiar 15. Okt 2004 18:12

Re: Interbase: Generierte ID ermitteln ?
 
hallo ralf,

habe die ddl aus einer DB kopiert
SQL-Code:
CREATE GENERATOR MITID;
SET GENERATOR MITID TO 13;
versuche es.

raik

Jens Schumann 15. Okt 2004 18:21

Re: Interbase: Generierte ID ermitteln ?
 
Hallo,
ich weiss nicht ob die Frage schon beantwortet ist. Aber ich hätte auch noch eine Lösung.
Wenn in einer meiner Tabellen ein Primary-Key benötigt wird (in fast allen Tabellen ist das
der Fall) ist der Key immer in der ersten Spalte mit dem Namen "ID". Zu der Tabelle gehört
dann folgender Trigger:
Code:
CREATE TRIGGER "TRG_THEMEN_0" FOR "THEMEN"
ACTIVE BEFORE INSERT POSITION 0
as
begin
  if (new.id is null) then new.id=gen_id(gen_themen,1);
end
Wenn bei einem INSERT das FELD ID nicht angegeben wird holt sich der Trigger einen
neuen Generatorwert. Wenn ID einen Wert hat, wird eben kein neuer Generatorwert geholt.

Wenn ich vor dem INSERT den Wert für ID brauche hole ich mir diesen
über folgende StoredProc
Code:
CREATE PROCEDURE "GET_THEMENID"
RETURNS
(
  "NEWID" INTEGER
)
AS
BEGIN NewID = GEN_ID(GEN_THEMENID,1);
END ^

Robert_G 15. Okt 2004 18:57

Re: Interbase: Generierte ID ermitteln ?
 
Ich wollte mich dieses WE mal mit FB beschäftigen, da ich für ein kleineres Projekt(, dass in naher Zukunft anläuft) eine passende kleine, günstige DB suche.
Deshalb mal meine Frage: Gibt es keinen konsistenten Weg um den PK eines neuen DS zu bekommen?
Ich meine im Normalfall würde ein Standardtrigger von mir, zu PSQL übersetzt, so aussehen (keine Gewähr, ich habe keinen Plan von PSQL :stupid: ):
SQL-Code:
CREATE TRIGGER SomeTable$PKtrig FOR SomeTable
ACTIVE BEFORE INSERT OR UPDATE POSITION 0
AS
begin
  if (INSERTING) then
    NEW.PK = GEN_ID(SomeTable$PKseq, 1);
  if (UPDATING) then
    NEW.PK = OLD.PK;
end
Es wird also _IMMER_ der PK aud der Sequence genommen und _KEINE_ Änderung des PK ermöglicht.
Die Frage ist jetzt nur: Wie zum Geier würde ich an die PK nach einem INSERT bekommen?
Das gibt's ja in FB/IB nicht:
SQL-Code:
INSERT INTO SomeTable
 (A, B, C)
VALUES
 (:iA, :iB, :iC)
RETURNING PK INTO :oPK
Alle anderen Vorschläge würden doch bewirken, dass jeder, der an dem Projekt arbeitet, _IMMER_ erst den PK aus der _RICHTIGEN_ Sequence holen muss. (Eine schöne Gelegenheit für einen unnötigen Bug. ;) )

Wie sieht es mit FB 2.0 aus, wurde dort schon eine Lösung für das Problem gefunden?

Ralf Stehle 15. Okt 2004 20:15

Re: Interbase: Generierte ID ermitteln ?
 
Ich kapiere das mit Generator und Trigger nicht.

Ich habe in IBExpert einen Generator Gen_UDat eingegeben, das hat scheinbar geklappt.
Danach habe ich bei Trigger folgende Anweisung gemacht

SQL-Code:
INSERT TRIGGER UDAT_BI0
ACTIVE BEFORE INSERT POSITION 0
AS
begin
  if (new.id is null) then new.id=gen_id(gen_udat,1);
end
Müsste jetzt nicht automatisch das Feld ID hochgezählt werden ?
Bei Einfügen kommt aber leider immer noch die Fehlermeldung, ID darf nicht Null sein

kiar 15. Okt 2004 20:21

Re: Interbase: Generierte ID ermitteln ?
 
das ist so nicht richtig.

womit erzeugst du den trigger? IBConsole, Ibexpert oder von hand?

Ralf Stehle 15. Okt 2004 20:30

Re: Interbase: Generierte ID ermitteln ?
 
Stimmt. In IBExpert kommt eine Fehlermeldung. Wie muss es denn richtig heißen?
Kann man das auch aus einer Delphi-Anwendung heraus machen

Ralf Stehle 15. Okt 2004 20:40

Re: Interbase: Generierte ID ermitteln ?
 
Dumme Frage:

was bedeuten in oben geposteten Beitrag

Delphi-Quellcode:
INSERT INTO SomeTable
(A, B, C)
VALUES
(:iA, :iB, :iC)
RETURNING PK INTO :oPK
der Doppelpunkt?

Robert_G 15. Okt 2004 20:57

Re: Interbase: Generierte ID ermitteln ?
 
Na du bist mir ja ein DB'ler.. ;)
Das ist ein [dp:b229d9c4b0=SQL AND Parameter]SQL Parameter[/dp:b229d9c4b0].

Ralf Stehle 15. Okt 2004 21:09

Re: Interbase: Generierte ID ermitteln ?
 
Danke für Dein Verständnis. Während meines "Learning bei Doing" habe ich noch nichts mit Parametern zu tun gehabt. Falls Du hierfür ein TUTO weißt, bin ich Dir dankbar, Dein Verweis auf das Forum hat aber auch schon mehr als genug Beiträge zu dem Thema angezeigt

CenBells 16. Okt 2004 09:39

Re: Interbase: Generierte ID ermitteln ?
 
Zitat:

Zitat von Ralf Stehle
Ich kapiere das mit Generator und Trigger nicht.

Ich habe in IBExpert einen Generator Gen_UDat eingegeben, das hat scheinbar geklappt.
Danach habe ich bei Trigger folgende Anweisung gemacht

SQL-Code:
INSERT TRIGGER UDAT_BI0
ACTIVE BEFORE INSERT POSITION 0
AS
begin
  if (new.id is null) then new.id=gen_id(gen_udat,1);
end
Müsste jetzt nicht automatisch das Feld ID hochgezählt werden ?
Bei Einfügen kommt aber leider immer noch die Fehlermeldung, ID darf nicht Null sein

Hi,
der trigger ist nicht richtig definiert.
Das muß so heißen
SQL-Code:
CREATE TRIGGER DeinTriggerName FOR DeineTabelle
ACTIVE BEFORE INSERT POSITION 0
AS
begin
  if (new.id is null) then new.id=gen_id(gen_udat,1);
end
Und ja, du kannst ihn auch aus Delphi heraus erzeugen. Dazu benötigst du die Komponente IBScript aus dem neuesten IBXpress Update (oder was vergleichbares).

Gruß
ken

edit: sql-skript ausgebessert Crate -> Create


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:53 Uhr.
Seite 3 von 3     123   

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