こんにちは。
初歩的な質問なのかもしれませんが、宜しくお願いします。
VBでは、日付の計算はこんな感じで行えると思うのですが
この用に、日付の計算をDelphiで行うには、どんな関数があるのですか?
If IsNull(Day1) OR IsNull(Day2) Then
Text1.Value = ""
Else
Text1.Value = ("d", Day2, Day1)
End if
宜しくお願いします。
VBでも、計算するときは関数が必要だったと思います。
# DateDiffでしたっけ?
Delphiの日付は、Double型です。
妙な管理方法でして、整数部が日付、小数部が時刻を表します。
あとは普通に計算できます。
つまり、
day3 := day2 - day1;
という具合にです。
日付を文字列に変換するなど、細かいところはヘルプを見てください。
「日付時刻ルーチン」にあります。
にしのさん。いつもありがとうございます。
If IsNull(Day1) OR IsNull(Day2) Then
Text1.Value = ""
Else
Text1.Value = DateDiff("d", Day2, Day1)
End if
すいません。DateDiff書き忘れてました。
日付時刻ルーチンに、DaysBetween 関数というのが
あったので、たぶんこれじゃないかな?と思っていますが、
使い方が良くわかりません。
ヘルプに例とかないし、いまいち使い方が解りません。
それと、Nullはどうやって、判断するのですか?
もし、よろしかったら、そこも教えてください。
宜しくお願いします。
TDateTimeにはNullはあり得ません。
もしかして、Day1などの変数はTDateTime(もしくはTDate,TTime)でなく、Variant型ですか?
Delphi5にはDaysBetweenがありませんでした。Delphi6から追加のようです。
2つの日付から日数を得るのは、単純な四則演算で出来ます。
たとえば、
var
day1, day2, day3: TDate;
begin
day1 := StrToDate('2002/11/23');
day2 := StrToDate('2003/11/23');
day3 := day2 - day1;
ShowMessage(Format('%.1f', [day3]));
とすれば、365.0と表示されます。
Delphi6で日付の管理方法が変わっていたら違う結果になるかもしれません。
NULLかどうかは、上にも書いたとおり判断できません。
TDateTimeは、double型と同じですから。
Variantであれば、VarIsNull関数で調べられます。
ありがとうございます。
日付の計算は
var
day1, day2, day3: TDate;
begin
day1 := StrToDate('2002/11/23');
day2 := StrToDate('2003/11/23');
day3 := day2 - day1;
ShowMessage(Format('%.1f', [day3]));
とすれば、365.0と表示されます。
で、うまくいきました。
>もしかして、Day1などの変数はTDateTime(もしくはTDate,TTime)でなく、>Variant型ですか?
Day1等は、テーブルのフィールドです。(Date型)
データが、何も入っていない時計算すると、落ちてしまいます。
これを、回避するには、どうすれば良いんですか?
宜しくお願いいたします。
SQLでのDATE型というと、DelphiではTDateFieldクラスですよね。
TDateFieldクラスに限らず、TFieldクラスには、IsNullプロパティがあるので、これでチェックしてからTDate型にコピーすればOKです。
にしのさん。ありがとうございました。
IsNullでうまくいきました。
それと、基本的なことで恥ずかしいんですが、
VBだと
if IsNull(day1) = False And IsNull(day2) = False then
MsgBox "値があります。"
End if
とできるのですが、
Delphiだと、
if クエリー項目Day1.IsNull = False then
Begin
if クエリー項目Day2.IsNull = False then
ShowMessage('値があります。')
else
ShowMessage('値がありません。');
End;
とやらないと、うまくいってくれません。
これは、何故なのですか?
それと、elseの処理に入ると、EVariantErrorクラスなんちゃらというのが出て
処理が止まってしまいます。
もしよろしければ、教えていただけますでしょうか?
ヘルプの、Object Pascal言語ガイドで、「優先順位」を調べてみてください。
=より、Andのほうが優先度が高いです。
つまり、
If クエリー項目Day1.IsNull = False And クエリー項目Day2.IsNull = False then
は、
If (クエリー項目Day1.IsNull = (False And クエリー項目Day2.IsNull)) = False then
として処理され、結果的に
If クエリー項目Day1.IsNull = True then
として処理されます
ありがとうございました。
うまくいきました。
今後とも宜しくお願いします。
m(_ _)m マキ。