![]() |
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 ? |
Re: Generatorwert setzen
Vielleicht solltest du uns auch noch die verwendetete Datenbank mitteilen.
|
Re: Generatorwert setzen
Interbase bzw. Firebird 1.5
|
Re: Generatorwert setzen
wenn du den Wert des alten Generators noch hast:
SQL-Code:
SET GENERATOR "new_gen" TO GEN_ID("old_gen",1);
|
Re: Generatorwert setzen
Jetzt mal Gemach. :zwinker: So erhalte ich ja die größte ID :
SQL-Code:
und so setze ich ihn neu :
SELECT MAX(ID) FROM TABLE8
SQL-Code:
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:
SET GENERATOR "new_gen" TO GEN_ID(MAX(ID),1);
|
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 |
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:
Somit habe ich am Ende die höchste alte ID in maxID.
if ID > maxID then
maxID := ID; Nur das hier geht so nicht :
Delphi-Quellcode:
Ich wollte einfach ein Dataset dazu verwenden, den Befehl abzusetzen. Jetzt kommt keine Fehlermeldung. Im SQL-Monitor siegt es so aus :
DS.Close;
DS.SelectSQL.Text := 'SET GENERATOR GEN_TABLE8_ID TO '+IntToStr (MaxID+1); DS.Open; DataBase.Commit; Zitat:
P.S. : Ich sehe gerade die Zahl hinter dem Commit. Was besagt die ? Im Moment habe ich auch manchmal 1513. |
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)+')';
|
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 02:50 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