ウォーターサーバーとコーヒーマシンが一体化した画期的マシン >>

アクセスのレコードの更新直後、他PCから該当レコードを読むと更新が反映されていません。回避方法をお教え下さい。

尚、アクセスの初心者です。

”データ.mdb”をServerへ置き、複数のPCの”プログラム.mdb”から”データ.mdb”のテーブルをリンクし使用する予定です。
しかし、PC-Aの”プログラム.mdb”でテーブルを更新した直後PC-Bの”プログラム.mdb”からテーブルを読み込むと更新が反映されていません。
しかし、更新後 約2秒以上経過した後に読み込むと更新が反映されています。
試行錯誤しましたが改善しません。

以下に環境を示します。

Access2003で”データ.mdb”と”プログラム.mdb”を作成しAccess2010とAccess2003で使用
T_確認テーブルに”Yes/No型”で”アクセス中フラグ”を設定
ServerとPC-AとPC-BはLANで接続

<プログラム内容の抜粋>
Dim db As DAO.Database
Dim rs As DAO.Recordset
Set db = CurrentDb

Set rs = db.OpenRecordset("T_確認テーブル", dbOpenDynaset, dbDenyRead)
rs.MoveFirst
If rs!アクセス中フラグ = True Then ' → または”if rs!アクセス中フラグ Then”でも同じ
MsgBox "既に他者が使用", vbExclamation, "入力依頼"

else
rs.movefirst
rs.edit
  rs!アクセス中フラグ=True ' フラグをセット
rs.update
End If

db.Close
Set db = Nothing

このQ&Aに関連する最新のQ&A

A 回答 (3件)

補足に気付かず遅くなりました、すみません。


コントロールの位置関係がよくわからないのですが、大雑把な流れは以下の様かと思います。
※印のところが不明点です。
このサイトではTabインデントが使えないので全角スペースで代用しています。

Private Sub 予約ボタン_Click()
On Error GoTo errH

  Dim db As DAO.Database
  Dim rs As DAO.Recordset
  Dim WSP As Workspace
  Dim reTryCount As Integer

  Set db = CurrentDb
  Set WSP = DBEngine.Workspaces(0)

reTry:
  '※Me!機材番号txtコントロール とこのコマンドボタンが同じフォームにあると仮定
  Set rs = db.OpenRecordset("SELECT * FROM T_管理テーブル WHERE 機材番号='" & Me!機材番号txt & "'" _
    , dbOpenDynaset, dbPessimistic)
  DBEngine.Idle dbRefreshCache

  If rs.EOF And rs.BOF Then
    MsgBox "該当する機材番号はありません", vbOKOnly
    Me!機材番号txt.SetFocus '
    GoTo atoShimatu
  End If

  If rs!選択フラグ = True Then
    MsgBox rs!機材番号 & "は既に他者に貸出中です。", vbExclamation, "入力依頼"
    Me!機材番号txt.SetFocus
    GoTo atoShimatu
  End If


  WSP.BeginTrans 'トランザクション処理開始
  rs.Edit 'ここでロック開始
    rs!選択フラグ = True '選んだことで選択フラグをセット
    rs!担当者 = Forms!F_新規貸出フォーム!担当者 'メインフォームの予約担当者をセット
    rs!予約日時 = Forms!F_新規貸出フォーム!年月日 'メインフォームの予約日をセット
'        ・ (省略)
'  MsgBox "lock" '確認用です
  rs.Update 'ロック解除される
  WSP.CommitTrans dbForceOSFlush 'トランザクション処理終了

  rs.Close
  Set rs = db.OpenRecordset("T_TMPテーブル", dbOpenDynaset)
'  rs.AddNew
'    rs.機材番号= ・・・・(省略)
'        ・(省略)
'        ・
'    rs.Update

'ここで サブフォームのリクエリーを実施

'DoCmd.GoToControl "検索" ← コントロールをメインフォームへ移動しようとしています。
'※↑コマンドボタンはサブフォームにおいてあるのかな?

'DoCmd.Requery "機材詳細表示リスト" '※以下二行の説明がほしいです。PS.メインフォーム名とサブフォーム名も。
'DoCmd.Requery "予約済み機材表示"

