見出し画像

FileMaker 特定フィールドだけ制限を緩める Part 2

以前に「FileMaker 特定フィールドだけ制限を緩める」という記事を書いていました。これは編集不可になっているレコードのある一部を変更したいというユーザーさんのリクエストから探し出した機能です。
しかし、Filemaker Pro 19.6あるいは19.5では動作しないことがわかったのでした。(元記事にも追記しておきました。)

今回はスクリプトトリガとレイアウトの工夫で解決しました。
大まかな流れは

  1. 編集したいフィールドに入力しているように見せて、

  2. 一旦グローバル格納のフィールドに書き込み、

  3. 目的のフィールドにグローバル格納のフィールドの値を完全アクセス権で設定する

と言ったような感じです。

用意するフィールド

一時入力用にグローバル格納のフィールドを用意します。
テキスト形式でg_text1 みたいな感じでいいかと思います。

スクリプトの作成

OnObjectEnter スクリプトトリガに設定するスクリプトを作成します。
フィールド編集開始
変数を設定 [ $params ; 値: Get ( スクリプト引数 ) ]
変数を設定 [ $$content ; 値: Case(IsEmpty($params) ; "";JSONGetElement ( $params ; "content" )) ]
変数を設定 [ $$id ; 値: 管理台帳__::ID ]
フィールド設定 [ $$content ]
現在のスクリプト終了 [ テキスト結果:    ]

スクリプト引数として下記のようなJSONデータを渡します。
編集開始前のフィールドが空欄でなければ、引数に設定します。

Case(
not IsEmpty ( 変更したいフィールド);
JSONSetElement ( "" ;
[ "content" ; 変更したいフィールド ;JSONString ]
);""
)

OnObjectExitスクリプトトリガに設定するスクリプトです。
フィールド編集終了
変数を設定 [ $params ; 値: Get ( スクリプト引数 ) ]
変数を設定 [ $newContent ; 値: Get ( アクティブフィールド内容 ) ]
If [ Exact ( $newContent; $$content ) ]
Else If [ not Exact ( $newContent ; $$content ) ]
フィールドを名前で設定 [ JSONGetElement ( $params ; "targetField" ) ; $newContent ]
Else If [ IsEmpty($newContent) ]
フィールドを名前で設定 [ JSONGetElement ( $params ; "targetField" ) ; "" ]
End If
変数を設定 [ $$content ]
現在のスクリプト終了 [ テキスト結果:    ]

スクリプト引数として下記のようなJSONデータを渡します。
値を設定したいフィールド名を設定しています。
JSONSetElement ( "" ; "targetField" ; GetFieldName ( 変更したいフィールド);JSONString)

気をつけるポイント

上記どちらのスクリプトとも、スクリプトワークスペース上で「完全アクセス権を付与」するのをお忘れなく!

レイアウトの調整

次はレイアウトの調整です。
変更したいフィールドの下に、先ほど追加した「g_text」フィールドを配置します。
編集モードで入力を許可しておきます。
スクリプトトリガに先ほどのスクリプトと引数を設定します。

元のフィールドをg_textフィールドにピッタリ重なるように配置します。
元のフィールドはフィールド入力のオプションでブラウズモードでは入力できないようにチェックを外します。
検索モードはチェックをつけておきましょう

レイアウトを保存します。

これで設定は終了です。
制限されたアカウントで入力できるかテストもお忘れなく!

メモ
1.一時編集用のグローバル格納フィールドは別のテーブルに作成した方が私の好みです。変更しなければ、該当のレコードに編集したという履歴が発生しないからです。
2.最初、フィールドごとにスクリプトや一時格納のフィールドを用意したので、おいおいな状況になってしまいました。フィールドも、スクリプトも増え続けることになり、ちょっとスマートじゃないなこれと考えました。
Get(アクティブフィールド内容)を利用すれば、グローバルフィールドの値をすぐにとれて、汎用的に書けるなというのに気がつきました。
編集終了時に一時フィールドの中身をクリアしておけば別のフィールド編集用に使い回しできます。
これで追加追加が発生してもだいぶ気楽になりましたね。
3.別のテーブルに制限を緩めるフィールド分ければいいんじゃないか?と一時考えたのですが、ログを取る都合があり今回の方法となりました。

お役に立てれば何よりです。


この記事が気に入ったらサポートをしてみませんか?