Operation not allowed, dataset "%s" is not in an activ...

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
sierdolg
Beiträge: 66
Registriert: Mi 24. Okt 2012, 15:50

Operation not allowed, dataset "%s" is not in an activ...

Beitrag von sierdolg »

Werte Forumsgemeinde,

erneut stecke ich an einer Fehlermeldung fest, deren Ursache sich nicht erschließt: Beim Start einer Anwendung, die nur aus einem Datamodule und einem Form besteht und noch fast keinen Code enthält (insbesondere keinen, der Datenbankaktionen anstoßen würde), kommt noch vor dem Erscheinen des Formulars die Fehlermeldung "ztPos : Operation not allowed, dataset "%s" is not in an edit or insert state.".

Mit dem Debugger habe ich an verschiedene Stellen Haltepunkte gesetzt und festgestellt, daß der Code, der die Datenbankverbindung herstellt und dann die Datasets der Reihe nach aktiviert:

Code: Alles auswählen

procedure TDataModule1.DataModuleCreate(Sender: TObject);
begin
    DataModule1.ZConInventory.Connect;
 
    //aktivieren der Datasets, Lookup-Datasets zuerst, dann die Haupttabelle
    DataModule1.ztHActive := True;
    //... (analog weitere weitere Tabellen-Datasets)
 
    DataModule1.ztStO.Active := True;
    DataModule1.ztVPActive := True;
    DataModule1.ztG.Active := True;
 
    DataModule1.ztLs.Active := True;
    DataModule1.zqVLs.Active := True;
    DataModule1.ztPos.Active := True;
    DataModule1.ztArt.Active := True;
end;     
 
komplett fehlerlos durchlaufen wird. Gemäß der project.lpr folgt dann  CreateForm:
 
[code=laz]begin
  RequireDerivedFormResource:=True;
  Application.Initialize;
  Application.CreateForm(TDataModule1, DataModule1);
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.
 [/code]
 
Setze ich in der ersten Zeile von .FormCreate einen Haltepunkt, stoppt die Ausführung hier und die seltsame "Operation not allowed" Meldung erscheint bereits.
procedure TForm1.FormCreate(Sender: TObject);
begin
  WriteLn('Start FormCreate');
end;             
 
Die WriteLn-Ausgabe erfolgt wie erwartet auch noch nicht; auf der Konsole erscheint nur:
 
[FORMS.PP] ExceptionOccurred
  Sender=EDatabaseError
  Exception=ztPosition : Operation not allowed, dataset "%s" is not in an edit or insert state.
  Stack trace:
  $000000000078CB94
  $0000000000A19D37  SETFIELDDATA,  line 3055 of ../../../../../../../../../../home/user/development/lazarus/trunk-trunk/ccr/zeos/src/component/ZAbstractRODataset.pas
  $000000000078FE1E
  $00000000007972CA
  $000000000078F6B2
  $00000000007901DF
  $00000000004A2825
  $000000000045A834  CREATEFORM,  line 2190 of include/application.inc
  $000000000041E44D  main,  line 18 of project1.lpr


Jede Idee und jeder Vorschlag, wie man der Fehlerursache auf die Schliche kommt, wäre willkommen!

Verwendete Versionen: Lazarus (trunk) mit aktuellem FPC (trunk) mit Zeos Access (zcomponent 7.2), alles mit fpclazupdeluxe installiert (also nichts linuxdistributionsspezifisches) auf Debian Stable 8 alias Jessie 64 Bit.

Noch eine Zusatzinformation: Der Fehler tritt auf, sobald ich mit "Edit fields" ein Nachschlagefeld hinzufüge, um auf einem DBGrid statt dem Fremdschlüssel (für einen Ort) den Ortsnamen anzeigen zu lassen. Im Designer funktioniert das auch!
Mit dem Löschen dieses Nachschlagefeldes verschwindet der Laufzeitfehler wieder. Doch was hat ein Nachschlagefeld mit "Edit oder Insert" zu tun?
Zuletzt geändert von sierdolg am Do 9. Mär 2017, 13:24, insgesamt 3-mal geändert.

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Operation not allowed, dataset "%s" is not in an activ..

Beitrag von mse »

Aktiviere in Lazarus die Entsprechung von MSEide 'Stop on exception' und prüfe das Stack Fenster. Wahrscheinlich siehst du dann wo versucht wird einen Feldwert zu ändern. Es ist auch nützlich, die FPC-RTL und ZEOS mit debuginfo zu kompilieren.

Schabersack
Beiträge: 7
Registriert: Mi 16. Okt 2013, 20:24

Re: Operation not allowed, dataset "%s" is not in an activ..

Beitrag von Schabersack »

Hallo!

Da hatte ich einmal etwas ähnliches - durchsuche doch mal deine Datenbank Properties nach einer Eigenschaft Autoedit und falls aktiv deaktiviere diese...

Gruß

Schabersack
Wer das Haus mit einem Schrim verlässt, der hat auch anrecht auf Regen!

sierdolg
Beiträge: 66
Registriert: Mi 24. Okt 2012, 15:50

Re: Operation not allowed, dataset "%s" is not in an activ..

Beitrag von sierdolg »

Hallo Schabersack,

vielen Dank für den Tip! Leider war's das auch nicht. Das "Operation not allowed" kommt auch, wenn auf allen Datasets das AutoEdit FALSE ist.
Ich habe zwischenzeitlich versucht, ein "Minimalbeispiel" zu erstellen - da funktionierte dann alles.

Einziger Erkenntnisfortschritt: Der Fehler tritt offenbar auf, sobald ich versuche, ein Feld zu berechnen.

Code: Alles auswählen

procedure TDataModule1.ztPositionCalcFields(DataSet: TDataSet);
begin
  WriteLn(ztPosition.Active); //Zeile 1
  ztPositionGesamtpreis.AsCurrency :=1.23; // Zeile 2
end;     
  

Setze ich dort einen Haltepunkt und gehe im Einzelschrittmodus weiter, so kommt es unmittelbar nach dieser Ereignisprozedur zu dem Fehler. Das Dataset ztPosition ist durchaus .Active,, wie "Zeile 1" belegt.
ztPositionGesamtpreis ist .FieldKind=fkCalculated, ztPosition eine TZTable Komponente (ZEOS).

Code: Alles auswählen

TRUE
TRUE
TRUE
[FORMS.PP] ExceptionOccurred
  Sender=EDatabaseError
  Exception=ztPosition : Operation not allowed, dataset "%s" is not in an edit or insert state.
  Stack trace:
  $000000000078CB74
  $0000000000A19E57  SETFIELDDATA,  line 3055 of ../../src/component/ZAbstractRODataset.pas
  $000000000078FDFE
  $00000000007972AA
  $000000000078F692
  $00000000007901BF
  $00000000004A2765
  $000000000045A834  CREATEFORM,  line 2190 of include/application.inc
  $000000000041E44D  main,  line 18 of project1.lpr
 

Sobald die "Zeile 2" auskommentiert wird, funktioniert alles - nur eben ohne das berechnete Feld.

* Woran könnte das liegen?
* Wie könnte man weiter zur Ursache vordringen?
Inzwischen kommen mir keine weitere Ideen mehr. Und keines der Beispiele für CalcFields-Prozeduren, die ich finden konnte, macht noch irgend etwas fundamental anderes...

Antworten