IsEmpty の使い方

解決


tama  2004-01-07 04:15:14  No: 6546  IP: [192.*.*.*]

販売先=0 のレコードが1件もない場合

ADODataset1.CommandText:='select sum(価格) as T from 販売帳簿 where 販売先=0';
ADODataset1.open;
if ADODataset1.IsEmpty then Total:=0 else Total:=ADODataset1['T'];

で if 文にエラーがでます(Null型からInteger型へのバリアント型変換はできません)。
IsEmpty の使い方がまちがっているのでしょうか?(Win-Xp-home,D7)

編集    削除
にしの  2004-01-07 08:49:17  No: 6547  IP: [192.*.*.*]

Eofではどうでしょう。
こういうときは、デバッグでブレークポイントを指定し、IsEmptyの値を変数に入れ、値を参照してみてください。
# 他でその変数を使用しない場合、プロジェクトのオプションで、最適化にチェックがあると参照できないかもしれません

エラーが起きている箇所は、Total:=ADODataset1['T']の部分だと思います。

編集    削除
tama  2004-01-07 18:01:49  No: 6548  IP: [192.*.*.*]

IsEmptyは「参照できない値」となっていました。
Eofを使うとfalseになっていますのでelse以下が実行されエラーが出るようです。↓

ADODataset1.CommandText:='select sum(価格) as T from 販売帳簿 where 販売先=0';
ADODataset1.open;
if ADODataset1.Eof then Total:=0 else Total:=ADODataset1['T'];

この場合EofはTrueになると思うのですが・・・?

編集    削除
にしの  2004-01-07 18:11:34  No: 6549  IP: [192.*.*.*]

Eofはプロパティなので、デバッグで参照できますが、IsEmptyは関数なので、一度変数に入れてやらないと参照できません。

あまりDBに詳しくないのですが、ADODataSetでなく、ADOQueryを使ってもダメですか?

編集    削除
HOta  2004-01-07 18:24:21  No: 6550  IP: [192.*.*.*]

ADODataset1['T']の様な書き方は合ったのでしょうか?
私は、ADODataset1.FieldByName('T').AsCurrencyなどと書きます。

編集    削除
にしの  2004-01-07 18:35:06  No: 6551  IP: [192.*.*.*]

FieldValueプロパティがdefault指定されているので、Variantが帰ってきます。
試していませんが、Variantで、内容がTotalの型とあっていれば入るのでは?
ちゃんとキャストしてやらないといけないかも。

私の場合も、FieldByNameを使用しますが^^;

編集    削除
tama  2004-01-07 20:07:04  No: 6552  IP: [192.*.*.*]

>ちゃんとキャストしてやらないといけないかも
タイピング量節約のためADODataset1['T']のような描き方を愛用してきたことが原因だったようです。
御指摘いただきましたとおり
if ADODataset1.Eof then Total:=0 else Total:=ADODataset1.FieldbyName('T').AsInteger;
でTotal=0が戻り、エラーが回避できました。

IsEmptyもEofもこの場合必要ないですね(^^;
ADODataset1.CommandText:='select sum(価格) as T from 販売帳簿 where 販売先=0';
ADODataset1.open;
Total:=ADODataset1.FieldbyName('T').AsInteger;
でOKでした。
HOtaさん、にしのさんありがとうございました。

編集    削除