在顶层下面加载和保存嵌套的clientdataset数据的正确方法是什么?

时间:2018-04-17 19:57:27

标签: delphi tclientdataset

我正在使用三级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方法。这似乎有点不雅。我一直无法找到在实践中说明这种操作的例子。任何人都可以举例说明如何做到这一点吗?

0 个答案:

没有答案