見出し画像

VBAは怖くない!(SQLとレコードセット)

第1章では、データベースの作成とAccessとの接続を説明しました。この章は、いよいよAccessで画面を作成していきますが、やはり壁はVBAになりますね。VBAと聞くと、「自分に出来るかなぁ~?」「難しそうだな…」という概念があるとどうしても毛嫌いしてしまいます。でも、VBAは構文を一度覚えてしまえば他の画面に適応できますので少しずつ覚えていけば決して難しいものではありません。

SQLって?レコードセットって?

テーブルから、ある条件を元に抽出したり、更新したり削除したりする命令を記述します。例えば、ログイン画面を想像してみてください。ログインする人は複数行存在し、IDとパスワードを入力しログインボタンをクリックするとシステムを使えるというイメージになります。

画像1

例えば、上記構文を見ることにしましょう。MST_ログインからログインコードが001の人だけを抽出し、レコード(行)セット(塊)という箱に入れるという処理になります。取得したレコードセットは画面に表示したり他のテーブルに追加したりといろいろなことができますので覚えておいてください。

Select…項目を選ぶという意味になります。「*」は全行を取得します。Selectログイン名 Fromという構文であれば、「ログイン名」のみ取得を行います。

From…どのテーブルからという意味になります。

Where…どの条件で抽出するかという意味になります。

画像2

​こちらの例を見てみましょう。商品区分がシャンプーのみの行を取得する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

今回も最後まで読んで頂きましてありがとうございます。

いいなと思ったら応援しよう!