errH:
  Select Case err.Number
    Case 0 '正常処理の場合、何もしない
      
    Case 91 'rs の閉じエラー
      err.Clear
      Resume Next
    Case 3218 '同時に複数から同じレコードに更新処理が掛かった場合
      err.Clear
      WSP.Rollback
      MsgBox "他の人によって更新中です。", vbOKOnly
      reTryCount = reTryCount + 1
      
      If reTryCount < 2 Then
        Resume reTry
      Else
        MsgBox "データを更新できませんでした。"
      End If
    Case Else
      Debug.Print err.Number, err.Description
      MsgBox err.Number & vbCrLf & err.Description
  End Select
  
atoShimatu:
  rs.Close: Set rs = Nothing
  Set WSP = Nothing
  db.Close: Set db = Nothing

End Sub
    • good
    • 0
この回答へのお礼

ご多忙の中お教え頂心より感謝致します。
早めの夏休みを頂、PCとを操作できない生活をしていて、返答とお礼が遅れましたことお詫びいたします。

さて、本題ですが、お教え頂いたプログラムと現象が発生するプログラムを比較し、1行毎に詰めたところ、”DBEngine.Idle dbRefreshCache”が抜けていたことが当現象の原因と判明しました。

また、書き込み方が判らず、補足へ書き込みご迷惑をおかけ致しました。

これで、先へ進めます。
誠に有難う御座いました。

お礼日時:2013/07/02 13:36

>200件以上のデータ



>有るプログラム(作成中)
の関係は?
作成中で構いませんので
関係ありそうなテーブルの説明とコードを提示できませんか?

>アクセスでは複数のプログラム.mdbとサーバに置いたデータ.mdbで使用するのはNGなのでしょうか。
NGではないと思いますが色々と神経細かくやっていかないと・・・。
実際に15人くらいで使っていますし。
ただ、そんなに面倒ならSQLServer やMySQLを使えば
余計なことに労力を使わなくて済むのに・・という意見が多いのは確かです。

この回答への補足

T_管理テーブルのレコードをメインフォームで絞込み、サブフォーム(リスト型)で表示、対象レコードの[選択]ボタンを押すと「選択フラグ」がTrueへ変更
他端末で同じレコードを選択しボタンを押すと「選択フラグ」をチェックしTrueの場合はMSGを表示し操作を終了させる予定です。これで、重複選択を防ぐつもりでした。
関連するテーブルとコードは以下の通りです。

データ量を減らしても同様なため、量には関係なくプログラムの作成に問題が有ると思っています。

WSP.BeginTransとWSP.CommitTrans dbForceOSFlushの位置は色々と変えて試して見ました。

AccessとVBAについて初心者のため、おかしなプログラムを作成していますのでご理解下さい。
ネットの説明を見ながら悪戦苦闘し作成してます。

T_管理マスターテーブル ← サーバーに有るデータ.mdb内のテーブル。以下項目は一部です。
  管理番号:オートナンバー型(主キー)
  機材番号:テキスト型
  機材名:テキスト型
  担当者:テキスト型
  予約日:日付/時刻型
  貸出日:日付/時刻型
  返却日:日付/時刻型
  選択フラグ:Yes/No型 ← False=未予約 True=予約済み 
  ・
  ・

T_TMPテーブル ← 各端末のプログラム.mdb内に有るテーブル。最終処理終了後テーブルのデータは削除
  管理番号:整数型
  機材番号:テキスト型
  貸出日:日付/時刻型
  返却日:日付/時刻型  

Private Sub 予約ボタン_Click()
  Dim db As DAO.Database
  Dim rs As DAO.Recordset
  Dim WSP As Workspace

  Set db = CurrentDb
  Set WSP = DBEngine.Workspaces(0)

  Set rs = db.OpenRecordset("T_管理テーブル", dbOpenDynaset, dbDenyRead)

  rs.MoveFirst

  Do Until rs.EOF
   If rs!機材=Me!機材番号 Then
     Exit Do
   Else
    rs.MoveNext
   End If
  Loop


  If rs!選択フラグ = True Then
    MsgBox "既に他者が選択しています。", vbExclamation, "入力依頼"
    rs.Close: Set rs = Nothing
    db.Close: Set db = Nothing
    Exit Sub
  End If

  DBEngine.Idle dbRefreshCache

