2016-11-29 3 views
0

Может ли кто-нибудь помочь мне разобраться, почему вычисленное поле в ClientDataset не обновляется с 0,1875. Фактически он не принимает 0,25, 0,50, 0,75, 1,0 ... и т. Д. Поле может быть обновлено, если значение равно 0,26, 0,51 ... 0,1876. Я использую следующий код в Delphi XE3:Delphi ClientDataSet Вычисленное поле не обновляется для определенного значения

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    ClientDataSet1.Close; 
    DBEdit1.DataSource:= DataSource1; 
    DBEdit1.DataField := 'PieceRate'; 
    ClientDataSet1.Open; 
end; 

procedure TForm1.ClientDataSet1CalcFields(DataSet: TDataSet); 
begin 
    ClientDataSet1.FieldByName('PieceRate').AsFloat :=StrToFloat(Edit1.Text); 
end; 

procedure TForm1.ClientDataSet1PieceRateGetText(Sender: TField; 
var Text: string; DisplayText: Boolean); 
begin 
    if Sender.IsNull then 
    Text:='Why it is blank?' 
    else 
    Text:= Sender.Value; 
end; 

enter image description here

enter image description here

enter image description here enter image description here

+0

Вы должны вывесить тип поля и то, что SQL заполняется набор данных. – RBA

+0

Ваш q нуждается в MCVE. Кроме того, почему вы используете TDBEdit, который позволяет редактировать значение поля, с вычисленным полем? – MartynA

+0

Когда я нажимаю кнопку Calc, я просто назначаю значение Edit1.text для вычисленного поля. Но это не обновление расчетного поля для 0,25, 0,50 ... и т. Д. –

ответ

3

Как вы не предоставили MCVE, я создал сам, и его код и экстракт DFM приведены ниже. Его работа должна быть само собой разумеющейся - она ​​устанавливает Value вычисленное поле выбранному значению в ListBox. Точка обработчика OnClick ListBox ListBox, вызывающая ClientDataSet.First, должна вызвать прокрутку набора данных и поэтому вызывать событие OnCalcFields.

В проекте НЕ проявляется проблема, которую вы утверждаете (хотя неясно, что именно именно вы подразумеваете под значением, которое не принимается). Какой бы элемент в элементе ListBox не был нажат, соответствующее значение валюты отображается в DBEdit, предшествующем символом корреляции системы, единственным исключением является то, что 0,1875 отображается как «0,19», потому что по умолчанию значение округляется до двух десятичные разряды. Моя программа работает одинаково в D7 и D10 Сиэтле, кстати.

Итак, что бы ни вызывало вашу проблему, в вашем проекте есть что-то, что у вас нет , включенных в ваш q, который показывает, если ничего больше не значение MCVE.

В комментарии вы сказали:

При нажатии кнопки Calc, я просто назначая значение Edit1.Text расчетной области.

Ну, это не то, что делает ваш обработчик Button1Click, в соответствии с кодом в вашем q. Если вы : присваиваете значение вычисленному полю в любом месте, кроме события OnCalcFields, вы должны проверить, что ваш набор данных находится в соответствующем State (TDataSetState), прежде чем вы это сделаете. Ты?

Код:

type 
    TForm1 = class(TForm) 
    ClientDataSet1: TClientDataSet; 
    DataSource1: TDataSource; 
    DBEdit1: TDBEdit; 
    ClientDataSet1ID: TIntegerField; 
    ClientDataSet1Value: TCurrencyField; 
    ListBox1: TListBox; 
    procedure ClientDataSet1CalcFields(DataSet: TDataSet); 
    procedure FormCreate(Sender: TObject); 
    procedure ListBox1Click(Sender: TObject); 
    public 
    end; 

[...] 

procedure TForm1.ClientDataSet1CalcFields(DataSet: TDataSet); 
begin 
    ClientDataSet1.FieldByName('Value').AsString := ListBox1.Items[ListBox1.ItemIndex]; 
end; 

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    ListBox1.ItemIndex := 0; 
    ClientDataSet1.CreateDataSet; 
    ClientDataSet1.InsertRecord([1]); 
end; 

procedure TForm1.ListBox1Click(Sender: TObject); 
begin 
    ClientDataSet1.First; 
end; 

DFM экстракт

object DBEdit1: TDBEdit 
    DataField = 'Value' 
    DataSource = DataSource1 
end 
object ListBox1: TListBox 
    Items.Strings = (
    '0' 
    '0.1875' 
    '0.25' 
    '0.50' 
    '0.75' 
    '1.0') 
    OnClick = ListBox1Click 
end 
object ClientDataSet1: TClientDataSet 
    Aggregates = <> 
    Params = <> 
    OnCalcFields = ClientDataSet1CalcFields 
    object ClientDataSet1ID: TIntegerField 
    FieldName = 'ID' 
    end 
    object ClientDataSet1Value: TCurrencyField 
    FieldKind = fkCalculated 
    FieldName = 'Value' 
    Calculated = True 
    end 
end 
object DataSource1: TDataSource 
    DataSet = ClientDataSet1 
end 
Смежные вопросы