みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
Pages: 1
Mac10.11.6 FM16です。
できないこと:
・オブジェクトフィールドへファイルをドロップしてスクリプトトリガを正しく発動したいです。
状況:
・オブジェクトフィールドへスクリプトトリガ(OnobjectModilfy)にスクリプトをセット
・オブジェクトフィールドを配置した、いくつかのレコードを一覧で表示しています。
(仮に対象レコードは3レコードとします)
・現在選択されているレコードは1番目とします。
・3番目のレコードのオブジェクトフィールドへFinder等フォルダより=>ファイルをドラッグアンドドロップします。
オブジェクトフィールドにセットしたトリガによりスクリプトが発動するのですが・・・1番目のレコードを対象にスクリプトを実行してしまいます。ドラッグアンドドロップをした3番目のレコードを対象にスクリプトを実行したいのです。
やってみたこと:
修正日時のタイムスタンプのフィールドを追加して>ドラッグアンドドロップ>修正日時でソート などしてみましたが、なぜか一番上に対象にしたいレコードがこない・・・などという結果になりました。
良い方法はないでしょうか?
Last edited by しろめだか (2018-02-09 21:57:26)
Offline
ライジングサンさんの素晴らしいサンプル
https://risingsun-system.biz/drag-and-d … filemaker/
を参考にして、オブジェクトフィールドに自動入力を作っておき、その中でレコード番号を取得しておけばいいです。
https://www.dropbox.com/s/w9vn6hva72oas … 7.zip?dl=0
修正日時でのソーとでも目的はできていますが。
Offline
こんなカンジとか。
「フィールド:修正タイムスタンプ」入力値の自動化:修正情報[タイムスタンプ]を作成。
リストレイアウトに「フィールド:修正タイムスタンプ」を配置。
「スクリプト:OnObjectModilfy[obj]」を作成
スクリプト:
フィールドへ移動 [テーブル::修正タイムスタンプ]
検索/痴漢を実行 [ダイアログあり:オフ;Get(スクリプト引数);次を検索]検索範囲:全レコード/検索条件|検索対象:現在のフィールド
オブジェクトフィールドにスクリプトトリガを設定。
イベント:OnObjectModilfy|スクリプト:OnObjectModilfy[obj]|スクリプト引数:Get ( タイムスタンプ )
Offline
素晴らしい回答ありがとうございます。
フィールド側の修正タイムスタンプとスクリプト引数としてのタイムスタンプの比較でレコードに移動する形で実現することができました。
しかし、私の作業では
この場合、1秒以内に次つぎと動作を行ってしまうと修正時刻が同時刻となってしまうため、誤動作することがありました。
【スクリプト一時停止/続行】1秒をスクリプトの最後等に入れてみましたが、入れる場所が悪いのか解消することができませんでした。
次のスクリプト発動するまでに一秒間、必ず空ける良い方法はありますでしょうか?
Last edited by しろめだか (2018-02-12 20:07:45)
Offline
1秒以内の操作は、ないかな~と思っていたのですが...。
その場合は、Get ( 現在の時刻 UTC ミリ秒 ) を使えば良いです。
「フィールド:修正タイムスタンプ」を 数値に変更。
入力値の自動化
計算値|フィールドに既存の値が存在する場合は置き換えない:OFF
式:
Evaluate ( Int(Get ( 現在の時刻 UTC ミリ秒 )/100); obj )
スクリプトトリガの引数を変更
イベント:OnObjectModilfy|スクリプト:OnObjectModilfy[obj]|スクリプト引数:Int(Get ( 現在の時刻 UTC ミリ秒 )/100)
Offline
ありがとうございます。
しっかり解決できそうです。
その他動作の、余談?になりますが、同じ状態でオブジェクトフィールドの内容を
クリックしてすぐに高速でdelete
の上記の作業をつぎつぎに行っているとクリックしたフィールドではなく、以前に選択されているレコードを対象にしていまいます。
クリックしてゆっくり余裕を持ってdeleteするとOnObjectModilfyのトリガによるスクリプトで意図した動作が行えましたが、
PCのスペックやバージョンよるものなのでしょうか?
mac10.11.6 FMPro16 Advanced16.0.4.403
Offline
Get ( 現在の時刻 UTC ミリ秒 )/100)
ココを変えれば、設定時間を変更できるので色々 ご自身で検証してみては。
Offline
確かに、高速の操作でなくてもたまに再現しますね。区切りをまたぐためでは。検索する際に数個小さい値以上にしておいて、最大を選ぶなどをしないとダメでしょう。ならば、UTCミリ秒のままで持たせておいて、数十ミリ秒前以降を検索したほうがいいかもしれません。
私の案では、その短時間の間に新規レコードが作られてしまうという場合以外は、そのような不具合は起こりません。お試しあれ。
Last edited by Shin (2018-02-13 09:28:49)
Offline
Shinさんのを見てみました。
Let (
$$rec = Get ( レコード番号 ) ;
Self
)
これでターゲットのレコード番号を取得しているのですね。素晴らしい。
Shinさんのがカンタンで良いですね。
Offline
たくさんのヒントをありがとうございます。
イマイチなぜ? 外部からファイルをドロップするとこの計算式で正しく位置が取れるのか?不明なので分かるまでにらめっこしてみます。
Let (
$$rec = Get ( レコード番号 ) ;
Self
)
現在のファイルの利点を活かせるよう試用させていただきます。
・・・それにしても 「スゴイ」
Last edited by しろめだか (2018-02-13 11:12:30)
Offline
元は、ライジングサンさんのファイルですので。
そのフィールドにドラップすると、そのフィールドに変更が加わります。上書きを許可しているので、その時点で自動入力が発動し、計算式が評価される。という仕組のようです。
トリガーでの時刻を見てみると、数ミリ秒ほど遅れが出るんですね。(環境に依って異なるでしょうが、十分高速の環境でも0にはならないです)それを考慮すると、面倒な検索が必要になります。その数ミリ秒の間に何かが起こると、どうしようも無いですが。
Offline
Pages: 1
[ Generated in 0.010 seconds, 9 queries executed - Memory usage: 568.69 KiB (Peak: 585.59 KiB) ]