プロが教えるわが家の防犯対策術!

Access97を使用しています。

データは テーブルAの項目B、項目Cが下記のようにあるとします。
フォーム上のText"B"に項目Bを入力します。

項目B項目C
11a
11b
22aa
22bb
22cc
33aaa
33ccc

この時
Set DB = CurrentDb()
strSQL = "SELECT * FROM A WHERE "
strSQL = strSQL + "B='" & Me.B & "';"
Set RS = DB.OpenRecordset(strSQL, dbOpenDynaset, dbReadOnly)
RS.MoveFirst
RS.MoveLast
m = RS.RecordCount
For i = 1 To m
COIL_N = RS.Fields("C")
Call RS.MoveNext
Next i

上記のようなモジュールですが、例えば
項目Bの"11"を選んだ時、項目Cの二番目のデータbが 取得できません。
"カレントレコードがありません"とでてきます。何故でしょうか?

A 回答 (3件)

RS.MoveLast


した時点で、レコードセットの最終レコードがカレントになっていますよね
その後
RS.MoveNext
すれば、EOFになりますからカレントは無くなります。

恐らくレコードセットの1レコード目は、bで2レコード目がaなのでは?
その辺は、キー設定がどのようになっているかに依存しますから。
    • good
    • 1
この回答へのお礼

ありがとうございました。上手く行きました。

お礼日時:2003/03/19 10:52

こんにちは。

maruru01です。

No.1の人の言う通り、1行実行しながら変数などに格納される値をモニタしてみることです。
"カレントレコードがありません。"
というエラーの場合は、レコードセットのEOFかBOFプロパティがTrueになっていることが原因ではないでしょうか。

それから、気になった点は何故

RS.MoveFirst
RS.MoveLast

としているのかという点です。
あと、レコードセットの読み込みはForループより、DoループでEOFプロパティに格納される値を条件にした方がいいと思います。

Do Until (RS.EOF)
  COIL_N = RS.Fields("C")
  RS.MoveNext
Loop

という感じです。
MoveFirstとMoveLastをなしにして、上記のコードにすればOKだと思います。
    • good
    • 0
この回答へのお礼

ありがとうございました。上手く行きました。

お礼日時:2003/03/19 10:51

ブレイクポイントを設定して1行ずつ実行すれば、原因がわかりそうな


質問ですね。

とりあえず、mにしかるべき数字(この場合は2)がちゃんと入ってる
か確認してみては?

あと最後から2番目のCALL文て必要なんですか? なくてもいいような・・。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています