ADOとフォーム

完全な非連結フォーム・・ADOとAccessのフォームで新規入力編

夏の最中に頭を抱えていたADOとAccessのフォームを結びつけるメソッドです。 手順はいたって簡単。まず下記のように表示したいレコードのフィールド数と見合ったテキストボックスコントロールを持ったフォームを作成します。

テキストボックスの名前を
txt0から始めて、連続番号を振ります。
txt0,txt1,txt2,txt3......って感じですね。
ラベルコントロールの方も同じです。
FormのLoad時にCaption(標題)をかえてあげればいいので
扱いやすいよう、lbl0,lbl1,lbl2.........
と名前付けをします。

Accessにはコントロール配列がありません。
でも、こうするとコントロール配列チックな扱いが出来て、 コードの記述も楽だからです。

なぜtxtの番号を0から始めるかって?
FieldsコレクションのIndex番号が0から始まるから。
それぞれのコントロールオブジェクトの番号、FieldsのIndex番号。
これらをそろえるとコードの中での扱いが驚くほど簡単になります。


Private Sub Form_Open(Cancel As Integer)
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim i As Long

Set cn = CurrentProject.Connection
Set rs = New ADODB.Recordset

cn.CursorLocation = adUseClient
rs.Open "m_ビデオ", cn, adOpenStatic, adLockOptimistic, adCmdTableDirect
Set Me.Recordset = rs

For i = 0 To rs.Fields.Count - 1
 Me.Controls("txt" & Format(i, "0")).ControlSource = rs.Fields(i).Name
 Me.Controls("lbl" & Format(i, "0")).Caption = rs.Fields(i).Name
Next

rs.Close

Set rs = Nothing
Set cn = Nothing

End Sub

出来てみるとなんともあっけない.....
For...Next文の中でテキストボックスコントロールに値をセットし、ラベルに標題をつけていますから、サブフォームコントロールのSourceObjectと同じく、Recordsetをダイナミックに変更できます。
Server側カーソルを使うときはテーブルをダイレクトに指定せず、SQL文にしてあげてください。(エラーになります)
もしくはオプション値を変えるとか。

CursorLocationがClient側なのは、フォームを使って(コードを用いずに)編集や新規入力をするためです。
こうすると選択フィルタも使えます。
もちろん普通の連結フォームで使えるメソッドは殆どOKです。これは意外な発見でした。
たいていの技術文書では「ADOでは新規入力できない」と断言していたから・・・。ね、検証してみないとわからないでしょう?
保守性を考えると議論百出といったところでしょうが、こんな便利な機能、使わない手はありません。

抽出や検索は元来Client側カーソルでするものですから問題はありません。
ローカルで使うなら、これで事足りてしまいます。
たとえば、WorkFileを1つにして、ここに全てのデータを編集するフォームをいくつか作っておいて
1つのファイルのみでローカルにある全てのファイル中のテーブルを更新するとか。
C/Sシステムのときは頭が痛いですね・・・夜中しか使えない!?

Server側カーソルを使うときは「編集確定」「新規入力確定」などなどボタンを配置してADOをぶん回す、というセオリーどおりの作りこみになってきます。書き慣れるとそんなに苦ではなくなりますし。最終的にはServer側カーソルを用いてさまざまなデータベースのRecordを編集したり更新したりするのがADOを使う目的なので、ま、それも勉強のうちだと思って頑張りましょう。

いずれにしても何をどう活かすか、ってところですね♪

AccessTipsTopへ