ループがうまくいかない

このQ&Aのポイント
  • ループがうまくいかず、エラーが発生しています。
  • 特定の条件でBookIDの重複を避けるためにループを使用していますが、内側のループでエラーが発生しています。
  • エラーの原因としては、DoUntilの条件式に不正な値が含まれている可能性が考えられます。
回答を見る
  • ベストアンサー

ループがうまくいかない

以下のようなテーブルがあります。 BookID,CategoryIDは一意な値です。 BooksDataをある条件で抽出するSQLを発行した際、 例えば300番のBookIDにはCategoryIDが複数あると 結果は300のレコードが複数分表示されます。 BooksIDが同じ値の場合、nextして、重複しない値になるまでnextさせ、結果としてBooksIDの値が重複しない結果を表示したいと考えております。 しかし、内側にあるDoWhile-Loop文で不明なエラーとなります。外側のDoWhile-Loop文をコメントアウトされると正常にnextできているようです。原因について推測できることはございますでしょうか。 [BooksData] BookID ISBN Title [BooksCategory] BookID CategoryID [BooksM_Category] CategoryID CategoryName Do While Not rs1.EOF 'BooksDataを表示 Response.Write("BookID:") Response.Write(rs1("BookID")&"<br>") '300番がはいっている bid = rs1("BookID") 'ここでエラーになる Do Until rs1("BookID") > bid rs1.MoveNext '最初のDoWhile-Loopをコメントアウトされると301が表示される。 'Response.Write(rs1("BookID")) Loop Loop

  • oen
  • お礼率58% (7/12)

質問者が選んだベストアンサー

  • ベストアンサー
  • kagep
  • ベストアンサー率23% (171/721)
回答No.1

