クリック画像の実寸表示

段ボール箱を机にした猫 ファイルメーカー(filemaker)のちらしの裏のメモ書き

TOP  >  レコードの確定を制御する(2)
作成日:2024年12月02日

レコードの確定を制御する(2)

イメージイラスト
にゃん太

どうも、にゃん太です

前回、レコードの確定をキャンセルする、という方法でレコードの確定タイミングを制御する方法を説明しました

しかし、設計上の都合から、この方法では対応できない場合もあります

今回のメモでは、別の方法でレコード確定タイミングを制御する方法を書いていきます


レコード確定のキャンセルでは困る場合

前回、レコードの確定の制御方法について書きました
何となくもっと制限がありそうな印象でしたが、確定していなくてもリレーション先の表示は更新されます
前回、参考に挙げた画面では、性別を番号で指定すると対応するテキストが表示されるのですが、問題なく更新される事が確認できます
また、レコード確定に絡まなければボタン押下の処理も実行できますし、その中では別ウインドウを開くこともできます
ですので、多くの場合はこの方法で実装すれば手間もかからず便利です
しかし、この方法では対応できない場合もあります
例えば、情報量が多く、複数レイアウトにまたがって入力をさせる場合です
同じレコードへのアクセスをする場合であっても、レイアウトを切り替える場合にはレコードの確定処理が必須となってしまう為、実行できません

グローバルフィールドでの対応

レコード確定のキャンセルの代替手段として、グローバルフィールドを活用する方法があります
1つ目は、現在のレコード内容を一旦グローバルフィールドにバックアップし、入力がキャンセルされたらグローバルフィールドから値を元に戻す方法があります
2つ目は、グローバルフィールドに入力し、入力が確定されたらグローバルフィールドから値を該当レコードに割り当てる方法です
1つ目の方法は、処理中にアプリケーションが落ちた場合に元に戻せなくなる上、複数人利用の場合に確定前に修正情報が他者が入力中の値を参照する可能性があるなどの問題があるため、あまり推奨しません
ですので、以下は2つ目の方法で進めていきます

確定処理の方法とそのリスク

確定処理の方法ですが、これはシンプルにフィールド値を引き渡すだけです

レコードの確定

# ################################################## # グローバルフィールドを活用した場合 # ################################################## フィールドの設定 [test::姓; global::g姓] フィールドの設定 [test::名; global::g名] フィールドの設定 [test::性別; global::g性別] フィールドの設定 [test::生年月日; global::g生年月日] フィールドの設定 [test::郵便番号; global::g郵便番号] フィールドの設定 [test::住所; global::g住所]

といった具合です
至極簡単な方法ですが、問題がないわけでもありません
レコードの確定をキャンセルする方法とは違い、値の引渡処理を自分で記述する必要があります
上記の例程度の量なら問題ありませんが、これが大量になってくると記述するだけで一仕事です
また、量が増えるほど誤記載のリスクが高まります

デザイン関数でフィールド一覧を取得する

上記問題への対策としては、デザイン関数を活用する事で対策可能です
FieldNames関数では、指定したファイル名、レイアウト名に配置されたフィールドを一覧で返してくれます

フィールド取得

変数を設定 [$test; 値: FieldNames ( Get ( ファイル名 ); "formTest" )] カスタムダイアログを表示 [$test]

取得結果

といった具合に配置されたフィールド名が取得できます
後は順番にスクリプトで処理すれば、量が多くても誤記載のリスクなく簡単に実行できます

レコードの確定

# ################################################## # デザイン関数を使用した場合 # ################################################## 変数を設定 [$fields; 値: FieldNames ( Get ( ファイル名 ); "formTest" )] 変数を設定 [$count; 値: ValueCount ( $fields )] 変数を設定 [$table; 値: Get ( レイアウトテーブル名 )] 変数を設定 [$i; 値: 1] Loop [ フラッシュ:常に ] Exit Loop If [$i > $count] 変数を設定 [$field; 値: GetValue ( $fields; $i )] If [Exact ( Left ( $field; 1 ); "g" )] フィールドを名前で設定 ["test::" & Middle ( $field; 2; Length ( $field ) - 1 ); GetField ( "global::" & $field )] End If End Loop

他の方法

他には、グローバルフィールドではなく、別途作成したテーブルのレコードに入力させる方法があります
方法としてはグローバルフィールドを用いた方法と近似な為、説明しませんが、入力したレコードを残す事で、変更履歴として活用できるという利点があります
一長一短ありますが、場合によっては非常に便利に活用できる方法でしょう

メモ書き終了の案内イラスト

以上で今日のメモ書きは終了です

内容はいかがでしたか?

もしご意見やご要望、誤りの指摘などありましたら、下記フォームよりお気軽にご連絡ください

ご連絡フォーム