AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Interbase: Generierte ID ermitteln ?
Thema durchsuchen
Ansicht
Themen-Optionen

Interbase: Generierte ID ermitteln ?

Ein Thema von mschaefer · begonnen am 5. Apr 2003 · letzter Beitrag vom 16. Okt 2004
Antwort Antwort
Seite 3 von 3     123   
Benutzerbild von kiar
kiar

Registriert seit: 2. Aug 2003
Ort: Aschersleben
1.362 Beiträge
 
Delphi 5 Professional
 
#21

Re: Interbase: Generierte ID ermitteln ?

  Alt 15. Okt 2004, 19:12
hallo ralf,

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

raik
verhältnisse die einem nicht passen,
muss man verändern oder verlassen
  Mit Zitat antworten Zitat
Benutzerbild von Jens Schumann
Jens Schumann

Registriert seit: 27. Apr 2003
Ort: Bad Honnef
1.644 Beiträge
 
Delphi 2009 Professional
 
#22

Re: Interbase: Generierte ID ermitteln ?

  Alt 15. Okt 2004, 19:21
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 ^
I come from outer space to save the human race
  Mit Zitat antworten Zitat
Robert_G
(Gast)

n/a Beiträge
 
#23

Re: Interbase: Generierte ID ermitteln ?

  Alt 15. Okt 2004, 19:57
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 ):
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?
  Mit Zitat antworten Zitat
Ralf Stehle

Registriert seit: 8. Aug 2003
124 Beiträge
 
Delphi 7 Professional
 
#24

Re: Interbase: Generierte ID ermitteln ?

  Alt 15. Okt 2004, 21:15
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
Ralf Stehle
ralfstehle@yahoo.de
  Mit Zitat antworten Zitat
Benutzerbild von kiar
kiar

Registriert seit: 2. Aug 2003
Ort: Aschersleben
1.362 Beiträge
 
Delphi 5 Professional
 
#25

Re: Interbase: Generierte ID ermitteln ?

  Alt 15. Okt 2004, 21:21
das ist so nicht richtig.

womit erzeugst du den trigger? IBConsole, Ibexpert oder von hand?
verhältnisse die einem nicht passen,
muss man verändern oder verlassen
  Mit Zitat antworten Zitat
Ralf Stehle

Registriert seit: 8. Aug 2003
124 Beiträge
 
Delphi 7 Professional
 
#26

Re: Interbase: Generierte ID ermitteln ?

  Alt 15. Okt 2004, 21:30
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
ralfstehle@yahoo.de
  Mit Zitat antworten Zitat
Ralf Stehle

Registriert seit: 8. Aug 2003
124 Beiträge
 
Delphi 7 Professional
 
#27

Re: Interbase: Generierte ID ermitteln ?

  Alt 15. Okt 2004, 21:40
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?
Ralf Stehle
ralfstehle@yahoo.de
  Mit Zitat antworten Zitat
Robert_G
(Gast)

n/a Beiträge
 
#28

Re: Interbase: Generierte ID ermitteln ?

  Alt 15. Okt 2004, 21:57
Na du bist mir ja ein DB'ler..
Das ist ein [dp:b229d9c4b0=SQL AND Parameter]SQL Parameter[/dp:b229d9c4b0].
  Mit Zitat antworten Zitat
Ralf Stehle

Registriert seit: 8. Aug 2003
124 Beiträge
 
Delphi 7 Professional
 
#29

Re: Interbase: Generierte ID ermitteln ?

  Alt 15. Okt 2004, 22:09
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
Ralf Stehle
ralfstehle@yahoo.de
  Mit Zitat antworten Zitat
Benutzerbild von CenBells
CenBells

Registriert seit: 30. Mär 2003
Ort: Kiel urspr. Lübeck
176 Beiträge
 
Delphi 7 Professional
 
#30

Re: Interbase: Generierte ID ermitteln ?

  Alt 16. Okt 2004, 10:39
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
Ein Objekt ist eine zur Ausführungszeit vorhandene für seine Instanzvariablen Speicherplatz allokierende Instanz, die sich gemäß dem Protokoll ihrer Klasse verhält.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 3     123   


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 21:44 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