我有一个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
是一个悖论表,但问题与其他数据库相同。
提前致谢
答案 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;
答案 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
的所有运行时混乱