Entwickler-Ecke

Datenbanken - TIBClientDataSet --> generator


foxy - Fr 23.05.03 07:22
Titel: TIBClientDataSet --> generator
guden all

hab die kombo benutzt auf anraten von Udontknow ... nun finde ich zum erbrechen aber nicht , wie ich ein feld per generator generieren kann...

wenn das einer was wäre super ;)


Udontknow - Fr 23.05.03 12:57

Hiho!

Also: Ein Generator ist ja einfach nur ein Mechanismus auf DB-Ebene, um eine Zahl zu "generieren". Da du aber zunächst nur eine Clientdatenmenge hast, die noch gar nicht zur DB wandert, wenn du nicht ApplyUpdates aufrufst, hast du logischerweise noch keine ID, wenn du die Zuweisung weiterhin per Trigger realisieren willst. Da müsstest du nach dem Posten direkt ApplyUpdate für jeden einzelnen Datensatz aufrufen.

Ich verfahre da anders. Ich erstelle auf der Interbase-DB eine Prozedur, die ich in Delphi dann per Dataset abrufen kann. Hier mal der Code:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
CREATE PROCEDURE Get_GenID(
    ID_ANZAHL INTEGER)
RETURNS (
    ID_NO INTEGER)
AS
BEGIN
  ID_NO = GEN_ID(GLB_ID_NO,ID_Anzahl);
  suspend;
 END


Einen Generatorwert kannst du dann mit einer einfachen SQL-Abfrage abrufen:

select * from Get_GenID(1) liefert dir dann also eine neue ID (Machst du aus der 1 eine 20, erhälst du die zwanstigste GenID zurück, die erste ist dann logischerweise Wert-19. So kann man sich automatisch einen Pool an Ids reservieren).
Sobald du diesen Wert hast, musst du ihn nur noch dann in deinem Dataset in AfterInsert einfügen.

Nachtrag:

Kann es sein, daß du "Kompo" anstelle von "Kombo" meinst? :wink:
Und ich war am überlegen, wann wir über ComboBoxen gesprochen hatten...

Cu, :)
Udontknow


foxy - Di 27.05.03 07:31

ich werde es versuchen

also dann sage ich einfach, im afterPost unter dem Feld ID der tabelle Firma , das der Diese prozeude aufrufen soll und einfügen soll?....

erweitert sich der wert auch immer um 1?, also nicht das ich da 10 mal 1 habe das ist nämlich nicht möglich


Udontknow - Di 27.05.03 07:37

Hiho!

Du musst es im BeforePost-Ereignis machen, Afterpost ist zu spät.

Der Generator erhöht sich genau um den Wert, den du an die Prozedur übergibst. Bsp:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
Generator-Stand: 0

select * from Get_Gen_ID(1)
Rückgabe 1
Generatorstand 1

select * from Get_Gen_ID(3)
Rückgabe 4 (da du 3 Schlüssel angefordert hast, kannst du also 2,3 und 4 nun vergeben)
Generatorstand 4


Cu,
Udontknow


foxy - Di 27.05.03 07:42

ok verstanden... nur npch ein verständins problem ...

wenn ich jetzt in before das einfüge ... dann ändert der doch imemr automatisch den anforderungswert oder??

also sagen wa einfach datensatz 1 -----> select * from Get_Gen_ID(1)
datensatz 2 ----> select * from Get_Gen_ID(2)
das ändert sich dann ja??oder muss ich das so machen?
wenn du mir das sagst habe ich es verstanden ;)

i:= i+1
select * from Get_Gen_ID(i);

bsp.


Udontknow - Di 27.05.03 08:02

Nein, nein! Der Generatorwert erhöht sich um den Wert, den du bei Get_Gen_ID angibst!
Du rufst für einen Datensatz immer nur Get_Gen_ID(1) auf. Das liefert dir einen Schlüssel.


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
select * from Get_GEN_ID(1)
Rückgabe 1

select * from Get_GEN_ID(1)
Rückgabe 2

select * from Get_GEN_ID(1)
Rückgabe 3


Cu,
Udontknow


foxy - Di 27.05.03 08:04

ahhhhh allet klar dank dir


CenBells - Mi 28.05.03 09:09

wieso steckt ihr das denn in eine eigene prozedur?
Man kann doch auch

Select Gen_ID(Gen_Name, Anzahl) FROM RDB$Database;

in einem execute query machen. Also, wozu denn die Prozedur?

gruß
Ken


Udontknow - Mi 28.05.03 11:27

Wahrscheinlich, weil ich diesen Kniff nicht kannte. :wink: Aber man lernt ja nie aus. Danke für den Hinweis! :)

Nachtrag: In manchen Fällen ist es vielleicht schön, vorher noch überprüfen zu können, ob der Generator eine bestimmte Grenze überschreitet (z.B. einen dem Standort zugeordneten Nummernkreis, um ordentlich replizieren zu können).

Cu,
Udontknow