AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Bei Query1.Post Fehler: Query2 nicht im Edit- oder Insertmodus
Thema durchsuchen
Ansicht
Themen-Optionen

Bei Query1.Post Fehler: Query2 nicht im Edit- oder Insertmodus

Ein Thema von Slipstream · begonnen am 27. Jan 2017 · letzter Beitrag vom 27. Jan 2017
Antwort Antwort
Slipstream
(Gast)

n/a Beiträge
 
#1

Bei Query1.Post Fehler: Query2 nicht im Edit- oder Insertmodus

  Alt 27. Jan 2017, 17:55
Datenbank: Firebird • Version: 2.5.2 • Zugriff über: Firedac
Wir haben hier in einem unserer Projekte eine äusserst merkwürdige Sache: In einem Formular, in welchem Meldungen bearbeitet werden, geschieht seit der Implementation einer Dateiauswahl via Opendialog folgendes: Bei Query1.Post erscheint die Fehlermeldung, dass Query2 weder im Editier- noch im Einfügemodus sei. Query2 kommt aber in diesem Formular gar nicht vor! Wird der OpenDialog zwischen Query1.Edit und Query1.Post nicht bemüht, erscheint der Fehler nicht. Mit dem OpenDialog soll in ein neues Feld der Tabelle ein Dateiname eingefügt werden. Der Opendialog wird nur ausgeführt, wenn sich Query1 im Editier- oder Einfügemodus befindet. Nachdem wir testweise in der Methode, in der normalerweise der Dateiname ausgewählt und eingefügt werden soll, via Code einen fixen Dateinamen einfügen, erscheint der Fehler nicht.

Im Projekt MyProblemProjekt.exe ist eine Exception der Klasse EDatabaseError mit der Meldung 'Query2: Datenmenge weder im Editier- noch im Einfügemodus' aufgetreten.

Ein weitres seltsames Phänomen besteht darin, dass beim Debuggen der Formular-Post-Methode kein Fehler entsteht und die via OpenDialog ausgewählte Datei einwandfrei in die dafür vorgesehene Spalte eingetragen wird. Auch bei Query1.Cancel entsteht kein Fehler, immer nur bei Query1.Post:

Delphi-Quellcode:
procedure TFormMeldung.Lbl_AnhangDblClick(Sender: TObject);
var
  Datei : string;
begin
  if EditModus then
  begin
    OpenDlg.Title := 'Datei öffnen';
    if OpenDlg.Execute then
    begin
      Datei := OpenDlg.FileName;
      if FileExists(Datei) then
      DM.Query1.FieldByName('DATEI').AsString := Datei;
    end;
  end;
end;

procedure TFormMeldung.MM_PostClick(Sender: TObject);
begin
  if AppendModus Or
     DM.Query1.FieldByName('DATUM').IsNull Then
     DM.Query1.FieldByName('DATUM').AsDateTime := Now;
  DM.Query1.Post; // hier entsteht der Fehler, jedoch nicht beim Debuggen, aber auch im Debugmodus
end;
Wir hatten auch schon an defekte Hardware gedacht, konnten den Fehler aber auf zwei anderen Firmenrechnern reproduzieren. Wir arbeiten an diesem Projekt mit Delphi XE7 Architect. Nun waren wir erst einmal ratlos.

Im Laufe des Abends, nachdem die Kollegen am frühen Nachmittag schon alle wegwaren, bin ich dann auf die Ursache gestossen: Das betreffende Formular ist ein modales Fenster, das Hauptformular, das Query2 verwendet, liegt dahinter. Nach dem Beenden des OpenDialogs lag das Hauptfenster zwar noch immer hinter dem modalen Fenster, hatte aber den Fokus erhalten. Mit einem simplen Self.SetFocus am Ende von procedure TFormMeldung.Lbl_AnhangDblClick(Sender: TObject); war der Fehler behoben.

Kennt jemand von euch diese Problematik? Und wenn ja, wie hast du, habt ihr sie gelöst?

Einige Bezeichner sind nicht Original, die muss ich laut Chef verschleiern, wenn ich öffentlich über Internas unserer Projekte schreibe.

Geändert von Slipstream (27. Jan 2017 um 18:06 Uhr)
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#2

AW: Bei Query1.Post Fehler: Query2 nicht im Edit- oder Insertmodus

  Alt 27. Jan 2017, 18:04
Hört sich für mich nach einem zeitlichen Problem an. Wenn du nämlich mit dem Debugger anhälst und durchstepst, dann sind die zeitlichen Abfolgen ja anders, als wenn das Programm direkt durchläuft. Laufen evtl. noch so Dinge wie Click Handler (oder MouseUp vom Grid) im Hintergrund ab in denen etwas spezielles passiert? Evtl. ist auch ein Timer aktiv der die Query Closed oder so etwas?