WSP.BeginTrans 'トランザクション処理開始
  rs.Edit
    rs!選択フラグ = True '選んだことで選択フラグをセット
    rs!担当者 = Forms!F_新規貸出フォーム!担当者 'メインフォームの予約担当者をセット
    rs!予約日時 = Forms!F_新規貸出フォーム!年月日 'メインフォームの予約日をセット
        ・ (省略)
  rs.Update
  WSP.CommitTrans dbForceOSFlush 'トランザクション処理終了

  Set rs = db.OpenRecordset("T_TMPテーブル", dbOpenDynaset, dbDenyRead)
  rs.AddNew
    rs.機材番号= ・・・・(省略)
        ・(省略)
        ・
    rs.Update

  ’ここで サブフォームのリクエリーを実施
DoCmd.GoToControl "検索" ← コントロールをメインフォームへ移動しようとしています。

DoCmd.Requery "機材詳細表示リスト"
DoCmd.Requery "予約済み機材表示"


Set WSP = Nothing
rs.Close: Set rs = Nothing
db.Close: Set db = Nothing

End Sub

補足日時:2013/06/17 14:44
    • good
    • 0

キャッシュには入っても、データ.mdbのテーブルが書き換えられていないのでは?


フラグの変更時にトランザクション処理を行えば解決しそうな?
http://hanatyan.sakura.ne.jp/logbbs/wforum.cgi?n …

この回答への補足

お教え頂き、トランザクションの設定などを行い、簡単なプログラムでは改善し喜びましたが、200件以上のデータが有るプログラム(作成中)では、やはり、同現象が発生しました。
再度Netで調べたところ、以下URLに同じ様な質問が有りました。(調査不足でした)
アクセスの問題なのでしょうか。
アクセスでは複数のプログラム.mdbとサーバに置いたデータ.mdbで使用するのはNGなのでしょうか。

http://bbs.wankuma.com/index.cgi?mode=al2&namber …

補足日時:2013/06/10 17:13
    • good
    • 0
この回答へのお礼

トランザクションを設定することで回避できました。

ご多忙の中有難う御座いました。

キャッシュが有る事すら知らず、トランザクションなどについては未知の世界へ一歩踏み入れたような感じです。
アクセスの勉強をして参ります。

お礼日時:2013/06/06 13:48

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QAccessのRefresh・Requery・Repaintの違い

Requeryはもう一度ソースレコード(テーブル)を読み込むようです。このとき、テーブルの先頭レコードに移動してしまいます。
Refreshは最新のレコード(テーブル)を再表示するような気がします。レコードの移動は起こらない気がします。
Repaintは、VBAでキャプションなどを変更したとき使っています。
でも、よくわかっていません。
どんなときにどんなメソッドを使えばいいのでしょうか?
詳しい方、よろしくお願いいたします。

Aベストアンサー

たびたびすみません。
調べてたらこんなのがでてきました。
http://www.nurs.or.jp/~ppoy/access/access/acF007.html

参考URL:http://www.nurs.or.jp/~ppoy/access/access/acF007.html

Qアクセエスのレコードの更新をVBAでするには?

アクセスで、一覧表のフォームにボタンを取りつけています。レコードの内容を変更したら、ペンの形のマークが現れますね。これは変更中ということですが、そこでボタンを押しても変更は確定されないから、更新確定させたいのです。

それで、DoCmd.Requery を最初の行に入れてみたら、元の一覧表は最初のレコードに飛んでしまう。

元の一覧表の位置を動かさないために、Ctrl+Enter キーを押して更新確定させたような状態をVBAで実現する方法あるのでしょうか?

よろしくお願いします。

Aベストアンサー

No1 です。
今回の場合には
Docmd.RunCommand acCmdSaveRecord の方が良かったですね
文字通りレコードを保存します。
Requery に引きづられてしまいました (^_^;)

Recalc、Refresh、Requery の使い分けは下記が参考にはなりますか?
http://www.nurs.or.jp/~ppoy/access/access/acF007.html

QAccess サブフォームでの選択行の取得

こんにちは。

Access初心者です。

サブフォームでテーブルの項目を表示させていますが、
選択された行を取得する方法はありますか?
サボフォームの下の方に現在選択されているレコード数が表示されてますが、その値でかまいません。

調べているのですが、なかなか検討がつきません。
宜しくお願い致します。

Aベストアンサー

フォーム名がフォーム1、サブフォームコントロールの名前がサブフォーム1だとすると、

Forms!フォーム1!サブフォーム1.Form.CurrentRecord

で取得できます。
(「Forms」と「Form」がありますのでご注意下さい)


また、フォーム1にコードを記述する場合であれば

Me!サブフォーム1.Form.CurrentRecord

サブフォーム1へのコード記述であれば

