最初のページに戻ります。

総合の目次があるページに戻ります。

よく使うマニュアルです

Wiki

updated on 2004.06.23

9.22.OPNQRYFの除算エラーの回避

[ Previous ] [ HOME ] [ Upper ] [ Next ]


OPNQRYFでも除算エラーの扱いは、マニュアルに有りました。

DB2 AS/400 用 データベース・プログラミング バージョン 4 資料番号 SD88-5035-00

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 が使用されるので、ゼロによる除算は起こりません。

というわけですが、ここのポイントは、%MAXですね。これが、QRYにもあればなあ。

(A*B) / (B*B)は、分母分子をBで約分すれば、A / Bに戻りますね。従って、同値として扱っているようですが、小数以下がA、Bにある時、内部の計算は大丈夫かなと思います。でもマニュアルで言っているのだから、大丈夫でしょう。

また、「先行するゼロの数は、B の小数部の桁数の 2倍にする必要があります」とは、たとえば、Bが偶然、0.01の場合、%MAXの中が、(0.01*0.01 0.00001)で、(0.0001 0.00001)のうち、最初の値を使いたいからです。B*B=Bの2乗なので、(x/100)*(x/100)=(x/10000)なのです。そこで、0の数を2倍にする(よって、小数部分は、全部でそれプラス+1桁)必要なのですね。勿論、Bが0ならば、%MAX(0.0000 0.00001)なので、0.00001が選択されるわけです。よく考えられています。


[ Previous ] [ HOME ] [ Upper ] [ Next ]

You are at K's tips-n-kicks of AS/400

 

SEO [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送