FTP による DD 名のサポート

この節では、バッチ・ジョブの JCL で割り振られたデータ・セットまたはファイル、または転送の前に対話式ユーザーにより割り振られたデータ・セットまたはファイル を FTP クライアントが転送する方法について説明します。FTP クライアントは割り振りで 使用される ddname を持つデータ・セットを参照します。

FTP クライアント API は ddname 転送をサポートしません。FTP クライアント API を使用してアプリケーション・プログラムを起動するバッチ・ジョブに関連した ddnames は、作成された FTP クライアント・プロセスでは使用できません。

クライアント・ファイル・アクセス・コマンドの 1–8 文字のローカル・ファイル名の前の接頭部として指定する //DD: トークンは、その後のトークンが、ローカル・ファイル名ではなく、実際には ddname であることを示します。この ddname はユーザーが割り振らなければなりません (例えば、FTP クライアントを開始した JCL で割り振ります)。put コマンドでローカル・ファイルにアクセスするために ddname を使用するときは、サーバー・ファイル名を明示的に指定しなければなりません。

クライアントが、データ・セットをオープンする前に、DCB 情報を必要とする場合もときにはあります。該当する状況としては、以下のような場合です。
  • スパン・レコードの読み取りおよび書き込み (RECFM=VS または VBS)
  • ASA 制御文字を含むレコードの読み取りおよび書き込み
  • RDW の保存中の可変長レコードの読み取りおよび書き込み
  • 末尾ブランクの保存中の固定長レコードの読み取りおよび書き込み

データ・セットが ddname を使用して割り振られており、それをオープンする前に DCB 情報が必要な場合は、 そのデータ・セットを割り振るときに使用された DD ステートメントの DCB 情報を FTP クライアントが検出できる必要があります。

ddname 割り振りに関する DCB 属性は、DD ステートメントの DCB パラメーターに指定された属性またはデータ・セット名を 使用して獲得されます。DCB パラメーターに逆方向参照を使用する際の制約事項については、「z/OS MVS JCL 解説書」を参照してください。

DD ステートメントがカタログ式 DASD データ・セットを参照する場合、 指定されていない DCB 属性はすべて DSCB から検索されます。DD ステートメントの DCB 属性は、DSCB で検出された DCB 属性をオーバーライドします。 ただし、LRECL=0 および BLKSIZE=0 については DSCB に異なる値があってもオーバーライドしません。

