非連結のフォームを使おう。連結フォーム?そりゃ使っちゃだめだよ。

MSACCESS_eyecatch
SBMJOB

ユーザー用の画面は非連結フォームで作りましょう。理由は予期せぬ更新を排除できる点、エラーチェック・更新処理が明示的に組み込める点等々、連結フォームよりも利点が多いです。更新タイミング等コントロールが明確になります。簡単なサンプルを用いて説明します。

目次

スポンサーリンク

非連結フォーム VS 連結フォーム

連結フォームはウィザードでも作りやすく、あっという間にテーブルへのレコード追加・更新機能を作成できますが、レコードが連結されているだけに機能追加に制限がでてきます。

非連結フォームはテキストボックス等のコントロールに名称をつけなければいけなかったり手間はかかりますが細かく設定できる分機能を追加しやすいです。

また、連結フォームでは予期しない更新やレコードの追加等々発生しやすく、ユーザーの使用よりも開発時に臨時に使う用途にはうってつけでしょう。(予期しない更新等は監査で問題にもなり得ます)

連結フォーム :開発用レコードメンテナンス用

非連結フォーム:ユーザー向け

実装例:商品マスターメンテナンス 概要

実装例商品マスターメンテナンスTOP

商品マスターの全レコードを一括表示する画面です、左の「変更」ボタンを押すと変更用の画面が表示されます。(この一括表示画面は帳票連結フォームになっています、実務では非連結のサブフォームにすると良いでしょう)

実装例商品マスターメンテナンス詳細

一括表示画面の「変更」ボタン押下時に対象レコードの商品コードを引数にして起動した詳細画面です。フォームロード時にADOで商品マスターから該当レコードを1レコードSQLでもってきて画面にセットしています。また各項目変更した内容で「更新」ボタンを押すと商品マスターをUPDATEするようになっています。

実装例関連図1

起点となるメンテナンス画面Topに商品マスターから全レコードを読み込んで画面にセットします。「変更」ボタン押下で引数:商品コードを渡してメンテナンス詳細画面を受け取り引数:商品コードでSQLで該当レコードを商品マスターから読込み画面の各テキストボックスにセットします。テキストボックスの値は変更可能になっているのでその情報で「更新」ボタンでSQL発行しUPDATEします。

それでは以下からサンプルを実装してみましょう!!!

商品マスターテーブル

商品マスターテーブル設計

商品マスターテーブル名を「ProductMaster」とし以下のフィールドを追加していきます。

  • IMCODE 商品コード
  • IMDISC 商品名
  • IMCAT1 カテゴリー1
  • IMCAT2 カテゴリー2
  • IMCAT3 カテゴリー3
  • IMPRIC 金額

サンプルなのでユニークキーは不要でしょう。実際にはテーブル設計時にやっておきましょう。

メンテナンス画面TOP

メンテナンス画面Top設計

F_PM_Mente_Topでメンテナンス画面Topを作成します。フォームウィザードで商品マスターを元に帳票レイアウトで作成して各コントロールの位置調整をしましょう。

この画面ではレコードの読込みだけなので、追加の許可・削除の許可・更新の許可はすべて「いいえ」にします。(ま、これ連結フォームなんですけどねw手抜きしちゃいました。)

「変更」ボタンはbtn_changeで作成します。

実務ではサブフォーム等を使って作成してみてください。

「変更」ボタンイベント

「変更」ボタンに「クリック時イベント」を設定し次のコードを書きます。

Private Sub btn_change_Click()
    DoCmd.OpenForm "F_PM_Detail", acNormal, , , , , CStr(Me.txt_IMCODE.Value)
End Sub

このプロシージャでは、ボタンクリックでF_PM_Detailを開き、引数でtxt_IMCODE 商品コードを渡します。

非連結フォーム:更新画面

更新画面設計

F_PM_Detailで更新画面を作成します。
テキストボックスは上から順に下の様に名前をセットしておきましょう。

  • txt_IMCODE
  • txt_imdisc
  • txt_imcat1
  • txt_imcat2
  • txt_imcat3
  • txt_imprice

ADO参照設定

「Microsoft ActiveX Data Object 6.1」をVBEのツール→参照設定から探してチェックマークをつけて追加しておいてください。

読込み時イベント

