初心者のFileMaker pro Q&A

みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。

1.ファイルメーカーで解らない事があればここで質問して下さい。

何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)

ログインしていません。

アナウンス


#1 2020-09-09 11:42:56

salon_hiyake
メンバー

[解決] LetとWhileを使ったカスタム関数化に際して

お世話になっております.

カスタム関数を作ろうと思い,以下のような式を書き,データビューワ上では意図した通りに動作することを確認できました.

やろうとしていることは,「にばん」という正解の語を左から読んで,
その中に,解答候補「いち」「に」「さん」のどれかが含まれていれば,その直後に「●」を挿入する,ということです.
(この例では「に●ばん」が出力される)

データビューワでは動作したので,$をチルダに置き換えて,カスタム関数として登録したところ,意図した動作になりません.
($を全て消去して,計算フィールドの定義として使用してみましたが同じでした)

何か単純な見落としではないかと思いますが,自分では思いつきません.
どなたか手助けいただけないでしょうか?

よろしくお願いします.

式:

``````````````````````````````````````````````````````````
Let ( [
  $lst= List( "いち" ; "に" ; "さん" ) ;
  $ExactAns = "にばん" ;
  $Ans = "";
  $NumOfValues = ValueCount ( $lst )
  ] ;                               //Let内の初期値
  While (
    [   
      $i = 1
    ] ;                             //初期変数
      $i  ≤  $NumOfValues and IsEmpty ( $Ans );
                                    //継続条件:全ての値をトライしたか、または、値が見つかったら終了
        [
        $tpAns = GetValue ( $lst ; $i )  ;
        $LenTpAns = Length($tpAns);
        $ExactAnsLeft = Left ( $ExactAns ; $LenTpAns );
        $i = $i + 1 ;
        $Ans = If (
                            Exact ( $ExactAnsLeft ; $tpAns ) ;
                            $ExactAnsLeft ; ""
                           )
        ] ;       //ロジック。ぴったりの語が見つかれば,その直後に●を挿入,そうでなければ「なし」
     If ( IsEmpty ( $Ans ) ; "なし" ;
                                   Substitute ( Left ( $ExactAns ; $LenTpAns ) ; $tpAns ; $tpAns & "●" ) & Right ( $ExactAns ; Length ( $ExactAns ) - $LenTpAns )
                                   )      //結果 全ての値をトライしてなければ「なし」、あれば推定値
    )
  )
``````````````````````````````````````````````````````````

オフライン

#2 2020-09-09 12:14:19

Shin
メンバー

Re: [解決] LetとWhileを使ったカスタム関数化に際して

$をチルダに置き換えないで,カスタム関数として登録したらどうなりますか。
while は、ローカル変数か、その内部で定義した関数内変数が必要な感じです。
また、Let() の中に While があるのは何か不自然。Whike の最初のブロックは、必要な変数のイニシャライズですので、ここにおいてみたら動くかもしれません、

編集者 Shin (2020-09-09 12:17:05)

オフライン

#3 2020-09-09 13:23:48

qb_dp
メンバー

Re: [解決] LetとWhileを使ったカスタム関数化に際して

