2011-01-24 15 views
0

DBGrid가 있고 계산 시트를 만들려고하지만 가끔 계산을 수행하지 않습니다. 어떻게 그것을 피할 수 있습니까 ??Dbgrid 계산

procedure TOrcamentos.DBGridEh1ColExit(Sender: TObject); 
var 
    percent: double; 
    Unid: double; 
    tot: currency; 
    vaz: string; 
begin 
    if Dorcamen_SUB.DataSet.State in [dsEdit, dsInsert] then 
    try 
     Dorcamen_SUB.DataSet.Post; 
    finally 
     vaz := DBGridEh1.Columns[3].Field.text; 
     if (vaz<> '') then 
     try 
      Torcamen_SUB.Edit; 
      Unid := (Torcamen_SUB.FieldByName('QT').AsFloat); 
      tot := (Torcamen_SUB.FieldByName('Precovenda').AsFloat); 
      percent := (Torcamen_SUB.FieldByName('Desconto').AsFloat); 
      try 
      tot := tot+(tot * percent)/ 100; 
      finally 
      Torcamen_SUB.FieldByName('Total').AsFloat := unid*tot; 
      Torcamen_SUB.Post; 
      Orcamentos.TotalExecute(self); 
      end; 
     except 
     end; 
    end; 
end; 

답변

2

실제로 계산을 구현하는 더 좋은 방법은 실제로 눈금이 연결되는 TTable 구성 요소로 계산을 이동하는 것입니다. Total 필드는 실제로는 데이터베이스의 필드가 아니어야하며 다른 필드의 값을 기반으로 계산 된 필드 여야합니다. 테이블의 필드 편집기를 사용하여 추가 필드를 추가하고 필드 이름 Total을 입력하고 올바른 데이터 유형을 선택한 다음 필드 유형을 계산 됨으로 선택하십시오.

Torcamen_SUB.FieldByName ('총') AsFloat :.. = Torcamen_SUB.FieldByName ('QT') AsFloat * ( Torcamen_SUB.FieldByName (확인을 클릭 한 다음 테이블의 OnCalcField 이벤트에 대한이 유사한 코드를 추가 'Precovenda') AsFloat + (Torcamen_SUB.FieldByName ('Precovenda')) AsFloat * Torcamen_SUB.FieldByName ('Desconto'). AsFloat)/100);

실제적으로 필요한 경우가 아니면 계산 된 값을 데이터베이스에 저장하면 안됩니다. 계산 된 필드로 데이터 집합을 데이터 집합에 추가 한 다음 그리드를 데이터 집합에 연결하기 만하면됩니다. 계산 된 모든 필드가 그리드에 표시되고 각 행은 해당 행의 값을 기반으로 올바른 계산 된 값을 표시합니다.

1

나는 당신이 (일부 그리드 열이 포커스를 잃을되는 이벤트 등) 사용자 상호 작용 로직 (총 계산 등) 비즈니스 로직을 혼합하고 생각하고 그 응용 프로그램의 산만 한 행동의 근원이다 .

어디서 그런 일이 일어나지 않는지 알지도 못하는 것 같습니다.

그런 종류의 계산을 수행하려면 Field의 이벤트 (예 : OnChange 이벤트)를 사용해보십시오.

당신은 단지 declare what you want in a TAggregateField 일 수 있고 "손으로"계산하는 것을 잊어 버리기 때문에 TClientDataSet과 같은 집계 기능이있는 데이터 세트를 사용하고 있다면 행운이 있습니다.

하지 귀하의 질문에하지만 ... 당신이 마지막도 ... 예를 들어, 코드의이 비트에/시도를 사용하는 방법에주의 :

try 
    tot := tot+(tot * percent)/ 100; 
finally 
    Torcamen_SUB.FieldByName('Total').AsFloat := unid*tot; 
    //other things 
end; 

가 알고 그것을위한 경우 어떤 이유로 try와 finally 절 사이의 줄에서 예외가 발생하는 경우 변수 tot에는 정의되지 않은 값 (이 경우 이전 할당 결과)이 있으므로 Torcamen_SUB.total 필드에 대한 할당이 잘못된 것입니다. 모든. 그것이 정말로 당신이 원하는 것인지 확실하지 않습니다.

+0

탁신 님, 당신 말이 맞습니다. sayng입니다. 나는 감사의 과정을 다시 만들 것이다. –

+0

Mdb를 사용 중입니다. 데이터베이스 및 TAggregateField 만들기 위해 whant itante 그것을 링크에서처럼 보자. 거기에 방법이 있습니까? –

+0

@ml ClientDataSets를 사용하고 있습니까? – jachguate