2011-02-08 43 views
4

我有一個TTable數據集,它由TTable的數據集提供。 該數據集有兩個字段:郵政編碼(字符串,5)和街道(字符串,20)如何在運行時將字段添加到clientdataset?

在運行時我想顯示第三個字段(字符串,20)。該字段的例程將郵政編碼作爲參數並返回屬於此郵政編碼的城市。

該問題只是關於添加一個計算的字段到現有的。填充數據本身不是問題。

我想:

cds.SetProvider(Table1); 
    cds.FieldDefs.Add('city', ftString, 20); 

    cds.Open; 

    cds.Edit; 
    cds.FieldByName('city').AsString := 'Test'; // --> errormessage (field not found) 
    cds.Post; 

CDS是我的ClientDataSet,表1是一個悖論表,但問題是與其他數據庫一樣。

在此先感謝

+0

與之相似,以我的[問題](http://stackoverflow.com/questions/2523697/adding-a-calculated-field-to-a-query - 運行時) – 2011-02-08 14:39:11

回答

18

如果你想添加以外的其他附加字段存在於基礎數據,您還需要添加現有油田以及手動。添加字段時需要關閉數據集,但如果您不想手動跟蹤所有字段詳細信息,則可以使用FieldDefs.Update所需的元數據。基本上是這樣的:

var 
    i: Integer; 
    Field: TField; 
begin  
    cds.SetProvider(Table1); 

    // add existing fields 
    cds.FieldDefs.Update; 
    for i := 0 to cds.FieldDefs.Count - 1 do 
    cds.FieldDefs[i].CreateField(cds); 

    // add calculated field 
    Field := TStringField.Create(cds); 
    Field.FieldName := 'city'; 
    Field.Calculated := True; 
    Field.DataSet := cds; 

    cds.Open; 
end; 


也看到這個excellent article通過Cary Jensen

+0

謝謝你的答案和不錯的鏈接,生病嘗試這個,雖然生病必須手動添加我的sql中的所有文件。 – CloudyMarble 2011-02-09 06:37:50

4

好吧,我發現了一個簡單的解決方案,因爲我有我的SQL 24場我沒有想增加他們所有手動,所以我增加了一個空場的SQL語句,而不是像:

select '  ' as city, the rest of the fields ... 

,我可以在我的程序中修改OnAfterOpen事件。

那麼我不得不在sql中定義多長時間,應該留下足夠的空白空間,例如5個空白空間5個字符,所以我必須知道城市名稱可以多久。

+1

這可能看起來並不高雅,但實現起來非常簡單。 – srayner 2014-01-22 16:04:32

1

如果您希望將已有的「動態」數據字段(來自提供者端)與其他客戶端持久字段(計算,查找,內部calcal,聚合)組合在一起,您應該繼承CDS。只需引入額外的布爾屬性CombineFields並覆蓋BindFields(在較新的delphi版本中)或整個InternalOpen(如我在d2006/2007中所做的),使用以下行

if DefaultFields或CombineFields then CreateFields; {TODO -ovavan -cSIC:如果CombineFields爲true,那麼持久字段將默認的共存}

,可以讓你避免與FieldDefs所有運行混亂/ CreateField

2

想和大家分享更精確的查詢未知領域。我敢打賭,最好是使用演員,既不是空格!

select E.NAME, E.SURNAME, cast(null as varchar(20)) as CITY 
from EMPLOYEE E 

例如, | Marc'O | Polo | <NULL> |

它更加準確,可以明確地看到字段大小,可以理解,容易,安全!

1

你應該添加字段後,使用CreateDataset

cds.SetProvider(Table1); 
cds.FieldDefs.Add('city', ftString, 20); 
cds.CreateDataset; 

cds.Open; 
cds.Edit; 
cds.FieldByName('city').AsString := 'Test'; 
cds.Post; 
相關問題