販売先=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)
Eofではどうでしょう。
こういうときは、デバッグでブレークポイントを指定し、IsEmptyの値を変数に入れ、値を参照してみてください。
# 他でその変数を使用しない場合、プロジェクトのオプションで、最適化にチェックがあると参照できないかもしれません
エラーが起きている箇所は、Total:=ADODataset1['T']の部分だと思います。
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になると思うのですが・・・?
Eofはプロパティなので、デバッグで参照できますが、IsEmptyは関数なので、一度変数に入れてやらないと参照できません。
あまりDBに詳しくないのですが、ADODataSetでなく、ADOQueryを使ってもダメですか?
ADODataset1['T']の様な書き方は合ったのでしょうか?
私は、ADODataset1.FieldByName('T').AsCurrencyなどと書きます。
FieldValueプロパティがdefault指定されているので、Variantが帰ってきます。
試していませんが、Variantで、内容がTotalの型とあっていれば入るのでは?
ちゃんとキャストしてやらないといけないかも。
私の場合も、FieldByNameを使用しますが^^;
>ちゃんとキャストしてやらないといけないかも
タイピング量節約のため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さん、にしのさんありがとうございました。
ツイート | ![]() |