![]() |
Datenbank: interbase 6.5 • Zugriff über: ibx, ibexpert
ominöse "not in edit mode"-meldung
Hi,
bin hier grad am Verzweifeln. Ich will Daten von einer Datenbank in eine andere konvertieren (ich weiß, das hatten wir schonmal; musste aber meine Datenbankstruktur nochmal ändern). Ich hab echt schon alles mögliche ausprobiert, zuerst mit TIBTable-Komponenten, dann dacht ich mir, weil ich beim letzten Mal, als es noch funktioniert hatte, TIBDataSets verwendet hatte, versuch ich das nochmal, aber nein. Mit diesem Code-Snippet versuche ich was in meine Datenbank einzufügen:
Delphi-Quellcode:
Ich habe echt schon alles ausprobiert. Auch ein einfügen von DatenModul.IBDataSet_AUT.Edit() bringt nichts. Ich raff's nicht. Ihr vielleicht?
function THauptFormular.ConvertAUT: Boolean;
var successful: Boolean; begin successful := false; Try DatenModul.Table_AUT.Active := true; DatenModul.Table_AUT.First(); while not DatenModul.Table_AUT.Eof do begin DatenModul.IBDataSet_AUT.Open(); DatenModul.IBDataSet_AUT.Insert(); DatenModul.IBDataSet_AUTAUT.AsString := DatenModul.Table_AUTAUT.AsString; //hier kommt die Meldung der Error "not in edit mode" DatenModul.IBDataSet_AUTVF.AsString := DatenModul.Table_AUTVF.AsString; DatenModul.IBDataSet_AUTFUNKTION.AsString := DatenModul.Table_AUTFUNKTION.AsString; DatenModul.IBDataSet_AUTFIRMA1.AsString := DatenModul.Table_AUTFIRMA1.AsString; DatenModul.IBDataSet_AUTFIRMA2.AsString := DatenModul.Table_AUTFIRMA2.AsString; DatenModul.IBDataSet_AUTSTRASSE.AsString := DatenModul.Table_AUTSTRASSE.AsString; DatenModul.IBDataSet_AUTPLZ.AsString := DatenModul.Table_AUTPLZ.AsString; DatenModul.IBDataSet_AUTORT.AsString := DatenModul.Table_AUTORT.AsString; DatenModul.IBDataSet_AUTLAND.AsString := DatenModul.Table_AUTLAND.AsString; DatenModul.IBDataSet_AUTTEL.AsString := DatenModul.Table_AUTTEL.AsString; DatenModul.IBDataSet_AUTTELPRIV.AsString := DatenModul.Table_AUTTELPRIV.AsString; DatenModul.IBDataSet_AUTFAX.AsString := DatenModul.Table_AUTFAX.AsString; DatenModul.IBDataSet_AUTANM.AsString := DatenModul.Table_AUTANM.AsString; DatenModul.IBDataSet_AUTDATUM.AsDateTime := DatenModul.Table_AUTDATUM.AsDateTime; DatenModul.IBDataSet_AUTTYP.AsString := DatenModul.Table_AUTTYP.AsString; DatenModul.IBDataSet_AUT.Post(); DatenModul.IBDataSet_AUT.Next(); DatenModul.IBDataSet_AUT.Close(); end; successful := true; Except on E : Exception do ShowMessage(E.ClassName+'-Fehler aufgetreten in ConvertAUT mit Nachricht: '+E.Message); end; if successful then ConvertAUT := true else ConvertAUT := false; DatenModul.Table_AUT.Close(); DatenModul.IBDataSet_AUT.Close(); end; Danke, Martin Die Definition meiner Dataset-Komponente ist folgende:
Code:
[edit=MrSpock]Code Tags gesetzt. Mfg, MrSpock[/edit]
object IBDataSet_AUT: TIBDataSet
Database = IBDatabase1 Transaction = IBTransaction BeforeInsert = IBDataSet_AUTBeforeInsert DeleteSQL.Strings = ( 'delete from AUT' 'where' ' ID = :OLD_ID') InsertSQL.Strings = ( 'insert into AUT' ' (ID, AUT, VF, FUNKTION, FIRMA1, FIRMA2, STRASSE, PLZ, ORT, LAN' + 'D, TEL, ' ' TELPRIV, FAX, ANM, DATUM, TYP)' 'values' ' (:ID, :AUT, :VF, :FUNKTION, :FIRMA1, :FIRMA2, :STRASSE, :PLZ, ' + ':ORT, :LAND, ' ' :TEL, :TELPRIV, :FAX, :ANM, :DATUM, :TYP)') RefreshSQL.Strings = ( 'Select ' ' ID,' ' AUT,' ' VF,' ' FUNKTION,' ' FIRMA1,' ' FIRMA2,' ' STRASSE,' ' PLZ,' ' ORT,' ' LAND,' ' TEL,' ' TELPRIV,' ' FAX,' ' ANM,' ' DATUM,' ' TYP' 'from AUT ' 'where' ' ID = :ID') SelectSQL.Strings = ( 'select * from AUT') ModifySQL.Strings = ( 'update AUT' 'set' ' ID = :ID,' ' AUT = :AUT,' ' VF = :VF,' ' FUNKTION = :FUNKTION,' ' FIRMA1 = :FIRMA1,' ' FIRMA2 = :FIRMA2,' ' STRASSE = :STRASSE,' ' PLZ = :PLZ,' ' ORT = :ORT,' ' LAND = :LAND,' ' TEL = :TEL,' ' TELPRIV = :TELPRIV,' ' FAX = :FAX,' ' ANM = :ANM,' ' DATUM = :DATUM,' ' TYP = :TYP' 'where' ' ID = :OLD_ID') Left = 312 Top = 448 object IBDataSet_AUTID: TIntegerField FieldName = 'ID' Origin = '"AUT"."ID"' ProviderFlags = [pfInUpdate, pfInWhere, pfInKey] Required = True end object IBDataSet_AUTAUT: TIBStringField FieldName = 'AUT' Origin = '"AUT"."AUT"' FixedChar = True Size = 30 end object IBDataSet_AUTVF: TIBStringField FieldName = 'VF' Origin = '"AUT"."VF"' FixedChar = True Size = 150 end object IBDataSet_AUTFUNKTION: TIBStringField FieldName = 'FUNKTION' Origin = '"AUT"."FUNKTION"' FixedChar = True Size = 150 end object IBDataSet_AUTFIRMA1: TIBStringField FieldName = 'FIRMA1' Origin = '"AUT"."FIRMA1"' FixedChar = True Size = 150 end object IBDataSet_AUTFIRMA2: TIBStringField FieldName = 'FIRMA2' Origin = '"AUT"."FIRMA2"' FixedChar = True Size = 150 end object IBDataSet_AUTSTRASSE: TIBStringField FieldName = 'STRASSE' Origin = '"AUT"."STRASSE"' FixedChar = True Size = 120 end object IBDataSet_AUTPLZ: TIBStringField FieldName = 'PLZ' Origin = '"AUT"."PLZ"' FixedChar = True Size = 30 end object IBDataSet_AUTORT: TIBStringField FieldName = 'ORT' Origin = '"AUT"."ORT"' FixedChar = True Size = 120 end object IBDataSet_AUTLAND: TIBStringField FieldName = 'LAND' Origin = '"AUT"."LAND"' FixedChar = True Size = 60 end object IBDataSet_AUTTEL: TIBStringField FieldName = 'TEL' Origin = '"AUT"."TEL"' FixedChar = True Size = 60 end object IBDataSet_AUTTELPRIV: TIBStringField FieldName = 'TELPRIV' Origin = '"AUT"."TELPRIV"' FixedChar = True Size = 60 end object IBDataSet_AUTFAX: TIBStringField FieldName = 'FAX' Origin = '"AUT"."FAX"' FixedChar = True Size = 60 end object IBDataSet_AUTANM: TIBStringField FieldName = 'ANM' Origin = '"AUT"."ANM"' FixedChar = True Size = 240 end object IBDataSet_AUTDATUM: TDateField FieldName = 'DATUM' Origin = '"AUT"."DATUM"' end object IBDataSet_AUTTYP: TIBStringField FieldName = 'TYP' Origin = '"AUT"."TYP"' FixedChar = True Size = 3 end end |
Re: ominöse "not in edit mode"-meldung
Kannst Du das mal so formatieren, dass man es auch lesen kann :warn:
|
Re: ominöse "not in edit mode"-meldung
Versuch' es mal so, indem Du in Deiner Function, in der Du konvertierst, das erste "DatenModul.IBDataSet_AUT.Close();" rausnimmst.
So wird doch die Tabelle geschlossen. Da kann nichts mehr eingefüht werden. |
Re: ominöse "not in edit mode"-meldung
Liste der Anhänge anzeigen (Anzahl: 1)
das geht hier leider nicht
aber ich hab mal nen anhang mit allem gemacht folgendermaßen: das projekt heißt cats2cats im alten datenbankformat gibt es separate aut-, lit-, deskr- und wörterbuchdateien im neuen soll das alles in einer einzigen datenbank gespeichert werden was ich bisher gemacht hab, ist mich mit der aut-datenbank zu befassen, also si umzuwandeln den rest einfach ignorieren, das läuft noch nicht aber wie gesagt, schon bei der aut-datei hapert's bitte mal nachschauen! grüße von le (leipzig) nach lu (luxemburg) hehe martin |
Re: ominöse "not in edit mode"-meldung
aber das wird doch in jedem schleifendurchgang neu geöffnet!
|
Re: ominöse "not in edit mode"-meldung
Moin, moin,
3 Fragen beim Lesen: TDatenModul.IBDataSet_AUTBeforeInsert(DataSet: TDataSet) und TRIGGER AUT_BI0 warum benutzt Du nicht das übergebene Dataset, wie ist der Status von IBDataSet_AUT beim Verlassen der Funktion und warum das Alles wenn es TRIGGER AUT_BI0 gibt?
Delphi-Quellcode:
Ich würde mal schrittweise zwischen den Befehlen DatenModul.IBDataSet_AUTAUT und DatenModul.IBDataSet_AUT auf active überwachen
DatenModul.IBDataSet_AUT.Insert();
DatenModul.IBDataSet_AUTAUT.AsString := DatenModul.Table_AUTAUT.AsString; //hier kommt die Meldung der Error "not in edit mode" Gruß Malte |
Re: ominöse "not in edit mode"-meldung
Juhu, endlich formatierter Code :)
Allso: Erstmal würde ich das "DatenModul.IBDataSet_AUT.Open();" und "DatenModul.IBDataSet_AUT.Close();" aus der schleife rausnehmen. Geht schneller :) Ist aber nicht das Problem... Zitat:
Ich denke, es sollte sein:
Delphi-Quellcode:
Ich weiß jetzt nicht aus dem Kopf, ob IBX da einen unterschied macht, aber IMHO sollte das Dataset im Insert-Mode sein.
DatenModul.Table_AUT.Next();
Dann könntest du noch probieren, nicht über Felder (Tstringfield etc.) zu gehen, sondern direkt
Delphi-Quellcode:
DatenModul.IBDataSet_AUT.FieldValues['wasweissich'] := ...
|
Re: ominöse "not in edit mode"-meldung
Zitat:
Wollt ich sowieso schon immer mal wissen was ich da falsch mache... Zitat:
Zitat:
Zitat:
|
Re: ominöse "not in edit mode"-meldung
Zitat:
SQL-Code:
definiert ist musst Du einen Wert mitgeben. Hier bietet sich bei integer- Feldern (z.B.) -1 an, da kann jeder beim 1. Versuch sehen, ob der Generator anspringt.
not null
Andererseits könntest Du im Trigger darauf reagieren, woher die Daten kommen, z.B.
SQL-Code:
Gruß
IF (OLD.ID=-1) THEN...
Malte |
Re: ominöse "not in edit mode"-meldung
Bei nicht definierter ID soll er aber besser DEFAULT verwenden ! Ist also kein ID-Wert definiert, dann gilt der default Wert. Allerdings, was soll das überhaupt, eine ID zu verwenden, die nicht besetzt wird ? :gruebel:
|
Re: ominöse "not in edit mode"-meldung
hmmm, naja war ja grad der Punkt dass ich *ursprünglich* die ID nicht belegen wollte, damit dass der Server automatisch macht...
aber wir kommen vom Thema ab, hat noch irgendjemand 'ne Idee? Danke, Martin |
Re: ominöse "not in edit mode"-meldung
Welchen Status hat dein Dataset zu diesem Zeitpunkt denn genau? (TDataSet.State)
|
Re: ominöse "not in edit mode"-meldung
der Status ist auf dsBrowse
schon seltsam mir is schon klar, dass ich da keine Daten verändern kann aber es bringt komischerweise auch nichts, vorher
Delphi-Quellcode:
einzufügen. Dann kommt die 'not in edit mode'-Meldung schon dort!
DatenModul.IBDataSet_AUT.Edit();
Ich hab auch wirklich alles SQL-Statements des DataSet gefüllt! Laut Delphi-Hilfe ist dieser Aufruf aber auch nicht notwendig: Zitat:
|
Re: ominöse "not in edit mode"-meldung
Ich hab grad mal die beforeInsert Methode aus meinem DataSet entfernt:
Delphi-Quellcode:
Jetzt auf einmal kommt er über die Stelle hinweg; meckert dafür aber, dass ich das Feld ID nicht belege.
procedure TDatenModul.IBDataSet_AUTBeforeInsert(DataSet: TDataSet);
begin {self.IBQuery_Get_AUT_GEN_ID.Open(); self.IBDataSet_AUTID.AsInteger := DatenModul.IBQuery_Get_AUT_GEN_IDGEN_ID.AsInteger + 1; //ShowMessage(IntToStr(DatenModul.IBQuery_Get_AUT_GEN_IDGEN_ID.AsInteger + 1)); self.IBQuery_Get_AUT_GEN_ID.Close(); } end; Ist mir völlig unverständlich, eildieweil ich mir meinen Trigger noch mal genau angeschaut hab, da ist nix mit if new.id is null; da steht:
SQL-Code:
Das heißt, der müsste IN JEDEN FALL eine neue ID generieren. Funzt aber nicht. Hier is der Wurm drin!
CREATE TRIGGER AUT_BI0 FOR AUT
ACTIVE BEFORE INSERT POSITION 0 AS begin new.ID = gen_id(gen_aut_id,1); end ^ |
Re: ominöse "not in edit mode"-meldung
Zitat:
Zitat:
SQL-Code:
Also muss das Feld beim insert einen Wert haben. Der Trigger wird ihn überbügeln...
CREATE TABLE AUT (ID INTEGER NOT NULL ...
Zitat:
Gruß Malte |
Re: ominöse "not in edit mode"-meldung
ja das ist aber leichter gesagt als getan
ich hab das auch schon probiert, hab den wert mit irgendwas belegt und was kommt dann für 'ne meldung? 'attempt to store duplicate value (visible to active transactions) in unique index AUT_IDX1' der trigger sollte doch jedesmal nen neuen wert erzeugen, oder? probiers mal aus... :wall: |
Re: ominöse "not in edit mode"-meldung
Lösch den Trigger mal aus der DB und erzeug nen neuen. Hört sich blöd an, hilft aber manchmal, da hakt einfach irgendwo was, was kein Mensch versteht :)
Wenn das nicht hilft, dann setz doch das ID-Feld manuell (einfach nen Int hochzählen). Sollte für deine Zweck (Konvertieren von einer DB zur anderen) doch reichen. |
Re: ominöse "not in edit mode"-meldung
1. den trigger kann ich nicht einfach löschen, weil das ne Datenbank ist, die per Script zur Laufzeit erst erzeugt wird, sprich bevor das Programm ausgeführt wird, existiert die Datenbank ja noch gar nicht
außerdem kann's am trigger auch nicht liegen, denn wenn ich in meiner testdatenbank im sql-editor eingebe:
SQL-Code:
schluckt der das problemlos! Da muss ich nicht mal nen wert für ID eingeben!!!
insert into AUT
(AUT) values ('SANCHO') 2. das mit dem hochzählen bringt mir nichts, weil ich nachher aufbauend auf dieser datenbank ja noch die das ganze Terminologie-programm umschreiben muss, und da wird mir selber hochzählen auch nichts bringen, deswegen will ich das jetz schon alles ordentlich machen... |
Re: ominöse "not in edit mode"-meldung
entweder mit after insert
SQL-Code:
ALTER TRIGGER AUT_BI0
ACTIVE AFTER INSERT POSITION 0 AS begin new.ID = gen_id(gen_aut_id,1); end oder Du setzt die ID before insert nur wenn nicht vorgegeben
SQL-Code:
ALTER TRIGGER AUT_BI0
ACTIVE BEFORE INSERT POSITION 0 AS begin if (old.id<=0) then begin new.ID = gen_id(gen_aut_id,1); end end und gibst ihm beim insert ID=-1 mit. Dann ist auch Hansas Frage beantwortet. Gruß Malte |
Re: ominöse "not in edit mode"-meldung
wie gesagt, die datenbank scheint richtig eingerichtet zu sein, schau dir meinen letzten post nochmal an, hab den nochmal editiert...
schätze, das muss irgendwo an meiner delphi-anwendung liegen... |
Re: ominöse "not in edit mode"-meldung
Delphi-Quellcode:
Du hast Dir die ID selbst in das Statement genagelt, auf nix anderes können wir uns berufen. ID ist not null und der trigger arbeitet before insert
InsertSQL.Strings = (
'insert into AUT' ' (ID, AUT, VF, FUNKTION, FIRMA1, FIRMA2, STRASSE, PLZ, ORT, LAN' + 'D, TEL, ' ' TELPRIV, FAX, ANM, DATUM, TYP)' 'values' ' (:ID, :AUT, :VF, :FUNKTION, :FIRMA1, :FIRMA2, :STRASSE, :PLZ, ' + ':ORT, :LAND, ' ' :TEL, :TELPRIV, :FAX, :ANM, :DATUM, :TYP)') Also entweder musst Du eine ID übergeben und den Trigger ändern oder aber das insert- statement korrigieren. Gruß Malte |
Re: ominöse "not in edit mode"-meldung
ich weiß, ich weiß
war mir auch schon aufgefallen, kann gar nichr erzählen was ich alles schon ausprobiert habe hatte die id schon aus dem insert-statement entfernt; dann meckert der auf einmal, das id einen wert haben muss (?!?!!) dann dachte ich mir, ich entferne sogar mal das feld aus dem dataset komplett (aus richtig aus dem feld-editor löschen) -> dann krieg ich wieder die 'attempt to store duplicate value'-nachricht arrrrrrrgggghhhhhhhhhh, ich krieg 'n kind |
Re: ominöse "not in edit mode"-meldung
Zitat:
Das die ID im Statement drinne ist, ist schon ok, der Trigger sollte aber den Fall, das ID nicht NULL ist, abfragen, sonst wirst du später u.U. Schwierigkeiten kriegen, wenn du mal ne ID selbst erzeugen mußt, kommt auch vor. |
Re: ominöse "not in edit mode"-meldung
Hast du schon mal getestet, ob der Trigger wirklich arbeitet? Z.B. irgendein Dummy-Feld setzen oder so....
Zitat:
|
Re: ominöse "not in edit mode"-meldung
Zitat:
Gruß Malte |
Re: ominöse "not in edit mode"-meldung
Zitat:
das script zur erzeugung der datenbank:
SQL-Code:
/******************************************************************************/
/**** Generated by IBExpert 2006.01.29 23.02.2006 16:00:02 ****/ /******************************************************************************/ SET SQL DIALECT 3; SET NAMES NONE; CREATE DATABASE 'C:\Dokumente und Einstellungen\Sancho\Eigene Dateien\LEER.GDB' USER 'sysdba' PASSWORD 'masterkey' PAGE_SIZE 4096 DEFAULT CHARACTER SET NONE; /******************************************************************************/ /**** Domains ****/ /******************************************************************************/ CREATE DOMAIN CHAR_1 AS CHAR(1) CHARACTER SET UNICODE_FSS; CREATE DOMAIN CHAR_10 AS CHAR(10) CHARACTER SET UNICODE_FSS; CREATE DOMAIN CHAR_100 AS CHAR(100) CHARACTER SET UNICODE_FSS; CREATE DOMAIN CHAR_14 AS CHAR(10) CHARACTER SET UNICODE_FSS; CREATE DOMAIN CHAR_15 AS CHAR(15) CHARACTER SET UNICODE_FSS; CREATE DOMAIN CHAR_20 AS CHAR(20) CHARACTER SET UNICODE_FSS; CREATE DOMAIN CHAR_3 AS CHAR(10) CHARACTER SET UNICODE_FSS; CREATE DOMAIN CHAR_4 AS CHAR(4) CHARACTER SET UNICODE_FSS; CREATE DOMAIN CHAR_40 AS CHAR(40) CHARACTER SET UNICODE_FSS; CREATE DOMAIN CHAR_50 AS CHAR(50) CHARACTER SET UNICODE_FSS; CREATE DOMAIN CHAR_60 AS CHAR(60) CHARACTER SET UNICODE_FSS; CREATE DOMAIN CHAR_80 AS CHAR(80) CHARACTER SET UNICODE_FSS; CREATE DOMAIN MEMOBLOB AS BLOB SUB_TYPE 1 SEGMENT SIZE 4096 CHARACTER SET UNICODE_FSS; CREATE DOMAIN TEST AS CHAR(85) CHARACTER SET UNICODE_FSS; /******************************************************************************/ /**** Generators ****/ /******************************************************************************/ CREATE GENERATOR GEN_DSKRPTLINK_DICENTRIES_ID; SET GENERATOR GEN_DSKRPTLINK_DICENTRIES_ID TO 0; CREATE GENERATOR GEN_DSKRPTLINK_GEN_D_LIT_ID; SET GENERATOR GEN_DSKRPTLINK_GEN_D_LIT_ID TO 0; CREATE GENERATOR GEN_D_LIT_ID; SET GENERATOR GEN_D_LIT_ID TO 0; CREATE GENERATOR GEN_AUT_ID; SET GENERATOR GEN_AUT_ID TO 0; CREATE GENERATOR GEN_DICENTRIES_ID; SET GENERATOR GEN_DICENTRIES_ID TO 0; CREATE GENERATOR GEN_DSKRPTS_ID; SET GENERATOR GEN_DSKRPTS_ID TO 0; CREATE GENERATOR GEN_LIT_ID; SET GENERATOR GEN_LIT_ID TO 0; CREATE GENERATOR GEN_TITELAUFS_LIT_ID; SET GENERATOR GEN_TITELAUFS_LIT_ID TO 0; CREATE GENERATOR GEN_TITELWERK_LIT_ID; SET GENERATOR GEN_TITELWERK_LIT_ID TO 0; /******************************************************************************/ /**** Tables ****/ /******************************************************************************/ CREATE TABLE AUT ( ID INTEGER NOT NULL, AUT CHAR_3, VF CHAR_50, FUNKTION CHAR_50, FIRMA1 CHAR_50, FIRMA2 CHAR_50, STRASSE CHAR_40, PLZ CHAR_10, ORT CHAR_40, LAND CHAR_20, TEL CHAR_20, TELPRIV CHAR_20, FAX CHAR_20, ANM CHAR_80, DATUM DATE, TYP CHAR_1 ); CREATE TABLE D_LIT ( ID INTEGER NOT NULL, ID_LIT SMALLINT NOT NULL ); CREATE TABLE DICENTRIES ( ID INTEGER NOT NULL, ASTERM CHAR_80, ASABK CHAR_10, ASPRGM CHAR_20, ASSEM CHAR_80, ZSTERM CHAR_80, ZSABK CHAR_10, ZSPRGM CHAR_20, ZSSEM CHAR_80, DATUM DATE, PROJ CHAR_20, REV CHAR_1, UPDDATUM DATE, ASVERW INTEGER, ZSVERW INTEGER, ASDEF MEMOBLOB, ZSDEF MEMOBLOB, AUDIO CHAR_20, VIDEO CHAR_20, ABBILDUNG CHAR_20, ASQCODE INTEGER, ZSQCODE INTEGER, AUT INTEGER, UPDAUT INTEGER ); CREATE TABLE DSKRPTLINK_D_LIT ( ID INTEGER NOT NULL, ID_D_LIT INTEGER NOT NULL, ID_DSKRPT SMALLINT NOT NULL ); CREATE TABLE DSKRPTLINK_DICENTRIES ( ID_DICENTRY INTEGER NOT NULL, ID_DSKRPT INTEGER NOT NULL, ID INTEGER NOT NULL ); CREATE TABLE DSKRPTS ( ASDSKRPT CHAR_10 NOT NULL, ZSDSKRPT CHAR_10 NOT NULL, ASLANG CHAR_50, ZSLANG CHAR_50, ID INTEGER NOT NULL ); CREATE TABLE LIT ( ID INTEGER NOT NULL, VF CHAR_50, HRSG CHAR_50, ORT CHAR_20, VERLAG CHAR_20, BANDHEFT CHAR_3, JAHR CHAR_4, SEITE CHAR_10, PREIS CHAR_10, ISBN CHAR_14, STANDNR CHAR_20, ANM1 CHAR_60, ANM2 CHAR_60, AUT INTEGER, DATUM DATE, TYP CHAR_3, SPRACHEN CHAR_20, QCODE CHAR_15 ); CREATE TABLE TITELAUFS_LIT ( ID INTEGER NOT NULL, TITELAUFS CHAR_60 NOT NULL, LIT_ID INTEGER NOT NULL ); CREATE TABLE TITELWERK_LIT ( ID INTEGER NOT NULL, TITELWERK CHAR_60 NOT NULL, ID_LIT INTEGER NOT NULL ); /******************************************************************************/ /**** Unique Constraints ****/ /******************************************************************************/ ALTER TABLE DSKRPTS ADD CONSTRAINT UNQ_DSKRPTS UNIQUE (ASDSKRPT, ZSDSKRPT); /******************************************************************************/ /**** Primary Keys ****/ /******************************************************************************/ ALTER TABLE AUT ADD CONSTRAINT PK_AUT PRIMARY KEY (ID); ALTER TABLE DICENTRIES ADD PRIMARY KEY (ID); ALTER TABLE DSKRPTLINK_DICENTRIES ADD PRIMARY KEY (ID); ALTER TABLE DSKRPTLINK_D_LIT ADD CONSTRAINT PK_DSKRPTLINK_D_LIT PRIMARY KEY (ID); ALTER TABLE DSKRPTS ADD PRIMARY KEY (ID); ALTER TABLE D_LIT ADD CONSTRAINT PK_D_LIT PRIMARY KEY (ID); ALTER TABLE LIT ADD CONSTRAINT PK_LIT PRIMARY KEY (ID); ALTER TABLE TITELAUFS_LIT ADD CONSTRAINT PK_TITELAUFS_LIT PRIMARY KEY (ID); ALTER TABLE TITELWERK_LIT ADD CONSTRAINT PK_TITELWERK_LIT PRIMARY KEY (ID); /******************************************************************************/ /**** Foreign Keys ****/ /******************************************************************************/ ALTER TABLE DICENTRIES ADD CONSTRAINT FK_DICENTRIES_1 FOREIGN KEY (ASVERW) REFERENCES DICENTRIES (ID) ON DELETE SET DEFAULT ON UPDATE SET DEFAULT; ALTER TABLE DICENTRIES ADD CONSTRAINT FK_DICENTRIES_2 FOREIGN KEY (ZSVERW) REFERENCES DICENTRIES (ID) ON DELETE SET DEFAULT ON UPDATE SET DEFAULT; ALTER TABLE DICENTRIES ADD CONSTRAINT FK_DICENTRIES_3 FOREIGN KEY (ASQCODE) REFERENCES LIT (ID) ON DELETE SET DEFAULT ON UPDATE SET DEFAULT; ALTER TABLE DICENTRIES ADD CONSTRAINT FK_DICENTRIES_4 FOREIGN KEY (ZSQCODE) REFERENCES LIT (ID) ON DELETE SET DEFAULT ON UPDATE SET DEFAULT; ALTER TABLE DICENTRIES ADD CONSTRAINT FK_DICENTRIES_5 FOREIGN KEY (AUT) REFERENCES AUT (ID) ON DELETE SET DEFAULT ON UPDATE SET DEFAULT; ALTER TABLE DICENTRIES ADD CONSTRAINT FK_DICENTRIES_6 FOREIGN KEY (UPDAUT) REFERENCES AUT (ID) ON DELETE SET DEFAULT ON UPDATE SET DEFAULT; ALTER TABLE DSKRPTLINK_DICENTRIES ADD CONSTRAINT FK_DSKRPTLINK_DICENTRIES_1 FOREIGN KEY (ID_DICENTRY) REFERENCES DICENTRIES (ID) ON DELETE SET DEFAULT ON UPDATE SET DEFAULT; ALTER TABLE DSKRPTLINK_DICENTRIES ADD CONSTRAINT FK_DSKRPTLINK_DICENTRIES_2 FOREIGN KEY (ID_DSKRPT) REFERENCES DSKRPTS (ID) ON DELETE SET DEFAULT ON UPDATE SET DEFAULT; ALTER TABLE DSKRPTLINK_D_LIT ADD CONSTRAINT FK_DSKRPTLINK_D_LIT_1 FOREIGN KEY (ID_D_LIT) REFERENCES D_LIT (ID) ON DELETE SET DEFAULT ON UPDATE SET DEFAULT; ALTER TABLE DSKRPTLINK_D_LIT ADD CONSTRAINT FK_DSKRPTLINK_D_LIT_2 FOREIGN KEY (ID_DSKRPT) REFERENCES DSKRPTS (ID) ON DELETE SET DEFAULT ON UPDATE SET DEFAULT; ALTER TABLE D_LIT ADD CONSTRAINT FK_D_LIT_1 FOREIGN KEY (ID_LIT) REFERENCES LIT (ID) ON DELETE SET DEFAULT ON UPDATE SET DEFAULT; ALTER TABLE TITELAUFS_LIT ADD CONSTRAINT FK_TITELAUFS_LIT_1 FOREIGN KEY (LIT_ID) REFERENCES LIT (ID) ON DELETE SET DEFAULT ON UPDATE SET DEFAULT; ALTER TABLE TITELWERK_LIT ADD CONSTRAINT FK_TITELWERK_LIT_1 FOREIGN KEY (ID_LIT) REFERENCES LIT (ID) ON DELETE SET DEFAULT ON UPDATE SET DEFAULT; /******************************************************************************/ /**** Indices ****/ /******************************************************************************/ CREATE UNIQUE INDEX AUT_IDX1 ON AUT (AUT); CREATE INDEX AUT_IDX2 ON AUT (FIRMA1); CREATE INDEX AUT_IDX3 ON AUT (FIRMA2); CREATE INDEX AUT_IDX4 ON AUT (ORT); CREATE INDEX AUT_IDX5 ON AUT (PLZ); CREATE INDEX AUT_IDX6 ON AUT (TYP); CREATE INDEX AUT_IDX7 ON AUT (VF); CREATE INDEX DICENTRIES_IDX1 ON DICENTRIES (ASABK); CREATE INDEX DICENTRIES_IDX10 ON DICENTRIES (ZSQCODE); CREATE INDEX DICENTRIES_IDX11 ON DICENTRIES (ZSTERM); CREATE INDEX DICENTRIES_IDX2 ON DICENTRIES (ASTERM); CREATE INDEX DICENTRIES_IDX3 ON DICENTRIES (DATUM); CREATE INDEX DICENTRIES_IDX4 ON DICENTRIES (PROJ); CREATE INDEX DICENTRIES_IDX5 ON DICENTRIES (REV); CREATE INDEX DICENTRIES_IDX6 ON DICENTRIES (AUT); CREATE INDEX DICENTRIES_IDX7 ON DICENTRIES (UPDAUT); CREATE INDEX DICENTRIES_IDX8 ON DICENTRIES (UPDDATUM); CREATE INDEX DICENTRIES_IDX9 ON DICENTRIES (ZSABK); CREATE INDEX GEN_DSKRPTLINK_DICENTRIES_IDX1 ON DSKRPTLINK_DICENTRIES (ID_DICENTRY); CREATE INDEX GEN_DSKRPTLINK_DICENTRIES_IDX2 ON DSKRPTLINK_DICENTRIES (ID_DSKRPT); CREATE UNIQUE INDEX DSKRPTS_IDX1 ON DSKRPTS (ASDSKRPT); CREATE UNIQUE INDEX DSKRPTS_IDX2 ON DSKRPTS (ZSDSKRPT); CREATE INDEX LIT_IDX10 ON LIT (VERLAG); CREATE INDEX LIT_IDX6 ON LIT (HRSG); CREATE UNIQUE INDEX LIT_IDX7 ON LIT (QCODE); CREATE INDEX LIT_IDX8 ON LIT (TYP); CREATE INDEX LIT_IDX9 ON LIT (VF); /******************************************************************************/ /**** Triggers ****/ /******************************************************************************/ SET TERM ^ ; /******************************************************************************/ /**** Triggers for tables ****/ /******************************************************************************/ /* Trigger: AUT_BI0 */ CREATE TRIGGER AUT_BI0 FOR AUT ACTIVE BEFORE INSERT POSITION 0 AS begin new.ID = gen_id(gen_aut_id,1); end ^ /* Trigger: DICENTRIES_BI0 */ CREATE TRIGGER DICENTRIES_BI0 FOR DICENTRIES ACTIVE BEFORE INSERT POSITION 0 as begin new.ID = gen_id(gen_dicentries_id,1); end ^ /* Trigger: DSKRPTLINK_DICENTRIES_BI0 */ CREATE TRIGGER DSKRPTLINK_DICENTRIES_BI0 FOR DSKRPTLINK_DICENTRIES ACTIVE BEFORE INSERT POSITION 0 AS begin new.ID = gen_id(GEN_DSKRPTLINK_DICENTRIES_ID,1); end ^ /* Trigger: DSKRPTLINK_D_LIT_BI0 */ CREATE TRIGGER DSKRPTLINK_D_LIT_BI0 FOR DSKRPTLINK_D_LIT ACTIVE BEFORE INSERT POSITION 0 AS begin new.ID = gen_id(GEN_DSKRPTLINK_GEN_D_LIT_ID,1); end ^ /* Trigger: DSKRPTS_BI0 */ CREATE TRIGGER DSKRPTS_BI0 FOR DSKRPTS ACTIVE BEFORE INSERT POSITION 0 as begin new.ID = gen_id(gen_dskrpts_id,1); end ^ /* Trigger: D_LIT_BI0 */ CREATE TRIGGER D_LIT_BI0 FOR D_LIT ACTIVE BEFORE INSERT POSITION 0 AS begin new.ID = gen_id(GEN_D_LIT_ID,1); end ^ /* Trigger: LIT_BI0 */ CREATE TRIGGER LIT_BI0 FOR LIT ACTIVE BEFORE INSERT POSITION 0 AS begin new.ID = gen_id(gen_lit_id,1); end ^ /* Trigger: TITELAUFS_LIT_BI0 */ CREATE TRIGGER TITELAUFS_LIT_BI0 FOR TITELAUFS_LIT ACTIVE BEFORE INSERT POSITION 0 AS begin new.ID = gen_id(gen_titelaufs_lit_id,1); end ^ /* Trigger: TITELWERK_LIT_BI0 */ CREATE TRIGGER TITELWERK_LIT_BI0 FOR TITELWERK_LIT ACTIVE BEFORE INSERT POSITION 0 AS begin new.ID = gen_id(gen_titelwerk_lit_id,1); end ^ SET TERM ; ^ |
Re: ominöse "not in edit mode"-meldung
Zitat:
Also IBExpert :) Naja das DB-Script scheint ok, klar. Wie, gesagt, bei den Triggern sollte noch die Abfrage auf NULL mit rein. Wie erzeugst du dann die DB? In deinem Projekt fehlt dieser Teil. Das machst du doch im Programm, oder hab ich das vorhin falsch verstanden? Wie lautet die Fehlermeldung mit der ID genau? Oder hab ich wieder mal was überlesen :gruebel: |
Re: ominöse "not in edit mode"-meldung
Zitat:
Wenn die Fehlermeldung erscheint, ist die Datenbank ja sogar erzeugt. Nur ist sie eben leer! Zitat:
Zitat:
|
Re: ominöse "not in edit mode"-meldung
was hast Du denn nun gemacht: die ID aus dem Insertstatement genommen oder den Trigger umgestellt?
Gruß Malte |
Re: ominöse "not in edit mode"-meldung
hab die id rausgenommen aus dem sql-statement
die id ist als unique definiert, deswegen wüsst ich echt nicht, wann ich 'ne id jemals selbst zuweisen sollte aber es klappt alles nicht :freak: und wie gesagt: der fehler KANN nicht an der datenbankstruktur liegen, sonst könnte ich im sql-editor unter ibexpert wohl kaum records einfügen; und das ganz ohne überhaupt ne id anzugeben! |
Re: ominöse "not in edit mode"-meldung
Delphi-Quellcode:
AUT.AUT hat einen unique index aber keine Ursprungsdaten, die unique sind
DatenModul.IBDataSet_AUT.Insert();
DatenModul.IBDataSet_AUTID.AsInteger := -1; // das klappt DatenModul.IBDataSet_AUTAUT.AsString := DatenModul.Table_AUTAUT.AsString; // <--- das nicht entweder raus mit dem unique oder die Ursprungsdaten nachbessern Gruß Malte |
Re: ominöse "not in edit mode"-meldung
klingt plausibel
werd ich gleich mal ausprobieren danke für den tipp werd nachher mal bescheid geben ob's das war gruß martin |
Re: ominöse "not in edit mode"-meldung
hab grad nur meinen laptop zur hand und da spackt delphi grad rum
was mir aber aufgefallen ist, ist, dass es mehrere records in der ursprungs-datenbank gibt, mit dem gleichen aut-kürzel das dürfte die "attempt to store duplicate value"-meldung erklären schätze das war das problem 1000 dank für dein wachsames auge! martin |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:00 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 by Thomas Breitkreuz