Private Sub Form_Load()
     
    Dim myCn     As ADODB.Connection    'ADOコネクションオブジェクト
    Dim myRs     As ADODB.Recordset     'ADOレコードセットオブジェクト
    Dim strSQL   As String              'SQL文用文字列
    
 
    '現在のデータベースへ接続
    Set myCn = CurrentProject.Connection
    
    'ADOレコードセットのインスタンス作成
    Set myRs = New ADODB.Recordset
    
    'SQL文作成
    strSQL = "SELECT ProductMaster.ID, ProductMaster.IMCODE, ProductMaster.IMDISC, ProductMaster.IMCAT1, ProductMaster.IMCAT2, ProductMaster.IMCAT3, ProductMaster.IMPRIC"
    strSQL = strSQL + " FROM ProductMaster"
    strSQL = strSQL + " WHERE (((ProductMaster.IMCODE)= '" & OpenArgs & "'"
    strSQL = strSQL + "));"
    
    'レコードセット取得
    myRs.Open strSQL, myCn, , adLockOptimistic
    
    Me.txt_IMCODE = myRs.Fields("IMCODE")
    Me.txt_imdisc = myRs.Fields("IMDISC")
    Me.txt_imcat1 = myRs.Fields("IMCAT1")
    Me.txt_imcat2 = myRs.Fields("IMCAT2")
    Me.txt_imcat3 = myRs.Fields("IMCAT3")
    Me.txt_imprice = myRs.Fields("IMPRIC")
    
    'オブジェクトの開放
    Set myRs = Nothing: Close
    Set myCn = Nothing: Close
    
End Sub

読込みイベントにADOでSQLで受け取った商品コードでレコードを読込み書くテキストボックスに情報をセットする。

「更新」ボタンイベント設定

「更新」ボタンに「クリック時イベント」を設定し次のコードを書きます。

Private Sub btn_Update_Click()
    Dim myCn     As ADODB.Connection    'ADOコネクションオブジェクト
    Dim myRs     As ADODB.Recordset     'ADOレコードセットオブジェクト
    Dim strSQL   As String              'SQL文用文字列
    
 
    '現在のデータベースへ接続
    Set myCn = CurrentProject.Connection
    
    'ADOレコードセットのインスタンス作成
    Set myRs = New ADODB.Recordset
    
    'SQL文作成
    strSQL = "UPDATE ProductMaster"
    strSQL = strSQL + " SET ProductMaster.IMPRIC ="
    strSQL = strSQL & Me.txt_imprice & ","
    strSQL = strSQL & "ProductMaster.IMDISC ='" & Me.txt_imdisc & "'" & ","
    strSQL = strSQL & "ProductMaster.IMCAT1 ='" & Me.txt_imcat1 & "'" & ","
    strSQL = strSQL & "ProductMaster.IMCAT2 ='" & Me.txt_imcat2 & "'" & ","
    strSQL = strSQL & "ProductMaster.IMCAT3 ='" & Me.txt_imcat3 & "'"
    
    strSQL = strSQL + " WHERE (((ProductMaster.IMCODE)='" & Me.txt_IMCODE & "'));"
    
    'Update by SQL
    myCn.Execute (strSQL)
        
    'オブジェクトの開放
    Set myRs = Nothing: Close
    Set myCn = Nothing: Close
    
    'Close Form
    DoCmd.Close acForm, Me.Name
    
End Sub

ADOでテキストボックスの変更入力された内容でSQLでUPDATEしています。今回はそのままUPDATEしていますが、本来であれば各種入力チェックや例外処理等を追加する必要があります。

終わりに

非連結フォームでのADOを用いたテーブル更新の例をやってみましたがこの例に新規レコード追加や入力チェックやロールバックコミットの機能を実装すると実務にそったメンテナンス画面になると思いますが、そこは費用対効果で実装するといいでしょう。本題に戻ると連結フォームでもこの辺りの入力チェックはイベントプロパティーを駆使すればできます!がプロパティーで設定するよりもVBAのコードにわかりやすく実装していく方がメンテナンス性が高くなります。加えて更新タイミングをVBAでコントロールできている点がなにより連結フォームよりも優れていますね。

広告

↑VBAも学べるそうなので初学者のかたは無料カウンセリングどうですか?



スポンサーリンク

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

システム開発SE・アプリ開発・デバッガー等々なんでもやる猫の下僕です。現在は凶暴猫にカタカタ動く手を狙われながらキーボードを打っています。かなりゆるい性格なのでコメントやメッセージお気軽に〜お仕事のご依頼もお気軽にぃ〜

スポンサーリンク

コメント

コメントする

CAPTCHA


目次