Ohne mehr Details wird es hier schwierig etwas zu finden. Zur Not müsstest du dir mal an diversen Stelle eine Logging Funktion einbauen. Wenn dann der Fehler allerdings nicht mehr auftritt (aufgrund der Dauer des Schreibens der Log), dann wird es schwierig. Dann müsstest du alles nacheinander wieder rausnehmen und schauen, was da passiert.

Schau dir auch hauptsächlich mal die Stellen an, an denen du solche Dinge wie Post oder Append machst und setz dort evtl. mal einen Breakpoint hin. Wenn er dann dort anhält, dann kannst du ja mal im StackTrace nachschauen woher der Aufruf kam.
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#3

AW: Bei Query1.Post Fehler: Query2 nicht im Edit- oder Insertmodus

  Alt 27. Jan 2017, 18:14
Du speicherst immer, auch wenn die Datenmenge weder im Editier- noch im Einfügemodus ist.

Wo werden denn EditModus und AppendModus gesetzt?

Für mich ist vor dem DM.Query1.Post nicht erkennbar, ob die Datenmenge aktuell verändert werden kann. Die Namensvergabe der Routinen lässt darauf schließen, dass es so sein könnte, aber sichergestellt ist es nicht.

Statt den Editier- oder Einfügemodus über irgendwelche (globalen) Variblen abzufragen, würd' ich doch lieber State abfragen. Sowas in der Art:
Delphi-Quellcode:
procedure TFormMeldung.MM_PostClick(Sender: TObject);
begin
  if (DM.Query1.State in [dsEdit, dsInsert]) then begin
    if DM.Query1.FieldByName('DATUM').IsNull Then DM.Query1.FieldByName('DATUM').AsDateTime := Now;
    DM.Query1.Post;
  end;
end;
  Mit Zitat antworten Zitat
Slipstream
(Gast)

n/a Beiträge
 
#4

AW: Bei Query1.Post Fehler: Query2 nicht im Edit- oder Insertmodus

  Alt 27. Jan 2017, 18:15
Hallo Aviator,

ich hab die Lösung doch schon gefunden: Das Beenden des OpenDialogs führt dazu, dass das im Hintergrund liegende Hauptformular den Fokus erhält und dann die Postmethode des Hauptformulars ausgelöst wird statt der Postmethode des modalen Formulars, das vorne liegt. Nachdem ich das herausgefunden habe, interessiert mich natürlich, ob das Verhalten des OpenDialogs, wenn der von einem modalen Formular aus aufgerufen wird, nach dem Schließen dieses Dialogs dem Hauptfenster den Fokus verleiht, ein Bug ist.

Im Hauptfenster wird Query2 verwendet, beim Posten im Hauptfenster wird DM.Query2.Post ausgeführt. DM ist das Datenmodul. Wenn ich im modalen Fenster am Ende der Methode mit dem OpenDialog Self.SetFocus ausführe, ist der Fehler behoben.

Es hat definitiv nichts mit irgendwelchen Zeitproblemen zu tun.

Hallo Naphets,

Editmodus wird in einer privaten Methode gesetzt, Appendmodus in der Append-Methode. Da ist alles in Ordnung. Alternativ könnte man auch Query1.State auswerten.

Wie oben schon geschrieben lag das Problem darin, dass der Opendialog beim Schließen den Fokus nicht an das aufrufende modale Formular zurückgab, sondern an das dahinterliegende Hauptformular. Mich interessiert jetzt, ob das ein Bug vom OpenDialog sein kann.

Was ich nicht verstehe: Ich hab doch in meinem ersten Post ganz oben schon geschrieben, dass ich das Problem gelöst habe, wieso versucht ihr beide trotzdem noch, das Problem zu lösen? Ich will doch nur wissen, ob hier ein Bug im OpenDialog ist.

Als Nachtrag möchte ich bemerken, dass vermutlich ich selber ein Kommunikationsproblem ausgelöst habe, weil ich vielleicht zu viel vorausgesetzt habe, das niemand erahnen kann. Das heisst, im Hauptformular befinden sich dieselben Datenbank-Bearbeitungs-Methoden wie im modalen Formular, die mit denselben Funktionstasten aufgerufen werden. Deshalb kam es dazu, dass durch den fehlerhaften Fokus nun ein Post im Hauptformular ausgelöst wurde, dessen Query gar nicht im Editirmodus war. Ich glaub, damit ist alles geklärt ausser der Frage, ob der Opendialog einen Bug hat. Jetzt mach ich erstmal Feierabend, bevor mich meine Frau umbringt.

Geändert von Slipstream (27. Jan 2017 um 19:05 Uhr) Grund: Nachtrag
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:41 Uhr.
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