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

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

よく使うマニュアルです

Wiki

updated on 2004.06.23

14.4.数字について

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


System36から移行したプログラムが、よくデシマルエラー起こしますよね。(10進数エラー;「数字または符号が正しくない」)。あれって、なんだかご存知ですか。
つまり、「数字として正しくない」データを見つけたといって騒いでいるのです。では、どうならいいのでしょうか。

AS/400のDB2/400で扱う数字は、ゾーン10進、パック10進、バイナリがあります。おのおの、どのように違うか説明しておきます。

ゾーン10進数

DDSのデータタイプ‘S‘がゾーン10進数です。情報処理試験の参考書にも載っているレギュラーな数字タイプです。一バイトを上位4ビットと下位4ビット(ちなみに、4ビットを1ニブルといいます)にわけて、符号以外は、上位4ビットはヘキサF固定で、最後の桁の符号は、プラスがF、マイナスがDです。下位4ビットは数字0は0だし、1なら1となります。
たとえば、-415008はヘキサではX'F4F1F5F0F0D8'となります。数字6桁ならば6バイト必要です。

パック10進

DDSのデータタイプ`P`または省略すると、パック10進数です。これも、レギュラーな数字タイプです。これは、なるべく記録する媒体を節約して数字を記録する手法だと思えばいいです。符号以外の上位4ビットと下位4ビットは各々数字一個一個を意味します。ゾーン10進の固定Fがもったいないので、そこにも数字を入れたわけです。
たとえば、-415008はヘキサでは、X'0415008D'となります。数字6桁ならば4バイト必要です。ヘキサの先頭一ニブルが無駄ですね。そうです。奇数桁でないとぴったり入らないのです。だから、パックにするときは、なるべく奇数桁にします。それに、その方が演算が速いらしいです。

バイナリ

DDSのデータタイプ‘B‘すると、バイナリです。いわゆる2進数といわれるもので、占有バイト数は2バイトか4バイト以外ありません。RPGのプログラムでは、コンパイラーが内部展開するときにパック10進数にしています。もちろん外部媒体への書き出しはバイナリ形式になります。2バイトのバイナリフィールドの最大10進数は9999(4桁)で、4バイトのバイナリフィールドの最大10進数は999999999(9桁)です。DDSの定義で数字桁を3桁のバイナリにすると、実際のバッファ上の桁数は2バイトで、5桁以上にすると、バッファの桁数は4バイトを占めます。OSが勝手に桁数を決めてくれます。表現上が1〜4桁だとディスク2バイト占有され、5から9桁はディスク4バイト占有されます。この辺に注意してください。業務ではあまり使いませんが、APIで頻繁に出てきます。


ところで、10進エラーの件ですが、たとえば、パック10進で、X’40404F’は、正しいのですが、X'404040'は、正しくありません。後者は最後の符号エリアがFでもDでもありませんね。SYSTEM36では、後者はちゃんと404040という数字で出てくるのです。数字に関しての検査が甘い機械だったようです(ちなみにSYSTEM36の後半のバージョンで、もしかしたら修正されたかも知れません。私はこの点を知りません。)ところが一方、AS/400では、厳しい検査をしているので(当たり前だと思うのですが)数字エラーとなるのです。また、SYSTEM36でデータをディスクに書くとき、(内部記述ですので)レコード長分、X'00'でクリアしてから書き出すように先輩から指示されていましたが、SYSTEM36からAS/400にコンバージョンすれば同じ結果を招くでしょう。

なお、CRTRPGPGMで、IGNDECERR(Ignore Decimal Error)を*YESにすると、エラーを含むレコードはスキップされて、次のレコードのに進みます。適当に解釈して、そのレコードを処理してくれるわけではありません。気をつけてください。また、デシマルエラーは確か、そのフィールドを参照して始めて、エラーになったように思います。

それから、数字に関して、もう一つ。RPGのMOVE命令に気をつけてください。
以前、ソフトハウスに居たとき、ほかの人のプログラムのデバッグをしていたのですが、画面から、100と入力すると、100倍されるはずなのに、 0.1倍になります。不思議でした。でも、これを作った人がコボルから転向してきたことを聞き、はっと思いました。コボルでは転送命令はMOVEだけですが、RPGはZ-ADDがあります。そうです、小数点以下3桁の数字フィールドにMOVEしていたのです。結構大きなプログラムでやっと探し出しました。
RPGで、小数点以下がある数字フィールドにMOVEするときは、注意してください。たとえば小数点以下3桁の数字フィールドに数字100をMOVEすると0.100(つまり0.1)になります。Z-ADD命令ならば、100.000となります。MOVEはまるで、小数点があることを無視して、転送してしまうのです。詳しくはRPGのマニュアルを見てください。


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

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

 

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