【ACCESS】非連結フォームを作成する方法

スポンサーリンク

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)一覧画面再表示

更新画面が閉じられて一覧画面が再表示されます

あくまでも一例であり実際は開発者によっていろいろな実装方法があります。

コメント

タイトルとURLをコピーしました