みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
Pages: 1
お世話になっております.
カスタム関数を作ろうと思い,以下のような式を書き,データビューワ上では意図した通りに動作することを確認できました.
やろうとしていることは,「にばん」という正解の語を左から読んで,
その中に,解答候補「いち」「に」「さん」のどれかが含まれていれば,その直後に「●」を挿入する,ということです.
(この例では「に●ばん」が出力される)
データビューワでは動作したので,$をチルダに置き換えて,カスタム関数として登録したところ,意図した動作になりません.
($を全て消去して,計算フィールドの定義として使用してみましたが同じでした)
何か単純な見落としではないかと思いますが,自分では思いつきません.
どなたか手助けいただけないでしょうか?
よろしくお願いします.
式:
``````````````````````````````````````````````````````````
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 )
) //結果 全ての値をトライしてなければ「なし」、あれば推定値
)
)
``````````````````````````````````````````````````````````
Offline
$をチルダに置き換えないで,カスタム関数として登録したらどうなりますか。
while は、ローカル変数か、その内部で定義した関数内変数が必要な感じです。
また、Let() の中に While があるのは何か不自然。Whike の最初のブロックは、必要な変数のイニシャライズですので、ここにおいてみたら動くかもしれません、
Last edited by Shin (2020-09-09 12:17:05)
Offline
While (
[
~i = 1;
~Ans = ""
] ;
で大丈夫でしょう。
以下の式で片付いたりして...
Substitute ( "にばん" ; ["いち" ; "いち●"]; ["に" ; "に●"] ; ["さん" ; "さん●"] )
Offline
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を併用するべき場面,というのはどういうケースがありますでしょうか?
Offline
While の中に Let() はあるでしょうが、Let の中に While は考えつかないです。
Offline
好みの書き方で良いのでは。
私は、以下のように書くのが好きかも。
レコードを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 )
) //結果 全ての値をトライしてなければ「なし」、あれば推定値
)
)
Offline
While は Let と同じく、自スコープ内の関数変数しか参照出来ないようです。
ネストして使うなら$を付けてローカル変数にする必要があるということでしょうか。
Offline
参照できるがループ内での変更が保存されない、のはずです。ヘルプにはLetとWhileの組み合わせの例しか出てませんが。。。
Pages: 1
[ Generated in 0.005 seconds, 9 queries executed - Memory usage: 528.27 KiB (Peak: 549.17 KiB) ]