Access VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


240 / 2272 ツリー ←次へ | 前へ→

【12432】更新クエリの実行タイミングについて すぬ 13/12/4(水) 14:15 質問[未読]
【12435】Re:更新クエリの実行タイミングについて かるびの 13/12/5(木) 2:39 回答[未読]
【12436】Re:更新クエリの実行タイミングについて すぬ 13/12/5(木) 10:04 回答[未読]
【12437】Re:更新クエリの実行タイミングについて hatena 13/12/5(木) 15:13 回答[未読]
【12438】Re:更新クエリの実行タイミングについて すぬ 13/12/5(木) 16:00 回答[未読]
【12439】Re:更新クエリの実行タイミングについて hatena 13/12/5(木) 19:00 回答[未読]
【12440】Re:更新クエリの実行タイミングについて すぬ 13/12/6(金) 12:32 回答[未読]
【12443】Re:更新クエリの実行タイミングについて hatena 13/12/6(金) 17:35 回答[未読]
【12444】Re:更新クエリの実行タイミングについて すぬ 13/12/6(金) 17:41 お礼[未読]

【12432】更新クエリの実行タイミングについて
質問  すぬ  - 13/12/4(水) 14:15 -

引用なし
パスワード
   こんにちは。
質問です。

部品管理をするデータベースを作成し、職場内で使っています。

参照フォームで編集したいデータを選び、「編集」ボタンを押したら編集フォームが開くようにしています。

このとき、他のユーザーがこのデータを編集できないようにそのレコードにフラグを立て(チェックON)、ガードするようにしています。

編集フォームを閉じる時(Form_Unload)、更新クエリでフラグを下げる(チェックOFF)するようにVBAコードを書いたのですが、うまくいく時、いかない時があります。

この原因がわからなくて解決に至らず、困っています。

知ってみえる方がいましたら教えてください。
よろしくお願いします。


参考までに、作ったVBAコードを載せます。


Private Sub Form_Unload(Cancel As Integer)

On Error GoTo Err_LABEL

  DoCmd.SetWarnings False
  
  If PartsHensyu = True Then             'フラグがONの時
    DoCmd.OpenQuery "Q_更新_T_Parts(Off4)"    
  End If

Exit_LABEL:
Exit Sub

Err_LABEL:
MsgBox ("予期せぬエラーが発生しました!(エラーNo." & Err.Number & ")" & vbCr & vbCr & "登録を終了します。")
Resume Exit_LABEL

End Sub

【12435】Re:更新クエリの実行タイミングについて
回答  かるびの  - 13/12/5(木) 2:39 -

引用なし
パスワード
    与えられた情報だけからすると、
更新クエリのWHERE句で必要なレコードが抽出されていないのかなとか、
Form_Unloadプロシージャにおいて、変数PartsHenshuには
きちんと値が格納されているのだろうか
(VBA実行中に、エラーでコードの実行が止まると、
変数が初期化されてしまい、その後は当該変数には何も格納されていない
という状態になることがあります。)
などという感想を持ちました。

 更新クエリのSQL文を開示してみてください。
 また、更新クエリがうまくいかなかったときの、
If PartsHensyu = True Thenというコードを実行する直前のPartsHenshu変数の値を
確認してみてください。

【12436】Re:更新クエリの実行タイミングについて
回答  すぬ  - 13/12/5(木) 10:04 -

引用なし
パスワード
   すぬです。

かるびのさん、回答ありがとうございます。

ご指摘いただいた箇所を確認しました。

> 更新クエリのSQL文を開示してみてください。

→こんなSQLになっています。

UPDATE T_Parts SET T_Parts.チェック4 = Off
WHERE (((T_Parts.PartsNo)=[forms]![F_Parts登録]![PartsNo]));


> また、更新クエリがうまくいかなかったときの、
>If PartsHensyu = True Thenというコードを実行する直前のPartsHenshu変数の値を確認してみてください。

→自分で試すとうまくいきます。うまくいかないときの原因がわからないため検証できずにいます・・・。
複数人でデータベースをアクセスしているとNGなんでしょうか?

