While関数とLoopスクリプト

FileMaker Pro 18 Advanced から「While関数」が登場しました。
今まではカスタム関数で実現させていた再帰ができる関数です。

この関数、何度か使っているのですが「すっ」と書けたことがありませんでした^^;
毎回計算結果が「?」になってしまったり、思ったものと異なる結果が返ってきてしまい、
試行錯誤しながらちょこちょこ直して「ようやく完成!」という手際の悪さで作っていました。

それが11月に開催されたFM-ChubuでWhile関数を試してみて、
自分の大きな勘違いにようやく気づくことができ、
すっと書けるようになりました(遅すぎですが・・・)

文字列を階段のような形にする計算式

「あいうえお」という文字列を、
 あ
 あい
 あいう
 あいうえ
 あいうえお
という具合にして返すにはどうしたらいいか?

「While関数」の構文を確認しましょう。

While ( [ 初期変数 ] ; 条件 ; [ ロジック ] ; 結果 )

このように書くことになっています。
ヘルプには以下のことも書かれています。

条件が真の間にロジックを繰り返してから、結果を返します。

それぞれの引数の役割については以下のように書かれています。

初期変数 以降の引数に使用できる変数の定義
条件   各ループの繰り返しの前に評価される論理式。
     真の間はループが繰り返されます。偽になるとループは停止します。
ロジック ループが繰り返されるごとに評価される変数の定義
結果   ループが停止したときに返される式

初期変数、条件、ロジック(ここが繰り返される部分)、結果の4つに分かれています。

この4つをみていると、
Loopステップを使ってスクリプトで実現するときの考え方に似ているように思いませんか?
(私は似ているように思いました)

Loopだとすんなりかけるのに、なぜか関数になるとうまく書けない。
なんでだろう?
と思っていたのですが、先日、ユーザー会でこの関数を取り上げた際、
進行してくれた方がさらっと言ってくれたことで気がつきました。

「条件は続けるための条件です」

これです。
ヘルプにも書かれているのですが、思い込みが強すぎて、
しっかり読めていませんでした^^;

Loopの場合、
ExitLoopIfで「Loopから抜ける条件を記載」します。
なので、While関数の条件を書くところも、
「抜ける条件を書くもの」と思い込んでいたのです。

これに気が付いたら、意外とすんなり書けました!
ようやくスッキリです。

スッキリしたので、計算式を書いておくことにします。
また混乱することもありそうなちょっと未来の私のために…^^;

While関数を使って計算式を作ってみる

「あいうえお」と入力するフィールドの名前は「文字列」、
計算結果を返す(計算式を書く)フィールドの名前は「文字階段計算結果_ct」としています。


While (
   //初期変数
   [
   count = 0 ;
   結果 = ""
    ] ;

   //条件(続けるための条件)
   count < Length ( 文字列 ) ;

   //ロジック
    [
   count = count + 1 ;
   結果 = 結果 & Left ( 文字列 ; count ) & ¶
    ] ;

   //結果
   Left ( 結果 ; Length ( 結果 ) - 1 )

   ) //while


これで実現できました。

ついでに?スクリプトの場合どうしていたかも書いておきます。

スクリプトで実現してみる

#初期変数
変数を設定 [ $count; 値:0 ]
変数を設定 [ $結果; 値:"" ]

Loop
 #条件(ただし、ここでは抜ける条件になる)
 Exit Loop If [ $count ≥ Length ( Sample::文字列 ) ]

 #ロジック
 変数を設定 [ $count; 値:$count + 1 ]
 変数を設定 [ $結果; 値:$結果 & Left ( Sample::文字列 ; $count ) & "¶" ]

End Loop

#結果
フィールド設定 [ Sample::文字階段スクリプト結果; Left ( $結果 ; Length ( $結果 ) - 1 ) ]


今回の計算はシンプルなものですのでお役に立てるかどうかわかりませんが、
お役に立てるようでしたら、ご自由にお使いくださいませ。

なお、今回も
ご紹介した計算式の使い方、ご質問などはお受けしておりません。
また、ご利用になる場合はご自身の責任でお使いくださいますようお願いいたします<(_ _)>

それと、相変わらず打たれ弱いので、ツッコミなどはこっそりメールでお願いします。


投稿者