Me.CurrentRecord

という構文によっても、それぞれ取得が可能です。

QAccessの画面更新を一時的に停止する方法。

こんにちは。
Accessの画面更新を一時的に停止する方法を捜しています。
ExcelのScreenUpdatingと同様な機能です。

VBAでの更新処理時に画面がチラチラと動くのを防止したいと思っています。
(Ver:Access2000)
ご存知の方宜しくお願い致します。

Aベストアンサー

Application.Echo False '画面の描画を止める

・・・処理を実行する・・・

Application.Echo True '画面の描画を行う

QACCESSサブフォームにデータ反映されない

よろしくお願いします。

Access2010を使っています。
メインフォームにあるテキストボックス2つに条件を入力し、
抽出したデータをサブフォームで表示させたいと思います。

●メインフォーム名「フォーム1」
テキストボックス2つ「tex1」「tex2」

●データ元クエリ「q1」
フィールド名「ID1」「ID2」「Name」

●サブフォームSQL
SELECT q1.Name
FROM q1
WHERE (((q1.ID1) = Forms![フォーム1]!tex1) And
((q1.ID2) = Forms![フォーム1]!tex2)));


フォームを開き、tex1とtex2に入力してもサブフォーム表示が変わりません。
サブフォームをデータシートで別に開くと、データ抽出できていることは確認できました。

サブフォームのコントロールソースへSQLを入力するだけでは、
メインフォーム内でのデータは反映されないんでしょうか??

Aベストアンサー

>サブフォームをデータシートで別に開くと、
>データ抽出できていることは確認できました。

の部分がよくわかりませんが。


普通は、たとえば、
メインフォームにボタンを一つ
設定し、そのボタンのクリックイベントで、

Private Sub コマンド0_Click()
Me!埋め込み0.Requery
End Sub

のように設定します。
ここで、「埋め込み0」というのはメインフォームの
デザインビューでサブフォームを表示するために
設定するコントロールのことで、サブフォーム
そのもではありません。初期値は「埋め込み0」
のような名前になっています。サブフォームと
同じ名前に設定しているならば、「埋め込み0」
のところをサブフォームと同じ名前に置き換えても
かまいません。


そのほかには、「tex2」の更新後処理に同様に、

Private Sub tex2_AfterUpdate()
Me!埋め込み0.Requery
End Sub

のように設定してもいいのですが、この場合には
「tex2」に入力後、一旦フォーカスを移動させる
必要があります。たとえば「tx1」にマウスを
移動させてクリックするとか。それによって
「tex2」の更新後処理が起動されます。

>サブフォームをデータシートで別に開くと、
>データ抽出できていることは確認できました。

の部分がよくわかりませんが。


普通は、たとえば、
メインフォームにボタンを一つ
設定し、そのボタンのクリックイベントで、

Private Sub コマンド0_Click()
Me!埋め込み0.Requery
End Sub

のように設定します。
ここで、「埋め込み0」というのはメインフォームの
デザインビューでサブフォームを表示するために
設定するコントロールのことで、サブフォーム
そのもではありません。初期値は「埋め込み0」
のよう...続きを読む

QDAOとADOの違いについて

Accessからイントラネット上のデータベースに接続するための接続方法で困っています。
DAOとADOの違いが分からず困っています。
メリット、デメリットが分かる方、どうか教えてください。

宜しくお願い致します。

Aベストアンサー

DAO(データアクセスオブジェクト)はAccessで使用されるMicrosoftJetデータベースエンジン を公開した最初のオブジェクト指向インターフェイスです。DAOは単一システムのアプリケーションや小規模でローカルなネットワークで使用するのに最も適しています。
とMSDNライブラリでは説明しています。
DAOはJetデータベースエンジンを対象にして開発されているのでJetのもつセキュリティ機能・データ定義機能などを十分に操作することができます。
ADO(ActiveXDataObjects)ではオブジェクトの種類が簡素化されているためJetデータベースエンジンの細かな機能を制御することができないといった点が不足している部分がありますがADOXやJROの各オブジェクトモデルで使用できる機能を使えばADOで不足している機能をほとんど補うことができます。
DAOはデータベースにAccessを使用するアプリケーションの場合、最大のパフォーマンスを得ることができます。しかしアプリケーションを運用していくうちに規模が大きくなってデータベースをSQLServerに移行することがあるかもしれません。
そのような可能性が含まれているのであれば最初からADOで開発しておいたほうが無難です。ADOはSQLServerに対する処理で良いパフォーマンスを得ることができます。

