![]() |
ID automatisch einfügen und gleich anzeigen, wie?[interbase]
Hi,
ich mal eine frage zu Iterbase bezüglich des Einfügens von daten. Ich arbeite mir dbedits, ibdataset und ibstoredproc. Per buttonclick soll, so eine neuer leerer datensatz erstellt werden, nur die ID soll automatisch generiert werden. Das automatische gernerieren funzt auch, die daten werden bloß nicht gleich weider angezeigt. Es soll der datensatz mit den leeren feldern angezeigt um diese zu füllen. Nach dem füllen der felder muss gespeichert werden.. sonst wird der datensatz wieder gelöscht. so sieht mein buttonclick bis jetzt aus:
Delphi-Quellcode:
ibdataset1.FieldByName ('id').AsInteger:=IBstoredproc1.Params[0].Asinteger;
IBstoredproc1.ExecProc; ibtransaction1.Commit; IBTransaction1.Active := True; ibdataset1.SelectSQL.Text:='select * from haus where id=:A'; ibdataset1.ParamByName('A').AsInteger:=IBstoredproc1.Params[0].Asinteger; Plautzer |
Re: ID automatisch einfügen und gleich anzeigen, wie?[interb
Hallo Plautzer
Wie sieht den deine StoredProc aus? Wenn Du Commit aufrufst, wird die Datenmenge wieder verworfen, sprich das Ergebnis aus der Abfrage ist weg. Also sollte dein Commit als letztes erfolgen, wenn du mit dem Ergebnis noch weiterarbeiten willst. Ansonsten kann ich dir nur empfehlen nicht mit TDBEdits zu arbeiten sondern TEdit zu nehmen. Ist zwar etwas mehr arbeit aber wesentlich flexibler. Ich gehe immer den umgetreten Weg, ich schreibe die Daten in die DB und lasse mir dann die ID zurückgeben.
SQL-Code:
Dann läufst Du nicht Gefahr eine ID doppelt zu vergeben, wenn das Prog im Netzwerk läuft.
Select Gen_ID(DB,0) From RDB$Database
into :ID |
Re: ID automatisch einfügen und gleich anzeigen, wie?[interb
Meine Procedure:
Delphi-Quellcode:
Ich möchte auch erst die daten in die db schreiben lassen, und dann diese aufrufen und anzeigen lassen.
begin
id = GEN_ID(gen_haus_id,1); INSERT into haus (id) VALUES (:id); suspend; end Bei mir kommt jetzt bloß immer die Fehlermeldung: " nicht im Bearbeitungs-Modus" ICh weiß aber nicht woran es liegt... hat jm ne iDee`? Thx, plautzer |
Re: ID automatisch einfügen und gleich anzeigen, wie?[interb
Könntest du mir mal zeigen wie bei dir die Insert procedure ausschaut?
Irgentwie haut das bei mir alles nicht hin! Thx, Plautzer |
Re: ID automatisch einfügen und gleich anzeigen, wie?[interb
Du kannst nicht die Transaktion schliessen und dann auf die Ergebnisse zurückgreifen. Mit einem RollbackRetaining sollte es gehen. Habe das aber nicht probiert.
Ansonsten mache es doch über eine Variable. Das könnte dann so aussehen. Die StoredProc
Code:
Und im Prog
Create Procedure Test ()
Returns ( oID Integer) AS Begin Insert Into Haus (ID) Values (gen_ID(gen_haus_ID,1)); Select Gen_ID(gen_Haus_ID,0) From RDB$Database Into :oID; Suspend; end;
Code:
Und über die ID kannst Du dann den DS wieder aufrufen.
var ID: Integer;
TransOpen; With SP_Test Do Begin ExecProc; ID:= Params[0].value; end; CloseTrans
SQL-Code:
Select ID From DB WHERE ....
|
Re: ID automatisch einfügen und gleich anzeigen, wie?[interb
Irgentwie kommme ich nicht zu potte.
Ich habe jez diese procedure:
Delphi-Quellcode:
Trotzdem wird nicht eingetragen.... ich habe doch die insert procedure, aber es wird kein neuer datensatz hinzugefügt:
CREATE PROCEDURE RESET_GENERATOR
RETURNS ( MAXVALUE INTEGER, CURVALUE INTEGER, NXTVALUE INTEGER) AS begin Select MAX(nr), Gen_id(gen_haus_id, 0) from haus Into :maxvalue, :curvalue;[ Nxtvalue = GEn_id(gen_haus_id, (:Curvalue - :Maxvalue)); Insert Into Haus (nr) Values (:nxtvalue+1); suspend; end Procedure im prog:
Delphi-Quellcode:
Plautzer
DM.IBTrans.Active:=true;
With DM.SP_Haus_insert Do Begin ExecProc; ID:= Params[2].value; end; DM.IBTrans.Active:=false; |
Re: ID automatisch einfügen und gleich anzeigen, wie?[interb
Hallo Plautzer,
mach es dir doch nicht so kompliziert. Ich gehe jetzt mal davon aus, das dein Feld "NR" der Primary Key ist. Also hast auch sicherlich einen Insert & Update Trigger sowie einen Generator für dieses Feld angelegt. Dann brauchst Du doch nur noch
SQL-Code:
auszuführen und der DS wird unter der nächsten freien ID o. Nr gespeichert. Es kann natürlich Probleme geben, wenn du in der Table Felder definiert hast die nicht NULL dein dürfen, dann funzt es so nicht.
Create Procedure test ()
Returns ( oID Integer) AS Begin Insert Into DB (NR) values (Gen_ID(gen_ID_Haus,1)) end Aber so ganz verstehe ich nicht, was du berechnen willst. Du suchst er den größten Wert in Nr (das ist klar, wäre das gleich wie gen_ID(Gen_haus_ID,0)). Dein Wert CurValue ist der gleiche wie Maxvalue. Also rechnet Du Cur-Max = 0 und dann +1. Das geht nicht, da die Nr bereist vohanden ist. Versuche mal den folgende Code und du wirst feststellen, das das dein letzte verwendete bzw. die nächste freie ID ist.
SQL-Code:
Select gen_ID(Gen_ID_haus,0 bzw. 1) from RDB$Database
|
Re: ID automatisch einfügen und gleich anzeigen, wie?[interb
Abend,
Thx Albi, funzt perfekt. mein Code:
Delphi-Quellcode:
Was ich davor hatte, machte wirklich keinen sinn.
CREATE PROCEDURE HAUS_INSERT
RETURNS ( NR INTEGER) AS begin nr=gen_ID(gen_haus_ID,1); Insert Into Haus (nr) Values (:nr); suspend; end Ich steige langsam hinter Interbase, du hast aber vorhin gesagt, das ich sicherlich einen update und insert trigger habe. Was für einen nutzen habe ich denn von einen update trigger? Beim insert kann ich mir es noch erklären, aber beimupdate? Und ich habe noch ne frage zum fremdkey, wird der immer automatisch übergeben? und kann der fremdkey genau wie der primary key nur einmal in der tabelle existieren oder könnt man diesen für einen 1:n beziehnung nutzen? DAnk dir nochmals. Plautzer |
Re: ID automatisch einfügen und gleich anzeigen, wie?[interb
Zitat:
Zitat:
SQL-Code:
Aber das war ja nicht die Frage. 8)
UNIQUE, CASCADE usw.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:41 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