13 返信 最新の回答 日時: Jun 6, 2017 4:36 PM ユーザー:qbxxdp

    複数のスクリプト引数を使ってスクリプトを動かしたい

    s_tsubo

      いつもディスカッションを読んで勉強させていただいております。

      皆さまお忙しいかとは思いますが、お知恵を貸していただきたいです。

       

      環境はこの通りです。

      iPhone iOS 10.3.2

       FM go 15

      Mac OS X 10.12.5

       FM Pro 15 Advanced

       

      次のような、写真や画像を収集するソフトを作っています。

      Dropbox - 複数のスクリプト引数.fmp12

      Starter Solutionの「製品カタログ」を参考に作っていたのですが、思った通りの機能が作れなくて困ってます。

       

      やりたいことは、

      「1つのテーマ(レコード)についての写真や画像を、空いているフィールド(ここでは 画像::参照ファイル* )に保存したい」

      です。

       

      それをするために、自分なりに作ってみて現在の形になっています。

      私が実現させようとしている機能は、1つのスクリプトで2つのスクリプト引数を使用するものです。

      引数1→ GetField ( 画像::参照ファイル* )

      引数2→ GetFieldName ( 画像::参照ファイル* )

       

      ①タップしたフィールドが空かどうか引数1を使って判定して、空であれば、カメラで撮影するか写真から画像を選ぶか、選んでデータを格納します。

      ②フィールドが空でなければ何もしません。

      ③空であっても空でなくても、画像::選択されたファイル に引数2を使ってフィールド名を保存して、大きな閲覧用フィールド(画像::選択されたオブジェクト)に画像が大きく表示されるようにします。

       

      スクリプトデバッガでチェックしたところ、上記の②と③はちゃんと動いているみたいなんですが、①が思った通りに動きません。

      (フィールドが空なのに、If文の判定が真ではない)

       

      長文になってしまい、すみません。

      お知恵を貸していただけるとありがたいです。

      よろしくお願い致します。

        • 1. Re: 複数のスクリプト引数を使ってスクリプトを動かしたい
          user14047

          FileMaker Pro 16 ヘルプ : List(関数)

          目的

          フィールド内の空白を除く値の連結一覧を返します。

          List ( "" ; "A" ) の結果は ¶A ではなく A です。

          空白を含む引数の指定に List 関数を使うのは不向きですので、

          1行目の引数 & ¶ & 2行目の引数 と ¶ で結んでみてください。

           

          また、引数の値に名前をつけた連想配列を利用することで、こういったトラブルを防ぐことができます。

          Google 検索 : FileMaker dictionary関数

           

          FileMaker 16 から、JSON 系の関数が利用できるようになったので、カスタム関数を利用して Dictionary 関数を作らなくても

          標準の関数で利用できるようになって便利になりました。

          • 2. Re: 複数のスクリプト引数を使ってスクリプトを動かしたい
            sago350@未来Switch

            ボタンの引数↓に色々設定しているので、1,2,3だけにしてスクリプト内で分岐した方が楽そうかなと思います。

             

            List (

              GetField ( 画像::参照ファイル1 ) ;

              GetFieldName ( 画像::参照ファイル1 )

            )

             

            スクリーンショット 2017-06-06 12.46.22.png

            私の考えとしては、レイアウトモードでボタンをカチカチしてたくさん引数を設定するよりは、引数は単純にしてスクリプト内で頑張ったほうが設定もデバッグが楽かなと思います。

            • 3. Re: 複数のスクリプト引数を使ってスクリプトを動かしたい
              s_tsubo

              user14047様

               

              早速のご返信を頂きまして、ありがとうございます。

               

              List関数は空白を無視するんですね、見落としていました。

              ご指摘の通り、& ¶ &を間に挟む方法で、If文の判定が狙った通りになりました。

              • 4. Re: 複数のスクリプト引数を使ってスクリプトを動かしたい
                s_tsubo

                sago350@未来Switch様

                 

                早速のご返信ありがとうございます。

                スクリプトの画像とサンプルファイルまで…、ありがたいです。

                 

                そうなんです。実際のソフトではもっとたくさんの画像を格納しています。

                ですから、一つ一つ複雑な引数を設定するのは面倒に思っていました。

                (顔など写っていますので、今回は構造を簡単にしたものをアップしました)

                 

                サンプルファイルの方を参考にして、続きの機能がうまく動くかどうか、研究してみようかと思います。

                • 5. Re: 複数のスクリプト引数を使ってスクリプトを動かしたい
                  qbxxdp

                  ボタンではなく

                  スクリプトトリガ:OnObjectEnter にして、

                  引数は、以下のようにします。

                   

                  "$field_value=" & Quote ( Get ( アクティブフィールド内容 ) )

                  &";$field_name=" & Quote ( Get ( アクティブフィールド名 ) )

                   

                  実行するスクリプトで、以下を実行すれば、変数:$field_value、$field_name にそれぞれ値が設定されます。

                   

                  変数を設定 [$er; 値:Evaluate ( "Let ( [" & Get ( スクリプト引数 ) & "] ; 0 )" )]

                   

                  この方法なら値に改行があっても問題ありません。

                  それとフィールドの引数の設定も同じで大丈夫です。

                  • 6. Re: 複数のスクリプト引数を使ってスクリプトを動かしたい
                    s_tsubo

                    続けて失礼します。

                    If文の判定がうまくいきまして、カスタムダイアログも出てくれたんですが、カメラや写真が動いてくれません。

                    もしかしてこれは、アクティブなフィールドが指定されていないからでしょうか…?

                     

                    とりあえずいただいた見本やURLを参考にして、勉強してみます。

                     

                    今回の教訓は、「スクリプト引数はできるだけシンプルな方が良い」ですね。

                    List関数を使うにしても、シンプルな方が使いやすそうです。

                    Dictionary関数は…私には少し難解でしたがいつか理解しようと思います。

                     

                    うまくいきましたら、また報告致します。

                    • 7. Re: 複数のスクリプト引数を使ってスクリプトを動かしたい
                      user14047
                      • フィールド数分の複数行のステップを If で引数のフィールド名をみながら分岐させる
                      • [フィールドへ移動]スクリプトステップで目的のフィールドをアクティブにしておく。(ターゲットフィールドの指定がない場合はアクティブなフィールドが利用される)
                      • グローバルフィールドを別途用意しデバイスから挿入で指定し、[フィールドを名前で設定] スクリプトステップ で目的のフィールドに設定する

                       

                      などいろいろ考えられます。

                       

                      FileMaker Pro 16 ヘルプ : デバイスから挿入(スクリプトステップ)

                      フィールドが指定されていないときに、現在アクティブなフィールドがオブジェクトフィールドまたはテキストフィールドの場合はこれが使用されます。
                      • 8. Re: 複数のスクリプト引数を使ってスクリプトを動かしたい
                        qbxxdp

                        前の投稿で書いていますが、

                         

                        ボタンではなく

                        スクリプトトリガ:OnObjectEnter にする。

                        引数は、以下にする。

                        "$field_value=" & Quote ( Get ( アクティブフィールド内容 ) )

                        &";$field_name=" & Quote ( Get ( アクティブフィールド名 ) )

                         

                        コレで「ディバイスから挿入」のエラーの問題も、

                        各フィールドのスクリプト引数の設定の煩わしさもどちらも解決しますよ。

                         

                        フィールドがたくさんある場合、一つスクリプト指定、引数指定の設定をすれば、後は、コピーしてフィールドの指定を変更するだけです。

                        • 9. Re: 複数のスクリプト引数を使ってスクリプトを動かしたい
                          user14047

                          この場合は、ボタンにするより、OnObjectEnter でスクリプトを実行させた方がスマートですよね。

                          • 10. Re: 複数のスクリプト引数を使ってスクリプトを動かしたい
                            s_tsubo

                            qbxxdp様

                             

                            ご返信ありがとうございます。

                            そしてお返事が遅くなってしまい、すみません。

                             

                            やってみたらすごくスマートに出来ました!

                            フィールドごとに設定を分ける必要がなくて、めちゃくちゃスッキリします。

                            ほんともうビックリです。

                            Evaluate、Let、Quoteなど、使い方が分からなくて敬遠していた関数なんですが、とても便利なんですね。

                             

                            Dropbox - 複数のスクリプト引数_改良1.fmp12

                             

                            変数の「$er」は、[変数を設定]で「$field_value」と「$field_name」を設定するためだけのもので、それそのものは使わない…と解釈したのですが合っておりますでしょうか?

                             

                            参照ファイルの条件付き書式が正常に動いてくれない等、課題がありますが何とか頑張ってみます。

                             

                            ありがとうございました。

                            • 11. Re: 複数のスクリプト引数を使ってスクリプトを動かしたい
                              s_tsubo

                              user14047様

                               

                              ご指摘ありがとうございます。

                              そしてお返事が遅くなってしまい、すみません。

                               

                              • グローバルフィールドを別途用意しデバイスから挿入で指定し、[フィールドを名前で設定] スクリプトステップ で目的のフィールドに設定する

                              データをひとまず取り込んでから、空いているフィールドを探してデータを入れられないかと考えていました。

                              (元のソフトはフィールドがたくさんあるので、「空いているフィールドを探し出してタップするのは面倒」と言われていたんです)

                              方法が思いつかなくて断念していたんですが、グローバルフィールドを使えば出来そうな気がしてきました。

                               

                              こちらの方法も検討してみます。

                              ありがとうございました。

                              • 12. Re: 複数のスクリプト引数を使ってスクリプトを動かしたい
                                s_tsubo

                                sago様

                                 

                                頂いたサンプルファイルを参考にして元のソフトを改良してみたところ、うまくいきました。

                                ご報告が遅くなってしまいました。すみません。

                                 

                                丁寧なご指導がありがたいです。

                                今後ともよろしくお願いします。

                                • 13. Re: 複数のスクリプト引数を使ってスクリプトを動かしたい
                                  qbxxdp

                                  >変数の「$er」は、[変数を設定]で「$field_value」と「$field_name」を設定するためだけのもので、それそのものは使わない…と解釈したのですが合っておりますでしょうか?

                                   

                                  その考え方で大丈夫です。