Recordset.Fields()の値のnullをReplaseするには?

解決


VBがんばってます  2004-09-11 09:15:41  No: 85518

度々のスレッド立て、ご容赦ください。
もしアドバイスを下さる方がいらっしゃいましたらご教授お願いします。

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の中の処理にはいらないと記憶しております。
どなたか対処法をご存知の方がいらっしゃいましたら、お願い致します。


魔界の仮面弁士  2004-09-11 11:45:00  No: 85519

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関数」を使う事になるでしょう。


VBがんばってます  2004-09-12 03:26:30  No: 85520

魔界の仮面弁士様、レスありがとうございます。

ご教授の通り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の値に渡すことができました。ありがとうございました。


VBがんばってます  2004-09-12 03:33:14  No: 85521

追記で恐縮ですが、Recordsetを使って値を比較し差異があった場合、そのRecordsetの1行全てを変数に代入し、画面に全てを表示したいのですが何かよい案はないでしょうか?

1レコードの項目にNo(主キー),Name,Address,TellがあったとしてRec_AとRec_Bを比較し、違っていた場合違っているほうのRecordsetのカラムの値全てを変数に持ちたいのですが、よいアイディアが浮かばず悩んでおります。

何かよい方法をご存知の方いらっしゃいましたら、レスいただけると嬉しいです。よろしくお願いします。


ABC  2004-09-12 21:14:26  No: 85522

「良いアイディア」の基準はなんですか?


VBがんばってます  2004-09-12 23:23:47  No: 85523

ABC様、レスありがとうございます。

よいアイディアだけではわからないですよね、スミマセンでした。
違っていた場合1レコードの内容すべてを変数に持つようにしたいのです。
その為の関数というか、変数みたいなものがあれば知りたいなぁと思いまして。自分でも調べているのですが、なかなか参考にしたいサイトが見つからないものですから。。。


ABC  2004-09-13 00:33:59  No: 85524

つまりコーディング量を少なくしておっしゃる処理を実現するのが
良いアイディアということですね?

その基準を示すためにも、現在あなたの考えているコーディング方法を
書いてみてはどうでしょうか?
でないと書いても無駄になりそうな気がしますから。


VBがんばってます  2004-09-14 18:44:43  No: 85525

ABC様、レスありがとうございます。
レスが遅くなりました。

結局CCollectionオブジェクトを二つ宣言して、差異があった場合そのオブジェクトに値を渡すようにしました。

中途半端に自分で解決してしまいました。次からはもっとちゃんと考えて投稿いたします。
ありがとうございました。


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

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






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