Einzelnen Beitrag anzeigen

Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
804 Beiträge
 
Delphi 10.4 Sydney
 
#1

TFDMemTable ohne DataSource als Datenspeicher verwenden

  Alt 15. Aug 2023, 17:44
Delphi-Version: 10.2 Tokyo
Hallo Zusammen,

ich habe ein Problem, dass ich nicht gelöst bekomme, daher wende ich mich an Euch:

Ich habe eine Client-Server App. Der Client fragt beim Server Daten an, dieser holt die Daten aus der Datenbank und gibt diese als TMemoryStream an den Client.
Der Client speichert diese Daten in einer TFDMemTable, an der ein DataSource angebunden ist, an welchem dann AusgabeObjekt hängen.

Das klappt auch wunderbar, bis es mal einen Fehler gibt und die Daten nicht rüberkommen. Das kommt nur selten vor und dann bekomme ich eine Fehlermeldung, dass keine Daten im JSON-Format vorliegen. Wenn ich die Daten dann manuell neu anfrage, kommen sie zwar an, aber dann spielt die TFDMemTable nicht mehr mit...

Delphi-Quellcode:
function TDB_Unit.Get_MLifeData(Maschinen_ID, BPanel: string; RefreshData: boolean = false): TStream;
var LClient: TxDataClient;
      LService: IMyReportsService;
      LSTream: TMemoryStream;
      MTable: TFDMemTable;
      Logic: TLogic;
      StreamString: WideString;
      Methode: string;
begin
   Methode := Read_Einstellungswert('LifeMonitor_Methode');
   MTable := TFDMemTable(FindComponent('MTable_MStatus_' + BPanel));
   MTable.Close;
   LClient := TXDataClient.Create;
   LStream := TMemorySTream.Create;
   Logic := TLogic.Create;
   Try
      LClient.Uri:= xData_Connect.URL;
      LService:= LClient.Service<IMyReportsService>;
      if Methode = 'JSONthen begin //von hier bis
         LStream:=LService.Get_LifeMDataAPI(Maschinen_ID, RefreshData) as TMemoryStream;
         LStream.Position:=0;
         StreamString := Logic.MyStreamToString(LStream);
         Logic.Read_JSON_LM(StreamString, MTable);
      end // hier ist unwichtig, weil das nur zwei verschiedene Methoden sind, mit dem Server zu sprechen
      else if Methode = 'QUERYthen begin
         MTable.Active; //Hier tritt der Fehler auf
         MTable.FieldDefs.Clear;
         MTable.Fields.clear;
         LStream:=LService.Get_LifeMData(Maschinen_ID, RefreshData) as TMemoryStream; //Anfrage an den Server
         LStream.Position:=0;
         MTable.Open;
         MTable.LoadFromStream(LStream, sfJSON); //Daten in die TFDMemTable
      end
      else begin
         ShowMessage('Methode unbekannt');
      end;
   Finally
      LClient.Free;
      LStream.Free;
   end;
end;
Ich bekommen eine Fehlermeldung: Öffnen der Datenmenge nicht möglich. Ein DataTable- oder DataView-Objekt muss angegeben werden. Hinweis: Verwenden Sie für TFDMemTable zum Öffnen der Datenmenge CreateDataSet oder CloneCursor.

Aber da ich die Daten manuell in die TFDMemTable spiele, benötige ich kein DataSet.

Derzeit sieht die Lösung so aus, dass ich die App neu starte. Dann läuft wieder alles wie gewünscht. Aber das ist ja kein Zustand.

Kann mir jemand helfen, wie ich den Fehler abfangen und beheben kann?

Vielen Dank
Patrick
Patrick
  Mit Zitat antworten Zitat