初心者のFileMaker pro Q&A (旧掲示板)

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

1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)

You are not logged in.

Announcement

新しい掲示板は、こちら:https://fm-aid.com/forum/t/filemaker


#1 2019-05-02 14:07:25

中田
Member

変数の挙動について

いつもお世話になっております。
変数の挙動について教えて下さい。

現在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

#2 2019-05-02 16:08:18

Shin
Member

Re: 変数の挙動について

手入力で、全角の4を入力していませんか。

Offline

#3 2019-05-02 16:12:24

Hiro
Member

Re: 変数の挙動について

当てずっぽですが、
「数値」比較と「文字」比較との違いでないかな?
例えば、真が返るのは、
・     4<21
・   ”4”>"21"

Offline

#4 2019-05-02 16:19:17

中田
Member

Re: 変数の挙動について

Shin様、いつも教えて頂き有り難うございます。

単純なスクリプトを作り半角で再度試してみましたが同様でした。
Loop
変数を設定 [$Counter; 値;$Counter+1]
Exit Loop If [$Counter > 21 ]
End Loop

これをデバッガで追っていきステップ3のExit Loop If [$Counter > 21 ]の段階でデータビューアから3を入力すると真になり抜けてしまいます。
データビューアで監視に同じ式を入れてみましたが1となりました。

Offline

#5 2019-05-02 16:24:09

中田
Member

Re: 変数の挙動について

Hiro様、いつも教えて頂き有り難うございます。

恐らく手入力すると文字として認識されるのかなと思います、手入力しなければ式の通りになりますので。
ただこの場合無視して良いのか、スクリプト内での動きでも何かのタイミングで"文字"として認識してしまう事があるのか。
もしかして数字の変数は全てGetAsNumberを付けなければダメなのかなと思いまして。

Offline

#6 2019-05-02 16:28:56

中田
Member

Re: 変数の挙動について

上記の内容で1と2を手入力しても偽になり3から真になるようなので恐らく>21の最初の2で比較しているようです。

Offline

#7 2019-05-02 16:41:08

Shin
Member

Re: 変数の挙動について

手元の FileMaker16 Mac でも再現します。
変数に限らず、FIleMaker は内部保存にテキストを使っているようで、それを場面に応じて数値などへ変換してるようです。
変数をデバッガの中で設定するときに、テキストのままで評価してしまうのではないかと思います。$Count+0 > 21 としてみると、強制的に数値に変換され、正しい動きになります。
スクリプトの動きの中では、その前の行で $Count + 1 として数値が代入されていますので、動きとしては問題ないと思います。
不具合として報告されてはいかがでしょう。

Last edited by Shin (2019-05-02 16:49:03)

Offline

#8 2019-05-02 16:46:25

Moz
Member

Re: 変数の挙動について

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

#9 2019-05-02 16:53:49

中田
Member

Re: 変数の挙動について

Shin様、返信有り難うございます。

>>スクリプトの動きの中では、その前の行で $Count + 1 として数値が代入されていますので、動きとしては問題ないと思います。

これを聞いて安心しました。
今まで作ったスクリプト全部見直さなければいけないかと思いまして。
基本テキストが入っていなければ大丈夫そうと理解しました。

>>それを場面に応じて数値などへ変換してる

これを頭に入れながら作りたいと思います。

不具合としての報告ですが私がまだ不具合かどうかもよく分からない初心者ですので今回は控えさせて頂きます。

有り難うございました。

Offline

#10 2019-05-02 16:57:52

中田
Member

Re: 変数の挙動について

Moz様、返信ありがとうございます。
大変勉強になります。
データビューアで入力した瞬間にTextになるとか面白いですね。

教えて下さり、有り難うございます。

Offline

#11 2019-05-02 18:16:00

Hiro
Member

Re: 変数の挙動について

外出で返答に出遅れました。

変数の中身に関係なく、目的の判別式中で明示的に「数値」変換するのが安心安全でしょう。
   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

#12 2019-05-02 21:15:45

中田
Member

Re: 変数の挙動について

Hiro様、ご返答有り難うございます。

>>・自動入力:$Counter = $Counter + 1  →  数値演算子+から「数値」と識別可能
・手動入力:$Counter = キーボード入力  →  不明
※判別式($Counter>21)内の材料(比較演算子「>」)ではデータタイプの判断が
できないので、このような不明な場合に限って、文字として比較演算する仕様です。

上記の説明でなるほどとすっきりしました。
このような事は中々情報が無く教えて下さり大変勉強になります。
有り難うございます。

Last edited by 中田 (2019-05-02 22:30:29)

Offline

Registered users online in this topic: 0, guests: 1
[Bot] claudebot

Board footer

Powered by FluxBB
Modified by Visman

[ Generated in 0.005 seconds, 9 queries executed - Memory usage: 542.07 KiB (Peak: 562.98 KiB) ]