Jetデータベースエンジンを主なターゲットにしているならDAOで可。それ以外のデータベースを利用するのであればADOを選択する方が良いのではと思います。

DAO(データアクセスオブジェクト)はAccessで使用されるMicrosoftJetデータベースエンジン を公開した最初のオブジェクト指向インターフェイスです。DAOは単一システムのアプリケーションや小規模でローカルなネットワークで使用するのに最も適しています。
とMSDNライブラリでは説明しています。
DAOはJetデータベースエンジンを対象にして開発されているのでJetのもつセキュリティ機能・データ定義機能などを十分に操作することができます。
ADO(ActiveXDataObjects)ではオブジェクトの種類が簡素化されて...続きを読む

QAccessのテーブルデータを一気にVBAで追加したい・・

Accessのテーブルデータを一気にVBAで追加したい・・

Accessに一時商品登録データというテーブルがあり、
問題なければ商品登録データにデータを流し込みたいと思っています

テーブルのデータ構造は全く同じです

VBAで一時商品登録のテーブルから一件ずつデータを読み取って
商品登録データに追加することは出来るのですが
一気にデータを追加する方法があれば教えていただけないでしょうか?

よろしくお願いいたいます

Aベストアンサー

本当にいろいろな方法があります。

一番簡単なのは、
あらかじめ「追加クエリ」を作成しておき

 Docmd.OpenQuery "追加クエリ名"

あるいは DAO で

 Set dbs = CurrentDB
 dbs.Excute "追加クエリ名"

追加クエリを使用しない場合は
追加クエリの SQL文 に相当するSQL を 実行。

 strSQL="INSERT INTO 商品登録データ SELECT 一時商品登録データ.* FROM 一時商品登録データ"

 Docmd.RunSQL strSQL

あるいは DAO で

 Set dbs = CurrentDB
 dbs.Excute strSQL

とか。

直書き、間違いがあったら御免。

QACCESS ADOでupdateが効かない

いつもありがとうございます。

現在、ADOを使ってカレントプロジェクト以外のMDBファイルのテーブルにレコードを追加する処理を行っているのですが、何のエラーメッセージも出ないままレコードが追加されません。

この場合、updateコマンドが実行された後の状態(リターンコード)を調べる事はできないでしょうか?

Aベストアンサー

前回の回答を訂正します。

<ある環境下ではエラーが起きないこともあります!>

さて、本日、Execute での UPDATE 文が実行されないという不具合に遭遇しました。
エラーもなく表面上は「実行しました!」とのメッセージ。
「ウーン!」と考えて、UPDATE 文の発行による更新を断念。
SELECT文で読み込み1レコードづつ更新するようにコードを訂正しました。
結果、この不具合は解消されました。

多分、実行したPCが某社のCAD。
「Windows、Office の更新は誤動作の原因となるのでしていない」とのこと。
こういう場合、非手続き的なコードよりも手続き的なコードの方が信頼が高いと感じました。
質問者も、シコシコと更新手続きを書いてみると解決するかもしれません。

「エラーが出ると思う!」との下りは、このような事情で撤回します。

QACCESSで空白のデーターをクエリで判定/識別する方法を教えてくださ

ACCESSで空白のデーターをクエリで判定/識別する方法を教えてください。
EXCELでは空白を""で判定/識別表していますがACCESSではどうなるのでしょうか。

下の例はフィールドに試験番号があればその番号を、空白なら”欠席”と表示しようとしています。
IIf(([試験番号]="空白の場合何を入れる?"),[試験番号],"欠席")

Aベストアンサー

もうひとつの書き方は
式1: IIf([試験番号] Is Not Null,[試験番号],"欠席")
第2、第3引数の、質問の順序にあわせるとこうなる。

QAccessのフォーム上にレコード数とレコード番号の表示

Accessでクエリを元に表示するフォーム上で、テキストボックス等に関数を使って、レコード数とレコード番号を表示する方法がありましたら教えてください。

フォームの書式設定で「移動ボタン」の表示をすれば目的の事は出来るのですが、表示の大きさが調整できない為、とても見難いのです。

以上よろしくお願いします。

Aベストアンサー

レコード番号のコントロールソースを
=[CurrentRecord]
レコード数のコントロールソースを
=Count("*")-[NewRecord]
としてみてください。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング