我有一个数据集,我需要一个查找字段。问题是,此数据集的结构由查询结果定义。在设置.Active = true;
之前我无法将该字段添加为TFieldDef,因为它被覆盖了,并且在运行查询后我无法添加因为您无法更改结构开放数据集。
必须有一些方法可以做到这一点。有谁知道怎么做?
编辑:似乎对我正在寻找的东西感到困惑。我不是在查询时寻找查找。我正在寻找一个查找字段,一个TField对象,其中FieldKind = fkLookup,因此它可以与数据感知查找组合框一起使用,用于在查询返回结果后编辑数据。这与SQL无关,也与Delphi的数据集模型和数据感知控件无关。答案 0 :(得分:4)
最简单的方法是在设计时定义持久字段。
您还可以修改SQL语句以从服务器获取计算值。
答案 1 :(得分:3)
您需要在打开数据集之前自己创建字段。
首先从数据库中获取所有字段定义
DataSet.FieldDefs.Update;
然后遍历每个fielddef并创建普通字段,并在适当的位置创建查找字段。像这样的简化版代码;
for I := 0 to DataSet.FieldDefs.Count - 1 do
begin
// Allocate a normal field
AField := DataSet.FieldDefs[I].CreateField(DataSet);
// Add lookup field if we have another table to look it up from
if (??? this is the key field of a lookup table) then
begin
AField := TStringField.Create(DataSet.Owner);
AField.FieldName := ???;
AField.DataSet := DataSet;
AField.FieldKind := fkLookup;
AField.KeyFields := ???;
AField.LookupKeyFields := ???;
AField.LookupDataSet := ???;
AField.LookupResultField := ???;
end;
end;
然后您可以打开数据集。
答案 2 :(得分:0)
您的表单上有两个数据集(例如 tblOrder , tblCustomer )
订单中的一个字段是客户表 customerId 的外键
客户表的密钥字段为标识,名称= 名称
添加所有字段(右键单击数据集,字段编辑器,添加所有字段
然后右键单击订单表并选择字段编辑器,然后右键单击新字段。
Name = myLookup,Type为string,Size为xx, FieldType = Lookup 。
Key field = customerid,dataset = tblCustomer,lookup Key = Id,Result field = Name 。
现在定义了查找字段
使其在编辑器中工作(例如在TDBLookupCombo中)
将数据源添加到表单 dsOrder
将它连接到tblOrder。
现在设置datasource = dsOrder,Field = myLookup
您不必设置查找源...
答案 3 :(得分:0)
让您拥有带有字段Orders
(类型为CustomerId
的表Integer
和带有字段Customers
(类型为CustomerId
的表Integer
CustomerName
)和String
(类型为table_main
)。然后,在Delphi IDE中,放置表单数据集table_lookup
和Orders
(分别用于表Customers
和table_main
)。打开CustomerId
的字段编辑器,添加(除其他外)字段decimal value = Convert.ToDecimal(command.ExecuteScalar());
,然后创建具有字段属性的新字段:
名称:客户名称(例如)
类型:整数
字段类型:查找
并具有查找属性:
数据集:table_lookup
关键字段:CustomerId
查阅关键字:CustomerId
结果字段:CustomerName
希望它现在仍然有意义。