![]() |
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 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:25 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