1

グリッド内の 2 つの日付の差の日数を計算しようとしています。この種類は機能しますが、最初は奇妙な結果が生成されます。これは、TEMP テーブルの Oncalculate fields イベントです。

TEMP.FieldByName('DAYS').asstring := IntToStr(Daysbetween(TEMP.FieldByName('BIV_OD').AsDateTime,TEMP.FieldByName('BIV_DO').AsDateTime));

BIV_OD と BIV_DO は日付フィールドです (つまり、... Date_From - Date-to のように) グリッド (BIV_OD) で最初の日付を選択すると、最初に DAYS フィールドに 40731 (??) と表示され、次に 2 番目の日付を入力するとすべて正常に動作します。何故ですか ?

4

1 に答える 1

2

それはあなたが求めたものです...

Delphi は、日付を 1899 年 12 月 31 日からの日数として保存するため、最初の日付を書き込むときは、40731 (1899 年 12 月 31 日からの日数) - 2 番目の日付をまだ入力していないため 0 になります。

解決策は、両方の日付が入力されていない限り、フィールドを計算しないことです。

if (Temp.FieldByName('BIV_OD').AsDateTime > 0) and (TEMP.FieldByName('BIV_DO').AsDateTime > 0) then
    TEMP.FieldByName('DAYS').AsString:= IntToStr(Daysbetween(TEMP.FieldByName('BIV_OD').AsDateTime,TEMP.FieldByName('BIV_DO').AsDateTime))
else
    TEMP.FieldByName('DAYS').AsString:= ''; //don't display anything. 

グリッド列のデータ型を整数に設定しましたが。

if (Temp.FieldByName('BIV_OD').AsDateTime > 0) and (TEMP.FieldByName('BIV_DO').AsDateTime > 0) then
    TEMP.FieldByName('DAYS').AsInteger:= Daysbetween(TEMP.FieldByName('BIV_OD').AsDateTime,TEMP.FieldByName('BIV_DO').AsDateTime)
else
    TEMP.FieldByName('DAYS').Value := Null; //don't display anything. 
于 2011-07-07T08:41:08.353 に答える