Habe mir mal die xml-Datei angesehen, und da fällt mir das AUTOINC auf. Ich weiß das nie: du willst ein AutoInc-Field mit Werten aus einer Datei neu beschreiben. Geht das überhaupt? Das AutoInc wird doch vom Datenbank-System vorgegeben.
Ich habe einfach mal im MetaData-Abschnitt das AutoInc-Feld ID zu einem einfachen Integer abgeändert - und nun lädt die Datei problemlos. Es ist der erste <FIELD> Eintrag:
Code: Alles auswählen
<?xml version="1.0" encoding="utf-8"?>
<DATAPACKET Version="2.0">
<METADATA>
<FIELDS>
<FIELD attrname="ID" fieldname="ID" fieldtype="i4"/>
<FIELD width="100" attrname="Bezeichnung" fieldname="Bezeichnung" fieldtype="string"/>
<FIELD width="100" attrname="Hersteller" fieldname="Hersteller" fieldtype="string"/>
<FIELD attrname="A" fieldname="A" fieldtype="r8"/>
<FIELD attrname="I" fieldname="I" fieldtype="r8"/>
<FIELD attrname="Wel" fieldname="Wel" fieldtype="r8"/>
<FIELD attrname="Wpl" fieldname="Wpl" fieldtype="r8"/>
<FIELD attrname="tf" fieldname="tf" fieldtype="r8"/>
<FIELD attrname="tw" fieldname="tw" fieldtype="r8"/>
<FIELD attrname="h" fieldname="h" fieldtype="r8"/>
<FIELD attrname="b" fieldname="b" fieldtype="r8"/>
<FIELD attrname="alpha" fieldname="alpha" fieldtype="r8"/>
<FIELD attrname="bf" fieldname="bf" fieldtype="r8"/>
<FIELD attrname="m" fieldname="m" fieldtype="r8"/>
<FIELD attrname="SA" fieldname="SA" fieldtype="boolean"/>
<FIELD width="100000" attrname="Grafik" fieldname="Grafik" fieldtype="string"/>
<FIELD attrname="U" fieldname="U" fieldtype="r8"/>
<FIELD attrname="Apf" fieldname="Apf" fieldtype="r8"/>
<FIELD attrname="Upf" fieldname="Upf" fieldtype="r8"/>
</FIELDS>
</METADATA>
Im nächsten Schritt habe ich mir selbst ein kleines Test-Programm geschrieben, das einen BufDataset mit AutoInc-ID erzeugt und als xml abspeichert:
Code: Alles auswählen
procedure TForm1.FormCreate(Sender: TObject);
var
i: Integer;
F: TField;
begin
if not FileExists(FILE_NAME) then
begin
BufDataset1.FieldDefs.Add('ID', ftAutoInc);
BufDataset1.FieldDefs.Add('INTVALUE', ftInteger);
BufDataset1.FieldDefs.Add('DATEVALUE', ftDate);
BufDataset1.FieldDefs.Add('FLOATVALUE', ftFloat);
BufDataset1.CreateDataset;
BufDataset1.Open;
for i := 0 to 100 do
BufDataset1.AppendRecord([
Random(100),
Random(365) + EncodeDate(2020, 1, 1),
Random *1000
]);
end else
BufDataset1.LoadFromFile(FILE_NAME, dfXML);
end;
Seltsam: diese Datei lädt ohne Fehler, und hat aber dieselbe AUTOINC-Zeile, wie deine Original-Datei. Meine oben gemachte Vermutung, AUTOINC-Felder könnten gar nicht gelesen werden, ist also falsch. Aber der Unterschied ist nur, dass mein ID-Feld in ROW-Nodes des RAWDATA Blocks vorne steht. Daher habe ich deine Original-Datei nochmals editiert: diesmal die alten METADATA beibehalten, aber in den ROW-Zeilen, den Teil ID="..." ganz nach vorne verschoben:
Code: Alles auswählen
<ROWDATA>
<ROW ID="1" A="132" I="28680" U="1,27" b="750" h="408" m="104" SA="false" bf="303" tf="10" tw="8,3" Wel="1405" Wpl="1663" alpha="47,8" Grafik="" RowState="4" Hersteller="ArcelorMittal" Bezeichnung="AU 14"/>
<ROW ID="2" A="147" I="32850" U="1,27" b="750" h="411" m="115" SA="false" bf="303" tf="11,5" tw="9,3" Wel="1600" Wpl="1891" alpha="47,8" Grafik="" RowState="4" Hersteller="ArcelorMittal" Bezeichnung="AU 16"/>
<ROW ID="3" A="150" I="39300" U="1,33" b="750" h="441" m="118" SA="false" bf="336" tf="10,5" tw="9,1" Wel="1780" Wpl="2082" alpha="54,7" Grafik="" RowState="4" Hersteller="ArcelorMittal" Bezeichnung="AU 18"/>
</ROWDATA>
Und wusch -- diese Datei wird problemlos gelesen.
Keine Ahnung, ob das die Lösung ist. Seltsam ist es allemal...
Ein Tipp vielleicht noch: Ich sehe in der Datei Float-Zahlen mit deutschen Dezimalkomma. Das würde ich in einer Datei auf keinen Fall machen, weil sobald ein User ein System hat, in dem der Dezimaltrenner auf Punkt eingestellt ist, fliegt dir die Datei um die Ohren. Besser: vor jedem Schreib-/Lese-Vorgang den FormatSettings.DecimalSeparator auf '.' zu setzen und hinterher wieder zurück.
[EDIT]
Kommando zurück. Auch diese "Lösungen" zeigen das eingangs geschilderte Problem, dass die Datei nicht immer fehlerlos geladen werden kann. (Leider kann ich den Beitrag nicht löschen).