AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi FireDAC Async Fehler in der "Oberfläche" ?
Thema durchsuchen
Ansicht
Themen-Optionen

FireDAC Async Fehler in der "Oberfläche" ?

Ein Thema von haentschman · begonnen am 23. Mai 2024 · letzter Beitrag vom 24. Mai 2024
Antwort Antwort
Benutzerbild von haentschman
haentschman
Online

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.388 Beiträge
 
Delphi 12 Athens
 
#1

FireDAC Async Fehler in der "Oberfläche" ?

  Alt 23. Mai 2024, 11:45
Datenbank: MSSQL • Version: 2017 • Zugriff über: FireDAC
Hallöle...

Ich habe eine Acync Query (Danke an Uwe). Das Laden der Artikel dauert normal ca. 10. Sekunden. Deshalb Async.
Funktioniert fast...

In meiner Entwicklungsumgebung (lokaler MSSQL) habe ich nur den Fehler im Anhang wenn ich zu schnell in der Oberfläche wechsle. Auf dem Server habe ich manchmal keine Datenmenge (wahrscheinlich unterdrückter Fehler) ... kommt später dran.

Ablauf:
1. beim Wechsel der Rechnung werden die Artikel, incl. der Kundenpreise, geladen. -> direkt RefreshArticle -> alles OK. Die Positionen stimmen, Datenmenge i.O.
2. Wechsel Rechnungsempfänger (nur (1) - Bild1) -> direkt RefreshArticle -> (kein (2) - Bild1) -> alles OK
3. Wechsel Rechnungsempfänger (nur (1) - Bild1) -> direkt RefreshArticle -> (direkt (2) - Bild1, während des Ladens im Hintergund) -> Fehler im Anhang

Wie kann ich den Fehler verhindern?

Code nach Beispiel Emba:
http://docwiki.embarcadero.com/RADSt...rung_(FireDAC)
Delphi-Quellcode:
function TSEAMDatabaseBase.CreateQueryAsync: TFDQuery;
begin
  Result := TFDQuery.Create(nil);
  Result.FetchOptions.Mode := fmAll;
  Result.ResourceOptions.CmdExecMode := amAsync;
  Result.Connection := FConnection;
  Result.OnError := DoOnQueryError;
end;
.
.
constructor TFormReceiptLogic.Create(Preferences: TSEAMPreferences);
begin
  FReproPartDataSet := DMZU.Database.CreateQueryAsync; // nur Instanz
  FReproPartDataSet.AfterOpen := DoArticleAfterOpen;
  FReproPartDataSet.BeforeOpen := DoArticleBeforeOpen;
...
end;
.
.
procedure TFormReceiptLogic.DoArticleBeforeOpen(DataSet: TDataSet);
begin
  DMLUP.dsReproPart.DataSet := nil;
end;

procedure TFormReceiptLogic.DoArticleAfterOpen(DataSet: TDataSet);
begin
  DMLUP.dsReproPart.DataSet := FReproPartDataSet;
  FIsRefreshing := False;
end;
.
.
procedure TFormReceiptLogic.RefreshArticle;
begin
  if (not FIsRefreshing) and (FReproPartDataSet.Command.State = csInactive) or (FReproPartDataSet.Command.State = csPrepared) then // nur Ausführen wenn nicht in Bearbeitung
  begin
    FIsRefreshing := True;
    DMZU.Database.FillDataSetRepositoryPart(FReproPartDataSet, FArticleFavorite, FReceiptAddress);
  end;
end;
Miniaturansicht angehängter Grafiken
wechsel.png   error.png  

Geändert von TBx (26. Mai 2024 um 13:33 Uhr) Grund: Druckfehler gemopst
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.452 Beiträge
 
Delphi 12 Athens
 
#2

AW: FireDAC Acync Fehler in der "Oberfläche" ?

  Alt 23. Mai 2024, 13:22
Ist die if-Abfrage in RefreshArticle wirklich richtig?
Aufgrund der Operator-Precedence von AND before OR wird die Abfrage auch bei einem FIsRefreshing = True und FReproPartDataSet.Command.State = csPrepared wahr.

In solchen Fällen empfehle ich immer Klammern, also entweder um das AND oder um das OR.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman
Online

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.388 Beiträge
 
Delphi 12 Athens
 
#3

AW: FireDAC Acync Fehler in der "Oberfläche" ?

  Alt 23. Mai 2024, 13:50
Recht hast du... Geschuldet dem stundenlagen Probieren ohne Ergebnis. Da geht sowas schon Mal verloren. Ich wußte, daß das mit dem Threading zu tun hat. FIsRefreshing ist zusätzliches Flag vom Probieren.
Delphi-Quellcode:
if (not FIsRefreshing) and ((FReproPartDataSet.Command.State = csInactive) or (FReproPartDataSet.Command.State = csPrepared)) then
.
Das ändert leider nichts am Fehler...der kommt wieder wenn ich zu schnell bin.

