Accessの非連結フォームを作成する方法についてご紹介します。
非連結フォームはデータベースのテーブルと直接関連付けられず、独自の表示と操作を行う事ができます。
要するに、フォームの入力項目を自由に入力させ、
更新ボタンをクリックしたイベントとして更新処理をVBAで記載することで
入力チェックを行ったり、関連テーブルへ同時に更新したりすることができます。
1. 非連結フォームを作成する
2. 更新ボタンクリック時のVBA処理
フォームを作成
(1)作成>フォームデザイン を選択
(2)ラベル、テキスト、ボタンを配置します
背景緑の項目はラベルです
Noのテキストの名前は「txtNo」
得意先名のテキストの名前は「txt得意先名」
得意先名略のテキストの名前は「txt得意先名略」
得意先名担当者のテキストの名前は「txt得意先担当者」
ACCESS VBA
更新と登録は1つのフォームで行うので起動時にモードを取得し
更新モードの場合は、キーを取得し(strCode)このキーを元にデータ検索します。
データが取れないということは既に他の人に削除されたデータなので
エラーとなり画面は表示されません。
'*************************** ' 画面起動時 '*************************** Private Sub Form_Open(Cancel As Integer) Dim strCode As String On Error GoTo Error ' 起動時のモード判定 If IsNull(OpenArgs) Then ' 新規モード msMode = MODE_INS Else ' 更新モード strCode = Me.OpenArgs Me.AllowAdditions = False Me.NavigationButtons = False msMode = MODE_UPD End If ' 画面サイズ初期化 Call subReSize ' 画面初期化処理(コントロールの初期化) Call subInitialize If msMode = MODE_INS Then '-------------- ' 新規モード '-------------- Else '-------------- ' 編集モード '-------------- ' 得意先マスタ取得 If funGetTokuisaki(strCode) = False Then MsgBox "選択されたデータは既に削除されています。" & Chr$(10), vbExclamation, C_MSG_TITLE Cancel = True End If End If Me.txt得意先名.SetFocus Exit Sub Error: MsgBox "エラーが発生しました。エラー内容:" & Err.Description & Chr$(10), vbCritical, C_MSG_TITLE End Sub
更新ボタン押下時に行うのは
1. 入力チェック
2. モード判定による処理分岐
登録モードの場合、登録処理
更新モードの場合、更新処理
3. 処理が終了したら画面を閉じて前の一覧画面を再表示する
'*************************** ' 更新ボタン '*************************** Private Sub cmd更新_Click() Dim sMsg As String '================= ' 入力チェック '================= If funCheckInput = False Then Exit Sub End If If msMode = MODE_INS Or mintId = 0 Then '================= ' 登録処理 '================= If funTokuisaki_Insert() = True Then MsgBox "登録処理が正常に終了しました。", vbInformation + vbOKOnly, C_MSG_TITLE ' 一覧再表示 Call Form_F_M得意先マスタ一覧.cmd検索_Click Call cmd終了_Click End If Else sMsg = "更新します。よろしいですか?" If MsgBox(sMsg, vbInformation + vbYesNo + vbDefaultButton2, C_MSG_TITLE) = vbNo Then Exit Sub End If '================= ' 更新処理 '================= If funTokuisaki_Update() = True Then MsgBox "更新処理が正常に終了しました。", vbInformation + vbOKOnly, C_MSG_TITLE ' 一覧再表示 Call Form_F_M得意先マスタ一覧.cmd検索_Click Call cmd終了_Click End If End If End Sub
更新処理関数は下記のようなイメージになります。
トランザクションの記載についての説明はまた機会がありましたらしたいと思いますが
更新系はトランザクションを使用した方が良いと思います。
ここでADOを使用しているのは外部のDBへの接続の際にも比較的改修少なく済むので
DAOで更新処理を書いていくよりADOを使う方が良いと思います。
Rem ---------------------------------------------------------------------------------- Rem 関数名 : funTokuisaki_Update Rem 処理内容 : 得意先マスタの更新を行う Rem 引 数 : なし Rem 戻り値 : true(正常)/false(異常) Rem ---------------------------------------------------------------------------------- Private Function funTokuisaki_Update() As Boolean Dim objCon As New ADODB.Connection Dim objCmd As New ADODB.Command Dim strSql As String On Error GoTo EXCEPTION funTokuisaki_Update = False Application.Echo False DoCmd.Hourglass True ' データベースを開く Set objCon = CurrentProject.Connection objCmd.ActiveConnection = objCon ' トランザクション開始 objCon.BeginTrans ' SQL生成 strSql = "UPDATE m_tokuisaki SET" strSql = strSql & " tokuisaki_name ='" & Nz(Me.txt得意先名.Value) & "'" strSql = strSql & " ,tokuisaki_short_name ='" & Nz(Me.txt得意先名略.Value) & "'" strSql = strSql & " ,tokuisaki_tanto_name ='" & Nz(Me.txt得意先担当者.Value) & "'" strSql = strSql & " ,upd_dt =Now()" strSql = strSql & " WHERE tokuisaki_id =" & mintId & "" objCmd.CommandText = strSql ' SQL実行 objCmd.Execute ' コミット objCon.CommitTrans ' 後処理 objCon.Close: Set objCon = Nothing funTokuisaki_Update = True Application.Echo True DoCmd.Hourglass False Exit Function EXCEPTION: Application.Echo True DoCmd.Hourglass False MsgBox "エラーが発生しました。エラー内容:" & Err.Description & Chr$(10), vbCritical, C_MSG_TITLE On Error Resume Next ' ロールバック objCon.RollbackTrans ' 後処理 objCon.Close: Set objCon = Nothing End Function
動作確認
(1)一覧画面
編集ボタンを押下
編集ボタン押下時は、その行のキー(strCode)を入力画面に引き渡します。
'*************************** ' 編集ボタン '*************************** Private Sub cmd編集_Click() Dim strCode As String If Nz(Me.txtID_明細.Value) = "" Then Exit Sub strCode = Me.txtID_明細.Value Me.Refresh DoCmd.OpenForm "F_M得意先マスタ入力", acNormal, , , , acDialog, strCode End Sub
(2)更新画面(初期表示)
更新モードで表示
(3)更新画面(データを修正)
(4)更新画面(更新ボタン押下)
確認メッセージが表示されますので「はい」を押下
(5)一覧画面再表示
更新画面が閉じられて一覧画面が再表示されます
コメント