如何在运行时向clientdataset添加字段?

时间:2011-02-08 14:15:07

标签: database delphi dataset tclientdataset

我有一个TClientDataSet,由TTable的数据集提供。 数据集有两个字段:邮政编码(字符串,5)和街道(字符串,20)

在运行时我想显示第三个字段(字符串,20)。该字段的例程是将邮政编码作为参数并将该城市归属于该邮政编码。

问题仅在于向现有的字段添加计算字段。填写数据本身不是问题。

我试过了:

  cds.SetProvider(Table1);
  cds.FieldDefs.Add('city', ftString, 20);

  cds.Open;

  cds.Edit;
  cds.FieldByName('city').AsString := 'Test';  // --> errormessage (field not found)
  cds.Post;

cds是我的clientdataset,Table1是一个悖论表,但问题与其他数据库相同。

提前致谢

5 个答案:

答案 0 :(得分:20)

如果要添加基础数据中存在的其他字段,则还需要手动添加现有字段。在添加字段时,需要关闭数据集,但如果您不想手动跟踪所有字段详细信息,则可以使用FieldDefs.Update获取必要的元数据。基本上是这样的:

var
  i: Integer;
  Field: TField;
begin    
  cds.SetProvider(Table1);

  // add existing fields
  cds.FieldDefs.Update;
  for i := 0 to cds.FieldDefs.Count - 1 do 
    cds.FieldDefs[i].CreateField(cds);

  // add calculated field
  Field := TStringField.Create(cds);
  Field.FieldName := 'city';
  Field.Calculated := True;
  Field.DataSet := cds;

  cds.Open;
end;


另见excellent article Cary Jensen

答案 1 :(得分:4)

我找到了一个更简单的解决方案,因为我在我的sql中有24个字段我不想手动添加它们所以我在sql语句中添加了一个虚拟字段,而不是像:

select '      ' as city, the rest of the fields ... 

我可以在我的程序OnAfterOpen事件中修改。

我必须在sql中定义该字段应该留多长时间,留下足够的空格,例如5个字符的5个空格,所以我必须知道城市名称可以有多长。

答案 2 :(得分:2)

想要为未使用的字段分享更准确的查询。我敢打赌,最好不要使用演员阵容!

select E.NAME, E.SURNAME, cast(null as varchar(20)) as CITY
from EMPLOYEE E

e.g。 | Marc'O | Polo | <NULL> |

它更准确,可以绝对看到字段大小,易于理解,简单,安全!

答案 3 :(得分:2)

添加字段后应使用CreateDataset

cds.SetProvider(Table1);
cds.FieldDefs.Add('city', ftString, 20);
cds.CreateDataset; 

cds.Open;
cds.Edit;
cds.FieldByName('city').AsString := 'Test';  
cds.Post;

答案 4 :(得分:1)

如果要将已存在的“动态”数据字段(来自提供者端)与其他客户端持久字段(计算,查找,内部计数,聚合)组合,则应将CDS子类化。只是引入额外的布尔属性CombineFields,并使用以下行覆盖BindFields(在较新的delphi版本中)或整个InternalOpen(就像我在d2006 / 2007中所做的那样)

如果DefaultFields或CombineFields则CreateFields; {TODO -ovavan -cSIC:如果CombineFields为true,那么持久字段将与默认字段共存}

这将允许您避免使用FieldDefs / CreateField

的所有运行时混乱