Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

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 22: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 22: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 22: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 22: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 22:49

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

Frank Borland 24. Feb 2006 07: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 07: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 10: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 11: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 12: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:


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:55 Uhr.
Seite 1 von 4  1 23     Letzte »    

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