我正在使用三级clientdataset设计程序,顶级:cdsMaster有两个嵌套级别:cdsTables& cdsNotes。在使用中,程序应该创建结构并在运行时在cdsmaster中发布一条记录。我的意图是,用户将通过在DBgrid中提供输入或使用cdsTables.LoadFromFile&选择以前保存的文件来填充cdsTables和cdsNotes字段。 cdsSavetoFile方法。我想跳过主级数据并在cdsTables级别(包括其cdsNotes)保存/加载记录,每个表存储在一个单独的文件中。每次用户选择包含cdsTables w /嵌套cdsNotes数据的文件时,都必须将其作为新的cdsTables记录添加到cdsMaster中。下面是clientdataset结构的示例,但不包括嵌套级别中实际包含的许多字段。
unit datamod_u;
interface
uses
System.SysUtils, System.Classes, Data.DB, Datasnap.DBClient;
type
TDataMod = class(TDataModule)
cdsMaster: TClientDataSet;
cdsTable: TClientDataSet;
cdsNotes: TClientDataSet;
procedure DataModuleCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
procedure DefinecdsMaster;
procedure DefineCdsTable;
procedure LoadTable (fname: string);
procedure SaveTable (fname: string);
end;
var
DataMod: TDataMod;
implementation
{%CLASSGROUP 'Vcl.Controls.TControl'}
{$R *.dfm}
procedure TDataMod.DefineCdsMaster;
begin
with TstringField.Create(Self) do
begin
Name := 'cdsMstrName';
FieldKind := fkData;
FieldName := 'Name';
DataSet := cdsMaster;
end;
with TDataSetField.Create(Self) do
begin
Name := 'cdsMstrTbls';
FieldKind := fkData;
FieldName := 'Tables';
DataSet := cdsMaster;
// Required := True;
Visible := false;
end;
end;
procedure TDataMod.DefineCdsTable;
begin
cdsTable.DataSetField := TDataSetField(cdsMaster.FieldByName('Tables'));
with TstringField.Create(Self) do
begin
Name := 'cdsTblName';
FieldKind := fkData;
FieldName := 'Tbl Name';
DataSet := cdsTable;
Required := false;
end;
with TDataSetField.Create(Self) do
begin
Name := 'cdsTblNotes';
FieldKind := fkData;
FieldName := 'Notes';
DataSet := cdsTable;
end;
cdsNotes.DataSetField := TDataSetField(cdsTable.FieldByName('Notes'));
with TstringField.Create(Self) do
begin
Name := 'cdsNote';
FieldKind := fkData;
FieldName := 'Note';
DataSet := cdsNotes;
end;
end;
procedure TDataMod.DataModuleCreate(Sender: TObject);
begin
DefineCdsMaster;
DefineCdsTable;
cdsMaster.CreateDataSet;
cdsMaster.edit;
cdsMaster.FieldByName('Name').AsString := 'MasterList';
cdsMaster.post;
end;
end.
Cary Jensen的书“Delphi in Depth,Clientdatsets 2nd Edition”表明SavetoFile和LoadfromFile方法只能在顶级而不是嵌套级别使用。因此问题变成如何最好地将嵌套级别数据保存/加载到文件。一种方法可能是创建一个临时clientdataset,其结构与cdsMaster的嵌套级别(cdsTables& cdsNotes)相同,并将每个记录字段复制到临时组件,以便我可以使用SavetoFile / LoadfromFile方法。这似乎有点不雅。我一直无法找到在实践中说明这种操作的例子。任何人都可以举例说明如何做到这一点吗?