'データが取得できたら、出力 If rs1.EOF = False then '先頭のIDを比較用に確保 bid = rs1("BookID") '1行目のタイトルを出力 Response.Write("BookID:") '1行目のBooksDataを出力 Response.Write(rs1("BookID")&"<br>") 'データ件数分ループ Do Until rs1.EOF '確保したIDと現在行のIDを比較 '→一致する場合は出力しない If rs1("BookID") <> bid then '違う場合 '比較用ID確保 bid = rs1("BookID") 'タイトル出力 Response.Write("BookID:") 'BooksDataを出力 Response.Write(rs1("BookID")&"<br>") End If '次のデータへ rs1.MoveNext Loop でいけるかと。 でも、BookIDだけを出力させるSQLを組んでいるのであれば、 SELECT DISTINCTすれば済むだけかと。 前段がよくわからないので、とりあえずロジックで対応してみました。 間違えてたら自己責任で直してください(^^;;;

oen
質問者

お礼

DISTINCTであっさりうまくいきました! SQLとASPの勉強中なもので、半日悩んでました。 ありがとうございました。

その他の回答 (1)

  • kagep
  • ベストアンサー率23% (171/721)
回答No.2

って、間違えてた。。。汗 最後にEnd If入れてください!

関連するQ&A

  • レコードセットのループ処理でエラー・・・

    簡単なことだと思うのですが、解決できなくこまっております。お助けください。 以下のコーディングで、データの取得は出来ているのですが、「Do Until rs1.EOF」でエラーとなります。 SOURCE----------------------------------------- sql = "Select No from t01" Recordset.Open sql, dbc, 3 If rs1.EOF Then Response.Write "データナシ<BR>" ←表示されません。 else Do Until rs1.EOF ←この行でエラーとなります。 Response.Write "No=" & rs1("No").Value rs1.MoveNext Loop end if Error-------------------------------------------- ADODB.Field (0x80020009) BOF と EOF のいずれかが True になっているか、または現在のレコードが削除されています。要求された操作には、現在のレコードが必要です。 因みに、Do Untilを使用せず  Response.Write "No=" & rs1("No").Value  rs1.MoveNext  Response.Write "No=" & rs1("No").Value と記述すると正常にデータが表示されます。 「Do Until rs1.EOF」で発生するエラーの回避方法を御教示願います。

  • SELECT文の発行でタイムアウトします

    以下のようなテーブルがあります。 BooksDataテーブルのBookIDから、 BooksCategoryテーブルのCategoryIDを調べ CategoryNameを表示したいと考えておりますが SELECT文が実行中にタイムアウトになってしまいます。 何か悪いところはございますでしょうか。 [BooksData] BookID ISBN Title [BooksCategory] BookID CategoryID [BooksM_Category] CategoryID CategoryName SELECT BMC.* FROM BooksM_Category AS BMC, BooksCategory AS BC WHERE BookID=XXX AND BMC.CategoryID=BC.CategoryID

  • データベースをEOFまでループさせたい

    データベースをEOFまでループさせたい 今までVB6.0上で下記のようなコーディングをしておりましたが 初VB.NET上コーディングで、参照にしたプログラムもがらっと変わり 四苦八苦しています><; 今まで ********* Do Until rs.EOF    aaa=rs("Log_Time")    rs.MoveNext Loop ********* これを Do~Loop でなく、For Each で書きたいと思うのですが 下記コーディングでエラーとなります。 エラー「型'System.Data.Datarow'の値を'integer'に変換できません」 For Each row As DataRow In rs.Tables(dataTableName).Rows    aaa = Me._rs.Tables(dataTableName).Rows(row)("Log_Time") Next やりたいことは単純にEOFまでループし、値を取得したいということなのですが・・・ うまくいきません。 EOFという概念もない様子?! どなたかヨロシクお願いします!

  • 次データ取得エラーについて

    sea_clear_sky8です。 [環境] OS 98SE PWS [質問内容] SQL CMD.CommandText = "SELECT * from test_t" このSQLだと下記のソースの部分が通り、データを表示 させることができます。 でも、 SQL CMD.CommandText = "select * from test_t " & _ "where name like '%" & Request("nm") & "%' " & _ "order by id " & _ "limit " & Request("page_num")*10 & ",10" だと次データ取得エラーと表示され、エラー番号3251が表示され 二つ目のデータから取得できません。 忙しいところすいませんが、ご教授願います。 エラー番号等で、インターネットで調べましたが、原因がわからない 状態です。よろしくお願いします。 [ソース] Do UntiL RS.EOF=true For i = 0 to RS.Fields.Count-1 Response.write RS(i).name k = RS(i).name + CSTR(RS.bookmark) Response.write "<input name="&k&" value="&RS(i)&">" next Response.write "<BR>" RS.MoveNext Loop

  • レコードが存在しなかった場合

    教えてください。 Vbscript初心者です。 SQLでデータを取得した後の構文で以下のような記述があります。 もしレコードが存在しなかった場合に Response.write(”レコードが存在しません")と表示したいです。 IIf Rs.RecordCount=0 Then Response.write("レコードが存在しません") End If のような書き方をどこかに入れようとしているのですが、以下のようなメッセージが表示されてしまいます。どのように書けば宜しいでしょうか? ADODB.Field エラー '800a0bcd' BOF と EOF のいずれかが True になっているか、または現在のレコードが削除されています。要求された操作には、現在のレコードが必要です。 よろしくお願い致します。 **************************** SQL文や接続の記述 <% Do While not Rs.EOF = True  Response.Write・・・   Rs.MoveNext Loop Rs.Close Set Rs = Nothing Con.Close Set Con = Nothing %> **************************

  • 複数のランダムクイズの表示がうまくいきません・・・。

    以下のようなプログラムを作成しましたが、表示が思うようにいきません。。 本当なら複数の問題をランダムで5問ずつ表示したいのですが、すべて表示することができず、1問のみだったり、3問のみしか表示されなかったりとバラバラです。 記述方法が悪いのでしょうか?どなたか分かる方いらっしゃいましたらご教授お願いします。 ------------------------- <% accessdb="cityquiz" cn="DRIVER={Microsoft Access Driver (*.mdb)};" cn=cn & "DBQ=" & server.mappath(accessdb) set rs = Server.CreateObject("ADODB.Recordset") sql = "select * from quiz" rs.Open sql, cn, 1, 3 total_records=rs.recordcount randomize random_number=int(rnd*total_records)+1 rs.MoveFirst do while not rs.eof and counter <> random_number counter = counter + 1 if counter= random_number then response.write rs("問題") & "<br>" response.write "<input type='radio' name='Q1' vakue='" & rs("ID") & "1'>" & rs("1択") & "<br>" response.write "<input type='radio' name='Q1' vakue='" & rs("ID") & "2'>" & rs("2択") & "<br>" response.write "<input type='radio' name='Q1' vakue='" & rs("ID") & "3'>" & rs("3択") & "<br>" response.write "<input type='radio' name='Q1' vakue='" & rs("ID") & "4'>" & rs("4択") & "<br>" response.write "<br>" end if counter2 = counter + 2 if counter2= random_number then response.write rs("問題") & "<br>" response.write "<input type='radio' name='Q2' vakue='" & rs("ID") & "1'>" & rs("1択") & "<br>" response.write "<input type='radio' name='Q2' vakue='" & rs("ID") & "2'>" & rs("2択") & "<br>" response.write "<input type='radio' name='Q2' vakue='" & rs("ID") & "3'>" & rs("3択") & "<br>" response.write "<input type='radio' name='Q2' vakue='" & rs("ID") & "4'>" & rs("4択") & "<br>" response.write "<br>" end if counter3 = counter + 3 if counter3= random_number then response.write rs("問題") & "(3)<br>" & counter3 response.write "<input type='radio' name='Q3' vakue='" & rs("ID") & "1'>" & rs("1択") & "<br>" response.write "<input type='radio' name='Q3' vakue='" & rs("ID") & "2'>" & rs("2択") & "<br>" response.write "<input type='radio' name='Q3' vakue='" & rs("ID") & "3'>" & rs("3択") & "<br>" response.write "<input type='radio' name='Q3' vakue='" & rs("ID") & "4'>" & rs("4択") & "<br>" response.write "<br>" end if ~略~ rs.movenext loop %>

  • 副問い合わせ?について。

    ASPとAccessを使って書籍検索サイトの作成の勉強をしています。 以下のような複数のテーブルがあります。 BooksDataをPublishTypeで抽出し、更にCategoryIDで抽出した結果のTableAの内容を全て表示するにはどういったSQLを書けばよいのでしょうか。 単純に "SELECT * FROM BooksData WHERE PublishType=3" といった問い合わせは成功しました。 [TableA] BookID ISBN Title PublishType [TableB] BookID(主キー) CategoryID(主キー) [TableC] CategoryID CategoryName

  • セレクトしたデータを更新させるにはどうしたらよろしいのでしょうか?

    更新されません。 セレクトしたデータをそのまま更新させようとしているからいけないのでしょうか? <% Dim DB,Rs,Cmd Set DB = Server.createobject("ADODB.Connection") On error Resume Next DB.open "mysql" DB.BeginTrans Set Cmd=Server.createobject("ADODB.command") Cmd.activeconnection=db Cmd.commandtext="select * from stb where id =1" Set Rs = Cmd.Execute i=cint(1) j="ADSL" Do until Rs.eof Rs("id"),value= i Rs("name").value= j Rs.update If DB.Errors.Count >0 then DB.Rollbacktrans response.write "エラー" for idx = 0 to 2 Response.write db.errors(idx).Description & "<br>" next else DB.commitTrans response.write "データが登録されました。" end if Rs.movenext Loop Rs.close DB.close set Cmd = Nothing set Rs = Nothing set db = Nothing %>

  • 【VB】コンボボックスにデータベースから取り出した値を入れたい

    VB2005です。 表題の通りですがやり方がよくわかりません。 データベースに接続し、 SQLで重複しない値を取り出すところまではできています。 SQL=SELECT DISTINCT FieldName FROM TableName VB6の時はこんなソースでした Do Until rs.EOF    Combo1.AddItem.Fields("FieldName")    rs.MoveNext Loop VB2005ではどう書くのでしょう? よろしくご教授ください。

  • レコード一件ずつ処理判定をしたいのです。

    データベースの値を取得してきて 下記内容の処理を実施したいと考えています。 Do While rs.EOF = False    処理する内容:     レコード1件目とレコード2件目の値をチェックする。     レコード2件目とレコード3件目の値をチェックする。 rs.MoveNext Loop レコード一件ずつ処理の判定をしたいのです。 要は レコード内で重複する値があれば排除する分岐をしたいんですよね。

専門家に質問してみよう