みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
お世話になります。
タイトルそのままなのですが、「フィールドの値が、スクリプトから変更されたか、ユーザーがキーボードから変更したかを見分けたい」です。
何か良い方法がありますでしょうか?
他にもやっている人がすでにいそうなのですが、検索では見つけられませんでした。
どうかよろしくお願いします。
Offline
なにも違いはないので、あらかじめスクリプトに細工をしておくとかしないと判別できないでしょう。
スクリプトの最初でローカル変数を設定しておき,そのフィールドが設定された時に、自動入力で、その変数をどこかに設定すればいいでしょう。(見えない文字にしておいて、埋め込んでもいいかもしれません)
手入力では、ローカル変数は消えていますので、設定されません。
ただし、一部を手入力した時はどうします?
Offline
himadaneeさん、Shinさん、ありがとうございます。
一応、以下のような方法で自己解決しました。
「スクリプトから変更されたか、ユーザーがキーボードから変更したか」を見張るフィールドを「テキストフィールド」とします。
「テキストフィールドの変更者」フィールドを用意しておきます。
レイアウト上の「テキストフィールド」にスクリプトトリガを設定し、OnObjectSaveで「値を変更」スクリプトが実行されるようにしておきます。
・ユーザーが値を変更したときは、必ずフィールドが選択された状態だと考えられるので、「テキストフィールド」=「Get(アクティブフィールド内容)」となります。
# 値を変更
# テキストフィールドにカーソルがあり、それの内容がフィールド内容と一致 → ユーザーによる変更とみなす
変数を設定 [ $アクティブフィールド内容が一致 ; 値: フィールドをユーザーが変更したかスクリプトから変更したか::テキストフィールド=Get(アクティブフィールド内容) ]
#
If [ $アクティブフィールド内容が一致 ]
フィールド設定 [ フィールドをユーザーが変更したかスクリプトから変更したか::テキストフィールドの変更者 ; "ユーザー" ]
Else
フィールド設定 [ フィールドをユーザーが変更したかスクリプトから変更したか::テキストフィールドの変更者 ; "スクリプト" ]
End If
・一方、スクリプトから値を変更する場合は、以下のようなスクリプトを用いて、フィールドからカーソルを外しておいて、値を変更し、変更者もスクリプトにするようにします。
# スクリプトから値を変更
フィールドへ移動 []
フィールド設定 [ フィールドをユーザーが変更したかスクリプトから変更したか::テキストフィールド ; "あああ" ]
フィールド設定 [ フィールドをユーザーが変更したかスクリプトから変更したか::テキストフィールドの変更者 ; "スクリプト" ]
レコード/検索条件確定 [ ダイアログあり: オフ ]
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
以上のような方法で解決しましたが、もっとスマートな方法がありそうな気もします。
Offline
そのフィールドを設定するスクリプトの最初に、
変数を設定[ $moderator ; Char(8238)] ]
の1行を入れておきます。
目的のフィールドの自動入力の計算に、上書きを許可して、
self & $moderator
としておきます。
目的のフィールドがスクリプトで変更された時のみに、見えないスペースが最後尾に付加されています。ただ、一部のみを手で変更された時の処理は、もう一手間いります。
Offline
Get(スクリプト名)でスクリプト実行中かどうかは判別できるので
「テキストフィールドの変更者」フィールド
を使うなら、それを計算値自動入力にすればいいのでは。例えば
Left(テキストフィールド;0) & Case(Get(スクリプト名)="";Get(アカウント名);"スクリプト")
監視用のスクリプトやトリガは不要です。
フィールドを設定する以外の何か別のスクリプトが動いている最中に手動で変更可能だと、手動での変更もスクリプトと判断されてしまうので、監視するフィールド変更スクリプトを特定したい場合は、""の代りにそのスクリプト名で判別します。
[ Generated in 0.022 seconds, 7 queries executed - Memory usage: 517.35 KiB (Peak: 521.89 KiB) ]