FTP

26. PACK数字フィールドを Ftpで転送するには?

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によって転送すると
正しい数値として転送することができる。