変数PartsHensyuはPublicで定義しています。
Public PartsHensyu As Boolean

【12437】Re:更新クエリの実行タイミングについて
回答  hatena  - 13/12/5(木) 15:13 -

引用なし
パスワード
   更新クエリを使ってますが、レコードソースにあるフィールドなら、フォーム上で更新した方がトラブルが少ないように思います。

Private Sub Form_Unload(Cancel As Integer)

On Error GoTo Err_LABEL

  If PartsHensyu = True And Me!チェック4 = True Then   
    Me!チェック4 = False
  End If

Exit_LABEL:
Exit Sub

上記で改善しないなら、処理全体を見直した方がいいと思います。

>このとき、他のユーザーがこのデータを編集できないようにそのレコードにフラグを立て(チェックON)、ガードするようにしています。
>
>編集フォームを閉じる時(Form_Unload)、更新クエリでフラグを下げる(チェックOFF)するようにVBAコードを書いたのですが、うまくいく時、いかない時があります。

> 複数人でデータベースをアクセスしているとNGなんでしょうか?
>
> 変数PartsHensyuはPublicで定義しています。
> Public PartsHensyu As Boolean

このフラグをいつ、どのように On にしてますか。

編集時に、フラグフィールドへの書き込みはどのようしてますか。

このあたりの整合がきちんととれているのでしょうか。


蛇足ですが、
私がするなら、更新フラグフィールドには、更新中のユーザー名あるいはPC名を書きこむようします。
そうすれば、更新ロックが長時間解除されない場合、更新中のユーザーに確認することができますので。
ついでに、更新開始時刻なども書きこんでおくといいかも。

【12438】Re:更新クエリの実行タイミングについて
回答  すぬ  - 13/12/5(木) 16:00 -

引用なし
パスワード
   すぬです。

hatenaさん、回答ありがとうございます。

指摘いただいた点についてですが、

処理の流れは、

・情報参照フォームで編集したいPartsを選択、表示する
・情報参照フォームの「編集」ボタンを押す
  このときPartsHensyuがON
  情報参照フォームで選択していたPartsのレコードを、追加クエリでテンポラリテーブルに追加
  「編集」ボタンを押した人(コンピュータ名)と時間を、選択したPartsレコードのフィールドに書く
・登録フォームを開き、情報を編集する(テンポラリテーブル)
・「登録」ボタンを押すと、更新クエリでテンポラリテーブルの情報を本物のレコードに反映し、フォームを閉じる
・「キャンセル」ボタンを押すと、何もせずフォームを閉じる
  フォームを閉じる時に、
   テンポラリテーブルのレコードを削除
   PartsHensyu=ONのとき、更新クエリでフラグをOFFにする


という処理になっていまして、
フォーム上でFlagをOFFにすることが出来ないなと思い、更新クエリを使っています。
更新者、日時はご意見をいただいたとおり、私も処理に組み込んでいます。

ですので、何かあればそれを見て処置していますが、以前より頻発しているため、何が原因なのか、どう解決すればいいのか模索中でして・・・。

このような処理ですが、気になる点などありますか?
もしあればヒントをいただけると助かります。

【12439】Re:更新クエリの実行タイミングについて
回答  hatena  - 13/12/5(木) 19:00 -

引用なし
パスワード
   前回の回答は、本テーブルに直接連結した場合のコードです。


>処理の流れは、
>
>・情報参照フォームで編集したいPartsを選択、表示する
>・情報参照フォームの「編集」ボタンを押す
>  このときPartsHensyuがON
>  情報参照フォームで選択していたPartsのレコードを、追加クエリでテンポラリテーブルに追加
>  「編集」ボタンを押した人(コンピュータ名)と時間を、選択したPartsレコードのフィールドに書く
>・登録フォームを開き、情報を編集する(テンポラリテーブル)
>・「登録」ボタンを押すと、更新クエリでテンポラリテーブルの情報を本物のレコードに反映し、フォームを閉じる
>・「キャンセル」ボタンを押すと、何もせずフォームを閉じる
>  フォームを閉じる時に、
>   テンポラリテーブルのレコードを削除
>   PartsHensyu=ONのとき、更新クエリでフラグをOFFにする
>
>
>という処理になっていまして、

