2017-06-23 15 views
1

実行時にTFDMemTableに新しいフィールドを作成しようとしていますが、フィールドはComboboxでなければなりません。Comboboxのアイテムを検索したいと思います。 second TFDMemTable
どうすればいいですか?
ここに私が必要とするもののサンプルがあります。私はメインテーブルとセカンダリテーブルを持っていますが、私はセカンダリテーブルの項目を持つメインテーブルのフィールドを持つことを試みています。実行時にTFdMemTableのルックアップフィールドを作成する方法

//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が存在しないというエラーを取得しますが、このアプローチは正しいです:
私はこのような何かをやってみましたか?これはこれを行う方法ですか?

+0

「QualityID」が存在しないという正確な行はありますか? – MartynA

+0

@MartynA 'createLookupField'の後に' FDMemTable.createDatSet; 'を呼び出すと発生します –

+0

@aliahmadi、私の編集した答えを参照 –

答えて

3

TFieldDefsはフィールドリストではなく、CreateDataSetメソッドはTFieldDefsからフィールドリストを作成しますが、データセットを閉じると、フィールドリストはクリアされます。

LoockUpフィールドを作成するには、データセットを閉じ、閉じられたデータセットに空のフィールドリストがありますが、ルックアップフィールドを作成するときにフィールドに入力する必要があります。したがって、閉じたデータセットに対してフィールドリストを手動で作成する必要があります。

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; 
+0

いいえ。フィールド定義を追加してデータセットを作成するだけで(フィールドが作成されます)。 – Victoria

+1

@KenWhiteルックアップフィールドを作成するために必要な永続フィールドを作成しています。 –

+0

@Victoriaデータセットを閉じると、フィールドリストがクリアされます。編集済みの回答 –

関連する問題