2016-11-29 4 views
0

ClientDataSet의 계산 된 필드가 0.1875로 업데이트되지 않는 이유를 알아낼 수있는 사람이 있습니까? 실제로 그것은 0.25, 0.50, 0.75, 1.0 ... 등을 허용하지 않습니다. 값이 0.26, 0.51 ... 0.1876 인 경우 필드를 업데이트 할 수 있습니다. 델파이 XE3에서 다음 코드를 사용하고 있습니다 : 사용자가 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

당신의 MCVE가 필요합니다. 또한 계산 된 필드를 사용하여 필드 값을 편집 할 수 있도록하는 TDBEdit을 사용하는 이유는 무엇입니까? – MartynA

+0

Calc 버튼을 누르면 계산 필드에 Edit1.text 값이 할당됩니다. 하지만 그것은 0.25, 0.50 ... 등 계산 된 필드를 업데이트하지 않습니다. –

답변

3

, 나는 내 자신, 그 코드를 생성 DFM 추출물 은 다음과 같습니다. 연산은 자명 한 것이어야합니다. Value 계산 된 필드를 ListBox의 선택된 값으로 설정합니다. 목록 상자의 OnClick 처리기가 ClientDataSet.First을 호출하는 점은 데이터 집합을 스크롤하게하고 이 해당 OnCalcFields 이벤트를 호출하도록하는 것입니다.

프로젝트는 당신이 주장하는 문제를 나타내지는 않습니다. (무엇이 이 "받아 들여지지 않은"값이라는 것을 정확히 알지 못하지만). ListBox 중 어느 항목이 클릭되었는지에 관계없이 해당 통화 값은 DBEdit 앞에 으로 표시되며 시스템 예외 기호로 표시됩니다. 단, 0.1875 은 기본적으로 값이 2로 반올림되므로 "0.19"로 표시됩니다 소수 자릿수. 내 프로그램은 D7과 D10 시애틀에서 동일하게 작동합니다 (btw.

여러분의 문제를 일으키는 것은 무엇이든간에 여러분의 프로젝트에 여러분이 가지고 있지 않은 것이기 때문에 여러분의 질문에 은 포함되어 있지 않습니다.

코멘트에서 당신은 말했다 :

내가 캘크 버튼을 누르면, 난 그냥 계산 필드 Edit1.text의 값을 할당하고있다.

귀하의 q에있는 코드에 따르면 Button1Click 처리기는 그렇지 않습니다. 인 경우 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 
관련 문제