2016-11-29 11 views
0

ClientDatasetの計算フィールドが0.1875で更新されない理由を知りたい人は誰でも助けてください。実際には、0.25,0.50,0.75,1.0などを受け入れていません。値が0.26,0.51 ... 0.1876などの場合、フィールドを更新することができます。あなたは、私は私自身を作成し​​、MCVEを提供し、そしてそのコードされていないとして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

:私は、Delphi XE3に次のコードを使用していますDFM抽出物 は以下の通りである。その操作は自明でなければなりません。Value計算された フィールドをListBoxの選択した値に設定します。 ClientDataSet.Firstを呼び出すListBoxのOnClick ハンドラのポイントは、データセットをスクロールさせ、 がそのOnCalcFieldsイベントを呼び出すようにすることです。

プロジェクトでは、あなたが主張している問題は発生しません(ただし、 が「受け入れられていない」ということを正確に意味していません)。リストボックス のいずれかの項目がクリックされた場合、対応する通貨の値は、DBEditの前に と表示されます。ただし、デフォルト値は2に丸められているため、0.1875 が「0.19」と表示されます小数位。私のプログラムはD7とD10シアトルで同じように動作します。

あなたの問題を引き起こしているのは、qに含まれている ではないものです。これは、MCVEの価値がない場合に表示されます。

は、コメントでは、言った:

私はCalcのボタンを押すと、私は計算フィールドにEdit1.text値を代入しています。

あなたのButton1Clickハンドラは、あなたのqのコードに従って、そうではありません。 の場合、OnCalcFieldsイベント以外の場所で計算されたフィールドに値を割り当てる場合は、データセットが適切なStateTDataSetState)であることを確認する必要があります。あなたですか?

コード:

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 
関連する問題