2014-03-25 74 views
0

我有SQLite中這樣一個表:OnCalculate場產生過長數

CREATE TABLE [TABLE1] (
    [T_ID] INTEGER PRIMARY KEY ON CONFLICT IGNORE AUTOINCREMENT, 
    [DATE] DATE UNIQUE ON CONFLICT IGNORE, 
    [FIELD1] INTEGER, 
    [FIELD2] INTEGER, 
    [FIELD3] INTEGER, 
    [FIELD4] REAL); 

我添加了2個新的計算的字段到TABLE1 稱爲SUM1(整數)和SUM2(浮點)。

procedure TForm3.UniTable1CalcFields(DataSet: TDataSet); 
begin 
UNITable1.Fields.FieldByName('SUM1').asInteger := (UNITable1.Fields.FieldByName('FIELD1').AsInteger) + (UNITable1.Fields.FieldByName('FIELD2').AsInteger) + (UNITable1.Fields.FieldByName('FIELD3').AsInteger); 
UNITable1.Fields.FieldByName('SUM2').asFloat := (UNITable1.Fields.FieldByName('SUM1').AsInteger)/(UNITable1.Fields.FieldByName('FIELD4').AsInteger) ; 
end; 

這種作品,但我有問題與SUM2顯示15位數字。

enter image description here

我想只有兩個像5,811,238小數顯示的數字。 我可以在cxGrid中通過設置字段屬性CalcEdit並將Precision設置爲3. 但我想知道這是否可以在代碼中完成。

有沒有辦法讓我做到這一點?

+1

那麼314/54是5.8148148148148148148148148148148。如果您使用的是持久字段,則可以將DisplayFormat設置爲',0.00 ;; ' –

+0

不錯的答案David A ...忘記了格式...發佈爲答案,如果你願意... – user763539

回答

4

那麼314/54是5.814814814814 ...。如果您使用的是持久字段,則可以將DisplayFormat設置爲',0.00 ;; '

或代碼:

TNumericField(UNITable1.Fields.FieldByName('SUM2')).DisplayFormat := ',0.00;; '; 
0

另一種選擇是使用FormatFloat('0.00',myvariable)功能。

'0.00'定義格式(2位小數),myvariable是一個恰當命名的變量。

唯一的缺點是它需要額外的幾行代碼來聲明和賦值給變量,並且如果您希望將該值用於進一步計算,則精度將低於原始浮點數你有過。

procedure TForm3.UniTable1CalcFields(DataSet: TDataSet); 
    var 
     var1: real; 
    begin 
     //Assign the floating point value to the variable 
     var1 := (UNITable1.Fields.FieldByName('SUM1').AsInteger)/(UNITable1.Fields.FieldByName('FIELD4').AsInteger); 
     UNITable1.Fields.FieldByName('SUM1').asInteger := UNITable1.Fields.FieldByName('FIELD1').AsInteger) + (UNITable1.Fields.FieldByName('FIELD2').AsInteger) + (UNITable1.Fields.FieldByName('FIELD3').AsInteger);   
     UNITable1.Fields.FieldByName('SUM2').AsFloat := FormatFloat('0.00',var1); 
    end; 

我還沒有機會對此進行測試,但基本思路是沿着這些方向。

+0

這個替代方案將涉及到將字段SUM2更改爲TStringField類型(在您的代碼中,例如,這將反映在更正''SUM2').AsFloat'到''SUM2').AsString')。我相信最好的方法就是保持TField的數字,並且只是改變該值的顯示('DisplayFormat'),就像上面的答案中所建議的一樣。 – GabrielF

+0

它不會學習多種方式,它可能在另一種情況下變得有用:-)。但是,在這種情況下,我完全同意你@GabrielF。 –