2009-08-19 44 views
2

我有一個數據集,我需要一個查找字段。問題是,這個數據集的結構是由查詢結果定義的。在設置.Active = true;之前,我無法將該字段添加爲TFieldDef,因爲它被覆蓋,並且我無法在運行查詢後將其添加,因爲您無法更改打開的數據集的結構。如何將查找字段添加到數據集?

必須有一些方法來做到這一點。有誰知道如何?

編輯:似乎有什麼我一直在尋找困惑。在查詢時我沒有查找查詢。我正在尋找一個查找字段,這是一個TField對象,其中FieldKind = fkLookup,因此它可以與數據感知查找組合框一起使用,以在查詢返回結果後編輯數據。這與SQL沒有任何關係,並且與Delphi的數據集模型和數據感知控件有關。

回答

3

最簡單的方法是在設計時定義持久字段。

您也可以修改您的SQL語句以從服務器獲取計算值。

+0

我需要的東西,可以在運行時修改,通過查找列在網格控制,並且特別需要數據集中的查找字段。 – 2009-08-19 12:31:15

+0

問題是關於計算字段,而不是查找字段。 我不確定我是否理解您的問題,但您也可以在運行時在代碼中定義持久性字段,然後再打開數據集。換句話說,讓FieldDefs由您的代碼創建,而不是由數據集自動創建。在那裏,您也可以定義計算或查找字段。 – 2009-08-19 12:43:05

+0

我想知道你是編輯這個問題還是我是幻覺。 ;-)我認爲這個問題是關於計算字段。 – 2009-08-19 12:47:08

2

在打開數據集之前,您需要自己創建這些字段。

首先從數據庫

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; 

然後你就可以打開數據集。

0

你有你的窗體上的兩個數據集(比如tblOrdertblCustomer)的順序
的字段是一個外鍵的客戶表客戶ID
客戶表的鍵字段是ID,名稱= 名稱

添加所有字段(右鍵單擊該數據集,字段編輯器中添加的所有字段。

然後右鍵單擊訂單表並選擇字段編輯器,然後右鍵單擊新字段

名稱= myLookup,類型爲字符串,大小爲XX,的FieldType =查找
關鍵字段= customerid,dataset = tblCustomer,lookup Key = Id,結果字段=名稱

現在您的查找字段已定義。
要使它在編輯器中工作(比如說在TDBLookupCombo)
添加一個數據源到窗體dsOrder
將它連接到tblOrder。

現在設置數據源= dsOrder,場= myLookup
您不必設置查找源...