- ベストアンサー
ACCESS ADO Whereで取得したデータのナンバーを取得する方法
お世話になります。 ACCESSで管理ソフトウェアを作成しているのですが、 ある配列変数 data(1 to 40)があり、 ADOでデータベースから Where句を使い、必要なデータを引き出し変数へ入れています。 引き出しているレコードの、レコードカウント数を変数に入れたいのですが、どうすればいいのでしょうか? RecordCountでは引き出したレコードの最大数をとってしまうためできませんでした。 よろしくお願いします。
- teas
- お礼率33% (36/107)
- その他(データベース)
- 回答数5
- ありがとう数4
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
単純に、カウンタ用の変数を用意すればよいのでは? 以下のような感じです。 Dim lngRecordCount as Long lngRecordCount = 0 Do Until rs.EOF (必要なデータかどうか判定) If (必要なデータなら) Then lngRecordCount = lngRecordCount + 1 data(lngRecordCount) = rs!XXXX End If rs.moveNext Loop
その他の回答 (4)
- NOBNNN
- ベストアンサー率50% (93/186)
行番号はレコード数と同じと考えてください。 例では新規にレコードを作成する際、行番号が順番にふられます。 VBA側でカウントすることもできますが、できればサーバー側 でできるようにしたほうが処理は早いと思います。
- O_cyan
- ベストアンサー率59% (745/1260)
>RecordCountでは条件に見合うデータ数をとってしまっていてレコードセットのカウント数が取得できなかったため レコードセットにしてしまった後はループさせてカウントするしかないと思いますが。 もう一つレコードカウントを取りたい条件にあったSQLを発行して先にカウントさせておくとか。
- O_cyan
- ベストアンサー率59% (745/1260)
>引き出しているレコードのレコードカウント数を変数に入れたい 変数名 = Me.Recordset.RecordCount で変数に代入できませんか。 >RecordCountでは引き出したレコードの最大数をとってしまうためできませんでした この辺が良く理解できていませんが・・。 引き出しているレコードのレコードカウント数とRecordCountで取得できるレコード数は一緒ではないですか? 開いているレコードセットからさらに絞り込んでレコード数をカウントするという事なのでしょうか。 別の抽出条件を付けてレコードセットを取得してカウントすれば良いのでは?
お礼
ご返答ありがとうございます。 Do Untilを使用し、条件に見合うデータを抽出しているのですが、RecordCountでは条件に見合うデータ数をとってしまっていてレコードセットのカウント数が取得できなかったためです。
- NOBNNN
- ベストアンサー率50% (93/186)
ADO ということは 接続先は MSDEとかOracle あるいはSQL Server とかいろいろあります。 また、ACCESS のバージョンは何を使用しているかによりかなり違ってきます。 仮にMSDE(SQL SERVER2000) とすれば IDENTITY用いた方法があります。 例: SELECT (IDENTITY(int, 1, 1) AS 行番号, ユーザーTBL.* INTO #WKユーザーTBL.* FROM ユーザーTBL Where あなたが書いた 条件 ORDEr BY あなたが書いた順番 あとは 作成された#WKユーザーTBL を接続して 読み込めば 行番号がわかります。 最新の MS SQL Server 2005 では 新しく SQL の関数で row_number が追加されました。 詳細は マイクロソフトの公式ページ MSDN ライブラリ あるいは BooksOnline などを閲覧してください。 SQL SERVER 2005 Expressは無料でダウンロードできます。 例: SELECT ROW_NUMBER() OVER (ORDER BY あなたが指定するレコードKey) AS 行番号, FROM ユーザーTBL Where あなたが書いた 条件 ORDEr BY あなたが指定するレコードKey 参考程度ですががんばって勉強してください。
お礼
ご返答ありがとうございます。 環境はACCESS + SQL Serverです。 行番号ではなく、読み込んだレコード数をループ中にいくつか?が知りたいです。(><)
関連するQ&A
- adoのWHERE句 クエリだとフィルタされない
エクセルvbaなのですが、 adoのWHERE句は、テーブルじゃないとダメなのでしょうか? と言うのも、 rs.Open "Q_カテゴリ WHERE 分類 like '%A%'" だと、エラーにならないのですが、抽出もされずに全レコードが対象になってしまいます。 しかし、 rs.Open "T_カテゴリ WHERE 分類 like '%A%'" にすれば、抽出された後のレコード数が取得されます。 エラーにならない事から、オブジェクトは存在してる事は確かなはずですが なぜかフィルタできません。 なぜでしょうか?
- ベストアンサー
- Visual Basic
- アクセス ADO Null以外のレコードの件数を取得したい
アクセス ADO Null以外のレコードの件数を取得したい テーブルにレコードが100行あり、そのうちNull値は40行あります。(主キーではないです) この時、ADOでNull以外にフィルタをかけたいのですが For i = 1 To RS.RecordCount RS.Filter = "フィールド = '*'" でも RS.Filter = "フィールド = 'Null''" でも、文字列になってしまい、うまくいきません。 RS.Filter = "フィールド " <> 'Null' だとエラーになります。 「<>null」を抽出する方法をご教授願います。
- ベストアンサー
- オフィス系ソフト
- ランダムでデータ取得したい
こんばんは。 初歩的なことなんですがどうしても解決できないので書き込みしました。 VBScriptで検索結果をランダムで取得し、 表示するプログラムを作成してみたんですが うまく動作しません。 以下がソースです。 SQL = "" SQL = SQL & "select NAME" & vbCrlf SQL = SQL & " from TBL" & vbCrlf '実行 Set rs = conn.Execute(SQL) 'レコードカウント取得~検索結果14件 rsCnt = rs.RecordCount 'ここで変数を最大値で設定できないのでしょうか? 'ためしに実数(今回は14)を挿入すると動作しました。 '理想はrs.RecordCountで配列指定したいのですができないです。 'これをするとrs.RecordCountに-1が返ってきてエラーが出ます。 ReDim strName(rsCnt) '1から14の配列を取得する intIdx=1 Do until rs.Eof strName(intIdx)=rs("NAME") intIdx=intIdx+1 rs.MoveNext Loop 'データ表示 For intCnt = 1 to rsCnt 'この中でRnd関数を使ってみました。 '配列で実数を使用した場合、ここまで来るのですが 'その結果をランダムで表示したかったので 'RandomizeとRnd関数を使用しましたが '重複データが出てきてしまいます。 ' Randomize index=Rnd*rsCnt+1 以上なんですが解決方法があれば 是非ご指導お願いします。 Takeshi Takahashi 2002/02/06
- ベストアンサー
- Microsoft ASP
- アクセスのADO
アクセスのADOで ウォッチ式にrsを登録してみていると rs.CursorLocation = adUseClient rs.Open "テーブル1", cn, adOpenStatic, adLockOptimistic を通過後は、 RecordCountには、20と数字が入るのですが、 rs.CursorLocation = adUseClient rs.Open "テーブル2", cn, adOpenStatic, adLockOptimistic にすると RecordCount : <データ プロバイダーまたはほかのサービスが E_FAIL 状態を返しました。> となってしまいます。 テーブルの中身が原因だと思うのですが どういう条件なら、 <データ プロバイダーまたはほかのサービスが E_FAIL 状態を返しました。> になるのでしょうか? rs.CursorLocation = adUseClient を使う理由は、 rs.Sort = "日付 DESC" とソートする為です。 参照設定はMicrosoft Activex Data Objects 2.8 Library にしています。 Access2010・32bitです。
- ベストアンサー
- オフィス系ソフト
- WHERE句だと抽出できない VBA ADO
アクセスのADOについて質問があります。 SQL文の中でWHERE句を使ってフィルタをすると返り値が0件になるのに、 rs.Open strSQLした後に、 rs.Filterで抽出すると、適切な数値が返ります。 具体的に言うと 【1】 strSQL = "SELECT T_会社名.*, T_会社名.住所 FROM T_会社名 WHERE (((T_会社名.住所) Like ""*埼玉*""));" rs.Open strSQL, cn, adOpenKeyset, adLockOptimistic i = rs.RecordCount 【2】 strSQL = "SELECT T_会社名.*, T_会社名.住所 FROM T_会社名;" rs.Open strSQL, cn, adOpenKeyset, adLockOptimistic rs.Filter = "T_会社名.住所 like '%埼玉%'" i = rs.RecordCount だと、【2】が、適切な数値が返ります。 なぜ【1】はダメなのでしょうか?
- 締切済み
- オフィス系ソフト
- アクセスでADO 並べ替えが適用できない
アクセスでADOを使っているのですが、 Sub test() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Set cn = CurrentProject.Connection rs.CursorLocation = adUseClient rs.Open "SELECT * FROM Q1", cn, adOpenStatic, adLockPessimistic rs.Sort = "受付日 DESC" For i = 1 To rs.RecordCount ・ ・ ・ このようなコードを作っていますが、 rs.Sortの部分で、「並べ替えを適用できません」になります。 レコード数は、15000件くらいです。 なぜ並べ替えができないのでしょうか? しょうがないからクエリで最初から並べ替えしておきますが、原因を教えてください。
- ベストアンサー
- Visual Basic
- Access2003(VBA)でADO接続時にルーターのセッション増加
早速質問させていただきます。 WindowsXP上のAccess2003でDBServer(SQLSERVER2005Express)にADO接続でデータ要求を行うアプリを開発しました。 このアプリをDBServerがあるネットワークセグメント以外から実行するとルータのセッション数が見る見るうちに増加してルーターがハングアップしてしまいます。 調査してみたらADOのRecoredsetをMovenextする度にセッション数が増えるようです。そもそもADO接続では毎レコード毎?にセッションを張るような仕組みなのでしょうか? またこの現象を解消するにはどのような手法があるのでしょうか? ご教授のほどよろしくお願い致します。 -------------------------------------------------------------- Dim adoCON As New ADODB.Connection Dim adoRS As ADODB.Recordset '(1)ADOを使いSQL ServerのDBを開きます adoCON.Open "Driver={SQL Server};" & _ "server=SERVERNAME\SQLEXPRESS; database=db_name; uid=sa; pwd=sa;" 'レコードセットの作成(SELECT文の実行) Set adoRS = adoCON.Execute("select * from 商品マスタ where 削除日=0") '//CSVデータ取り込み用配列の初期化 Erase arr() LineCount = 0 TblColCnt = 0 '最終レコードまで順読み込みを行う Do Until adoRS.EOF = True ReDim Preserve arr(ShouhinMSTMaxCol, LineCount) For cols = 1 To adoRS.Fields.Count - 1 TblColCnt = TblColCnt + 1 arr(TblColCnt, LineCount) = Trim$(adoRS(cols - 1)) Next LineCount = LineCount + 1 TblColCnt = 0 'レコードの順読み adoRS.MoveNext Loop 'レコードセットのクローズ adoRS.Close 'データベースのクローズ adoCON.Close 'オブジェクト変数のクリア Set adoRS = Nothing Set adoCON = Nothing --------------------------------------------------------------
- 締切済み
- Visual Basic
- VC++ (ADO) で Access の Yes/No 型の Select 文
http://www.alpha-net.ne.jp/users2/uk413/vc/VCT_ADO.html を参考にして VC++ 2005 .NET (ADO 接続)にて Access を操作しています。 Select 文にて Access の Yes/No 型を判定したいのですが、WHERE 句を どのように書けばよいのかわかりません。 WHERE field_name = Yes (または 'Yes', 1 など) で書いてみているのですがうまくいきません。 どのように記述すればよいのかご存知の方がいらっしゃいましたらご教示 願えないでしょうか。 よろしくお願いいたします。
- ベストアンサー
- C・C++・C#
- アクセスADO 複数のレコードがあるのに-1が返る
アクセスのADOを作っています。 テーブルにレコードは複数あるのですが、Filterをすると必ず-1が返ります。 どうしてでしょうか? エラーになってるのでしょうか? ---------------------------------------------------- Set cn = CurrentProject.Connection myStr = "test" rs.Open "Tテーブル", cn, adOpenForwardOnly, adLockReadOnly rs.Filter = ("フィールド1=" & "'" & myStr & "'") MsgBox rs.RecordCount ’マイナス-1になる rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing ---------------------------------------------------- rs.Open の下に、MsgBox rs.RecordCountを置いても、-1になることから、Filter のせいではないと思うのですが 原因がわかりません。 ご教授よろしくお願いします。
- ベストアンサー
- オフィス系ソフト
- ADOで現在のレコードの次のレコードの値も取得
ADOで現在のレコードの次のレコードの値も取得するには? アクセスに対してADOでデータを取得しているのですが 例えばテーブルに フィールド1 あああ いいい ううう と入ってる時に、1レコード目のあああの値を取得しているときに、同時に次のレコードのいいいの値も取得することは可能ですか? Sub Sample() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Set cn = CurrentProject.Connection rs.Open "SELECT * FROM テーブル1", cn, adOpenStatic, adLockPessimistic For i = 1 To rs.RecordCount MsgBox rs("フィールド1") '現在のレコード MsgBox rs("フィールド1") + 1 '次のレコード rs.MoveNext Next rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub これだとダメなようです。 あああ いいい が表示されるようにしたいのですが、どうすればいいか教えてください。
- ベストアンサー
- オフィス系ソフト
お礼
ご返答ありがとうございます。 やはり、変数を用いてカウントを取らないといけないのでしょうか?