![]() |
Datenbank: Interbase • Version: 6.5 • Zugriff über: Interbase Xpress
'Merken' des Primary Key nach Posten
Hallo
könnt ihr mir helfen: angenommen ich habe eine tibdataset - komponente und füge einen datensatz über post() ein. dieses tibdataset hat ein generatorField für die id, also den primärschlüssel. das problem ist folgendes: wie komm ich nach erfolgreichem post() an den primärschlüssel, denn ich brauche ihn gleich im anschluss als fremdschlüssel in einer anderen tabelle. ich kann den datensatz leider nicht suchen, da die datensätze in der tabelle NUR über den primärschlüssel identifizierbar sind wisst ihr da rat?? |
Re: 'Merken' des Primary Key nach Posten
Hallo sancho1980,
stehst du nach dem Post nicht auf dem Datensatz, der gerade eingefügt wurde? Verwunderte Grüsse Thorsten |
Re: 'Merken' des Primary Key nach Posten
sollte man meinen und das dachte ich auch aber wenn ich nach dem post den id als fremdschlüssel verwende, fügt der nicht-existente id's als fremdschlüssel ein, also scheinbar klappt das nicht so ganz :-(
|
Re: 'Merken' des Primary Key nach Posten
Liste der Anhänge anzeigen (Anzahl: 1)
ich zeig dir mal was ich meine, die dateien sind im anhang:
hier soll eine paradox-tabelle in eine andere datenbank umgewandelt werden die struktur und so is alles noch nicht so ausgereift, also nicht wundern die paradox-tabell heißt demodeen und die interbase datenbank heißt dictionary wenn du in dem programm auf 'convert' klickst, beginnt die umwandlung die ursprüngliche datenbank besteht nur aus einer tabelle aber meine interbase-datenbank soll da eben jetz so extra tabellen für deskriptoren und synonyme haben und diese per fremdschlüssel referenzieren, eigentlich relativ selbsterklärend, denk ich ich hab von dem ganzen noch nicht so viel ahnung, deswegen gebt mal bitte bescheid wenn ich irgendwo groben unfug gemacht hab |
Re: 'Merken' des Primary Key nach Posten
:dp: Willkommen in der DP :hi:
Eine Möglichkeit wäre, die ID selbst zu erzeugen und dann mit zu posten.
Delphi-Quellcode:
Oder das Feld einfach auslesen
MyID := MyDB.Gen_ID('MyGenerator', 1);
Delphi-Quellcode:
da, wie schon oben erwähnt der DS-Cursor auf den eben eingefügten DS steht...
MyID := MyDSet.FieldValues['MYIDFIELD'];
|
Re: 'Merken' des Primary Key nach Posten
Hallo.
Leider befindet sich der vom RDBMS vergebene Schlüssel nach einem Insert nicht im record buffer des Programms. Deshalb hat sich eine andere Vorgehensweise durchgesetzt. Der Generator ist ja schon da:
SQL-Code:
Man definiert einen before insert trigger für die Tabelle:
CREATE GENERATOR "GEN_TBL";
SQL-Code:
Auf diese Weise wird immer ein konsistenter primary key sicher gestellt. In der Anwendung besorgt man sich dann den nächsten Generator-Wert:
CREATE TRIGGER "TBL_BI0" FOR "TBL"
ACTIVE BEFORE INSERT POSITION 0 AS BEGIN IF (NEW.id = 0) THEN NEW.id = GEN_ID(GEN_TBL, 1); END
SQL-Code:
Den verwendet man dann auch für die foreign keys. Wenn man transaktionsgeschützt arbeitet, dann kann man sich den Schlüssel auch direkt nach der Verwendung besorgen:
SELECT GEN_ID(GEN_TBL, 1) FROM RDB$DATABASE
SQL-Code:
Grüße vom marabu
SELECT GEN_ID(GEN_TBL, 0) FROM RDB$DATABASE
|
Re: 'Merken' des Primary Key nach Posten
Hi,
also erst mal zum Generator. Die Prüfung sollte auf null erfolgen, damit man auch mal per Hand eine ID vergeben kann. Beispiel:
SQL-Code:
Da die Vergabe im Trigger auf dem Server passiert, merkt der Client auch erst mal nichts davon.
CREATE TRIGGER ADRESSE_BI FOR ADRESSE
ACTIVE BEFORE INSERT POSITION 0 AS BEGIN IF (NEW.ID IS NULL) THEN NEW.ID = GEN_ID(GEN_ADRESSE_ID,1); END Die Komponentenetwickler sind alle dazu übergegengen, dem User eine Möglichkeit zu schaffen, die ID selbst zu erzeugen und damit auch nach dem Post zur Verfügung zu haben. Dafür gibt es in TIBDataSet das Property GeneratorField. Hier müsste ich nach meinem Beispiel nur 'GEN_ADRESSE_ID' eintragen, und schon sind wir die Probleme los. Cu, Frank |
Re: 'Merken' des Primary Key nach Posten
Zitat:
Edit: Zu langsam :? :) |
Re: 'Merken' des Primary Key nach Posten
Hallo
na das nenn ich mal ein belebtes forum tatsächlich hab ich sogar in ibexpress für meine tabelle einen generator erzeugt gehabt wobei mir schleierhaft ist, warum ich diesen generator trotzdem noch in der eigenschaft generatorfield meines tibdatasets mitangeben muss! ich denk meine delphi-anwendung hat damit ni zu tun hmmm, aber die andere frage ist, dieses auslesen des generators, wie geht das in delphi nehm ich da wieder eine tibdataset-komponente und füge das von euch angegebene sql-statement ein? wenn ja, wie mach ich dann weiter..felder lese ich aus, indem ich die einzelnen tabellenfelder im feld-editor persistent mache und dann ist der zugriff ganz einfach, aber geht das auch mit generatoren?? gruß und danke martin |
Re: 'Merken' des Primary Key nach Posten
hups, dumme frage
wusste nicht, dass man den generator_id auch einfach im feld-editor hinzufügen kann einfach ignorieren :P |
Re: 'Merken' des Primary Key nach Posten
Liste der Anhänge anzeigen (Anzahl: 1)
Also ich werd hier immer noch nicht schlau draus vielleicht wisst ihr ja nochmal weiter:
1.) Wieso ist es nicht möglich, in der Datenbank dictionary auf tabelle synslink die folgenden zwei fremdschlüssel zu erzeugen: alter table SYNSLINK add constraint FK_SYNSLINK_1 foreign key (ID_HAUPT) references DICENTRIES(ID) on delete SET DEFAULT on update SET DEFAULT alter table SYNSLINK add constraint FK_SYNSLINK_2 foreign key (ID_NEBEN) references DICENTRIES(ID) on delete SET DEFAULT on update SET DEFAULT Die Fehlermeldung, die mir da IBExpert ausspuckt ist: violation of FOREIGN KEY constraint "". violation of FOREIGN KEY constraint "INTEG_2" on table "DICENTRIES". Häh? Wo ist denn das Problem, den Primärschlüssel aus dicentries gleichzeitig als Fremdschlüssel in zwei anderen Tabellen zu verwenden?? 2.) Das zweite Problem, das ich hab, hat mit dem Delphi-Client zu tun. In den Zeilen 183, 198, 213 und 228 (form.pas) will ich jedem Nebeneintrag den Verweis auf den entsprechenden Haupteintrag 'einspeichern'. Komischerweise funzt das nicht, obwohl alle anderen Wertzuweisungen funktionieren...HILFE!!! |
Re: 'Merken' des Primary Key nach Posten
Hallo Martin.
(1) Die beiden ALTER Statements werden mit IBConsole auf der von dir angehängten GDB problemlos angenommen. (2) Mir fällt auf, dass du beim statischen Feld "DataSet_DICENTRIES_IDGEN_ID" die Eigenschaft AutoGenerateValue nicht korrekt gesetzt hast. marabu |
Re: 'Merken' des Primary Key nach Posten
1) Tatsächlich, wenn ich die Statements direkt im SQL-Editor abfeuere klappts, komisch...
2) Eigentlich nutz ich DataSet_DICENTRIES_ID nur um den zuletzt erzeugten ID zu bekommen. Für das Einfügen von Datensätzen sind DataSet_Haupt bzw. DataSet_Neben zuständig und da hab ich die ID-Generierung über Einstellung der jeweiligen GeneratorField-Eigenschaften gemacht. Wozu ist dann dieser AutoGenerate (von dem du redest) gut? Doppelt gemoppelt? 3) Mir ist immer noch unklar, warum die Wertzuweisung "self.DataSet_NebenASVERW.Value := haupt_id;" in den vier genannte Zeilen nicht klappt... Danke! Martin |
Re: 'Merken' des Primary Key nach Posten
zu 3. Asche auf mein Haupt. Das Insert-SQL-Statement von DataSet_Neben hatte ASVERW nicht drin
Die andere Frage steht. Würde mir das mal einer erklären, warum ich soviele Möglichkeiten habe, die ID-Generierung zu konfigurieren und wo da die Unterschiede liegen?? Grüßchen Martin |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:06 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 by Thomas Breitkreuz