Nachtrag:
Normalerweise arbeitet die Software mit dem "NativeClient2012". Was bitteschön hat da ODBC zu suchen? Macht die Query im Thread eine eigene Connection auf und nimmt sich den ersten Treiber im System?
Miniaturansicht angehängter Grafiken
odbc.png  

Geändert von haentschman (23. Mai 2024 um 14:21 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.452 Beiträge
 
Delphi 12 Athens
 
#4

AW: FireDAC Acync Fehler in der "Oberfläche" ?

  Alt 23. Mai 2024, 16:04
Aus FireDAC.Phys.MSSQL.pas:
Delphi-Quellcode:
    ODBCDriver := FindBestDriver(
      {$IFDEF MSWINDOWS} [C_2018_ODBC, C_2017_ODBC, C_2012_NC, C_2016_ODBC, C_2012_ODBC, C_2008, C_2005, C_2000] {$ENDIF}
      {$IFDEF POSIX} [C_2018_ODBC, C_2017_ODBC, C_2016_ODBC, C_2012_ODBC, C_FreeTDS], C_FreeTDSLib {$ENDIF}
    );
Der 2012-NC kommt also erst nach dem 2017-ODBC.

Wie stellst du denn aktuell sicher, dass die Anwendung den Native Client verwendet?
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman
Online

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.388 Beiträge
 
Delphi 12 Athens
 
#5

AW: FireDAC Acync Fehler in der "Oberfläche" ?

  Alt 24. Mai 2024, 06:10
Zitat:
Wie stellst du denn aktuell sicher, dass die Anwendung den Native Client verwendet?
...auf den Clienten gibt es NUR den "NativeClient"...kein ODBC. (die wenigsten Probleme) In meiner Entwicklungsumgebung gibt es die 2 ODBC wegen dem MSSQL Server lokal.

Ich habe den ODBC 2017 entfernt. Jetzt nimmt meine Entwicklung auch den NativeClient. (Bild)

...der Fehler ist aber der gleiche.
Miniaturansicht angehängter Grafiken
treiber.png  

Geändert von haentschman (24. Mai 2024 um 06:30 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.452 Beiträge
 
Delphi 12 Athens
 
#6

AW: FireDAC Acync Fehler in der "Oberfläche" ?

  Alt 24. Mai 2024, 10:11
Nur das ich das richtig verstehe: Der Fehler tritt auf, wenn du den Rechnungsempfänger wechselst und dann zu schnell den Tab anwählst?

In den Fall wäre es interessant zu wissen, was alles beim Tab-Wechsel passiert.

Ich habe den ODBC 2017 entfernt. Jetzt nimmt meine Entwicklung auch den NativeClient.
Alternativ kannst du auch eine TFDPhysMSSQLDriverLink Komponente auf ein früh erzeugtes Form oder Datenmodul packen und dort den gewünschten Treiber einstellen.

In manchen Fällen ist die Entfernung eines neueren Treibers vielleicht keine Option.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman
Online

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.388 Beiträge
 
Delphi 12 Athens
 
#7

AW: FireDAC Acync Fehler in der "Oberfläche" ?

  Alt 24. Mai 2024, 11:29
Zitat:
Der Fehler tritt auf, wenn du den Rechnungsempfänger wechselst und dann zu schnell den Tab anwählst?
...ja.
Zitat:
In den Fall wäre es interessant zu wissen, was alles beim Tab-Wechsel passiert.
...eigentlich uninterressante Sachen.
Delphi-Quellcode:
procedure TfoReceipt.dxLayoutGroup1TabChanging(Sender: TObject; ANewTabIndex: Integer; var Allow: Boolean); // Wechsel Tab ->(2)
begin
  if (Datamodule.Kopf.State = dsEdit) or (Datamodule.Kopf.State = dsInsert) then
  begin
    Datamodule.Kopf.Post;
  end;
  if (Datamodule.Pos.State = dsEdit) or (Datamodule.Pos.State = dsInsert) then
  begin
    Datamodule.Pos.Post;
  end;
  StyleEditReceiptNumber(False);
end;
..
procedure TfoReceipt.StyleEditReceiptNumber(State: Boolean);
begin
  if State then
  begin
    cxDBTextEdit49.StyleReadOnly.Color := $00CD5151;
  end
  else
  begin
    cxDBTextEdit49.StyleReadOnly.Color := clBtnFace;
  end;
end;
Die einzige Verbindung der Datenmenge der Vorgabeartikel, ist die Verbindung über das Repository der Spalte "Artikelnummer" der Datenmenge Datamodule.Pos in der Ansicht Positionen (2)

  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 08:48 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