AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi ID automatisch einfügen und gleich anzeigen, wie?[interbase]
Thema durchsuchen
Ansicht
Themen-Optionen

ID automatisch einfügen und gleich anzeigen, wie?[interbase]

Ein Thema von plautzer · begonnen am 23. Dez 2004 · letzter Beitrag vom 25. Dez 2004
Antwort Antwort
plautzer

Registriert seit: 23. Aug 2003
172 Beiträge
 
#1

ID automatisch einfügen und gleich anzeigen, wie?[interbase]

  Alt 23. Dez 2004, 14:25
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
  Mit Zitat antworten Zitat
Albi

Registriert seit: 4. Mai 2003
Ort: Berlin
458 Beiträge
 
Delphi 7 Professional
 
#2

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

  Alt 23. Dez 2004, 16:05
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.
  Mit Zitat antworten Zitat
plautzer

Registriert seit: 23. Aug 2003
172 Beiträge
 
#3

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

  Alt 23. Dez 2004, 16:38
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
  Mit Zitat antworten Zitat
plautzer

Registriert seit: 23. Aug 2003
172 Beiträge
 
#4

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

  Alt 23. Dez 2004, 18:40
Könntest du mir mal zeigen wie bei dir die Insert procedure ausschaut?
Irgentwie haut das bei mir alles nicht hin!

Thx,


Plautzer
  Mit Zitat antworten Zitat
Albi

Registriert seit: 4. Mai 2003
Ort: Berlin
458 Beiträge
 
Delphi 7 Professional
 
#5

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

  Alt 23. Dez 2004, 18:50
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.

Select ID From DB WHERE ....
  Mit Zitat antworten Zitat
plautzer

Registriert seit: 23. Aug 2003
172 Beiträge
 
#6

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

  Alt 24. Dez 2004, 10:52
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
  Mit Zitat antworten Zitat
Albi

Registriert seit: 4. Mai 2003
Ort: Berlin
458 Beiträge
 
Delphi 7 Professional
 
#7

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

  Alt 24. Dez 2004, 11:44
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.

Select gen_ID(Gen_ID_haus,0 bzw. 1) from RDB$Database
  Mit Zitat antworten Zitat
plautzer

Registriert seit: 23. Aug 2003
172 Beiträge
 
#8

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

  Alt 25. Dez 2004, 00:21
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
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#9

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

  Alt 25. Dez 2004, 00:49
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 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. Ich sage nur : UNIQUE, CASCADE usw. Aber das war ja nicht die Frage. 8)
Gruß
Hansa
  Mit Zitat antworten Zitat
Antwort Antwort


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 11:41 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