![]() |
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:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:07 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