Редактор полей в движках
Я пытаюсь сделать движок для TClientDataSet, но работает он не стандартно - на входе XML
function RunQuery(Cds: TClientDataSet; SQLText: String;EmptyDataSet: Boolean = True): String; overload;
var
i, j, RecCount, FieldCount: Integer;
Field: TField;
XMLDoc: DOMDocument;
XMLElement: IXMLDOMElement;
begin
XMLDoc := CoDOMDocument.Create;
with XMLDoc.appendChild(XMLDoc.createElement('EXCHQUERY')) As IXMLDOMElement do
begin
setAttribute('action', 'runquery');
setAttribute('UUIN', '2BFC65AD-9B37-40E1-A2E4-25848D0259A9');
end;
XMLDoc.documentElement.appendChild(XMLDoc.createCDATASection(SQLText));
try
Cds.DisableControls;
if not Cds.Active then
Cds.CreateDataSet;
if EmptyDataSet and not Cds.IsEmpty then
Cds.EmptyDataSet;
try
XMLDoc.loadXML(ExecXML(XMLDoc.xml));
except
on E: Exception do raise Exception.Create(E.Message);
end;
RecCount := XMLDoc.documentElement.childNodes.length - 1;
FieldCount := Cds.FieldCount - 1;
for i := 0 to RecCount do
begin
Cds.Append;
XMLElement := XMLDoc.documentElement.childNodes.item As IXMLDOMElement;
for j:= 0 to FieldCount do
begin
Field := Cds.Fields[j];
if not VarIsNull(XMLElement.getAttribute(Field.FieldName)) then
case Field.DataType of
ftLargeint : Field.Value := StrToInt64(Trim(XMLElement.
getAttribute(Field.FieldName)));
ftDate : Field.Value := XMLToDateTime(Trim(XMLElement.
getAttribute(Field.FieldName)));
ftString : Field.Value := Trim(XMLElement.
getAttribute(Field.FieldName));
ftCurrency : Field.Value := StrToCurr(Trim(XMLElement.
getAttribute(Field.FieldName)));
end;
end;
Cds.Post;
end;
Cds.First;
finally
Cds.EnableControls;
XMLDoc := nil;
end;
end;
Отсюда видно - что поля в TClientDataSet должны быть уже определены, я не нашёл такого средства в FastReport. Вот вопрос - как можно такое реализовать ??????
function RunQuery(Cds: TClientDataSet; SQLText: String;EmptyDataSet: Boolean = True): String; overload;
var
i, j, RecCount, FieldCount: Integer;
Field: TField;
XMLDoc: DOMDocument;
XMLElement: IXMLDOMElement;
begin
XMLDoc := CoDOMDocument.Create;
with XMLDoc.appendChild(XMLDoc.createElement('EXCHQUERY')) As IXMLDOMElement do
begin
setAttribute('action', 'runquery');
setAttribute('UUIN', '2BFC65AD-9B37-40E1-A2E4-25848D0259A9');
end;
XMLDoc.documentElement.appendChild(XMLDoc.createCDATASection(SQLText));
try
Cds.DisableControls;
if not Cds.Active then
Cds.CreateDataSet;
if EmptyDataSet and not Cds.IsEmpty then
Cds.EmptyDataSet;
try
XMLDoc.loadXML(ExecXML(XMLDoc.xml));
except
on E: Exception do raise Exception.Create(E.Message);
end;
RecCount := XMLDoc.documentElement.childNodes.length - 1;
FieldCount := Cds.FieldCount - 1;
for i := 0 to RecCount do
begin
Cds.Append;
XMLElement := XMLDoc.documentElement.childNodes.item As IXMLDOMElement;
for j:= 0 to FieldCount do
begin
Field := Cds.Fields[j];
if not VarIsNull(XMLElement.getAttribute(Field.FieldName)) then
case Field.DataType of
ftLargeint : Field.Value := StrToInt64(Trim(XMLElement.
getAttribute(Field.FieldName)));
ftDate : Field.Value := XMLToDateTime(Trim(XMLElement.
getAttribute(Field.FieldName)));
ftString : Field.Value := Trim(XMLElement.
getAttribute(Field.FieldName));
ftCurrency : Field.Value := StrToCurr(Trim(XMLElement.
getAttribute(Field.FieldName)));
end;
end;
Cds.Post;
end;
Cds.First;
finally
Cds.EnableControls;
XMLDoc := nil;
end;
end;
Отсюда видно - что поля в TClientDataSet должны быть уже определены, я не нашёл такого средства в FastReport. Вот вопрос - как можно такое реализовать ??????