Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi ominöse "not in edit mode"-meldung (https://www.delphipraxis.net/63874-ominoese-not-edit-mode-meldung.html)

sancho1980 23. Feb 2006 23:14

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:
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;
Ich habe echt schon alles ausprobiert. Auch ein einfügen von DatenModul.IBDataSet_AUT.Edit() bringt nichts. Ich raff's nicht. Ihr vielleicht?

Danke,
Martin


Die Definition meiner Dataset-Komponente ist folgende:

Code:
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
[edit=MrSpock]Code Tags gesetzt. Mfg, MrSpock[/edit]

Union 23. Feb 2006 23:33

Re: ominöse "not in edit mode"-meldung
 
Kannst Du das mal so formatieren, dass man es auch lesen kann :warn:

CG2003 23. Feb 2006 23:40

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.

sancho1980 23. Feb 2006 23:48

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

sancho1980 23. Feb 2006 23:49

Re: ominöse "not in edit mode"-meldung
 
aber das wird doch in jedem schleifendurchgang neu geöffnet!

Frank Borland 24. Feb 2006 08:03

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:
DatenModul.IBDataSet_AUT.Insert();
DatenModul.IBDataSet_AUTAUT.AsString := DatenModul.Table_AUTAUT.AsString; //hier kommt die Meldung der Error "not in edit mode"
Ich würde mal schrittweise zwischen den Befehlen DatenModul.IBDataSet_AUTAUT und DatenModul.IBDataSet_AUT auf active überwachen


Gruß


Malte

Der Jan 24. Feb 2006 08:37

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:

Delphi-Quellcode:
DatenModul.IBDataSet_AUT.Next();

Was soll das bringen? Du fügst doch in das DataSet ein. Bei "Insert" (Ich würde Append nehmen, aber egal) wird der Cursor automatisch gesetzt...
Ich denke, es sollte sein:
Delphi-Quellcode:
DatenModul.Table_AUT.Next();
Ich weiß jetzt nicht aus dem Kopf, ob IBX da einen unterschied macht, aber IMHO sollte das Dataset im Insert-Mode sein.

Dann könntest du noch probieren, nicht über Felder (Tstringfield etc.) zu gehen, sondern direkt
Delphi-Quellcode:
DatenModul.IBDataSet_AUT.FieldValues['wasweissich'] := ...

sancho1980 24. Feb 2006 11:35

Re: ominöse "not in edit mode"-meldung
 
Zitat:

Zitat von Frank Borland
und warum das Alles wenn es TRIGGER AUT_BI0 gibt?

Genau damit hatte ich schon immer 'n Problem. Eigentlich sollte der Trigger das alleine machen, aber wenn ich versuche, einen Datensatz einzufügen, ohne ID zu belegen, bekomm ich eine Fehlermeldung, von wegen, ID ist nicht belegt...
Wollt ich sowieso schon immer mal wissen was ich da falsch mache...

Zitat:

Zitat von Frank Borland
Ich würde mal schrittweise zwischen den Befehlen DatenModul.IBDataSet_AUTAUT und DatenModul.IBDataSet_AUT auf active überwachen

Das hab ich wirklich gestern den ganzen Tag lang gemacht! Deswegen bin ich ja so verzweifelt...

Zitat:

Zitat von Der Jan
Ich denke, es sollte sein:
Zitat:

Zitat von Delphi-Quellcode:
DatenModul.Table_AUT.Next();


Stimmt. Für 'ne Sekunde dacht ich daran lag's..Aber die besch... Meldung kommt trotzdem noch!

Zitat:

Zitat von Der Jan
Juhu, endlich formatierter Code

Na wenn dann richtig :stupid:

Frank Borland 24. Feb 2006 12:29

Re: ominöse "not in edit mode"-meldung
 
Zitat:

Zitat von sancho1980
Zitat:

Zitat von Frank Borland
und warum das Alles wenn es TRIGGER AUT_BI0 gibt?

Genau damit hatte ich schon immer 'n Problem. Eigentlich sollte der Trigger das alleine machen, aber wenn ich versuche, einen Datensatz einzufügen, ohne ID zu belegen, bekomm ich eine Fehlermeldung, von wegen, ID ist nicht belegt...
Wollt ich sowieso schon immer mal wissen was ich da falsch mache...

Der Trigger kommt schon alleine klar. Da das Feld
SQL-Code:
not null
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.
Andererseits könntest Du im Trigger darauf reagieren, woher die Daten kommen, z.B.
SQL-Code:
IF (OLD.ID=-1) THEN...
Gruß


Malte

Hansa 24. Feb 2006 13:03

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:

sancho1980 24. Feb 2006 13:10

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

Der Jan 24. Feb 2006 13:42

Re: ominöse "not in edit mode"-meldung
 
Welchen Status hat dein Dataset zu diesem Zeitpunkt denn genau? (TDataSet.State)

sancho1980 24. Feb 2006 14:02

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:
DatenModul.IBDataSet_AUT.Edit();
einzufügen. Dann kommt die 'not in edit mode'-Meldung schon dort!
Ich hab auch wirklich alles SQL-Statements des DataSet gefüllt!

Laut Delphi-Hilfe ist dieser Aufruf aber auch nicht notwendig:

Zitat:

Zitat von Delphi-Hilfe zu TIBDataSet
Nach dem Aufruf von Insert können die Benutzer Daten in die Felder des neuen Datensatzes eingeben und anschließend die Änderungen mit Post in die Datenbank oder das Änderungsprotokoll eintragen. (Client-Datenmengen können die zwischengespeicherten Änderungen danach durch einen Aufruf von ApplyUpdates in die Datenquelle eintragen.)


sancho1980 24. Feb 2006 14:28

Re: ominöse "not in edit mode"-meldung
 
Ich hab grad mal die beforeInsert Methode aus meinem DataSet entfernt:

Delphi-Quellcode:
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;
Jetzt auf einmal kommt er über die Stelle hinweg; meckert dafür aber, dass ich das Feld ID nicht belege.
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:
CREATE TRIGGER AUT_BI0 FOR AUT
ACTIVE BEFORE INSERT POSITION 0
AS
begin
  new.ID = gen_id(gen_aut_id,1);
end
^
Das heißt, der müsste IN JEDEN FALL eine neue ID generieren. Funzt aber nicht. Hier is der Wurm drin!

Frank Borland 24. Feb 2006 14:37

Re: ominöse "not in edit mode"-meldung
 
Zitat:

Zitat von sancho1980
Ich hab grad mal die beforeInsert Methode aus meinem DataSet entfernt:

endlich, das wurde auch Zeit :-D


Zitat:

Zitat von sancho1980
Jetzt auf einmal kommt er über die Stelle hinweg; meckert dafür aber, dass ich das Feld ID nicht belege.

Das ist völlig korrekt, ID ist not null definiert, das hatten wir aber schon:

SQL-Code:
CREATE TABLE AUT (ID INTEGER NOT NULL ...
Also muss das Feld beim insert einen Wert haben. Der Trigger wird ihn überbügeln...


Zitat:

Zitat von sancho1980
Das heißt, der müsste IN JEDEN FALL eine neue ID generieren. Funzt aber nicht. Hier is der Wurm drin!

Das wird er auch tun, egal was Du ihm beim insert für eine ID gibts.

Gruß

Malte

sancho1980 24. Feb 2006 14:40

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:

Der Jan 24. Feb 2006 14:45

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.

sancho1980 24. Feb 2006 14:49

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:
insert into AUT
  (AUT)
values
  ('SANCHO')
schluckt der das problemlos! Da muss ich nicht mal nen wert für ID eingeben!!!

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...

Frank Borland 24. Feb 2006 14:51

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

sancho1980 24. Feb 2006 14:56

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...

Frank Borland 24. Feb 2006 15:07

Re: ominöse "not in edit mode"-meldung
 
Delphi-Quellcode:
 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)')
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
Also entweder musst Du eine ID übergeben und den Trigger ändern oder aber das insert- statement korrigieren.

Gruß

Malte

sancho1980 24. Feb 2006 15:13

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

Der Jan 24. Feb 2006 15:16

Re: ominöse "not in edit mode"-meldung
 
Zitat:

entweder mit after insert
After Insert wird nix bringen, das ist ja eben danach... :)
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.

