FtpでiSeries400のデータ・ベースのPACK数字フィールドを転送すると文字化けになってしまう。
これはiSeries400のFtpクライアントがデータ・ベースをありのままに読んでいるだけなので
起こる現象である。Ftpクライアントと言えども単なるTCP/IPアプリケーションのひとつに
過ぎないので、iSeries400に搭載するFtpであれば PACK数字フィールドはアンパックして
送信する配慮がIBMにあっても良かったのではないかと思うが、Ftpの仕様としいう観点から正直に
あるがままのD⁄Bをそのまま転送するという方式にしてしまったのであろう。
弊社でも実際、iSeries400用のFtpクライアントである「SNDFTP」をSpoolライターの
機能の一部として開発したが、これはIFSファイルのみの転送なので、
アンパックの必要は無かったが今後、DB2/400をサポートする場合はPACK数字フィールドは
当然、アンパックして転送するつもりである。
さて、それはともかく現状でPACK数字をFtpによって転送したい場合はやはり一旦、
ZONE数字のフィールドのファイルにコピーしてからそれを Ftpによってダウンロードするしか
方法がない。あるデータ・ベースに対して次のような DDS記述のファイルがあるとする。
0001.00 A********************************************** 0002.00 A* HSZAIKO : 品種別商品在庫 * 0003.00 A********************************************** 0004.00 A UNIQUE 0005.00 A R @HSZAIKO 0006.00 A* 0007.00 A HZSCOD 4A COLHDG(' 品種 コード') 0008.00 A ZHCODE 10A COLHDG(' 商品 コード') 0009.00 A* 0010.00 A HZSUR 7P 0 COLHDG(' 在庫数 ') 0011.00 A* 0012.00 A K HZSCOD 0013.00 A K ZHCODE
ここで「在庫数」は7桁のPACK数字フィールドである。
このDDSソースから P を S に変更しただけの全く同じレイアウトのDDSソースを次のように作成する。
0001.00 A********************************************** 0002.00 A* HSZAIKO : 品種別商品在庫 * 0003.00 A********************************************** 0004.00 A UNIQUE 0005.00 A R @HSZAIKO 0006.00 A* 0007.00 A HZSCOD 4A COLHDG(' 品種 コード') 0008.00 A ZHCODE 10A COLHDG(' 商品 コード') 0009.00 A* 0010.00 A HZSUR 7S 0 COLHDG(' 在庫数 ') 0011.00 A* 0012.00 A K HZSCOD 0013.00 A K ZHCODE
このファイルを例えば QTEMP に作成して
CPYF FROMFILE(QTRFIL/HSZAIKO) TOFILE(QTEMP/HSZAIKO) MBROPT(*REPLACE) FMTOPT(*MAP *DROP)
によってZONEフィールドのファイルに FMTOPT(*MAP *DROP)
によってコピーすると
在庫数がZONE である QTEMP/HSZAIKO が作成されるので、これを Ftpによって転送すると
正しい数値として転送することができる。