| 2.2.3.13 ゼロによる除算の処理 ゼロによる除算は、QUERY
ファイルのオープン (OPNQRYF) コマンドではエラーとみなされます。
通常、レコード選択はフィールド・マッピング・エラーが発生(たとえば、フィールド・マッピングによる除算エラーが発生)する前に行われます。したがって、ゼロによる除算エラーの原因となったレコードを(QRYSLT
パラメーター値およびレコード内の有効データに基づいて)除外することができます。こういった場合、レコードが除外されて、OPNQRYF
コマンドによる処理が続行されます。
答えをゼロにしたい場合には、通常の商業データに実際に使用できる以下のような方法があります。
A を B で除算して C を得たいとします(式で表すと、A / B = C
となります)。以下の定義で、B はゼロの場合があるとします。
| フィールド |
桁数 |
10進数 |
| A |
6 |
2 |
| B |
3 |
0 |
| C |
6 |
2 |
以下の算法を使用できます。
(A * B) / %MAX((B * B) .nnnn1)
%MAX 関数は、B * B
または最小値のうち、大きい方を返します。最小値には十分な桁数のゼロを先行させ、B
がゼロでない場合に B * B
で計算されるどんな値よりも小さくなるようにしなければなりません。この例では、B
は小数部がゼロなので、.1 を使用することができます。先行するゼロの数は、B の小数部の桁数の 2倍にする必要があります。たとえば、B
の小数部が 2 桁の場合には、.00001 を使用します。
以下の MAPFLD 定義を指定します。
MAPFLD((C '(A * B) / %MAX((B * B) .1)'))
最初の乗算の目的は、B
がゼロの場合に被除数をゼロにすることです。このようにすると、除算が行われたときに、結果がゼロになります。B
がゼロの場合には除数として .1
が使用されるので、ゼロによる除算は起こりません。 |