首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在运行时在TFdMemTable中创建查找字段

如何在运行时在TFdMemTable中创建查找字段
EN

Stack Overflow用户
提问于 2017-06-23 01:53:17
回答 1查看 2.5K关注 0票数 2

我试图在运行时在TFDMemTable中创建一个新字段,该字段必须是一个Combobox,我想从第二个TFDMemTable中查找Combobox的项。

我怎样才能做到这一点?

这里是我所需要的示例,我有一个主表和一个辅助表,我试图在主表中有一个字段,其中包含来自次要表的项。

我试着做这样的事:

代码语言:javascript
复制
//First i try creating the second table with the values for the combobox
FDMemTableQualityLiterals.FieldDefs.Add('QualityID', ftInteger, 0, false);
FDMemTableQualityLiterals.FieldDefs.Add('IdValue', ftString, 20, false);
FDMemTableQualityLiterals.CreateDataSet;

FDMemTableQualityLiterals.Open;
FDMemTableQualityLiterals.AppendRecord([1, '480p']);
FDMemTableQualityLiterals.AppendRecord([2, '720p']);
FDMemTableQualityLiterals.AppendRecord([3, '1080p']);


// then i try to create the main table with a few field including the qualityID field
FDMemTable1.FieldDefs.Add('ID', ftInteger, 0, false);
FDMemTable1.FieldDefs.Add('Name', ftString, 30, false);
FDMemTable1.FieldDefs.Add('QualityID', ftInteger, 0, false);
FDMemTable1.CreateDataSet;
FDMemTable1.Close;
//i try to link/create a new field like qualityID that has literal values instead of an id
CreateLookupField(TDataset(FDMemTable1), 'QualityLookup', TDataset(FDMemTableQualityLiterals), 'QualityID', 'QualityID', 'IdValue');
FDMemTable1.CreateDataSet;

FDMemTable1.open;
FDMemTable1.AppendRecord([0, 'item1', 1]);
FDMemTable1.AppendRecord([1, 'item2', 2]);
FDMemTable1.AppendRecord([2, 'item3', 3]);
// i use this code to show the result in devExpress
cxGrid1DBTableView1.DataController.DataSource := DataSource1;
cxGrid1DBTableView1.DataController.CreateAllItems();


Procedure TForm1.CreateLookupField( ATable: TDataSet; AFieldName: String; ALookupDataset: TDataset; AKeyfields: String; ALookupKeyfields: String; ALookupResultField : String);
Var
  I : Integer;
  NewField : TField;
Begin
  with ATable do begin
    if FieldDefs.Updated = False then
      FieldDefs.Update;
    If FindField(AFieldName) = Nil then
    begin
      NewField := TStringField.Create(ATable);
      NewField.FieldName := AFieldName;
      NewField.KeyFields := AKeyFields;
      NewFIeld.LookupDataSet := ALookupDataset;
      NewField.LookupKeyFields := ALookupKeyFields;
      NewField.LookupResultField := ALookupResultField;
      NewField.FieldKind := fkLookup;
      NewField.Dataset := ATable;
    end;
  end;
End;

但是它不起作用,我收到一个错误,它说qualityID不存在,即使我们排除了错误,这种方法正确吗?这就是做这个的方法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-23 10:07:41

TFieldDefs是字段定义列表,而不是字段列表,CreateDataSet方法从TFieldDefs创建字段列表,但当关闭字段列表时,字段列表将被清除。

为了创建LoockUp字段,数据集必须关闭,而关闭的dataset有一个空字段列表,但是在创建查找字段时需要对这些字段进行检查!因此,您应该手动为关闭的数据集创建字段列表,如下所示:

代码语言:javascript
复制
var
 I : Integer;
begin
  FDMemTable1.FieldDefs.Add('ID', ftInteger, 0, false);
  FDMemTable1.FieldDefs.Add('name', ftString, 30, false);
  FDMemTable1.FieldDefs.Add('QualityID', ftInteger, 0, false);

  FDMemTable1.CreateDataSet; //This is unnecessary
  FDMemTable1.Close;

  for I := 0 to FDMemTable1.FieldDefs.Count - 1 do
   begin
    if FDMemTable1.FindField(FDMemTable1.FieldDefs[i].Name) = Nil then
     FDMemTable1.FieldDefs.Items[i].CreateField(FDMemTable1);
   end;

  CreateLookupField(TDataset(FDMemTable1), 'QualityLookup', TDataset(FDMemTableQualityLiterals), 'QualityID', 'QualityID', 'IdValue');
  FDMemTable1.CreateDataSet;



  //FDMemTable1.open; //not need to `FDMemTable1.open` after `FDMemTable1.CreateDataSet`, `CreateDataSet` method sets Active = True 
  FDMemTable1.AppendRecord([0, 'Ali', 1]);
  FDMemTable1.AppendRecord([1, 'Ali2', 2]);
  FDMemTable1.AppendRecord([2, 'Ali3', 3]);
  //FDMemTable1.AppendRecord([1, 'Ali', 1, 1]);
  //FDMemTable1.AppendRecord([1, 'Ali']);
  //FDMemTable1.Close;

//  FDMemTable1.CreateDataSet;
//  cxGrid1DBTableView1.DataController.DataSource := DataSource1;

  //FDMemTable1.Active := true;
//  cxGrid1DBTableView1.DataController.CreateAllItems();
end;
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44711860

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档