home *** CD-ROM | disk | FTP | other *** search
- unit TableXML;
- interface
- uses
- DB;
-
- function DataSetXML(DataSet: TDataSet; const FileName: String): Integer;
-
- implementation
- uses
- SysUtils, TypInfo;
-
- function DataSetXML(DataSet: TDataSet; const FileName: String): Integer;
- var
- F: System.Text;
- i: Integer;
-
- function Print(Str: String): String;
- { Convert a fieldname to a printable name }
- var
- i: Integer;
- begin
- for i:=Length(Str) downto 1 do
- if not (UpCase(Str[i]) in ['A'..'Z','1'..'9']) then
- Str[i] := '_';
- Result := Str
- end {Print};
-
- function EnCode(Str: String): String;
- { Convert memo contents to single line XML }
- var
- i: Integer;
- begin
- for i:=Length(Str) downto 1 do
- begin
- if (Ord(Str[i]) < 32) or (Str[i] = '"') then
- begin
- Insert(''+IntToStr(Ord(Str[i]))+';',Str,i+1);
- Delete(Str,i,1)
- end
- end;
- Result := Str
- end {EnCode};
-
- begin
- Result := -1;
- ShortDateFormat := 'YYYYMMDD';
- System.Assign(F,FileName);
- try
- System.Rewrite(F);
- writeln(F,'<?xml version="1.0" standalone="yes"?>');
- writeln(F,'<DATAPACKET Version="2.0">');
- with DataSet do
- begin
- writeln(F,'<METADATA>');
- writeln(F,'<FIELDS>');
- if not Active then
- FieldDefs.Update { get info without opening the database };
- for i:=0 to Pred(FieldDefs.Count) do
- begin
- write(F,'<FIELD ');
- if Print(FieldDefs[i].Name) <> FieldDefs[i].Name then { fieldname }
- write(F,'fieldname="',FieldDefs[i].Name,'" ');
- write(F,'attrname="',Print(FieldDefs[i].Name),'" fieldtype="');
- case FieldDefs[i].DataType of
- ftString,
- ftFixedChar,
- ftWideString: write(F,'string');
- ftBoolean: write('boolean');
- ftSmallint: write(F,'i2');
- ftInteger: write(F,'i4');
- ftAutoInc: write(F,'i4" readonly="true" SUBTYPE="Autoinc');
- ftWord, // why not i4 ??
- ftFloat: write(F,'r8');
- ftCurrency: write(F,'r8" SUBTYPE="Money');
- ftBCD: write(F,'fixed');
- ftDate: write(F,'date');
- ftTime: write(F,'time');
- ftDateTime: write(F,'datetime');
- ftBytes: write(F,'bin.hex');
- ftVarBytes,
- ftBlob: write(F,'bin.hex" SUBTYPE="Binary');
- ftMemo: write(F,'bin.hex" SUBTYPE="Text');
- ftGraphic,
- ftTypedBinary: write(F,'bin.hex" SUBTYPE="Graphics');
- ftFmtMemo: write(F,'bin.hex" SUBTYPE="Formatted');
- ftParadoxOle,
- ftDBaseOle: write(F,'bin.hex" SUBTYPE="Ole')
- end;
- if FieldDefs[i].Required then write(F,'" required="true');
- if FieldDefs[i].Size > 0 then write(F,'" WIDTH="',FieldDefs[i].Size);
- writeln(F,'"/>')
- end;
- writeln(F,'</FIELDS>');
- writeln(F,'</METADATA>');
- if not Active then Open;
- writeln(F,'<ROWDATA>');
- Result := 0;
- while not Eof do
- begin
- Result := Result + 1;
- write(F,'<ROW ');
- for i:=0 to Pred(Fields.Count) do
- if (Fields[i].AsString <> '') and
- ((Fields[i].DisplayText = Fields[i].AsString) or
- (Fields[i].DisplayText = '(MEMO)')) then
- write(F,Print(Fields[i].FieldName),'="',
- EnCode(Fields[i].AsString),'" ');
- writeln(F,'/>');
- Next
- end;
- writeln(F,'</ROWDATA>')
- end;
- writeln(F,'</DATAPACKET>')
- finally
- System.Close(F)
- end
- end;
-
- end.
-