Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Generatorwert setzen [vorerst erledigt] (https://www.delphipraxis.net/35075-generatorwert-setzen-%5Bvorerst-erledigt%5D.html)

Hansa 2. Dez 2004 10:00


Generatorwert setzen [vorerst erledigt]
 
Hi,

hier ist folgendes Problem aufgetaucht : ich muß einmalig (allerdings bei 20 Tabellen) den Generatorwert neu besetzen (auf den höchsten vorhandenen Wert + 1). Hintergrund ist der, daß ich die IDs aus älteren Tabellen 1:1 übernehmen muß. In diesen Fällen schlägt der Trigger, der dafür vorgesehen ist nicht zu, da die ID eben NOT NULL ist.

Mit einer stored Procedure geht das schon, aber dann müßte ich für eine einmalige Aktion 20 SPs anlegen. Ähnlich wäre es, wenn ich die Trigger umbauen würde. Und mit einer einzelnen SP geht das auch nicht, da ich die Table-Namen nicht als Parameter übergeben kann.

Was kann man da noch machen ?

jim_raynor 2. Dez 2004 10:15

Re: Generatorwert setzen
 
Vielleicht solltest du uns auch noch die verwendetete Datenbank mitteilen.

Hansa 2. Dez 2004 10:17

Re: Generatorwert setzen
 
Interbase bzw. Firebird 1.5

der-C 2. Dez 2004 11:06

Re: Generatorwert setzen
 
wenn du den Wert des alten Generators noch hast:
SQL-Code:
SET GENERATOR "new_gen" TO GEN_ID("old_gen",1);

Hansa 2. Dez 2004 11:52

Re: Generatorwert setzen
 
Jetzt mal Gemach. :zwinker: So erhalte ich ja die größte ID :

SQL-Code:
SELECT MAX(ID) FROM TABLE8
und so setze ich ihn neu :

SQL-Code:
SET GENERATOR "new_gen" TO GEN_ID(MAX(ID),1);
Wegen des MAX komme ich auf Feldebene im select aber nicht dran. So wie oben kann ich es im Generator auch nicht benutzen, da ein Generator mit der Table nur indirekt zu tun hat. Die alten IDs sind seltsamerweise nicht sortiert. Aber ich könnte ja immer den höchsten Wert einer Variable zuweisen und zum Schluß dem Generator übergeben ? :gruebel: Hmm, das könnte gehen. Vielleicht fällt jemand noch was besseres ein. :mrgreen:

mikhal 2. Dez 2004 11:54

Re: Generatorwert setzen
 
GenID(<GeneratorName>, 0) gibt dir die letzte Zahl des entsprechenden Generator zurück, ohne eine neue Zahl zu generieren.

Grüße
Mikhal

Hansa 2. Dez 2004 12:13

Re: Generatorwert setzen
 
Der Tip mit Gen (..,0); ist gut. Werde ich mir merken. Das Problem ist nur : ich habe keinen alten Generator, sondern nur die alten IDs. Die höchste ID ermittele ich aus den alten Daten einfach so :

Delphi-Quellcode:
if ID > maxID then
  maxID := ID;
Somit habe ich am Ende die höchste alte ID in maxID.

Nur das hier geht so nicht :

Delphi-Quellcode:
DS.Close;
DS.SelectSQL.Text := 'SET GENERATOR GEN_TABLE8_ID TO '+IntToStr (MaxID+1);
DS.Open;
DataBase.Commit;
Ich wollte einfach ein Dataset dazu verwenden, den Befehl abzusetzen. Jetzt kommt keine Fehlermeldung. Im SQL-Monitor siegt es so aus :

Zitat:

Zitat von SQL-Monitor
[Application: konv]
WgDS: [Execute] SET GENERATOR GEN_TABLE8_ID TO 135

Execute tick count 0

[Application: konv]
ReadTransaction: [Commit (Hard commit)](1495)

Der einzige Haken an der Sache ist nur : es geht nicht, Generator bleibt bei 0 stehen. :mrgreen:

P.S. : Ich sehe gerade die Zahl hinter dem Commit. Was besagt die ? Im Moment habe ich auch manchmal 1513.

Stevie 2. Dez 2004 12:18

Re: Generatorwert setzen
 
Wie wär's mit
Delphi-Quellcode:
DS.SelectSQL.Text := 'SET GENERATOR GEN_TABLE8_ID TO GenID("GEN_TABLE8_ID", '+IntToStr (MaxID+1)+')';

Hansa 2. Dez 2004 12:23

Re: Generatorwert setzen
 
Mann, ihr seid ja schneller als ich. :bouncing4: Bei so einem Thema hätte ich das nicht gedacht. Ich habe IBexpert neu gestartet und siehe an, der Wert 135 steht im Generator. @Stevie : das geht schon so, zumindest in IBexpert, wenn man es von Hand eingibt. Also muß es auch in Delphi gehen.


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