レコードセットについて教えてください。カレントDBは参照されているものとします。Accessです。


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人2回まで
  • 登録:
  • 終了:2009/03/14 04:30:25
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:kn1967 No.1

回答回数2915ベストアンサー獲得回数301

ポイント35pt

(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 & "'")

などなど・・・やりかたはいろいろありますので適宜チョイスしてください。

id:akaired

ご回答ありがとうございます!助かりました!

2009/03/14 04:30:14

その他の回答2件)

id:kn1967 No.1

回答回数2915ベストアンサー獲得回数301ここでベストアンサー

ポイント35pt

(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 & "'")

などなど・・・やりかたはいろいろありますので適宜チョイスしてください。

id:akaired

ご回答ありがとうございます!助かりました!

2009/03/14 04:30:14
id:fester No.2

回答回数124ベストアンサー獲得回数20

ポイント35pt

レコードセットの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

id:akaired

ご回答ありがとうございます!助かりました!

2009/03/14 04:30:12

質問者が未読の回答一覧

 回答者回答受取ベストアンサー回答時間
1 Mook 1314 1219 393 2009-03-12 13:08:55
  • id:Mook
    誤回答でした。
    開封不要です。

    http://www.geocities.jp/cbc_vbnet/DAO/recordidou.html
    をご参照ください。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません