Accessの「AllowEdits/編集の許可」プロパティが効かない場合
今回やりたかったこと
Accessを使ったツールの開発中,次のような要望が上がりました.
👨「ユーザが特定の操作を行うまで,フォーム(連結フォーム)の更新はさせないでほしい」
この要望を満たすのは一見簡単かと思ってました.
なにせ,AllowEdits/更新の許可という,そのまんまのプロパティがありますからね.
問題発生
で,結論から言うと,以下の制限に引っかかって見事に失敗しました.
フィールドの値をプログラムを使用して変更すると、"AllowEdits/更新の許可" プロパティの設定に関係なく、現在のレコードが編集可能になります。
今回はコマンドボタン等のコントロールの操作からVBAで直接値を投入する部分があったため,そちらの処理が優先されてしまい,ユーザの要望を叶えることができませんでした.
さらに,このコントロール操作が行われると,AllowEditsプロパティの値がまるっと無視されるというおまけつきです.もうこれは「敗北」と言っても差し支えないでしょう.
一応上記のサイトには,
"AllowEdits/更新の許可" が No に設定されているレコードをプログラムで変更する場合、そのレコードをユーザーが変更できないようにするには、プログラムでの変更を行った後にレコードを保存してください。変更が保存された後、"AllowEdits/更新の許可" プロパティの設定が再び有効になります。
‥という記述もあるのですが,今回ユーザの要望を満たすには「各コントロールのイベント発生時にAllowEditsの値を見,その値に応じてイベントのコードを切り替える」という処理を複数個書かなければならない状態となりました.これは面倒くさいし正直嫌です――結構イベントの個数が多かったので.
解決策(その1)
AccessのフォームにはRecordsetType/レコードセットというプロパティも存在します.
こちらは既定値が 0/ダイナセット ですが,2/スナップショット に設定すると,
‥という状態になります.こちらの方が多分容易に制御ができるんじゃないかと思います.
解決策(その2)
今回のユーザの要望は以下の通りでした.
👨「ユーザが特定の操作を行うまで,フォーム(連結フォーム)の更新はさせないでほしい」
なので,「編集を許可」というボタンをフォーム上に配置しておき,そこで上記の スナップショット/ダイナセット の切り替えを行うようにしました.
ただし,注意すべき点として,スナップショット・ダイナセットの切り替えを行うと,フォームのカレントレコードが先頭のレコードに変更されてしまいます.
なので,上記の切り替えを行う前に予めカレントレコードの位置を覚えておき,切り替え後にDoCmd.GoToPage/GoToPageマクロ・アクションを実行するとよいでしょう.
これで今回のユーザの要望はすべて達成することができました.めでたい.
*1:行おうとすると実行時エラーが発生する.