accessデータベースのリンクテーブルについて
管理していてた
Accessによるデータベース。
データベースをフォームとテーブルに分割し、別mdbファイルとして扱い、
リンクテーブルマネージャーでリンクしておくという方法を取っていた。
ここでは便宜上、メインとして使うフォームデータベースを
Form.mdb、
参照先のテーブルデータベースを
Table.mdbとしておく
Form.mdbが
Table.mdbをリンクしているという構成。
現状ではサーバーにある2つのmdbをローカルに持ってきてローカル用に
リンクテーブルマネージャーを使ってリンク。
以降はサーバーからTalbe.mdbを持ってきて、ローカルで更新したら
同ファイルをサーバーにあげるという、ちょっと危うい手法をとっている。
ただ、Form.mdbを更新した場合がちょっと曲者で、
ローカルに持ってきた際にローカル用にリンクテーブルも再設定しなければならなくなる。
アプリケーションを立ち上げた時点でメインフォームを開くようにしているので
テーブルが参照できずフォームが開けない感じになってしまう。
まぁ、以上のような状況のときにどうすれば起動時に動的にテーブルをリンクできるかというのが
問題になってくるわけで、その方法について書き記しておく。
1)起動時実行用マクロの作成
AutoExecという名前でマクロを作成すると、データベース起動時にアクションを起こせる。
今回の場合だったらアクションに「プロシージャの実行」を指定し、「プロシージャ名」も設定する。
(とりあえずここではOpenMainForm()としておく)
- 注意
- Accessのメニューで「ツール」⇒「起動時の設定」でフォームの表示をしてしまうと
先にフォームが表示されてしまうっぽいので、マクロから実行されるプロシージャ内で
フォームを開くこと
2)プロシージャの記述
とりあえず手っ取り早くサンプルコードを…
Public Function OpenMainForm() As Integer
On Error GoTo relink
'フォームを開く
DoCmd.OpenForm ("F_Main")
Exit Function
relink:
'フォームを開くのに失敗したらこっちに流れてくる
MsgBox "リンクテーブルを更新します"
'リンクテーブルデータベースが存在するかチェック
Dim table_path As String
Dim buf As String
table_path = CurrentProject.Path & "\Table.mdb"
buf = Dir(table_path)
If buf = "" Then
MsgBox "Form.mdbが置いてあるフォルダにTable.mdbを置いてください"
DoCmd.Quit
End If
'データ管理.mdb内のテーブルと同じ名前のリンクテーブル
Dim db As Database
Dim tbd As TableDef
Set db = CurrentDb
For Each tbd In db.TableDefs
If Len(tbd.Connect) <> 0 And InStr(tbd.Connect, "ODBC;") = 0 Then
If InStr(tbd.Connect, "Table") <> 0 Then
tbd.Connect = ";DATABASE=" & table_path
tbd.RefreshLink
End If
End If
Next
db.TableDefs.Refresh
db.Close: Set db = Nothing
'フォームを開く
DoCmd.OpenForm ("F_Main")
End Function
テーブルがリンクされているとき、tbd.Connectに値が入っている。0の場合は空だと思っていい。
ODBCは不明っていうかあまり調べていない…
次にInStr(tbd.Connect, "Table")で、再リンクしたいテーブルのみを抽出。
Connectプロパティのリンクテーブルの設定は;DATABASE=テーブルのフルパスなのでそれをセット。
後はRefreshLinkとかで更新すればいけるということが判明。
最終更新:2009年01月22日 16:14