ひょんなことから、ACCESS 2003で作られたmdbのアプリを ACCESS 2016以降でも動くように変換する依頼を受けました。
はまった点は主に以下の3点
- レプリケーションが設定してあった
- DBの設計が???だった
- レポートのレイアウトでサイズが固定され変更できなかった
レプリケーションが設定してあった
まず一番最初にはまったのはmdbにレプリケーションの設定がしてあったこと。通常のmdbは最近のACCESSでも開くことができるようなのだが、レプリケーションが設定してあると最近のACCESSで開くことすらできなかった。
仕方がないのでACCESS 2010をインストールした長年放置して埃を被った古いPCを引っ張り出してきて、開くことにした。とりあえず、こいつでmdbファイルを開くことはできた。でもaccdbに変換して保存したかったのだが、残念なことにお客さんから預かったデータはレプリカ元ではなくレプリカ先だった。そのため、このファイルを元にファイル変換はできなかった。
そこで、次に試したのが空のaccdbファイルを作成して、そのファイルからインポート機能を使って元のmdbファイルのテーブルをインポートするという手段。…なんとうまくいきました。
設計が???だった
次にはまったのはDBの設計だった。なんせ2003年ごろに社員さんが見よう見まねでテーブル設計したらしく、フィールド名とかに半角カナや記号を使いまくってて、コンバート後のVBAのコードでエラーがでて動かなかった。中には対になっている右側の括弧が全角で左側の括弧は半角とかもあって何がなにやらわけわかめ状態であった。
とはいうものの、テーブル数もそこそこ多かったため一々テーブルを確認するなんて難しい。仕方がないのでACCESSの定義データをテキストに落としてくれるVBSのツールをネットでググって落としてきて、ACCESSの定義データをテキストに落としてきてgrepで半角カナを検索して対象をリストアップした。
このとき、最初VBSのツールをUTF-8で保存したのだがうまく動かなかったのでさんざん悩んだのですが、結局はShift-JISで保存する。これで解決しました。
では実際にはどのようにテーブルを修正したか?実は直接はテーブルは修正しなかったんです。シクるとお客様のデータだから後がないし(バックアップはもちろんとってるけど)。でどうしたかというと、テーブルを修正した空のaccdbをもう一つ用意し先ほどの変換したばかりのaccdbからもう一回インポートしたんです。
VBAから参照するフィールド名では半角と全角が明確に区別されるのですが、インポートだと、フィールド名が半角から全角に変わっていても手動での変換なしにそのままインポートされました。
もちろん、VBAのフィールド名も修正してやりました。簡単に書くとこうなんですが、実際にはmdbのファイル数が10ファイルほどに分散されていたので結構苦労しました。
レポートのレイアウトでサイズが固定され変更できなかった
この案件で次にはまったのがレポートのサイズが固定され変更できなかったことでした。レポートのパネルのサイズ(高さ)が55cmとかいうわけのわからんサイズで固定されてしまい、値を変えても元に戻ってしまうという謎の現象でした。
正直、ググっても明確な回答はありませんで、かなり悩みました。そもそも今回のACCESSのコンバートの話、実はその会社の社員さんが見よう見まねで作ったらしいのですが、既に辞めておられ使っているけど誰も手を出せない状態の代物でした。当然私は細かい中身を知る由もないため作り直しなんてできません。
レポートのコピーを作ってみたりとかいろいろやってみたのですがいずれも玉砕でしたが、最後に以下の方法で修正することができました。
- サイズが固定されるパネルの中のオブジェクトを全部選択する
- 一旦選択したオブジェクトを切り取りする
➡するとサイズを修正できるようになりました - パネルのサイズを修正し、切り取ったオブジェクトを貼り付ける
なんで、正しくコンバートできないこのようなレポートがあるのか、真相は不明ですが個人的にはオブジェクトのエリアが対象のパネルの外にはみ出しているものがあるとあるとなるのかなとおぼろげに思っています。
まあ、真相はわかりませんが
その他
そんなこんなで、無事コンバートを終え、お客さんにお渡ししたのですが、前の社員さんが見よう見まねでつくったようなアプリなのでサポートを考えると頭が痛いです