度々のスレッド立て、ご容赦ください。
もしアドバイスを下さる方がいらっしゃいましたらご教授お願いします。
Win2000,VB6.0,Access2000で開発しております。
現在Recordsetを使ってSQLを実行しRecordを取得しているのですが、取得したカラムにNULLが入っているものがあります。NULLだった場合Replaceを行って空文字か記号に変換したいのですが、調べてもなかなかめぐり合わないので投稿いたしました。
Rec_A.Fields(lngX1)の値がnullだったら何か文字に変換ということを記述したいのですが、うまくかけないでいます。
lngX1はLong型でループ変数が入っています。
イメージとしては
If Rec.Fields(lngX1) = Null then
Rec.Fields(lngX1)の値を他のものに変更
end if
こういった記述をしたいのですが、確かIf文でnullを比較すると必ずfalseを返す為Ifの中の処理にはいらないと記憶しております。
どなたか対処法をご存知の方がいらっしゃいましたら、お願い致します。
Replace関数の第1引数は、String型ですので、ここにNullを渡すことは出来ません。
Nullの場合に空文字列にしたいのであれば、
案1)
If IsNull(値) Then
S = ""
Else
S = CStr(値)
End If
案2)
S = IIf(IsNull(値), "", CStr(値))
案3)
S = 値 & ""
などの手法が使えます。
もしくは、Nullを変換するために、
Public Function Nz(ByVal Value As Variant, Optional ByVal IsNullValue As Variant = Empty) As Variant
If IsNull(Value) Then
Nz = IsNullValue
Else
Nz = Value
End If
End Function
のような関数を用意して、
str1 = Nz(値)
lng1 = Nz(値)
str2 = Nz(値, "(null)")
lng2 = Nz(値, -1)
などのように書く事もできるかと。
> 確かIf文でnullを比較すると必ずfalseを返す為
いえ、Nullとの比較はFalseではなく、「Null」を返します。
Nullには「不明な値」のような意味があります。
「不明な値との比較結果」はやはり「不明」なため、結果もNullとなるわけですね。
# ちなみに、「True And Null」はNull、「False And Null」はFalse、
# 「True Or Null」はTrue、「False Or Null」はNull ……となりますが、
# これも、Nullが『不明な値』であると分かると、理解しやすいかと。
Nullかどうかの判断には、幾つかの方法がありますが、
基本的には、「IsNull関数」を使う事になるでしょう。
魔界の仮面弁士様、レスありがとうございます。
ご教授の通りIsNull関数を使い以下のように対処いたしました。
Dim chkNull_A as String
chkNull_A = IsNull(Rec_A.Fields(lngX1))
If chkNull_A = true Then
Rec_A.Fields(lngX1) = vbNullString
End if
この用に記述することによりNullだった場合、""をRecordsetの値に渡すことができました。ありがとうございました。
追記で恐縮ですが、Recordsetを使って値を比較し差異があった場合、そのRecordsetの1行全てを変数に代入し、画面に全てを表示したいのですが何かよい案はないでしょうか?
1レコードの項目にNo(主キー),Name,Address,TellがあったとしてRec_AとRec_Bを比較し、違っていた場合違っているほうのRecordsetのカラムの値全てを変数に持ちたいのですが、よいアイディアが浮かばず悩んでおります。
何かよい方法をご存知の方いらっしゃいましたら、レスいただけると嬉しいです。よろしくお願いします。
「良いアイディア」の基準はなんですか?
ABC様、レスありがとうございます。
よいアイディアだけではわからないですよね、スミマセンでした。
違っていた場合1レコードの内容すべてを変数に持つようにしたいのです。
その為の関数というか、変数みたいなものがあれば知りたいなぁと思いまして。自分でも調べているのですが、なかなか参考にしたいサイトが見つからないものですから。。。
つまりコーディング量を少なくしておっしゃる処理を実現するのが
良いアイディアということですね?
その基準を示すためにも、現在あなたの考えているコーディング方法を
書いてみてはどうでしょうか?
でないと書いても無駄になりそうな気がしますから。
ABC様、レスありがとうございます。
レスが遅くなりました。
結局CCollectionオブジェクトを二つ宣言して、差異があった場合そのオブジェクトに値を渡すようにしました。
中途半端に自分で解決してしまいました。次からはもっとちゃんと考えて投稿いたします。
ありがとうございました。
ツイート | ![]() |