FileMakerと関係ありませんが、我が家は割とデータベースの話に花が咲きます。
まったりとした休日のある日、話の流れは忘れましたがゼロディバイドの話が出、「そういえばFileMakerでゼロとか空白で除算するとエラーって何返ってくるんだっけ?」となり、記事にまとめました。
構文エラーになることはなるよね。
(きっとFileMaker技術者認定の方やFBAの方々には当然の話なんでしょうけど。。。)
ランタイムエラーと構文エラー
初歩的なところで、前提としてまとめておきます。
エラー | 大体の説明 |
---|---|
ランタイムエラー | 式自体は合っているけれど、実際の計算をした時にレコードがなかったりで正常に処理が遂行できない時のエラー |
構文エラー | そもそも計算できないでしょ?というようなエラー。例えば、カッコがないとか、今回のようなゼロや空白で除算など。 |
カッコがない時、そもそもスクリプトを書いているときにエラーになるでしょ?というケースもありますが、変数に計算式としてカッコを書いていて、実は閉じカッコが足りなかった、という時に、実行している時に構文エラーが返ります。
この辺のFileMakerガイドを参考にしてください。
ゼロ除算
2行目では、いつも通りに計算をし、結果をrec変数に保存します。
3行目で、その時のエラーコードを取得します。
構文エラーを取得するには、EvaluationErrorという論理関数を使用すると取得できるので、4行目で構文エラーを取得します。
結果です。
構文エラーが返ってきました。
エラーコード15は、「0 で割ることができません」という内容です。
全くもって納得できるエラーコードです。
空白除算
他の言語でいうところの、Null扱いに近いでしょうか?
多言語でも、Nullで除算はエラーが返ってきますので、大体想像はつきます。
結果です。
同じく、構文エラー15が返ってきました。
エラーメッセージ自体は「0で、、、」ですが、要は除算できないというメッセージです。
カスタマイズしたエラーメッセージを出す場合は、「ゼロもしくは値が設定されていない状態で除算が行われました」という柔らかいメッセージの方が良さそうですよね。
変数にして除算するとどうなる?
上記までは、単純に固定値を指定して除算しましたが、変数に割る値を代入して実行すると、同じ結果が返ってくるのでしょうか?
計算する時どこまで実装するか
全ての計算式に構文エラーを確認していてはコードが煩雑になり可読性も悪くなりそうです。
除算に限らず、計算式がテキストであるとかゼロが含まれている計算になったらまずい(大抵まずいですが)場合、EvaluateErrorを実装する、という程度でしょうか。
今回は変数で対応しましたが、フィールドのデータで計算式を組み立てる時に、元々の入力制限として下限値を設定しておく、などの対策をしてEvaluateErrorが発生しない(しにくい)構造にするのも手かと思います。