みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
Pages: 1
いつもお世話になっております。
変数の挙動について教えて下さい。
現在FileMakerServer17にクライアントFileMaker17で使用しております。
変数
$Counter
をカウントアップしていって
Exit Loop if $Counter > 21
のようなスクリプトを作りました。
デバッガで確認中に気が付いたのですがデータビューアから直接$Counterの数字を例えば4(半角で)に変更すると何故かExitしてしまいます。
スクリプト中で$Counter+1で進めていった場合はExit Loop if $Counter > 21の通りになりますが手入力すると21最初の数字2で計算されているようです。
Exit Loop if GetAsNumber($Counter) > 21とすると手入力でも式の通りの挙動となります。
そこで教えて頂きたいのですがこれが通常の動きなのでしょうか?
またスクリプト内の記述として内容が数字の変数の場合はGetAsNumberを通常つけた方が良いのでしょうか?
ご教授、宜しくお願い致します。
Last edited by 中田 (2019-05-02 16:01:50)
Offline
手入力で、全角の4を入力していませんか。
Offline
当てずっぽですが、
「数値」比較と「文字」比較との違いでないかな?
例えば、真が返るのは、
・ 4<21
・ ”4”>"21"
Offline
Shin様、いつも教えて頂き有り難うございます。
単純なスクリプトを作り半角で再度試してみましたが同様でした。
Loop
変数を設定 [$Counter; 値;$Counter+1]
Exit Loop If [$Counter > 21 ]
End Loop
これをデバッガで追っていきステップ3のExit Loop If [$Counter > 21 ]の段階でデータビューアから3を入力すると真になり抜けてしまいます。
データビューアで監視に同じ式を入れてみましたが1となりました。
Offline
Hiro様、いつも教えて頂き有り難うございます。
恐らく手入力すると文字として認識されるのかなと思います、手入力しなければ式の通りになりますので。
ただこの場合無視して良いのか、スクリプト内での動きでも何かのタイミングで"文字"として認識してしまう事があるのか。
もしかして数字の変数は全てGetAsNumberを付けなければダメなのかなと思いまして。
Offline
上記の内容で1と2を手入力しても偽になり3から真になるようなので恐らく>21の最初の2で比較しているようです。
Offline
手元の FileMaker16 Mac でも再現します。
変数に限らず、FIleMaker は内部保存にテキストを使っているようで、それを場面に応じて数値などへ変換してるようです。
変数をデバッガの中で設定するときに、テキストのままで評価してしまうのではないかと思います。$Count+0 > 21 としてみると、強制的に数値に変換され、正しい動きになります。
スクリプトの動きの中では、その前の行で $Count + 1 として数値が代入されていますので、動きとしては問題ないと思います。
不具合として報告されてはいかがでしょう。
Last edited by Shin (2019-05-02 16:49:03)
Offline
Shinさんが既に書かれていますが変数のタイプは自動的に設定されます。明示する場合は GetAsXxxx 関数を使います。
例示されたスクリプトの場合は[変数を設定]で $Counter + 1 が設定される際に数字タイプに設定されています。
ところが、データビューアから変数を入力すると変数はテキストタイプになってしまうため、
[Exit Loop If]ではテキスト比較が行われてしまうために Loop から抜けてしまいます。
これを防ぐためには既に書かれている通り GetAsNumber ( $Counter ) のように型指定の関数を使い
評価する時点で変数の型を決め打ちする必要があります。
データタイプを判定できる関数があれば良いのですが......海外では製品のアイデアに投稿されています。
※変数を設定する際に自動判定してるんだから手入力でも判定できると考えれば不具合ですネ。
MBSプラグインを利用すると変数のタイプを判定する外部関数が利用できます。
https://www.mbsplugins.eu/FMDataType.shtml
こちらを使うと上記の流れがよく分かります。
データビューアで入力した瞬間にnumber から text にタイプが変わります。
Last edited by Moz (2019-05-02 16:48:30)
Offline
Shin様、返信有り難うございます。
>>スクリプトの動きの中では、その前の行で $Count + 1 として数値が代入されていますので、動きとしては問題ないと思います。
これを聞いて安心しました。
今まで作ったスクリプト全部見直さなければいけないかと思いまして。
基本テキストが入っていなければ大丈夫そうと理解しました。
>>それを場面に応じて数値などへ変換してる
これを頭に入れながら作りたいと思います。
不具合としての報告ですが私がまだ不具合かどうかもよく分からない初心者ですので今回は控えさせて頂きます。
有り難うございました。
Offline
Moz様、返信ありがとうございます。
大変勉強になります。
データビューアで入力した瞬間にTextになるとか面白いですね。
教えて下さり、有り難うございます。
Offline
外出で返答に出遅れました。
変数の中身に関係なく、目的の判別式中で明示的に「数値」変換するのが安心安全でしょう。
Exit Loop If [ $Counter $Counter*1 > 21 ]
>#5『恐らく手入力すると文字として認識されるのかなと思います、』
・自動入力:$Counter = $Counter + 1 → 数値演算子+から「数値」と識別可能
・手動入力:$Counter = キーボード入力 → 不明
※判別式($Counter>21)内の材料(比較演算子「>」)ではデータタイプの判断が
できないので、このような不明な場合に限って、文字として比較演算する仕様です。
Last edited by Hiro (2019-05-02 19:02:39)
Offline
Hiro様、ご返答有り難うございます。
>>・自動入力:$Counter = $Counter + 1 → 数値演算子+から「数値」と識別可能
・手動入力:$Counter = キーボード入力 → 不明
※判別式($Counter>21)内の材料(比較演算子「>」)ではデータタイプの判断が
できないので、このような不明な場合に限って、文字として比較演算する仕様です。
上記の説明でなるほどとすっきりしました。
このような事は中々情報が無く教えて下さり大変勉強になります。
有り難うございます。
Last edited by 中田 (2019-05-02 22:30:29)
Offline
Pages: 1
[ Generated in 0.062 seconds, 11 queries executed - Memory usage: 544.98 KiB (Peak: 565.88 KiB) ]