11

我有一个TClientDataSet,它由 aTTable的数据集提供。数据集有两个字段:邮政编码(字符串,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是一个悖论表,但问题与其他数据库相同。

提前致谢

4

5 回答 5

25

如果要添加基础数据中不存在的其他字段,则还需要手动添加现有字段。添加字段时需要关闭数据集,但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;


另请参阅Cary Jensen的这篇优秀文章

于 2011-02-08T15:06:27.080 回答
5

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

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

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

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

于 2011-02-09T08:49:19.693 回答
3

想为不存在的字段分享更准确的查询。我敢打赌最好使用演员表,而不是空格!

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

例如| Marc'O | Polo | <NULL> |

更准确,可以清楚地看到字段大小,易懂,简单,安全!

于 2014-06-06T11:37:22.097 回答
3

您应该CreateDataset在添加字段后使用:

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

cds.Open;
cds.Edit;
cds.FieldByName('city').AsString := 'Test';  
cds.Post;
于 2015-05-13T10:27:24.887 回答
1

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

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

这将允许您避免所有运行时与 FieldDefs/CreateField 的混乱

于 2012-04-28T07:47:15.387 回答