2

我有一个需要查找字段的数据集。问题是,这个数据集的结构是由查询结果定义的。我无法在设置之前将该字段添加为 TFieldDef,因为它会被覆盖,并且在运行查询.Active = true;我无法添加它,因为您无法更改打开数据集的结构。

必须有某种方法来做到这一点。有谁知道怎么做?

编辑:我在寻找什么似乎有些混乱。我不是在查询时寻找查找。我正在寻找一个查找字段,一个 TField 对象,其中 FieldKind = fkLookup,以便它可以与数据感知查找组合框一起使用,以便在查询返回其结果后编辑数据。这与 SQL 无关,与 Delphi 的数据集模型和数据感知控件无关。

4

4 回答 4

4

最简单的方法是在设计时定义持久字段。

您还可以修改 SQL 语句以从服务器获取计算值。

于 2009-08-19T08:06:34.373 回答
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;

然后您可以打开数据集。

于 2009-08-20T03:55:47.197 回答
0

您的表单上有两个数据集(例如tblOrdertblCustomer
订单中的一个字段是客户表customerId
的外键 客户表 的键字段是Id,Name = Name

添加所有字段(右键单击数据集,字段编辑器,添加所有字段。

然后右键单击订单表并选择字段编辑器,然后右键单击新字段

Name = myLookup,Type 是 string,Size 是 xx,FieldType = Lookup
键字段 = customerid,数据集 = tblCustomer,查找键 = Id,结果字段 = 名称

现在您的查找字段已定义。
为了使它在编辑器中工作(比如在 TDBLookupCombo 中)
,将数据源添加到表单dsOrder
将其连接到 tblOrder。

现在设置 datasource = dsOrder,Field = myLookup
你不必设置查找源...

于 2009-08-22T06:17:33.900 回答
0

让您拥有Orders带有字段(以及其他)CustomerId(类型Integer)的表格,以及Customers带有字段CustomerId(类型Integer)和CustomerName(类型String)的表格。然后,在 Delphi IDE 中,拖放表单数据集table_maintable_lookup(分别用于表OrdersCustomers)。打开字段编辑器table_main,添加(以及其他)字段CustomerId,然后使用字段属性创建新字段:

名称:客户名称(例如)

类型:整数

字段类型:查找

并具有查找属性:

数据集:table_lookup

关键字段:客户 ID

查找键:CustomerId

结果字段:客户名称

希望它现在仍然相关。

于 2019-01-26T21:45:28.817 回答