IsEmpty の使い方

解決


tama  2004-01-07 04:15:14  No: 6546

販売先=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

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

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


tama  2004-01-07 18:01:49  No: 6548

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

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

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


HOta  2004-01-07 18:24:21  No: 6550

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


にしの  2004-01-07 18:35:06  No: 6551

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

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


tama  2004-01-07 20:07:04  No: 6552

>ちゃんとキャストしてやらないといけないかも
タイピング量節約のため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さん、にしのさんありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加