Access VBA質問箱 IV

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

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


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

【8361】プロセスを完了するには にしもり 06/7/25(火) 17:07 質問[未読]
【8362】Re:プロセスを完了するには にしもり 06/7/26(水) 17:02 質問[未読]
【8364】Re:プロセスを完了するには 小僧 06/7/27(木) 11:00 発言[未読]
【8366】Re:プロセスを完了するには にしもり 06/7/27(木) 13:26 質問[未読]
【8367】Re:プロセスを完了するには にしもり 06/7/27(木) 13:27 発言[未読]
【8376】Re:プロセスを完了するには 小僧 06/7/31(月) 11:56 発言[未読]
【8377】Re:プロセスを完了するには にしもり 06/7/31(月) 14:05 お礼[未読]

【8361】プロセスを完了するには
質問  にしもり  - 06/7/25(火) 17:07 -

引用なし
パスワード
   こんにちは。

下記のようなコードでtbl_STAFFの更新のテストをしています。ところが、実行はできるのですがテスト後のtbl_STAFFを削除しようとすると次のメッセージが出て削除できません。「テーブル'tbl_STAFF'は現在ほかのユーザまたはプロセスで使用されているのでロックできませんでした」

似たようなケースで他のテーブルを消したことがありますがこのようなメッセージが出たことはありません。下記コードの中に、プロセスが完了した、という記述がなにか必要なのでしょうか?
どなたかご教示いただけると助かります。

Private Sub btnExecute_Click()
If DirtyFlg = 1 Then
  Dim strCriteria
  Dim strConn
  strCriteria = "UPDATE tbl_STAFF SET "
  strConn = ""
  If IsNull(StaffName1) = False Then
    strCriteria = strCriteria & "staff_name = '" & [Forms]![F_ModStaff]![StaffName1] & "' "
    strConn = ", "
  End If
  If IsNull(EmpDate1) = False Then
  
  '**シングルクォーテーション追加
    strCriteria = strCriteria & strConn & "Emp_Start_Date = '" & [Forms]![F_ModStaff]![EmpDate1] & "' "
    strConn = ", "
  End If
  If IsNull(AssDate1) = False Then
    strCriteria = strCriteria & strConn & "CR_Start_Date = '" & [Forms]![F_ModStaff]![AssDate1] & "' "
    strConn = ", "
   '**ここまで
  End If
  If IsNull(flgUnitID) = False Then
    strCriteria = strCriteria & strConn & "Attached_Unit_Num = " & [Forms]![F_ModStaff]![flgUnitID] & " "
    strConn = ", "
  End If
  If IsNull(Status1) = False Then
    strCriteria = strCriteria & strConn & "Staff_Status = '" & [Forms]![F_ModStaff]![Status1] & "' "
  End If
    strCriteria = strCriteria & "WHERE staff_id = " & [Forms]![F_ModStaff]![flgStaffID] & ";"
  DoCmd.RunSQL strCriteria
Else
  MsgBox "No Need to Change"
  Exit Sub
End If
  Me!DirtyFlg = 0
  Me!flgUnitID = Null
  Me!StaffName1 = Null
  Me!EmpDate1 = Null
  Me!AssDate1 = Null
  Me!Status1 = Null
  Me!UnitName = Null
  Me!StaffName = Null
  Me!EmpDate = Null
  Me!AssDate = Null
  Me!Status = Null

  MsgBox "Save Completed"
  
End Sub

【8362】Re:プロセスを完了するには
質問  にしもり  - 06/7/26(水) 17:02 -

引用なし
パスワード
   素人ですが本件はコードの問題ではないように思えてなりません。
当該テーブルを操作しているフォームのプロパティの使用ロックが、デフォルトではいいえになっているところ、「はい」になっています。これと関係ありますか。
どなたかシステムに詳しい方お教え願えませんでしょうか。

【8364】Re:プロセスを完了するには
発言  小僧  - 06/7/27(木) 11:00 -

引用なし
パスワード
   ▼にしもり さん:
こんにちは。

なかなかレスがつかないですね…。

> If DirtyFlg = 1 Then

フォームは連結フォーム、非連結フォームのどちらでしょうか。
非連結フォームで DirtyFlg という変数を変化させて
擬似的にDirty状態を作っているようにも思えたのですが、

> 現在ほかのユーザまたはプロセスで使用されているのでロックできませんでした

のメッセージが出るという事は連結…なのでしょうか。


> テスト後のtbl_STAFFを削除しようとすると

ここももうちょっと詳しい情報があるとヒントになるかもしれません。
上記の表現ですとテーブルそのものを削除しているようにも見えますが、
tbl_STAFFのレコードを削除ではないですか?

また削除の方法…テーブルを直接開いて、とか、
連結フォームのレコードセレクタを選んでいる状態で削除など
提示があると、回答がつきやすくなるかもしれません。

【8366】Re:プロセスを完了するには
質問  にしもり  - 06/7/27(木) 13:26 -

引用なし
パスワード
   ▼小僧 さん:
>フォームは連結フォーム、非連結フォームのどちらでしょうか。
こんにちは。
公開したのはF_ModStaffという名のフォームです。
同フォームにたどり着く前段に、別のフォームがあって(F_Staff)、その中のコマンドボタンを押すとF_ModStaffがオープンする仕組みになております。
ちなみにF_ModStaffの中にはサブフォーム(SF_STAFF)がある・・という具合です。

いまだによくわからないのですがF_ModStaffのフォームを開くと、
個々のテキストボックスには「非連結」という文字が表示されます。

でも、だからといってこのフォームが非連結、というわけではないのですよね?
たとえば或るコントロールのプロパティを開くと、更新時処理に[イベントプロシージャ]があって、・・・を押すと玉手箱のようにコードが出て、テーブルをUPDATEしたりしています。コントロールには「非連結」と表示されているにもかかわらず、です。そういう意味ではこれは「連結」です。

>上記の表現ですとテーブルそのものを削除しているようにも見えますが、
>tbl_STAFFのレコードを削除ではないですか?
また、削除と言ったのは、テーブルそのものです。
他者が残したオリジナルをコピーしてテストしているので、そのことによる支障はありません。

【8367】Re:プロセスを完了するには
発言  にしもり  - 06/7/27(木) 13:27 -

引用なし
パスワード
   こんにちは。
今回は、私自身が腑に落ちないと思っているのであって、対象テーブルが常にロック状態であったとしてもデータ更新自体はできることがわかりました。
ですからもしわたくしの質問が見当違い(気にするほどのことではない)なら
本件はそのまま放っておこうかと思っています。

私は自力解決をモットーにしていますが、難題を前に虚しく響いております。

【8376】Re:プロセスを完了するには
発言  小僧  - 06/7/31(月) 11:56 -

引用なし
パスワード
   ▼にしもり さん:
こんにちは。

業務が忙しくなかなかレスが付けられなくてすみません。

> でも、だからといってこのフォームが非連結、というわけではないのですよね

連結フォームというのは、
通常はフォームのレコードソースが指定されているものをそう呼びますね。

フォーム上に配置されたテキストボックスやコンボボックスの
コントロールソースを指定すると、
特にコードを組むことなく値がテーブルに反映されます。

連結フォームで値を変更している最中(Dirty状態ですね)に
AfterUpdateなどのイベント処理でレコードソースと同じテーブルに
更新を掛けに行くと、

> 現在ほかのユーザまたはプロセスで使用されているので…

のエラーが発生する事が多々あります。

今回はそれに該当するかはちょっと状況が掴みづらいので解りませんが、
更新後処理の1行目に

DoCmd.RunCommand acCmdSaveRecord

と明示的にレコードを保存する事で回避できる場合もあります。

【8377】Re:プロセスを完了するには
お礼  にしもり  - 06/7/31(月) 14:05 -

引用なし
パスワード
   ▼小僧 さん:

>業務が忙しくなかなかレスが付けられなくてすみません。
ありがとうございます。でも無理をなさらないでください。

このDBの作者はDirty状態でflgを多用しているのでご指摘は的を得ていると思いました。が、すべての更新後処理の1行目にDoCmd.RunCommand acCmdSaveRecord を挿入してみましたが結果は同じでした。今のままでも更新自体はできますので、とりあえずここはこのままにしようと思います。

先日別のスレッドでクロ様よりのURLにあった本を頼み、届きましたので
遅まきながら盆休みに勉強をしようと思っています。

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