* Fixed CreateDataset when TBufDataset.Filename is set

* Clear old fielddefs before reading TBufDataset from file
 * Call bindfields while reading a dataset from file while there are 
   (calculated) fields present + test

git-svn-id: trunk@21756 -
This commit is contained in:
joost 2012-07-02 10:28:37 +00:00
parent bc3bf09c92
commit ec67f10680
2 changed files with 54 additions and 16 deletions

View File

@ -2733,26 +2733,30 @@ begin
end;
procedure TCustomBufDataset.CreateDataset;
var AStoreFilename: string;
begin
CheckInactive;
if not ((FieldCount=0) or (FieldDefs.Count=0)) then
if ((FieldCount=0) or (FieldDefs.Count=0)) then
begin
Open;
Exit;
if (FieldDefs.Count>0) then
CreateFields
else if (fields.Count>0) then
begin
InitFieldDefsFromfields;
BindFields(True);
end
else
raise Exception.Create(SErrNoFieldsDefined);
end;
if (FieldDefs.Count>0) then
begin
CreateFields;
// When a filename is set, do not read from this file
AStoreFilename:=FFileName;
FFileName := '';
try
Open;
end
else if (fields.Count>0) then
begin
InitFieldDefsFromfields;
BindFields(True);
Open;
end
else
raise Exception.Create(SErrNoFieldsDefined);
finally
FFileName:=AStoreFilename;
end;
end;
function TCustomBufDataset.BookmarkValid(ABookmark: TBookmark): Boolean;
@ -2772,8 +2776,12 @@ end;
procedure TCustomBufDataset.IntLoadFielddefsFromFile;
begin
FieldDefs.Clear;
FDatasetReader.LoadFielddefs(FieldDefs);
if DefaultFields then CreateFields;
if DefaultFields then
CreateFields
else
BindFields(true);
end;
procedure TCustomBufDataset.IntLoadRecordsFromFile;

View File

@ -71,6 +71,7 @@ type
procedure TestDeleteAllInsertXML;
procedure TestStreamingBlobFieldsXML;
procedure TestStreamingBigBlobFieldsXML;
procedure TestStreamingCalculatedFieldsXML;
procedure TestAppendDeleteBIN;
@ -543,6 +544,35 @@ begin
end;
end;
procedure TTestBufDatasetStreams.TestStreamingCalculatedFieldsXML;
var
ADataset: TCustomBufDataset;
f: tfield;
begin
ADataset := DBConnector.GetNDataset(true,10) as TCustomBufDataset;
f := TIntegerField.Create(ADataset);
f.FieldName:='ID';
f.dataset := ADataset;
f := TIntegerField.Create(ADataset);
f.FieldName:='CalcID';
f.dataset := ADataset;
f.FieldKind:=fkCalculated;
f := TStringField.Create(ADataset);
f.FieldName:='NAME';
f.dataset := ADataset;
ADataset.Open;
ADataset.SaveToFile('FieldsDS.xml',dfXML);
ADataset.Close;
ADataset.LoadFromFile('FieldsDS.xml',dfXML);
AssertEquals(ADataset.FieldByName('ID').AsInteger,1);
AssertEquals(ADataset.FieldByName('NAME').AsString,'TestName1');
ADataset.Close;
end;
procedure TTestBufDatasetStreams.TestAppendDeleteBIN;
begin
TestChanges(@AppendDeleteChange);