1

次の行として集計フィールド(SUM_TOTAL)の値にアクセスしようとすると:

DM.cdsTOTAL.AsCurrency := DM.cdsItemSUM_TOTAL.AsCurrency;

次のエラーが発生します。

タイプ float としてフィールド 'SUM_TOTAL' にアクセスできません。

私の一時的な解決策はこれです:

DM.cdsTOTAL.AsCurrency := StrToCurrDef(DM.cdsItemSUM_TOTAL.AsString, 0);

他の提案はありますか?

4

3 に答える 3

2

これが、TAggregateField が十分に設計されていない方法です。db.pas の実装の詳細を参照して、前述の AccessError を引き起こすベース TField.GetAs... ファミリーをオーバーライドしないことを理解してください。

于 2013-01-09T06:37:24.647 に答える
1

TAggregateField のクラス ヘルパーを実装でき、必要に応じて TAggregate を実装できます。

type
  TAggregateHelper=Class Helper for TAggregate
  private
    function GetCurrency: Currency;
  published
    Property asCurrency:Currency read GetCurrency;
  End;

  TAggregateFieldHelper=Class Helper for TAggregateField
  private
    function GetCurrency: Currency;
  published
    Property asCurrency:Currency read GetCurrency;
  End;


implementation



{ TAggregateHelper }

function TAggregateHelper.GetCurrency: Currency;
begin
  if not VarIsNull(Value) then
     Result := Value
  else Result := Value;
end;
{ TAggregateFieldHelper }

function TAggregateFieldHelper.GetCurrency: Currency;
begin
  if not VarIsNull(Value) then
     Result := Value
  else Result := Value;
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
  Showmessage(FloatToStr(CDSTotal.AsCurrency) + '-' + FloatToStr(CDS.Aggregat[0].asCurrency));
end;
于 2013-01-19T21:00:42.833 に答える
1

暗闇の中でのショット:

begin
  If DM.cdsItemSUM_TOTAL.IsNull then
  begin 
    DM.cdsTOTAL.AsCurrency := 0;
  end 
  else
  begin
     DM.cdsTOTAL.AsCurrency := Currency(DM.cdsItemSUM_TOTAL.Value);
  end;
end;

値は float (おそらく double) であるため、通貨変数にキャストできると思います。

于 2013-01-18T17:05:59.633 に答える