Der Jan 24. Feb 2006 15:19

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:

weil das ne Datenbank ist, die per Script zur Laufzeit erst erzeugt wird
Zeig mal das Script...

Frank Borland 24. Feb 2006 15:23

Re: ominöse "not in edit mode"-meldung
 
Zitat:

Zitat von Der Jan
Zitat:

entweder mit after insert
After Insert wird nix bringen, das ist ja eben danach... :)
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.

Du zitierst zu entweder und schreibst einen Kommentar zu oder

Gruß

Malte

sancho1980 24. Feb 2006 15:24

Re: ominöse "not in edit mode"-meldung
 
Zitat:

Zitat von Der Jan
Hast du schon mal getestet, ob der Trigger wirklich arbeitet? Z.B. irgendein Dummy-Feld setzen oder so....

im sql-editor von ibexpert geht das problemlos wie gesagt, sogar ohne angabe der id!

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 ; ^

Der Jan 24. Feb 2006 15:47

Re: ominöse "not in edit mode"-meldung
 
Zitat:

Du zitierst zu entweder und schreibst einen Kommentar zu oder
Tschuldigung. Hätte ich eine Leerzeile lassen sollen ? :wink: ...Hab nen Teil überlesen...



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:

sancho1980 24. Feb 2006 15:49

Re: ominöse "not in edit mode"-meldung
 
Zitat:

Zitat von Der Jan
Wie erzeugst du dann die DB? In deinem Projekt fehlt dieser Teil.

Nein das fehlt im Programm nicht. Da ist eine TIBScript-Komponente. Schau einfach mal was alles passiert, wenn du auf "Umwandeln" klickst, da wird auch das Script ausgeführt!
Wenn die Fehlermeldung erscheint, ist die Datenbank ja sogar erzeugt. Nur ist sie eben leer!

Zitat:

Zitat von Der Jan
Wie lautet die Fehlermeldung mit der ID genau? Oder hab ich wieder mal was überlesen

Ja :-)

Zitat:

Zitat von sancho1980
...
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


Frank Borland 24. Feb 2006 16:26

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

sancho1980 24. Feb 2006 16:37

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!

Frank Borland 24. Feb 2006 18:41

Re: ominöse "not in edit mode"-meldung
 
Delphi-Quellcode:
DatenModul.IBDataSet_AUT.Insert();
DatenModul.IBDataSet_AUTID.AsInteger := -1; // das klappt
DatenModul.IBDataSet_AUTAUT.AsString := DatenModul.Table_AUTAUT.AsString; // <--- das nicht
AUT.AUT hat einen unique index aber keine Ursprungsdaten, die unique sind
entweder raus mit dem unique oder die Ursprungsdaten nachbessern

Gruß


Malte

sancho1980 25. Feb 2006 13:45

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

sancho1980 25. Feb 2006 23:58

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