Dim rs As DAO.Recordset
Dim x As String
Dim y As String
Dim id As String
Dim name As String
x="select ID,Name From Table1 where ID='1' and Name='John'"
rs=CDB.OpenRecordset(x, dbOpenDynaset)
ここでデータがTable1に存在すればrs!ID,rs!Nameでデータにアクセスできると思いますが、
存在しなければ当然ですが何も表示されません。そこで、何もなければ"0"をいれたいです。
If IsNull(rs!ID) Then
id = Nz(rs!ID)
End If
id=rs!ID
If IsNull(rs!Name) Then
name = Nz(rs!Name)
End If
name=rs!Name
としたいのですが、rs!IDがNULLにもかかわらず、IF文の中身は読まれずに飛ばされます。
何がいけないのでしょうか?何がやりたいかとういと、この後別のSQL文を作成します。
そのSQLでwhereの条件にしたいのです。この後に、
y="Select * from Table2"
If name <> "0" Then
y=y & " where name='" & rs!Name
end if
.....
といったようなことをやりたいと思っています。ご教授お願いします。
(1)レコードセットを準備しただけでは
どのレコードを対象としているか判りませんので
フィールドへアクセスするまえに、対象レコードを指定してやります。
レコードが無ければデータも無いのですからIF文で分岐してやれば楽です。
rs.MoveFirst If Not rs.EOF() id = rs!ID name = rs!Name Else id = "0" name = "0" End If
話は変わりますが・・・
(2)
サーチするIDとNAMEは事前に持っているはずですから
それをそのまま使うという手もありますよね。
Dim rs As DAO.Recordset Dim x As String, y As String Dim id As String, name As String id = 1 name = "John" x="SELECT COUNT(*) AS cnt FROM Table1 WHERE ID='" & id & "' AND Name='" & name & "'" rs=CDB.OpenRecordset(x, dbOpenDynaset) rs.MoveFirst y="SELECT * FROM Table2" & IIF(rs!cnt = 0, "", "WHERE Name = '" & name & "'")
さらに・・・
(3)xでカウント数だけを返すのではなくxでyのSQL文を生成するようにする
(4)xをyのサブクエリにする←これがお勧めだけれども他との絡みもありそうだから割愛
などという手もあるかと思います。
(5)もう少しAccess向けにするとすれば
Dim rs As DAO.Recordset Dim x As String, y As String Dim id As String, name As String id = 1 name = "John" y = "SELECT * FROM Table2" & IIF(DCOUNT("*","Table1","ID='" & id & "' and Name='" & name & "'") = 0, "", "WHERE Name = '" & name & "'")
などなど・・・やりかたはいろいろありますので適宜チョイスしてください。
(1)レコードセットを準備しただけでは
どのレコードを対象としているか判りませんので
フィールドへアクセスするまえに、対象レコードを指定してやります。
レコードが無ければデータも無いのですからIF文で分岐してやれば楽です。
rs.MoveFirst If Not rs.EOF() id = rs!ID name = rs!Name Else id = "0" name = "0" End If
話は変わりますが・・・
(2)
サーチするIDとNAMEは事前に持っているはずですから
それをそのまま使うという手もありますよね。
Dim rs As DAO.Recordset Dim x As String, y As String Dim id As String, name As String id = 1 name = "John" x="SELECT COUNT(*) AS cnt FROM Table1 WHERE ID='" & id & "' AND Name='" & name & "'" rs=CDB.OpenRecordset(x, dbOpenDynaset) rs.MoveFirst y="SELECT * FROM Table2" & IIF(rs!cnt = 0, "", "WHERE Name = '" & name & "'")
さらに・・・
(3)xでカウント数だけを返すのではなくxでyのSQL文を生成するようにする
(4)xをyのサブクエリにする←これがお勧めだけれども他との絡みもありそうだから割愛
などという手もあるかと思います。
(5)もう少しAccess向けにするとすれば
Dim rs As DAO.Recordset Dim x As String, y As String Dim id As String, name As String id = 1 name = "John" y = "SELECT * FROM Table2" & IIF(DCOUNT("*","Table1","ID='" & id & "' and Name='" & name & "'") = 0, "", "WHERE Name = '" & name & "'")
などなど・・・やりかたはいろいろありますので適宜チョイスしてください。
ご回答ありがとうございます!助かりました!
レコードセットのEOFプロパティを使うのがよろしいかと思います
http://www.geocities.jp/cbc_vbnet/ADO/recordidou.html
If rs.EOF Then id = "0" name = "0" Else id=rs!ID name=rs!Name End If
ご回答ありがとうございます!助かりました!
回答者 | 回答 | 受取 | ベストアンサー | 回答時間 | |
---|---|---|---|---|---|
1 | Mook | 1314回 | 1219回 | 393回 | 2009-03-12 13:08:55 |
ご回答ありがとうございます!助かりました!