- ベストアンサー
Accessのテーブルへのリンク
いま、ASPのDBとして使っているAccessのファイル A.mdbがあります その中の一つのテーブルを別のAccessファイル B.mdbにリンクして、参照したいと思っています。 しかし、B.mdbからリンクするときに インポートすると、A.mdbの変更が反映されず、 リンクすると、B.mdbで変更したものがA.mdbにも反映されて困っています. やりたいことはB.mdbから安全に(変更なしで)A.mdbのテーブルを 閲覧したいのです. ・A.mdbの変更をB.mdbに反映したい ・B.mdbのテーブルの変更はA.mdbに影響がない と言うことです. どうかお力添えを よろしくお願いします.
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
再びNo3です。質問者さんはADOとDAOの違いを少し知っておられるとします。ご存じのように、DAOではフォームに記入した内容を即テーブルに反映させるプログラムを作ることができます。ADOはこれができません。 よってDAOの場合は、フォームの記入は一旦テキストボックスで受け、その内容をレコードセットに転記してテーブルの読み書きを行うように作らなければ、もしくは既存プログラムを書き換えなければ、No3の様なことはできなくなります。 DAOでフォームに記入した内容を即テーブルに反映させるプログラムを作り慣れた人にはこの上なく面倒ですが、ADOしか知らない人には「当たり前の話」になります。よって、新規に作るにしても、既存プログラムを書き換えるにしても「こんなこと、たいした作業でない」と割り切ると良いでしょう。
その他の回答 (3)
- moonliver_2005
- ベストアンサー率59% (536/904)
>ということはAccess(A.mdb)に、そういう参照をさせる機能が ないということなのでしょうか? 機能はありますけれども、それを使うかどうかはプログラマの責任に於いて行わなければなりません。 Accessでは、テーブルはテーブルとしてはプログラマからは見えません。Openメソッドでテーブルに対応する「レコードセット」というオブジェクトを作った時点ではじめてテーブルを操作できるようになります。レーコードセットに対して読み書き追加削除するとテーブルにこれが反映することになります。 質問者さんのやりたいことを実現するにはBmdb側で、そのテーブルに対し、レコードセットをLockモードをadlockOptismicで開いておいて、書き込みを受け付るようにします。その上でWriteメソッドを実行させますが、その後でUpdateメソッドを省略して実行させなければ、Bmdb側で好きなようにそのレコードセットを書き換えることができますが、Updateメソッドで「この書き込みをテーブルに反映させろ」という指示がないので、A側mdbにあるテーブルは何も変わらないということになります。 B側の書き込み命令は、プログラムの進行と共に消えうせてしまいますから、「消え失せてしまうのでは困る」というのであれば、別のテーブルを書き込みログ用としてB側mdbに作成し、この書き込みログテーブル用のレコードセットをOpenして、リンクテーブルのレコードセットに書き込むと同時に、書き込みログテーブルのレコードセットにも書き込んで、後者のレコードセットのみUpdateメソッドを実行しておきます。 こうすると、Bmdb側で一生懸命テーブルを変更しても少しもテーブルは変更されないプログラムを作ることができます。Bmdbは何を変更としようとしたかは、ログテーブルを見ればすべて判りますが、Amdb側には無関係のことになっています。Amdb側でそれを知りたければAmdbからログテーブルに対しリンクを張ればよいことになります。
- shimix
- ベストアンサー率54% (865/1590)
・B.mdbにインポートしたテーブルとリンクテーブルの両方を持つ。 ・B.mdbの起動時マクロ(Autoexec)で ・インポートしたテーブルを削除クエリで全レコード削除 ・リンクテーブルからインポートテーブルへ追加クエリ を実行する あとはインポートテーブルを使って処理すればいいんじゃないでしょうか?
お礼
なるほど、No.1の方の方法をマクロでやるということですね. 確かにかなりよくなります.ありがとうございます. 質問の機能ですが、べつのSQLのサーバー(Oracle,MySQL?は不明) ではやっているのを見たことがあります ということはAccess(A.mdb)に、そういう参照をさせる機能が ないということなのでしょうか? もう少し、聞かせてください.
- CHRONOS_0
- ベストアンサー率54% (457/838)
Aの変更がどのぐらいの頻度で行われるのかわかりませんが その変更が確実に反映されるような頻度でインポートしなおせばいいのでは
お礼
頻度はそんなに頻繁でないので、確かにそうなのですが、 最終手段とさせてください.
お礼
大変丁寧な回答ありがとうございます. おしゃることは基本的に理解できたと思います. 根本はNo.1サンと同様にA.mdbにリンクされている B.mdbのテーブルはデータ取得専用にし 変更、書き込みは等はB.mdbにあるミラーテーブルに 対して行う方法で実現できるということでしょうか。 結局テーブルの情報を守るのは プログラマなんですね. そのほうこうでやってみたいと思います. 有難うございました.