7 返信 最新の回答 日時: Jan 31, 2017 6:07 PM ユーザー:tt2016

    動的値一覧で関連付けられた値を選択後に、関連性のない値を選択しようとすると、選択不可にする方法を教えてください

    tt2016

      閲覧者様

       

      お世話になります。

      TT2016と申します。

       

      現在、勘定科目(経理の仕分け)の組み合わせを登録するレイアウトを作成しております。

       

       

      【現在状況】

      添付画像1、「動的値一覧_現在状況」のように、

      動的値一覧を用いて、

       

       種別(収入 or 支出)を選択すると、

       大項目は種別(収入 or 支出)に関連付いた値を選択出来ます。

       中項目は種別と大項目に関連づいた値を選択出来ます。

       小項目(収入 or 支払の名目)は、任意入力欄で特に条件はありません。

       

       そのため、添付画像では、

       種別(収入)に関連付いた、大項目(金銭貸借・一時支払)が選択されます。

       中項目は、種別(収入)と、大項目(金銭貸借・一時支払)に関連付いた、

       仮払金が選択されます。

       

       

      【ご相談】

      添付画像2、「動的値一覧_中項目が入っている状態で大項目変更」のように、

      種別、大項目、中項目で値選択後に、関連性のない値に変更出来てしまいます。

      (添付画像では、大項目をその他に変更しています)

       

      1.

      関連性のない値に変更しようとすると、変更出来ないようにする方法はありますでしょうか?

       

      2.

      「1.」の条件を満たしつつ、

      中項目の値を空白にすれば、大項目を変更可能にすることは可能でしょうか?

       

       

      お手数ですが、ご教授の程よろしくお願いいたします。

        • 1. Re: 動的値一覧で関連付けられた値を選択後に、関連性のない値を選択しようとすると、選択不可にする方法を教えてください
          fukky

          大項目 > 中項目 > 小項目
          上位の項目が決まらなければ下位の項目は決められないのですから、

          上位の項目を変更したら下位の項目をリセットすればよいのでは?

           

          いきなりリセットするのかダイアログで確認するのかなどの工夫は必要でしょうが。

          1 人中 1 人が役に立つと言っています
          • 2. Re: 動的値一覧で関連付けられた値を選択後に、関連性のない値を選択しようとすると、選択不可にする方法を教えてください
            shin

            大項目の変更をトリガーで検出して,中項目の内容をチェックすればいいでしょう。Filter() を使って,該当する値一覧ちに絞り込み,それを設定してしまうのが簡単かも。

             

            それ以外にも、中項目側の自動入力で、大項目のデータの変更を感知して値を書き換える、または、中項目の値を見て値が入っていれば大項目の値を上書きし変更させない、という事も可能です。

            https://dl.dropboxusercontent.com/u/9260632/FileMaker/FMTips/forum/community169954.fmp12.zip

            1 人中 1 人が役に立つと言っています
            • 3. Re: 動的値一覧で関連付けられた値を選択後に、関連性のない値を選択しようとすると、選択不可にする方法を教えてください
              tt2016

              fukky様

               

              ご教授ありがとうございます。

               

              上位の項目を変更したら下位の項目をリセットするという発想がありませんでした。

              この手法であれば、現時点での私の技能でも、実現出来そうです。

              早々のご回答ありがとうございます。

              • 4. Re: 動的値一覧で関連付けられた値を選択後に、関連性のない値を選択しようとすると、選択不可にする方法を教えてください
                tt2016

                shin様

                 

                ご教授ありがとうございます。

                また、先日の温かいご回答、ありがとうございます。

                 

                サンプルデータまで、添付いただきありがとうございます。

                ファイルメーカーでこのような挙動まで出来るなんて驚きです。

                しっかり読み解いて、使いこなせるようにします。

                 

                ありがとうございます。

                • 5. Re: 動的値一覧で関連付けられた値を選択後に、関連性のない値を選択しようとすると、選択不可にする方法を教えてください
                  tt2016

                  【情報共有】

                  shin様からいただいた動的値一覧のサンプルデータの理解が済んだので共有です。

                  参考情報になれば幸いです。

                   

                   

                  サンプルデータ

                  community169954

                   

                  【前提条件】

                  1.ご教授いただいた内容

                   ①中項目の内容に応じて、大項目の値を固定化する。

                  (中項目がaaを選択していると、大項目はBを選択出来ない。)

                   

                   ②大項目の内容に応じて、中項目の値を空白にする。

                  (中項目がaaを選択している時に大項目をBに変更すうと、aaが消える)

                   

                   

                  2.各種設定

                  添付の「①_各種設定状況.jpg」を参照ください。

                  テーブル、レイアウト、リレーション、値一覧などの各種設定画像を

                  まとめた画像を添付しております。

                   

                   

                  3.実現方法

                  下記設定を行うことで実現可能

                   ・リレーションシップ

                   ・動的値一覧

                   ・フィールドオプションに、入力値の自動化の、計算値を設定する。

                   

                   

                  【計算値の中身】

                   ①中項目の内容に応じて、大項目の値を固定化する。

                  (中項目がaaを選択していると、大項目はBを選択出来ない。)

                   

                  Case (

                  IsEmpty ( C2 ) ; Self ;

                  Value C::Parents

                  )

                   

                  上記case文は、P2(大項目)のフィールドオプション、計算値に設定されている。

                   

                  条件1で、C2(中項目)の値が空白であるか確認を行っている。

                  C2(中項目)の値が空白の場合は、Self関数で、P2(大項目)に入力されている現在の値を表示する。

                   

                  条件1以外の場合は、デフォルト値を返す。

                  デフォルト値は、テーブルValue CのParentsの値を表示する。

                  テーブル「Value C」は、テーブル「main」とC2⇔Children(中項目)でリレーションシップを行っている。

                  結果、中項目にaaかaaaが入っているなら、大項目の選択肢はAのみとなる。

                  そのため、ドロップダウンリストにBという選択肢が表示されるが、リレーションシップの結果、存在しない値を選択しようとして選べないようです。

                   

                  ※※

                  Value Cは、Valueを複製したテーブルです。

                  リレーションシップを参照ください。

                   

                  ドロップダウンリストで使用されている値は、

                  テーブル「value」のレコード値を参照ください。

                   

                   

                  ==================

                   ②大項目の内容に応じて、中項目の値を空白にする。

                  (中項目がaaを選択している時に大項目をBに変更すうと、aaが消える)

                   

                  Let (

                  $t = P ;

                  GetValue ( FilterValues ( ValueListItems ( Get ( ファイル名 ) ; "C" ) ; Self ) ; 1 )

                  )

                   

                  フィールドC(中項目)の計算値として設定されている。

                   

                  概要としては、ValueListItemsで出力された動的値一覧の値を、(変数定義でリレーションシップで絞り込まれた動的値一覧)

                  FilterValuesで、現在入力されているフィールド値(self)と比較、フィルターをかける。GetValueで、フィルターがかかった値の1個目を出力する。

                   

                   

                  順を追うと、

                  ①ValueListItemsで、動的値一覧の値を返す。

                   動的値一覧の値を返す条件として、

                   対象となるファイルは、Get ( ファイル名 )で返す。(community169954)

                   値一覧は、C。(ファイル名community169954の、値Cが対象となる)

                   

                   今回、Let関数で、$t = Pという変数設定を行っている。

                   Pは、大項目の値が設定されている。(A or B)

                   テーブルmain⇔Value Pは、フィールドP⇔Parentsでリレーションシップしている。

                   Cは、テーブルValue Pから参照しているので、

                   そのため、大項目をAと選択すると、中項目はaa、aaaが選択可能。(Bならbb,bbb)

                   

                   先にLet関数で、変数定義を行った後に、

                   ValueListItemsの処理が実行されているので、

                   大項目がAを選択していると、ValueListItemsはaa,aaaを返す。(Bならbb,bbb)

                   Let関数で変数を定義すれば、直接変数を計算式に利用しなくても、結果的に利用されるケースがあるので注意が必要です。Let関数を削除して実行したら動きませんでした。

                   

                   ※参考画像 ②_ValueListItems_動的値一覧.jpg

                   

                   

                  ②FilterValuesで、ValueListItemsで返した値を、

                   フィールドCの現在入力されている値と比較、フィルタする。(Self関数で呼び出す)

                   現在入力されている値が空白なら、C(中項目)は、空白を返す。

                   

                   現在入力されている値が、aaならaaを、aaaならaaaを返す。(bbならbb、bbbならbbb)

                    

                   Self関数で、フィールドCに現在入力されている値は、変動しませんが、

                   P(大項目)が変動すると、ValueListItemsが返す値も変動します。

                   ValueListItemsで返した値と、Self関数の値が合致しないと、

                   結果、FilterValuesで、空白を返します。

                   

                   ※Cは、値一覧の名称のCと、フィールド名Cが存在します。

                   

                   

                  ③GetValueで、FilterValuesが返した値の1個目の値を、フィールドCに返す。

                   

                   

                  ④Letは、計算式を実行する前の変数定義で使用。

                   変数の利用タイミングは①を参照。

                   

                   

                  @ !==================

                   

                   

                  shin様

                   

                   

                  サンプルデータありがとうございました。

                  見本があるお陰で何とか読み解けました。

                  ご教授ありがとうございます。

                  • 6. Re: 動的値一覧で関連付けられた値を選択後に、関連性のない値を選択しようとすると、選択不可にする方法を教えてください
                    shin

                    ちょっとだけ間違っているので。

                    Let関数で、$t = Pとしているのは、変数を設定しようとしているのではなく、P が変化しているかどうか(save されたかどうか)の判断をさせているだけです。

                    FM11 までは、これが無くても動いたはずですが、FM12 以降は各フィールドの計算式の評価基準が変わって、その式の中に変化した(save された)フィールドを含むかどうかが加味された様です。これは、高速化には役立つのですが、この式の様に間接的に(動的な値一覧のキーが)変化したフィールドの評価は行われない様です。そのために、あえて無駄な変数格納をしています。

                    ローカル変数を使ってしまいましたが、場合によってはスクリプト内のローカル変数へ影響を与える事もありますので、let() 内の変数($ のつかないもの)へ変更した方が良いでしょう。

                    1 人中 1 人が役に立つと言っています
                    • 7. Re: 動的値一覧で関連付けられた値を選択後に、関連性のない値を選択しようとすると、選択不可にする方法を教えてください
                      tt2016

                      shin様

                       

                      ご訂正ありがとうございます。

                      お陰様で認識の誤りを修正出来ました。