While (
    [   
      ~i = 1;
      ~Ans = ""
    ] ;
で大丈夫でしょう。

以下の式で片付いたりして...
Substitute ( "にばん" ; ["いち" ; "いち●"]; ["に" ; "に●"] ; ["さん" ; "さん●"] )

オフライン

#4 2020-09-09 13:39:35

salon_hiyake
メンバー

Re: [解決] LetとWhileを使ったカスタム関数化に際して

Shinさん,qb_dpさん,ありがとうございます.Letはいらなかったようです.
以下の式でカスタム関数で動きました.失礼しました.


``````````````````````````````````````````````````````````
  While (
    [   
      ~i = 1;
      ~lst= List( "いち" ; "に" ; "さん" ) ;
      ~ExactAns = "にばん" ;
      ~Ans = "";
      ~NumOfValues = ValueCount ( ~lst )
    ] ;                             //初期変数
      ~i  ≤  ~NumOfValues and IsEmpty ( ~Ans );
                                    //継続条件:全ての値をトライしたか、または、値が見つかったら終了
        [
        ~tpAns = GetValue ( ~lst ; ~i )  ;
        ~LenTpAns = Length(~tpAns);
        ~ExactAnsLeft = Left ( ~ExactAns ; ~LenTpAns );
        ~i = ~i + 1 ;
        ~Ans = If (
                            Exact ( ~ExactAnsLeft ; ~tpAns ) ;
                            ~ExactAnsLeft ; ""
                           )
        ] ;       //ロジック。ぴったりの語が見つかれば,その直後に●を挿入,そうでなければ「なし」
     If ( IsEmpty ( ~Ans ) ; "なし" ;
                                   Substitute ( Left ( ~ExactAns ; ~LenTpAns ) ; ~tpAns ; ~tpAns & "●" ) & Right ( ~ExactAns ; Length ( ~ExactAns ) - ~LenTpAns )
                                   )      //結果 全ての値をトライしてなければ「なし」、あれば推定値
          )
``````````````````````````````````````````````````````````

While関数を書き慣れなれていなくてすみません.
補足質問で恐縮ですが,LetとWhileを併用するべき場面,というのはどういうケースがありますでしょうか?

オフライン

#5 2020-09-09 14:57:13

Shin
メンバー

Re: [解決] LetとWhileを使ったカスタム関数化に際して

While の中に Let() はあるでしょうが、Let の中に While は考えつかないです。

オフライン

#6 2020-09-09 15:10:50

qb_dp
メンバー

Re: [解決] LetとWhileを使ったカスタム関数化に際して

好みの書き方で良いのでは。
私は、以下のように書くのが好きかも。

レコードをJSONとして取得(繰り返しフィールド対応)
https://fm-aid.com/custom-function/28-getrecordasjson2

LET([
      ~lst= List( "いち" ; "に" ; "さん" ) ;
      ~ExactAns = "にばん" 
];
While (
    [   
      ~i = 1;
      ~Ans = "";
      ~NumOfValues = ValueCount ( ~lst )
    ] ;                             //初期変数
      ~i  ≤  ~NumOfValues and IsEmpty ( ~Ans );
                                    //継続条件:全ての値をトライしたか、または、値が見つかったら終了
        [
        ~tpAns = GetValue ( ~lst ; ~i )  ;
        ~LenTpAns = Length(~tpAns);
        ~ExactAnsLeft = Left ( ~ExactAns ; ~LenTpAns );
        ~i = ~i + 1 ;
        ~Ans = If (
                            Exact ( ~ExactAnsLeft ; ~tpAns ) ;
                            ~ExactAnsLeft ; ""
                           )
        ] ;       //ロジック。ぴったりの語が見つかれば,その直後に●を挿入,そうでなければ「なし」
     If ( IsEmpty ( ~Ans ) ; "なし" ;
                                   Substitute ( Left ( ~ExactAns ; ~LenTpAns ) ; ~tpAns ; ~tpAns & "●" ) & Right ( ~ExactAns ; Length ( ~ExactAns ) - ~LenTpAns )
                                   )      //結果 全ての値をトライしてなければ「なし」、あれば推定値
          )
)

オフライン

#7 2020-09-09 18:36:55

mic
メンバー

Re: [解決] LetとWhileを使ったカスタム関数化に際して

While は Let と同じく、自スコープ内の関数変数しか参照出来ないようです。
ネストして使うなら$を付けてローカル変数にする必要があるということでしょうか。

オフライン

#8 2020-09-10 07:48:48

himadanee
ゲストユーザー

Re: [解決] LetとWhileを使ったカスタム関数化に際して

参照できるがループ内での変更が保存されない、のはずです。ヘルプにはLetとWhileの組み合わせの例しか出てませんが。。。

クィック投稿

メッセージを書いて送信してください。
登録の確認

実在の人物による登録であることを確認します。

Board footer