入力用にオープンされるテープ・データ・セットを DD ステートメントが参照する場合 (PUT //DD:)、READTAPEFormat 設定の代わりに、 DD ステートメントに指定されたレコード・フォーマットが使用されます。DD ステートメントにレコード・フォーマット (RECFM) がまったく指定されていない場合は、READTAPEFormat 設定 (もしあれば) が使用されます。

データ・セットが FTP によってオープンされたあとは、オープンによって DCB に戻されたデータを 使用して、そのデータ・セットの属性が設定されます。

制約事項:
  • 動的に割り振る ddname をバッチ・ジョブに渡す場合、その ddname を割り振るときに XTIOT、UCB nocapture、または 16 MB 境界より上の DSAB のオプションを使用しないでください。
  • MVSGet サブコマンドでは、ローカル・データ・セットを DD 名として 指定することはできません。
  • 空のファイルからのデータの転送を防ぐために、 FTP は、一連の連結ファイルの最初のファイルが空であるかどうかを検査し、 空のデータ・セットを割り振ります。データは転送されません。

    BSAM を 使用して一連の連結ファイルを転送する場合、そのうちの個々のファイルが空であってはなりません。つまり、個々のファイルが、有効なファイル終了インディケーター・セットを 持っている必要があります。

    連結データ・セットでは、いずれかのファイルが 空の場合は、PUT コマンドおよび APPEND コマンドを使用して データ・セットを転送することができます。データ・セットの 1 つが空の場合、 次のコマンドの実行が続行され、追加のデータが連結されます。

    put     //dd:infile1 target.ds
    append  //dd:infile2 target.ds   
    append  //dd:infile3 target.ds

    以下は、 入力が連結データ・セットで構成されており、最初のファイル USER35.GDG1 が 空で残りのファイルが空ではない場合の問題を示す サンプル JCL です。FTP は、最初のファイルの空のデータ・セットを検査し、 その結果、ヌル・ファイルを転送します。

    //STEP02 EXEC PGM=FTP,REGION=2048K,PARM='(TCP TCPCS TRACE'
    //STEPLIB DD DSN=USER33.LINKLIB,DISP=SHR 
    //SYSPRINT DD SYSOUT=* 
    //INFILE1 DD DSN=USER35.GDG1(+1),DISP=SHR          
    //        DD DSN=USER35.GDG2(+1),DISP=SHR
    //        DD DSN=USER34.FILE,DISP=SHR 
    //OUTPUT DD SYSOUT=* 
    //INPUT DD * 
    9.67.113.57 21 
    USER33 **pw** 
    put //DD:INFILE1 remote.file 
    quit  
    /*

    この問題を解決するために、代わりに以下のサンプル JCL を 使用することができます。

    //STEP02 EXEC PGM=FTP,REGION=2048K,PARM='(TCP TCPCS TRACE' 
    //STEPLIB DD DSN=USER33.LINKLIB,DISP=SHR 
    //SYSPRINT DD SYSOUT=* 
    //INFILE1 DD DSN=USER35.GDG1(+1),DISP=SHR
    //INFILE2 DD DSN=USER35.GDG2(+1),DISP=SHR
    //INFILE3 DD DSN=USER34.FILE,DISP=SHR 
    //OUTPUT DD SYSOUT=* 
    //INPUT DD * 
    9.67.113.57 21 
    USER33 **pw** 
    put //DD:INFILE1 remote.file 
    append //DD:INFILE2 remote.file 
    append //DD:INFILE3 remote.file 
    quit 
    /* 
    注: この制限は、GDG データ・セットだけでなく、すべてのタイプの データ・セットに適用されます。
以下は、//DD: トークンの使用法を示すサンプル・ジョブです。このサンプル・ジョブには、//DD: トークンを指定したローカル・ファイル指定を使用する 2 つのデータ・セットがあります。1 つは、STEP01 で新規の GDG データ・セットとして作成されるデータ・セットです (OUTSET DD ステートメントを参照)。STEP02 (FTP ステップ) では、このデータ・セットを位置指定するため、DD02 DD ステートメントで逆方向参照を使用していることに注意してください。参照された DD ステートメントには明示的な DCB 属性が含まれているので、FTP は、データ・セットをオープンする前に 属性にアクセスすることができます。2 番目のデータ・セットは、このジョブが実行される前に存在した古いデータ・セットです。
 
	//USER33J  JOB  MSGLEVEL=1,MSGCLASS=H,USER=USER33,PASSWORD=**pw**
	//STEP01   EXEC PGM=IEBDG
	//SYSPRINT DD  SYSOUT=A
1	//OUTSET   DD  DSNAME=USER33.MYGDG(+1),DISP=(NEW,CATLG,CATLG),
 	//             VOLUME=SER=CPDLB1,SPACE=(TRK,(5,5)),UNIT=SYSDA,
	//             DCB=(RECFM=FB,LRECL=80,BLKSIZE=800)
	//SYSIN    DD  *
		< create statements >
	//STEP02   EXEC PGM=FTP,REGION=2048K,PARM='(TCP TCPCS TRACE'
	//STEPLIB  DD  DSN=USER33.LINKLIB,DISP=SHR
	//SYSPRINT DD  SYSOUT=*
2	//DD01     DD  DSNAME=USER33.TEST.S.A,DISP=OLD
3	//DD02     DD  DSNAME=*.STEP01.OUTSET,DISP=SHR
	//OUTPUT   DD  SYSOUT=*
	//INPUT    DD  *
	9.67.113.57 6321
	USER33 **pw**
4	put   //DD:DD02   data
5	get   data   //DD:DD01
	quit
	/*
以下は、この例の中で番号の付いている項目の簡潔な説明です。
1
GDG データ・セットの新規世代を割り振る DD ステートメント
2
既存のデータ・セットの DD ステートメント
3
STEP01 の新規データ・セットに対する逆方向参照
4
STEP01 で作成された新規データ・セットのために、//DD: トークンを使用した Put サブコマンド
5
既存のデータ・セットのために、//DD: トークンを使用した Get サブコマンド
上記のジョブの FTP 出力は以下のとおりです。FTP トレース・ステートメントのうち一部だけを選んで示していることに注意してください。
	EZA1736I FTP (TCP TCPCS
	EZA1450I IBM FTP CS V1R5 2003 090 19:22 UTC
	EZA1466I FTP: using TCPCS
	EZA1456I Connect to ?
	EZA1736I 9.67.113.57 6321
	EZA1554I Connecting to:  9.67.113.57 port: 6321.
	220-FTPDJG1 IBM FTP CS V1R2 at MVS164, 14:58:36 on 2003-01-01.
	220 Connection will not timeout.
	EZA1459I NAME (9.67.113.57:USER33):
	EZA1701I >>> USER USER33
	331 Send password please.
	EZA1701I >>> PASS
	230 USER33 is logged on.  Working directory is "/u/user33".
	EZA1460I Command:
1 	EZA1736I put   //DD:DD02   data
2 	MF0680 seq_open_file: DDname DD02 has filename USER33.MYGDG.G0087V00
	EZA1701I >>> PORT 9,67,113,57,6,158
	200 Port request OK.
	EZA1701I >>> STOR data
	125 Storing data set /u/user33/data
	250 Transfer completed successfully.
	EZA1617I 820 bytes transferred in 0.020 seconds.  Transfer rate 41.00 Kbytes/sec.
	EZA1460I Command:
3 	EZA1736I get   data   //DD:DD01
4 	MF0680 seq_open_file: DDname DD01 has filename USER33.TEST.S.A
	EZA1701I >>> PORT 9,67,113,57,6,159
	200 Port request OK.
	EZA1701I >>> RETR data
	125 Sending data set /u/user33/data
	250 Transfer completed successfully.
	EZA1617I 820 bytes transferred in 0.030 seconds.  Transfer rate 27.33 Kbytes/sec.
	EZA1460I Command:
	EZA1736I quit
	EZA1701I >>> QUIT
	221 Quit command received. Goodbye.
1
ローカル・ファイルのために //DD: トークンを使用した Put サブコマンド
2
ローカル・データ・セット名が、STEP01 で作成された新規 GDG データ・セットであることを示す、トレース・ステートメント
3
ローカル・ファイルのために //DD: トークンを使用した Get サブコマンド
4
ローカル・データ・セット名が既存のデータ・セットであることを示す Trace ステートメント