VBAは怖くない!(SQLとレコードセット)
第1章では、データベースの作成とAccessとの接続を説明しました。この章は、いよいよAccessで画面を作成していきますが、やはり壁はVBAになりますね。VBAと聞くと、「自分に出来るかなぁ~?」「難しそうだな…」という概念があるとどうしても毛嫌いしてしまいます。でも、VBAは構文を一度覚えてしまえば他の画面に適応できますので少しずつ覚えていけば決して難しいものではありません。
SQLって?レコードセットって?
テーブルから、ある条件を元に抽出したり、更新したり削除したりする命令を記述します。例えば、ログイン画面を想像してみてください。ログインする人は複数行存在し、IDとパスワードを入力しログインボタンをクリックするとシステムを使えるというイメージになります。
例えば、上記構文を見ることにしましょう。MST_ログインからログインコードが001の人だけを抽出し、レコード(行)セット(塊)という箱に入れるという処理になります。取得したレコードセットは画面に表示したり他のテーブルに追加したりといろいろなことができますので覚えておいてください。
Select…項目を選ぶという意味になります。「*」は全行を取得します。Selectログイン名 Fromという構文であれば、「ログイン名」のみ取得を行います。
From…どのテーブルからという意味になります。
Where…どの条件で抽出するかという意味になります。
こちらの例を見てみましょう。商品区分がシャンプーのみの行を取得するSQL文となります。よってレコードセットには2行の商品情報が格納されます。
レコードセット(一番初め)…商品コード001(サラサラシャンプー)
レコードセット(一番最後)…商品コード002(白髪染めシャンプー)
箱の中でレコードセットは1行1行値を参照したり格納したりすることができます。
基本的な操作の流れ
例えば、ログインボタンをクリックした時のプログラムは下記のようになります。
Private Sub btn_login_Click()
'レコードセット/コネクション/SQL文を宣言する
Dim cn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Dim q As String
'ログインコード・ログインパスワードの入力チェックを行う
If IsNull(Me.txt_ログインコード) = True Or Len(Me.txt_ログインコード) = 0 Then
MsgBox "ログインIDを入力してください。", vbOKOnly + vbCritical, ""
Me.txt_ログインコード.SetFocus
Exit Sub
End If
If IsNull(Me.txt_ログインパスワード) = True Or Len(Me.txt_ログインパスワード) = 0 Then
MsgBox "パスワードを入力してください。", vbOKOnly + vbCritical, ""
Me.txt_ログインパスワード.SetFocus
Exit Sub
End If
On Error GoTo LBL_ERROR
Set cn = CurrentProject.Connection
cn.BeginTrans
'レコードセットを取得する
q = ""
q = q & "SELECT * FROM MST_ログイン "
q = q & "WHERE ログインコード = '" & Me.txt_ログインコード & "';"
rs.Open _
Source:=q, _
ActiveConnection:=cn, _
CursorType:=adOpenStatic, _
LockType:=adLockReadOnly
If rs.EOF = True Or rs.BOF = True Then
MsgBox "ログインID/パスワードが一致しません。", vbOKOnly + vbCritical, ""
rs.Close
GoTo LBL_EXIT:
Else
q = ""
q = q & "delete from tmp_mst_ログイン;"
cn.Execute (q)
q = ""
q = q & "INSERT INTO TMP_MST_ログイン ( ログインコード, ログイン名, 権限フラグ ) "
q = q & "SELECT ログインコード, ログイン名, 権限フラグ FROM mst_ログイン "
q = q & "WHERE ログインコード = '" & Me.txt_ログインコード & "';"
cn.Execute (q)
rs.Close
End If
cn.CommitTrans
DoCmd.OpenForm "F_メインメニュー"
LBL_EXIT:
If Not rs Is Nothing Then Set rs = Nothing
If Not cn Is Nothing Then Set cn = Nothing
Exit Sub
LBL_ERROR:
cn.RollbackTrans
MsgBox Err.Description, vbCritical
Resume LBL_EXIT
End Sub
↑何か謎のプログラムコードですよね。これだけでも怖くなってしまいます。難しい英語が並んでいるので一気に「あ、難しい!」という気分になってしまいますね。でも、基本的には下記の流れになります。
次回は、これもまたあまりAccessの書籍では知られていない「複数のPCで運用した場合」のトランザクション処理(同時処理)についての説明をしていきたいと思います。また、エラーが起こったときにどのように制御するかというところもあわせて紹介していきたいと思います。「on error」についてはあまりAccessの書籍では掲載されていないような気がします。
おすすめ書籍のご紹介
もちろん、SQLは上記の限りではなく、データベース設計も含めてかなりの種類があります。下記書類がかなり参考になりますので、良かったら読んでみてくださいね!
www.amazon.co.jp/dp/4798157821
今回も最後まで読んで頂きましてありがとうございます。