|
247b さん ありがとうございます
>念のため確認1
>アクセス任せの排他制御と、そうでない排他制御の違いを教えてください。
>どうも、この辺にお互いの認識相違があるように思われます。
改めて聞かれると・・・・
>>アクセス任せの排他制御
これだけであいまいな理解であることが明白みたいな・・・です
排他については
Set dbs = OpenDatabase(LC_get_path, Options:=True) '排他で開く
でMDBそのものがロックされ、他の人は開けない
(今回初めて体験しました)
アクセス任せの排他制御 は、それ以外みたいな・・・ (^_^;;;
認識でした
当初は間違ったテストと間違った理解で
APP1_入力.MDBからDT登録時、コード上でDT.MDBを排他で開いて、直ぐ閉じるのであれば、
APP2_参照.MDBから、DT.MDBのTBLをスナップショット系からみることは出来る
みたいな理解でした
今回の 念のため確認1 を頂き、再度、排他について調べてみました
VBA の Recordset オブジェクトで共有データをロックする
tp://msdn.microsoft.com/ja-jp/library/cc376533.aspx
なんてありました
以下抜粋
排他モードは、データのロック方法の中では最も制限レベルが高いもので、ほかのすべての
ユーザーはデータベースを開くことができず、データベース内のデータへアクセスできなくなります。
共有モードでデータベースを開くと、複数ユーザーが同時にアクセスでき、
Jet データベース エンジンによりユーザー間の競合が処理されます。
Recordset オブジェクトでは、次の 4 つのレベルでデータをロックします。
* 排他モード データベース全体を他のユーザーが使えないようにし、
制限レベルが最も高くなります。
* レコードセット ロック Recordset オブジェクトのテーブルをロックします。
* ページ レベル ロック 編集中のデータが保存されている 4096 バイト (4K) の
ページ全体をロックします。
* レコード レベル ロック 現在編集中のレコードのみをロックします。
ページ レベル ロックあるいはレコードセット ロックを使用した場合は、現在編集中の
レコードが含まれるページおよびレコードのみがロックされ、制限レベルとしては最も
低いものとなります。この場合、ほかのユーザーはページまたはレコードからデータを
取得できますが、変更はできません。
レコード レベル ロックは ADO および DAO Recordset オブジェクトの既定値です。
また、ページ レベル ロックは ADO Command オブジェクトまたは DAO QueryDef
オブジェクトを使用する SQL DML ステートメント (UPDATE、DELETE、および
INSERT INTO ステートメントなどの大規模な操作) の既定値となっています。
ページ レベルまたはレコード レベルでデータをロックする Recordset オブジェクトを
操作する場合は、ペシミスティック ロックまたはオプティミスティック ロックの
どちらかを選択
ADO Recordset オブジェクトのロック タイプを設定するには、Recordset オブジェクトに
用意されている Open メソッドの LockType 引数にある adLockPessimistic 定数または
adLockOptimistic定数を指定します。 DAO Recordset オブジェクトの場合は、LockEdits
プロパティを設定してロック タイプを変更できますが、ADO Recordset オブジェクトを
開いた後にロック タイプを変更することはできません。
ペシミスティック ロックでは、レコードの編集を開始するとそのレコードまたはレコードが
あるページがロック処理中はページ全体がロックされるため、ロックが解除されるまで他の
ユーザーがそのページのレコードを変更できない
オプティミスティック ロックでは、新規レコードへ移動、または Update メソッドを
使用してレコードへの変更を保存する際に、レコードまたはページがロックレコードの
編集中に正しい更新を確認できないことです。ほかのユーザーが最初にレコードを更新
した場合、レコード編集の更新は行われません。
抜粋 以上
文言的にはだいぶ理解できたつもりですが、コードはまだ??です (^^;)
>念のため確認2
>参照.MDBからDT.MDBを参照するとき、リンクテーブルは使ってないんですよね?
今回の作業を始める前に一応下調べはしたのですが
リンクテーブルは駄目だとか、あってもよいとかの書き込みがあって
よく理解できなかったので、
取りあえずリンクテーブルはやめ、また、DT.MDBのDTを表示するコントロールも
非連結にしましたが、
結局、フォームを開くとき、
コントロールのレコードソースを設定しているのでリンクテーブル有り同じことに
なっているのではと思っています
>逆に、入力.MDBでDT.MDBを開いた時に排他モードにして、参照.MDBで開く時に共有モードで開く
>(Option引数をつけない)というようにしてはどうでしょうか。
のアドバイスなんですが
>>でなくて
>>複数のAPP.MDBからDT.MDBを編集したい
>>となりました
で
APP1_入力.MDB
APP2_参照.MDB
DT.MDB
の
APP2_参照.MDB からも DT.MDB へ入力したいと思っています
動作的には
APP2_参照.MDB から 選択したブックを 編集更新したら 更新日時をDT.MDBに書き込む
で、最終的には、エクセルから DT.MDB に書き込むつもりでいるのですが
今回は
便宜的に、APP2_参照.MDBからブックを開いたときに DT.MDB に書き込みたいと思っています
まとめると
APP1_入力.MDB を 使用するのは 1人で、作業時には作業を始めると30分程度は連続使用
APP2_参照.MDBは、10人ぐらいが使用するのですが、起動しっぱなしでもかまわない
DT.MDB 直接の操作は無いと思っていますが、メンテt時等使用する場合は排他で開く
DT.MDBのメンテ時以外は、APP1_入力.MDB、APP2_参照.MDBどちらも同時使用可能
APP2_参照.MDBでの最新DT表示は、最新DT取得ボタン等で表示
APP1_入力.MDB、APP2_参照.MDBはローカルPCで起動、DT.MDBは、ファイルサーバー上に置く
みたいな感じです
なので
入力.MDBでDT.MDBを開いた時に排他モードは、
APP2_参照.MDBから、DT_TABLEを参照出来なくなるため不適、
共有モードでJet データベース エンジンによるユーザー間の競合処理
が希望の操作ではないかと思えます
上記の方針で再度チャレンジしてみようと思います
取りあえずのご報告でした。
|
|