Microsoft Accessで構築した業務アプリケーションの運用において、アプリケーションのバージョンアップ版の配布、データや業務ロジックの共有化をどのように行うか、弊社で採用している方法を紹介します。
これは、ほぼ皆さんも採用されているのではないかと思います。
データとアプリケーションのaccdbを分離して、アプリケーションaccdbではリンクテーブルとしてデータaccdb内のテーブルを参照するようにします。
Microsoft Accessデータ共有データaccdbは、さらにマスターとデータをaccdbレベルで分離しています。
また、データaccdbもデータの属性等により、さらにaccdbレベルで分離しています。
データaccdbは共有されるため、必然的に社内共有ファイルサーバーに配置されることになります。
業務ロジックの共有化は、共有するロジック(関数)をライブラリaccdbに作成して、アプリケーションaccdbからは『参照設定』でライブラリaccdbを参照して行います。
Microsoft Access業務ロジック共有アプリケーションaccdbから『参照設定』でライブラリaccdbを参照します。
ライブラリaccdbのプロジェクト名.関数名(図では Library.BusinessYear())で関数を呼び出します。
ライブラリaccdbは共有されますので、社内共有ファイルサーバーに配置させたくなるのですが、後述するアプリケーションの配布の仕組みで、個人のローカルディレクトリに配置されます。
詳細は、アプリケーションの配布を参照してください。
バージョンアップされたアプリケーションを効率よく配布したり、共有されているライブラリaccdbをロック(使用中)であることを気にすることなく改修したりするため、弊社ではランチャー方式によるアプリケーション起動を採用しています。
Microsoft Accessアプリケーション配布
①ユーザーがランチャーアプリケーションを起動します
②ランチャーアプリケーションがライブラリaccdbをローカル環境にコピーします
③ランチャーアプリケーションがアプリケーションaccdbをローカル環境にコピーします
④ランチャーアプリケーションがローカル環境のアプリケーションaccdbを起動します
アプリケーションaccdbはローカル環境のライブラリaccdbを参照設定するようにしておきます。
共有ファイルサーバーにテスト済のアプリケーションやライブラリを配置しておけば、ランチャー方式により、ユーザーは最新のアプリケーションやライブラリを使用して業務を行うことができます。
ローカル環境のアプリケーションを起動する際に/CMDスイッチにより、実行する際に必要なパラメーターを与えていますので、ランチャーアプリケーションを切り替えることにより、管理者モードで起動したりすることも可能です。
ランチャーアプリケーションのサンプルは下記になります。
ランチャーアプリケーションとアプリケーションのファイル名は同じにしておきます。
共有ファイルサーバーはX:にマウントされ、AccessのアプリケーションはX:\AccessApplicationに配置されているものとします。
ローカル環境はC:\AccessApplicationフォルダーを作成し、Accessのオプション➡セキュリティセンター➡信頼できる場所に登録しておきます。
Option Compare Database
Option Explicit
Private Const PUB_BASE_DIR As String = "X:\AccessApplication"
Private Const PUB_APP_DIR As String = PUB_BASE_DIR & "\System"
Private Const PUB_LIB_DIR As String = PUB_BASE_DIR & "\Lib"
Private Const LOCAL_BASE_DIR As String = "C:\AccessApplication"
Private Const LOCAL_APP_DIR As String = LOCAL_BASE_DIR & "\System"
Private Const LOCAL_LIB_DIR As String = LOCAL_BASE_DIR & "\Lib"
Public Function AutoExec()
Dim strPubLibFile As String
Dim strPubAppFile As String
Dim strExeLibFile As String
Dim strExeAppFile As String
With CreateObject("Scripting.FileSystemObject")
' ローカル環境内のライブラリフォルダが存在しなければ作成します
If .FolderExists(LOCAL_APP_DIR) = False Then .CreateFolder LOCAL_APP_DIR
If .FolderExists(LOCAL_LIB_DIR) = False Then .CreateFolder LOCAL_LIB_DIR
' ライブラリaccdbをローカル環境へコピーします
strPubLibFile = PUB_LIB_DIR & "\Library.accdb"
strExeLibFile = LOCAL_LIB_DIR & "\Library.accdb"
If .FileExists(strExeLibFile) Then .DeleteFile strExeLibFile
.CopyFile strPubLibFile , strExeLibFile
' アプリケーションをローカル環境へコピーします
strPubAppFile = PUB_APP_DIR & "\" & CurrentProject.Name
strExeAppFile = LOCAL_APP_DIR & "\" & CurrentProject.Name
If .FileExists(strExeAppFile) Then .DeleteFile strExeAppFile
.CopyFile strPubAppFile , strExeAppFile
End With
' アプリケーションを起動します
Shell Application.SysCmd(acSysCmdAccessDir) & "MSACCESS.EXE" _
& " " & strExeAppFile & " /cmd" & CurrentProject.Path
End Function