![]() |
TFDJSONDataSetsReader liefert immer das letzte DataSet
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Zusammen,
vorab: ich suche keine Lösung sondern berichte über zwei Bugs die ich gefunden habe, zumindest empfinde ich es als Bug. ------------Problem 1---------------- Ich habe eine TFDQuery
Delphi-Quellcode:
dessen Tabellenname per Makro übergeben wird.
SELECT * FROM &TableNamen WHERE UEBERTRAGEN = 1
Insgesamt sind es fünf Tabellen die in ein TFDJSONDataSets geschrieben werden. Ich gehe also in einer Schleife durch. Dabei setze ich den Tabellennamen und schreibe die Daten in das TFDJSONDataSets über die Methode:
Delphi-Quellcode:
Die drei Parameter sind:
TFDJSONDataSetsWriter.ListAdd(ExportFDJSONDataSets, TableName, qry);
-ExportFDJSONDataSets das ist das TFDJSONDataSets -TableName den eindeutige Tabellennamen -qry immer das gleiche TFDQuery welches die Daten der aktuellen Datei darstellt. ACHTUNG: Das Problem ist, ich übergebe immer das gleiche Object "qry" eigentlich sollte das keine Problem sein, ist es jedoch. Deutlich wird es wenn man sich anschaut was exportiert wird. Der Objectname "qry" wird als "Table Name" exportiert und nicht wie erwartet, nach meiner Vorgabe über "TableName"
Code:
Das hat zur Folge, beim schreiben der DataSets ins TFDJSONDataSets, überschreibt das letzte DataSet alle DataSets da sie den gleichen Namen haben "qry"
<Table Name="qry" SourceName="KONTAKTE" SourceID="1" TabID="0" EnforceConstraints="False" MinimumCapacity="50">
Somit sind alle fünf DataSets mit dem gleichen Inhalt!
Delphi-Quellcode:
LDataSet := TFDJSONDataSetsReader.GetListValueByName(FJSONDataSets, TableName); //Auslesen über den Namen
Delphi-Quellcode:
Wenn ich jedoch für jede Query ein eigene TFDQuery verwende die auch jeweils einen anderen Namen hat, funktioniert das Auslesen einwandfrei.
LDataSet := TFDJSONDataSetsReader.GetListValue(FJSONDataSets, I); //Auslesen über den Index
------------Problem 2---------------- Wenn das TFDJSONDataSets erzeugt und noch kein DataSet per "TFDJSONDataSetsWriter.ListAdd" geschrieben wurde, würde ich erwarten dass
Delphi-Quellcode:
0 zurückgibt.
TFDJSONDataSetsReader.GetListCount(FJSONDataSets)
Das ist nicht so, es kommt eine Exception dass kein DataSet vorhanden ist. Wenn man den Source anschaut ist es klar, AList.FDataSets ist nil! Eigentlich sollte hier die zwei or Bedingung weg und nil zurückgegeben werden. Die aufrufende Methode prüft bereits auf nil dieser Methode und gibt richtigerweise auch als Result := 0; zurück.
Delphi-Quellcode:
class function TFDJSONDataSetsReaderBase.GetPairList(
const AList: TFDJSONDataSetsBase): TPairList; begin if (AList = nil) or (AList.FDataSets = nil) then raise EFDDataListError.Create(sCantReadNilList); Result := AList.FDataSets; end; ------------Problem 3---------------- Der erzeugte JSON Text ist zu geschwätzig. Meine fünf Tabellen habe ich als CSV exportiert, erste Zeile die Feldbezeichner und danach die Records. Alle fünf Tabellen zusammen ergeben etwa 1300 Bytes. Exportiere ich aus den fünf Tabellen das JSON in ein File hat dieses File 15000 Bytes. Dabei ist auffällig, zu jedem Feld bei jedem Record werden die Feldbezeichner mit exportiert. Auch weitere Daten werden exportiert. Z.B. für jedes Feld werden stolze 17 Eigenschaften exportiert. Somit ist die eigentliche Stärke von JSON ausgehebelt wie ich finde.
Code:
Als Beispiel habe ich einen Datensatz exportiert. Die Nutzdaten sind "700002, 700002, 1, '11111111111', true"
"RowList":[{"RowID":0,"Original":{"KONTAKTID":700002,"PERSONID":700002,"KONTAKTTYP":1,"KONTAKT":"11111111111","UEBERTRAGEN":true}}]}]
Ihr könnt das JSON anzeigen lassen z.B.: mit dem Viewer: ![]() Gruß Kostas [Edit] getestet mit Delphi XE7 und XE8 SP1 |
AW: TFDJSONDataSetsReader liefert immer das letzte DataSet
Die eigentliche Stärke von JSON sieht man nicht, wenn man einfach nur eine platte Tabelle überträgt. Versuch mal mit CSV mehrere komplexe Dokumente zu übertragen, dann sieht man was JSON kann.
Mit einem Trecker den Vorgarten pflügen ist umständlicher als mit dem Spaten, aber bei 3ha Acker sieht das anders aus. |
AW: TFDJSONDataSetsReader liefert immer das letzte DataSet
Zitat:
Zitat:
Zitat:
Zitat:
![]() Zitat:
Allerdings ist das wohl kaum als Bug anzusehen. Allenfalls als ungeschickte Implementierung. |
AW: TFDJSONDataSetsReader liefert immer das letzte DataSet
Zitat:
|
AW: TFDJSONDataSetsReader liefert immer das letzte DataSet
Zitat:
|
AW: TFDJSONDataSetsReader liefert immer das letzte DataSet
Zitat:
|
AW: TFDJSONDataSetsReader liefert immer das letzte DataSet
Zitat:
JSON hat die Eigenschaft die Feldnamen eine Section zu übertragen und die Records jeweils ohne Feldnamen. Darauf war mein Kommentar gerichtet. Ich vergleiche XML mit JSON. Bei XML müssen die Feldnamen angegeben werden aber nicht in JSON. Gruß Kostas |
AW: TFDJSONDataSetsReader liefert immer das letzte DataSet
Hallo Zusammen,
Wenn ich eine TFDQuery über
Delphi-Quellcode:
ein XML schreibe,
SaveToFile(File, sfXML)
beinhaltet das XML auch alle weitere Information dich auch in JSON enthalten sind. Würde das bedeuten dass das XML nicht kompatibel wäre bei unterschiedlichen FireDac Versionen oder ist das nur bei JSON? Gruß Kostas |
AW: TFDJSONDataSetsReader liefert immer das letzte DataSet
Ich habe es nicht ausprobiert, aber ich gehe davon aus, dass auch das nicht kompatibel sein muss.
|
AW: TFDJSONDataSetsReader liefert immer das letzte DataSet
Der Unterschied zum CSV-Ansatz ist eher, daß FireDAC hier Objekte überträgt und nicht nur die reinen Inhalte eines DataSets. Damit werden insbesondere auch interne Zustände und falls vorhanden auch unterschiedliche Versionen der DataRows (Original, Current und Proposed) übertragen. Am Zielort entsteht so mehr oder weniger eine exakte Kopie der FDQuery-Instanz. Diese Art der Serialisierung ist halt bereits vorhanden ist und muss für JSON-Reflect nicht speziell für DataSets neu implementiert werden.
Andererseits hindert dich aber auch niemand daran, aus dem DataSet eine CSV-Repräsentation zu machen, diese zu übertragen und am Ziel in ein anderes DataSet einzulesen. Die BatchMove-Funktionalität in FireDAC kann dort sicher Hilfe leisten. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:26 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz