人生でいちばんスベッた瞬間

見積システムを作成していまして、ロックの処理をVBAにて作成しました。
リストを開くとき、「見積」テーブルにある「レコードロック」というレコードがTrueになります。
そのため別の使用者が開いた際、ロックがかかり開けないという仕組みになっています。

<リストの開いた時のコード>
Private Sub Form_Open(Cancel As Integer)
On Error Resume Next
If Me.レコードロック = True Then


MsgBox "別の使用者がいるため開くことができません。", vbOKOnly + vbExclamation, "レコードロック"
Cancel = True

Else

閉じる_ボタン.Enabled = True
キャンセル.Enabled = False
更新_ボタン.Enabled = False
一覧に反映.Enabled = False

End If
End Sub

リストを開けない時、メッセージボックスにて"別の使用者がいるため開くことができません。"と表示されるのですが
これを"○○が使用しているため開くことができません。"と変更したいです。

「○○」はリストを開いた時点で自動で取得するように作成すべく、
「見積」テーブルにある「レコードロック者」というレコードに記入するため追加クエリを作成しました。
<追加クエリのSQLビュー>
UPDATE Q_見積 SET Q_見積.[レコードロック者] = a()
WHERE (((Q_見積.見積番号)=[forms]![リスト]![見積番号]));

内容としましてはリストにある見積番号とテーブルにある見積番号が同じの場合、「見積」のテーブルの該当する見積番号のレコードロック者にコンピューター名を入れる処理です。


「○○」をコンピューター名にするため「a」という変数を作成し開いた時のコードを変更しました。
<リストの開いた時のコード 変更後>
Private Sub Form_Open(Cancel As Integer)
On Error Resume Next
Public a As String
If Me.レコードロック = True Then


MsgBox "別の使用者がいるため開くことができません。", vbOKOnly + vbExclamation, "レコードロック"
Cancel = True

Else
a = Environ(“ComputerName”)

DoCmd.SetWarnings False
DoCmd.OpenQuery "追加クエリ"
DoCmd.SetWarnings True

閉じる_ボタン.Enabled = True
キャンセル.Enabled = False
更新_ボタン.Enabled = False
一覧に反映.Enabled = False

End If
End Sub

しかし、リストを開くことはできますがレコードロック者に名前が追加されることはなかったです。
追加クエリを確認すると「式に未確定関数'a'があります。」と表示されました。

どのように変更すればよいでしょうか?
ご教授の方、お願い致します。

<備考>
・Microsoft access2021
・windows11 home、64ビット

A 回答 (1件)

状況が良く分かっていないので『怪答』かもしれません。


フィールドを一個追加して(名前を仮にWhoとします)フォームにも配置。
で、
>Private Sub Form_Open(Cancel As Integer)
>On Error Resume Next '※現段階でResume NextしてるとDebugで混乱するかと
の時に
If nz(Me!Who,"")="" then
me!Who=environ("computername") 'この時Accessでレコードロックされるはず
else
msgbox me!Who & "が使用中なのでバイバイ",vbokonly
Cancel=true
end if
end sub

※フォームをCloseする時には
me!who=""
で戻す
ではいかが?

余談ですが
>DoCmd.SetWarnings False
>DoCmd.OpenQuery "追加クエリ"
>DoCmd.SetWarnings True
アクションクエリ(更新・追加・削除)の実行確認が出るのを止めるために
Setwarningsしてますが
Currentdb.execute(Sql文)なら確認のメッセージが出ません。
Dim sSql as string
sSql="UPDATE Q_見積 SET Q_見積.[レコードロック者] ='" & environ("computername") & "'"
ssql=ssql & "WHERE (((Q_見積.見積番号)=" & [forms]![リスト]![見積番号] & "));"
currentdb.execute ssql,dbfailonerror
みたいな感じです。
ご参考まで。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

me!Who=environ("computername")

この処理で追加したフィールド、「who」にコンピューター名が登録されるのと思われるのですが、レコードをコピーし実際に起動したところエラーは起きませんでしたがコンピューター名が追加されることもなかったです。
恐らくですが、見積番号とテーブルにある見積番号が同じの場合フォームを開くため追加で条件式が必要です。
WHEREにて追加するでしょうか?


余談についてVBAの提示ありがとうございます。
同様のレコードが大量にあるため、検討させていただきます。

お礼日時:2024/08/02 14:41

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

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


おすすめ情報

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