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;