Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi ID automatisch einfügen und gleich anzeigen, wie?[interbase] (https://www.delphipraxis.net/36680-id-automatisch-einfuegen-und-gleich-anzeigen-wie-%5Binterbase%5D.html)

plautzer 23. Dez 2004 14:25


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

Albi 23. Dez 2004 16:05

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:
Select Gen_ID(DB,0) From RDB$Database
into :ID
Dann läufst Du nicht Gefahr eine ID doppelt zu vergeben, wenn das Prog im Netzwerk läuft.

plautzer 23. Dez 2004 16:38

Re: ID automatisch einfügen und gleich anzeigen, wie?[interb
 
Meine Procedure:

Delphi-Quellcode:
begin
  id = GEN_ID(gen_haus_id,1);
  INSERT into haus (id)
  VALUES (:id);
  suspend;
end
Ich möchte auch erst die daten in die db schreiben lassen, und dann diese aufrufen und anzeigen lassen.

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

plautzer 23. Dez 2004 18:40

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

Albi 23. Dez 2004 18:50

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:
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;
Und im Prog

Code:
var ID: Integer;
TransOpen;
With SP_Test Do
Begin
  ExecProc;
  ID:= Params[0].value;
end;
CloseTrans
Und über die ID kannst Du dann den DS wieder aufrufen.

SQL-Code:
Select ID From DB WHERE ....

plautzer 24. Dez 2004 10:52

Re: ID automatisch einfügen und gleich anzeigen, wie?[interb
 
Irgentwie kommme ich nicht zu potte.

Ich habe jez diese procedure:
Delphi-Quellcode:
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
Trotzdem wird nicht eingetragen.... ich habe doch die insert procedure, aber es wird kein neuer datensatz hinzugefügt:

Procedure im prog:

Delphi-Quellcode:
DM.IBTrans.Active:=true;
With DM.SP_Haus_insert Do
Begin
  ExecProc;
  ID:= Params[2].value;
end;
DM.IBTrans.Active:=false;
Plautzer

Albi 24. Dez 2004 11:44

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:
Create Procedure test ()
Returns (
  oID Integer)
AS
Begin
  Insert Into DB (NR)
  values (Gen_ID(gen_ID_Haus,1))
end
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.

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

plautzer 25. Dez 2004 00:21

Re: ID automatisch einfügen und gleich anzeigen, wie?[interb
 
Abend,

Thx Albi,

funzt perfekt.

mein Code:

Delphi-Quellcode:
CREATE PROCEDURE HAUS_INSERT
RETURNS (
    NR INTEGER)
AS
begin
  nr=gen_ID(gen_haus_ID,1);
  Insert Into Haus (nr)
  Values (:nr);

  suspend;
end
Was ich davor hatte, machte wirklich keinen sinn.
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

Hansa 25. Dez 2004 00:49

Re: ID automatisch einfügen und gleich anzeigen, wie?[interb
 
Zitat:

Zitat von plautzer
...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?
...

Ein update Trigger macht bei IDs natürlich keinen Sinn. Aber wohl beim Rest. Ein Beispiel : in meiner DB gibt es in jeder Table ein Feld LETZTEAENDERUNG (Timestamp). Es geht mir nicht darum zu wissen, was geändert wurde, sondern nur ob und wann ! Wie will man nun so etwas festhalten ? Eben mit einem Update-Trigger. Meine Insert-Trigger holen sich auch nicht nur die ID aus dem Generator und erhöhen ihn, sondern nach obigem Muster wird auch ein Feld ANGELEGT mit der aktuellen Zeit besetzt. So weiß ich immer Bescheid, wann ein Record angelegt wurde und wann zuletzt geändert. Das ganze erhöht die Transparenz der DB schon beträchtlich. Kommt jetzt z.B. ein DAU daher und behauptet die Daten hätten sich heute urplötzlich geändert, dann kann man ihm auf die Sekunde genau sagen, wann er was gemacht hat. Ursprünglich war das ganze allerdings eher dazu gedacht, das Zeitverhalten eines Konvertierungsprogramms nach Interbase zu überwachen. Nachdem sich allerdings herausstellte, daß es tatsächlich mit einer Zeile mehr im Insert-Trigger und einem zusätzlichen Update-Trigger pro Tabelle kinderleicht realisieren läßt, habe ich es in allen Tabellen so gemacht. Bei den Triggern ist etwas Phantasie gefragt und man sollte sie ganz genau dosiert einsetzen.

Zitat:

Zitat von plautzer
...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?

Das führt jetzt zu weit. :mrgreen: Ich sage nur :
SQL-Code:
UNIQUE, CASCADE usw.
Aber das war ja nicht die Frage. 8)


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:15 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