Accessは小さなデータベースで、VBAが使えることから非常に多くの現場のシステム構築として利用されてきました。しかし、デメリットとして、アップデートをした場合にそのファイルの配布方法とアップデート方法に於いては、非常にアナログな手法が用いられており、管理するのが大変面倒ということは言われ続けてきました。

最近のアプリケーションのように、オンライン経由でアップデート通知や自動ダウンロード、サイレントアップデートなどができれば、このデメリットも大きく克服ができるのではと考え、今回自分が現場のシステムで使ってるオンラインアップデート方法について公開してみたいと思います。

今回使用するファイル

仕組み

今回のこの仕組はオンラインといっても、ファイルサーバーでも良いですし、どこかのクラウド上で直リンクでダウンロードできるならば使える仕組みです。今回使用するファイルのうち

  • アップデート情報の入ったXMLファイル
  • アップデートする本体の入ったZIPファイル

の2つはオンライン上のどこかに配置しなければなりません。今回は、https://officeforest.org/update/以下にこの2つのファイルを保存してあります。

その後、実際にアップデートする場合には、以下の手順でファイルを差し替えます。

  1. XMLファイルのverの項目を最新のバージョン数値に書き換え、サーバ上のファイルを差し替える
  2. そのバージョンに該当するファイルをupdate.zipとして圧縮し、サーバ上のファイルを差し替える

配布済みのプログラムは最初に起動させるのは、start.accdb(一番最初に起動させるデータベースファイル)としプログラムであるtestdatabase.accdb(プログラム本体のファイル)は直接は起動させません。start.accdbがアップデート情報を読み取り、更新後にtest.accdbを起動する仕組みになっている為です。

※現在のプログラム本体のファイルのバージョン情報は、start.accdbのsettingテーブルに入っています。

図:Webサーバ上にファイルを配置してみた

ソースコード

XMLファイルのコード

  • verは最新バージョンのバージョン数値
  • zipは最新バージョンのファイルがある場所のURLを記述

start.accdb起動時に実行するコード

  • start.accdbは起動時にAutoexecマクロを実行するように仕込んであります。
  • また、start.accdb自体は起動時に最小化され表示されないようにしてあります。
  • Autoexecマクロを実行すると、ウィンドウは最小化され、updateexecプロシージャを実行します。
  • 本プログラムは、Microsoft Scripting RuntimeおよびMicrosoft XML v6.0を参照設定で追加しています。
  • start.accdbのsettingにあるバージョンとver.xmlに入ってるバージョン情報を比較し、後者が大きい場合にはzipファイルをダウンロードし、zipmeltで解凍しtest.accdbを上書きします。
  • アップデートがない場合には、通常どおり、testdatabase.accdbが起動します。
  • Windows APIとしてURLDownloadToFileおよびShowWindowの2つを呼び出すようDLLの呼び出しを冒頭に追加しています。
  • 通常通り起動(もしくはアップデートをキャンセル時)すると、v1.5のフォームが表示され、アップデートされた場合にはv2.0のフォームが表示されるようになっています。
  • OS標準機能でZIPを解凍してるので、この機能はWindows7以上での動作要件となります。

図:アップデータがあるとメッセージが出る仕組み

図:通常はこのフォームが表示。アプデすると中身が変わる

実行結果

実際にstart.accdbを起動してみましょう。

すると、ウェブ上のver.xmlを読み取り、バージョン比較後、アップデートの実行をするとver.xml内に記述されたファイルをダウンロード。その後ZIP解凍し、プログラム本体であるtestdatabase.accdbを起動して完了という手順になります。

アップデート実行後、start.accdbのsettingテーブルには最新のバージョンが書き込まれ、次回起動時のバージョン比較にまた利用されるようになっています。プログラム本体であるtestdatabase.accdbにアップデートルーチンを書いてしまうと、起動している為上書きができないため、このstart.accdbとの二段構えに構成しているのがポイントです。

※再度start.accdbを起動しても最新版なのでアップデートの画面は出ず、通常通りtestdatabase.accdbが起動するようになります。

図:無事にVersion 2.0へアップデートされた。

共有してみる: