ADOを使ったデータベース操作
ここでは、読み取り専用でデータベースへ接続し、テーブルを参照していきます。
レコードの移動は、MoveFirst、MoveNextメソッドを使用します。
テーブル中のレコードの先頭、終了は、BOF、EOFプロパティで判断します。
では、簡単なプロシージャを作ってみて雰囲気をつかんでいきましょう。
例えばこういうテーブルがあります。「テーブル」という名前でレコードは7件です。
このテーブルの中のレコード件数を数えるというプロシージャを作ってみます。
データベースウィンドウの「モジュール」を新規作成して下さい。
VisualBasicのエディタが現れます。
ここにコードを書くというところは、プライベートプロシージャと同じです。
左のツールボタンの
をクリックして「プロシージャ」を選ぶとプロシージャの追加ダイアログが出てきます。
適当な名前を付けてください。
するとこう書かれていますよね。
プライベートプロシージャの時と同じで、「BEという名前のプロシージャですよ」ということです。
ただ先頭が「Private」でなく、「Public」ですね。
これは「Publicプロシージャ」といって、このデータベースの中ならどこでも自由に使うことが出来るプロシージャです。
では実際に書いていきましょう。
まず最初に「どのデータベースの、どのオブジェクトを、何のつもりで使うか」と書かなければいけません。
データそのもののことを「レコードセット」と呼びますが、まずレコードセットをテーブルやクエリから取り出して並べてみます。
そしてそのレコードセットを書き換えたり削除したりしてもいい状態で開くのか、読み取りだけなのかも宣言します。
なにも言わない場合は「読取専用」として扱われます。今回はレコードの件数を数えるだけなのでそのままにします。
「レコードセットを開く」という記述は
Dim 変数名 as New ADODB.Recordset
と書くとのことです。
さて、「変数」とはなんでしょう?
本来、どこのデータベースの何という名前のテーブルの・・・ということを長々と書かなければならないのですが
それは面倒なので、代わりの短い名前をつけて、そのプロシージャで使うことができるのです。
たとえば
Dim being as New ADODB.Recordset
と書いたら、「being」という名前の変数を使わせてください、このプロシージャ内で利用する
レコードセットを入れる器として使います、という意味になります。変数はプログラミングを扱う場面でよく使用されるので、覚えておきましょう。
Dim
とは、変数そのものと変数の種類を書き表すときに使う構文です。
適用されるのはその行の下からなので、始めに書くことが多いです
ちなみに、この記述を「オブジェクト変数の宣言」といいます。
その後ろの
New ADODB.Recordset
は「ADODBコンポーネントのRecordsetオブジェクトを使用する」という
意味です。
次に、変数「being」の中身がなんなのかも書きます。
being.Open "テーブル", CurrentProject.Connection
これで、「being」と言ったら、このプロシージャの中では「テーブル」というテーブルの中身のことになります。
他の単語についての説明は後にするとしてとりあえず書いてみてください。
さて、どうやってレコード件数を数えましょうか。
私たちが数を数えるときも上から順番に、1,2,3・・・と数えますがVBAも同じなんです。
まず数えた数を入れておく器(変数)を用意します。
テーブルの中の一件目に到着したら、器に1を足します。
次のレコードに移ります。
そしてまた器に1を足します。
これをテーブルの中の最後になるまで繰り返します。
この処理が終わった結果の器の中の数がレコードの件数になるわけです。
繰り返し処理は、「Loop」を使いましょう。
「テーブルの最後になるまで繰り返せ」という命令にしたいので、「Do Until」としてみましょうか。
Do Until ★★
処理
Loop
これで、★★になるまで処理を繰り返せ、という意味になります。
きちんと処理が抜けるように作らないと永久ループになってしまうので気をつけましょう。
では、
「テーブルの最後」
「次のレコードに移動」
「器」
「器に1を足す」
この4つの処理をVBAで具体的に書いてみましょう。
「テーブルの最後」→
being.EOF
「次のレコードに移動」→
being.Move.Next
「器」→適当な変数を作りましょう。ここでは「
Cup
」とします。
「器に1を足す」→
Cup = Cup + 1
で、こうなりました。
これで、変数Cupの中には、このテーブルの件数が入っているはずです。
とりあえずメッセージボックスに出してみましょう。
今回は処理の中身を理解するために書いているのですが、
レコード件数をカウントするという処理は、もちろんDcount関数などでもっと簡単にできます。
でも、VBAのコードを書くということの雰囲気はつかめたでしょうか。
ちなみにメニューバーの「デバック」→「コンパイル」をすると細かいつづりの間違いを教えてくれます。
では、このプロシージャが正しく動くかテストしましょう。
メニューバーの「表示」から「イミディエイトウィンドウ」を選んでください。
そして今作ったプロシージャの名前をそのまま入力します。
できました!
ではとりあえずOKを押してメッセージボックスを消して、エディタに戻りましょう。
でもメッセージボックスよりテキストボックスにしたいですよね。
ところで前回「Subプロシージャ」と「Functionプロシージャ」があるという話をしましたが、
Subプロシージャは順番に処理を行うだけのプロシージャで、Functionプロシージャは値を返す「関数」でしたね。
ということで、SubプロシージャからFunctionプロシージャに書き換えてみました。
一行目をかきかえると、自動的に最終行も変わりましたね?
では、メッセージボックスのところも「MsgBox Cup」の変わりに書き換えましょう。
このプロシージャ名そのものに、カウントした結果を代入します。
Functionプロシージャの場合はイミディエイトウィンドウの書き方も少し変わります。
「ここに答えをだせ」という書き方ができるのです。
でました。
適当な名前をつけて保存してください。
モジュールというのはプロシージャを入れておく入れ物みたいなもので、モジュール名を直接使うことはありません。
ではフォームで使ってみましょう。
適当なテキストボックスを一つ作ってデータのコントロールソース欄に
=BE()
と入力します。
フォームビューで見てみると・・・。
件数のカウント結果がでていますね。
では少し応用して、「郵便料金表」のようなものを作ってみましょう。
ちなみにこれは定形外のデータです。
両方とも数値型フィールドのテーブルです。
そして次のようなプロシージャを作ります。
ではコンパイルしてイミディエイトウィンドウでテストしてみましょう。
カッコの中に調べたい郵便物の重さを入力します。
すると・・・。
というように、いつでも答えを求めることができます。
それ以外でも、下のようなテーブルがあったとします。
みんなが「送りたい」と思っている郵便物の重さをあらかじめテーブルに入力し、下のようなクエリを作ります。
3番目のグリッドに 「BE_ryokin(調べたい重さが入力されているフィールド名)を入力します。
カギカッコで囲むとなおいいです。
「何グラム?」に入れた数値がプロシージャで処理されて
答えがそれぞれ返ってますね。
でもなぜか文字扱いですね。
一応これを直してみましょうか。
一行目の型、Variant(万能型) を Long(長整数型) に変えてみました。
さてどうでしょう。
さっきのクエリをもう一度開きなおしてみると、ちゃんと直ってますね。
さて、実際にテーブルを扱うプロシージャはいかがでしたでしょうか。
今回は「読取専用」だったのでテーブルの中にデータを書き込んだりという処理について考えませんでしたが覚えることはいっぱいあるので少しずつ慣れていきましょう。
ところでAccess97ではDAOを見ながらプロシージャは働いていました。
では、DAOのために書かれたプロシージャはもう使えないのでしょうか?
VisualBasicエディタのウィンドウの「ツール」→「参照設定」を見てください。
この一覧がそのPCで扱うことの出来るライブラリの一覧で、他のソフトウェアで使っている関数などをここでも使わせてほしいという設定をする画面です。
ただ、機能そのものが使えるようになるわけではないので注意して下さい。
下のほうにあるDAOの左側にチェックをつけ、ADOより上に優先順位をあげれば、97で作成したDAOを使ったプロシージャも動くようになります。
プライベートプロシージャや、テーブルやクエリを扱わないプロシージャは関係ないと思いますが97で作ったデータベース内のプロシージャを一つ一つ確認してみないとこの設定が必要かどうかわからないので注意して下さい。
とりあえずADOの説明はここまでにします。わかりましたか?
ADOXを使ったデータベース操作>>
Access TOPページへ
(C)1999-2003 BE CORPORATION All rights reserved.Terms of Use. Privacy Policy.