テンポラリテーブルを利用しているのですね。
この部分を読み飛ばしてました。

ということで、処理の流れを見る限りは問題はなさそうです。

DoCmd.OpenQuery で更新クエリを実行するとトランザクション処理は行われないので、複数ユーザーがほぼ同時に実行したときに、問題がでそうに思えます。

DAOかADOでトランザクション処理を追加して実行するようにしたほうがいいかもしれません。

あと、登録フォームを開くとき、ダイアログモードあるいは、「作業ウィンドウの固定「を「はい」で、開いてますか。

【12440】Re:更新クエリの実行タイミングについて
回答  すぬ  - 13/12/6(金) 12:32 -

引用なし
パスワード
   すぬです。

hatena さん、回答ありがとうございます。

>DoCmd.OpenQuery で更新クエリを実行するとトランザクション処理は行われないので、複数ユーザーがほぼ同時に実行したときに、問題がでそうに思えます。
>
>DAOかADOでトランザクション処理を追加して実行するようにしたほうがいいかもしれません。
>

すみません、トランザクション処理について理解できていないです。
どのような処理なんでしょうか?


>あと、登録フォームを開くとき、ダイアログモードあるいは、「作業ウィンドウの固定「を「はい」で、開いてますか。

作業ウィンドウの固定の設定は何も変更していないので「いいえ」のままになっています。
「はい」にすることで何が期待できるんでしょうか?

【12443】Re:更新クエリの実行タイミングについて
回答  hatena  - 13/12/6(金) 17:35 -

引用なし
パスワード
   >>DoCmd.OpenQuery で更新クエリを実行するとトランザクション処理は行われないので、複数ユーザーがほぼ同時に実行したときに、問題がでそうに思えます。
>>
>>DAOかADOでトランザクション処理を追加して実行するようにしたほうがいいかもしれません。
>>
>
>すみません、トランザクション処理について理解できていないです。
>どのような処理なんでしょうか?

「Access トランザクション処理」でWEB検索すればいろいろ解説が見つかります。

例えば、下記は、DAOでのトランザクションの使用例です。

Workspace.CommitTrans メソッド (DAO)
msdn.microsoft.com/ja-jp/library/ff835985.aspx


>>あと、登録フォームを開くとき、ダイアログモードあるいは、「作業ウィンドウの固定「を「はい」で、開いてますか。
>
>作業ウィンドウの固定の設定は何も変更していないので「いいえ」のままになっています。
>「はい」にすることで何が期待できるんでしょうか?

ダイアログモードあるいは作業ウィンドウ固定でフォームを開くと、ユーザーはそのフォームしか操作ができなくなります。もし、そうしないと、ユーザーが他のフォームでデータ処理を行い、想定外の結果にある危険性があります。

ダイアログモードで開くには、
Docmd.OpenForm "フォーム名", , , , , acDialog
というように第6引数で acDialog を指定します。
acDialog を指定して開くと、ユーザーがこのフォームを閉じるまで、次の行のコードは実行されません。
フォームでのデータ操作が終わった後の後始末の処理などを次の行に記述しておくことができます。

【12444】Re:更新クエリの実行タイミングについて
お礼  すぬ  - 13/12/6(金) 17:41 -

引用なし
パスワード
   すぬです。

hatena さん、回答ありがとうございます。

トランザクション処理やフォームのダイアログモードについて、
前回回答をいただいてから、私もWebで調べてみました。
じっくり勉強してみます。

またわからないことが出てきましたら質問させていただくと思います。
その時はお時間許す限り教えていただけたら、と思います。

お忙しいところありがとうございました!

240 / 2272 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
1078190
(SS)C-BOARD v3.8 is Free