第五章在CL过程和程序中处理目标
5.1在CL程序中访问目标
在CL程序命令和过程中引用目标的原则与在每个命令和分别处理不是在程序中使用目标的原则是一样的。目标名可用限定或非限定名,非限定目标名用库列表来查找。
在CL过程和程序中引用的大多数目标在运行引用它们时才访问。对限定名(库名/目标名)的目标,在命令运行引用它时必须在指定的库中,但在程序生成时不一定要在此库中,即CL语句中用的大部分目标是简单地基于运行时目标的位置。在5.1.1中给出一些特例。
如果在CL源语句中不用限定名而用库列表,就不用对所有目标做运行时的考虑。如果在编译时用库列表,那么在运行时目标可以在库列表中的任一库里,这就要求在不同库中不能有重复的目标名。如果用库列表,可以在过程生成和命令处理之间把目标移到不同的库中。
在命令运行时所引用的目标必须存在,而在编译时程序PAYROLL即时不存在,CL程序也能编译成功:
PGM /*TEST*/
DCL...
MONMSG...
.
.
.
CALL PGM(QGPL/PAYROLL)
.
.
.
ENDPGM
实际上,在程序TEST活动时,PAYROLL不一定存在,但在处理CALL命令时要存在。在调用程序中被调用程序的生成一定要放在CALL命令之前:
PGM /*TEST*/
DCL...
.
.
.
MONMSG
.
.
.
CRTCLPGM PGM(QGPL/PAYROLL)
CALL PGM(QGPL/PAYROLL)
.
.
.
ENDPGM
对于生成命令,比如CRTCLPGM、CRTDTAARA,在编译和运行时所引用的目标是生成命令定义的,而不是生成的目标。如果用生成命令,生成命令定义在编译时必须在限定命令所用的库中。(换句话说,如果用*LIBL,它必须在库列表中)。
5.1.1例外情况:访问命令定义、文件和过程
从引用命令定义或文件的源语句生成CL程序时要下面两个东西存在:
在文件生成时目标必须存在
在命令引用它们做处理时目标必须存在
即在用DCLF时,在生成引用此文件的程序时必须先生成文件。
5.1.1.1访问命令定义
在生成和命令运行时都可发生访问命令定义,要做语法检查,在使用命令的程序生成期间命令必须存在。在生成期间,命令要存在于引用的库存中,并且在执行时的同一库中。如果不用限定名,那么在运行和生成时要在库列表中的同一库中。
命令名在程序中可用限定名:
如果命令定义在程序运行时不是用库列表访问的
在有多个命令定义用同一名字时
命令名在程序处理和生成时必须一致。如果不同,则会出错。如果修改了命令中的缺省参数,则在命令执行时用新的缺省值。详细内容请看9.9及CHGCMD的联机帮助信息。
5.1.1.2访问文件
DCLF命令的程序或模块在编译时要访问文件。因此,在使用它的程序或模块编译前此文件必须存在。在模块运行和生成程序或服务程序时文件不必须存在。
把描述记录格式及其中字段的DDS写进源文件中,然后生成它。即用CRTDSP把这些信息编译生成文件目标。在DDS中说明的的字段可以是输入字段,输出字段或既输入又输出字段。在程序编译时,这些字段做为变量说明给CL程序,程序从显示中通过这些变量管理数据。
也可用DDS来生成物理文件。CL变量的说明使程序包含整个记录,这个变量与文件同名,与记录同长。
除了某些特别的CL命令外,CL程序不能管理除显示文件和数据库文件外的其它类型文件。
在生成文件后可以删除DDS,但不提倡这样做。在CL程序或模块编译后可以删除它所引用的文件。(在命令引用它时要存在,例如在程序中处理DCLF、SNDF或RCVF)。
在命令定义中讲述的使用限定名的原则也适用于文件。详细信息请看5.2。
5.1.1.3访问过程
过程是由CALLPRC规定的。在生成调用它的模块时不必须要存在。它的存在与否对使用它的程序或服务程序不是必须的。被调用的过程可以是:
在CRTPGM或CRTSRVPGM中MODULE参数里规定的模块
在BNDSRVPGM参数中规定的服务程序,此服务程序必须在运行时可用
BNDDIR参数中规定的联编目录中列出的服务程序或模块
5.1.2检查目标是否存在
在程序中要使用一个目标前,要检查它是否存在,你是否有权使用它。这在一个功能同时使用多个目标时很有用。
用CHKOBJ来检查目标存在与否,可在过程和程序的任何地方使用这个命令,它有下列格式:
CHKOBJOBJ(库名/目标名)OBJTYPE(目标类型)
其它可选参数检验目标的权限。如果要检查权限且打开文件,那么数据权和操作权都要被检查。在执行这个命令时,有信息会生成告诉你检查的结果,可以监控这些信息并处理它们。例如:
CHKOBJOBJ(OELIB/PGMA)OBJTYPE(*PGM)
MONMSGMSGID(CPF9801)EXEC(GOTO NOTFOUND)
CALL OELIB/PGMA
.
.
.
NOTFOUND:CALL FIX001 /*PGMA Not Found Routine*/
ENDPGM
在此例中,MONMSG仅检查‘目标没找到的’的逃逸信息。对CHKOBJ可能送出的所有信息请看联机帮助。在2.5.10和第七、八章也有有关的内容介绍。
CHKOBJ命令不分配目标。对多数应用检查目标的存在性是一个足够的功能,它还要运行一个分配的请求,ALCOBJ命令即可检查是否存在又可分配目标。
用CHKTAP和CHKDKT命令可保证带或软盘放在设备上且准备好,它们也产生一些信息,你可在CL程序中监控它们。
5.2在CL过程中处理文件
CL过程和程序中支持两类文件,即显示文件和数据库文件。你可以把显示送往工作站,也可从工作站接收输入给过程和程序使用,或从数据库文件读数据给过程和程序使用。
注:在过程和程序的数据库文件是通过DCLF和RCVF命令来使用的。在AS/400数据库程序设计一书中有打开和关闭数据库文件的说明,它包括OPNDBF和CLOF命令,它使后来的用高级语言写的程序或过程可以使用数据库文件。
要在CL过程和程序中使用文件,必须:
1、用DDS源语句规定显示文件或数据库文件的格式,标识字段和条件。
2、用CRTDSPF,CRTPF或CRTLF生成文件,CL过程和程序不支持子文件。(信息
子文件除外)。
3、对数据库文件,用ADDPFM或ADDLFM往文件中加成员。如果在生成时已加了
成员,则不须这步,在处理过程和程序时必须有成员。但在生成过程和程序时不必
须有成员。
4、用DCLF在CL过程中说明文件,并用适当的数据管理命令引用记录格式。
5、生成CL模块。
6、生成CL程序。
在一个CL过程中仅可用一个显示文件或数据库文件。对于所用的同一个命令,显示文件和数据库文件是很类似的,但也有一点不同:
下列语句仅适用于CL过程和程序中使用的数据库文件:
—CL过程和程序仅可用单格式的数据库文件
—文件可以是物理文件或逻辑文件,逻辑文件可以引用多个物理文件成员
—仅可用RCVF命令做输入操作,SNDF、SNDRCVF、ENDRCV、WAIT和RCVF
中的DEV参数不能用于数据库文件
—在CL过程和程序中引用的物理文件不必须用DDS来建立。如果不用DDS,则文
件与记录格式同名,且只有一个与文件同名的字段,它与文件的记录等长。(CRTPF
中的RCDLEN参数)
—文件生成时不必须有成员,但在程序处理文件时要有一个成员
—在处理第一个RCVF时为输入打开文件,此时文件必须存在且有一个成员
—文件一直保持打开,直到过程或OPM程序返回或到了文件末。在到达文件末时,
送出CPF0864信息,不允许对文件做其它操作,过程和程序要监控这些信息,并在到
达文件末时来取适当的动作
下列语句仅适用于用在CL过程和程序中的显示文件:
—显示文件可有99个记录格式
—对显示可使用所有数据管理命令(SNDF、RCVF、SNDRCVF、ENDRCV和WAIT)
—必须用DDS定义显示文件
—在处理第一个SNDF,SNDRCVF,或RCVF时,为输入/输出打开文件,它一直保
持打开直到过程或OPM程序返回
注:在第一次发生发送或接收时才打开这两类文件。这样,可在过程和程序中间生成要使用的文件,且在第一次发送或接收前完成替换工作。
显示文件的格式做为DDS中的记录格式,每个记录格式可以有字段、条件指示器或常量。一个显示文件可以有几个记录格式。显示文件名,记录格式名和字段名要唯一。虽然在CL过程和程序不要求,但其它的高级语言程序可能需要它。
显示显示文件DSPFILE
RCDFMT1
字段1键字
字段2常量
RCDFMT2
字段3
字段4
有关DDS的详细信息请看DDS参考手册。
CL过程和程序能使用几个调用数据管理的命令,这些命令让你用显示设备接收或发送数据,也可引用数据库文件从其中读记录,这些命令是:
DCLF(说明文件):定义在过程和程序中使用的显示文件或数据库文件,文件中的字
段自动说明为过程和程序中的变量。
SNDF(发送文件):往显示中送数据。
SNDRCVF(发送/接收文件):往显示中送数据,然后请求输入,接收从显示中来的数
据。
RCVF(接收文件):接收从显示文件或数据库文件中来的数据。
OVRDSPF(用显示文件替换):允许在运行时用一个显示文件替换过程和程序使用的
文件。
OVRDBF(用数据库文件替换):允许在运行时用一个数据库文件替换过程和程序使
用的文件。
这些命令用由DDS提供的显示功能让运行程序与设备通讯,并从数据库文件读记录。DDS提供写菜单和完成基本应用程序间对数据的请求,这是多种CL应用的特点。
CL程序DSPFLIE显示
PGM
DCLF DSPFILE
SNDF RCDFMT(A)R
C
D
F
M
T
(A)RCDFMT (A)
显示中或记录格式中的字段是在文件的DDS中定义的。CL过程和程序要用这些字段,必须用DCLF来引用文件,所用的字段和指示器会自动做为过程和程序的变量。可在任何CL命令中使用这些变量,但它们的主要用途是与显示传送信息,在运行时不用DCLF命令。
字段的显示格式和选项是在设备文件规定的,是通过指示器来控制的。在DDS中可用99个指示器,且CL也支持它。指示器变量在CL过程和程序是用名为&IN01—&IN99的逻辑格式说明的。它让你显示字段及控制数据管理显示功能,从设备上提供对过程和程序响应的信息。在数据库文件中不用指示器。
5.2.1在CL过程中引用文件
在CL模块和程序生成时在编译DCLF命令中访问文件,同时文件中的每个字段都做变量说明。如果在编译时文件用限定名,那么在运行时文件也必须在这个库中,如果在编译时用库列表,那么在运行时要在库列表中的一个库里。
5.2.2打开及关闭文件
在用CL编程时,在一个过程或OPM程序中只可引用一个文件。引用的文件在第一个发送、接收或发送/接收操作时,会隐含打开。打开的显示文件在它所在程序返回控制时关闭。打开的数据库文件在到达文件末时关闭,或在把控制返回时关闭,它一旦关闭,就不能在同一个调用过程或OPM程序中再次打开。
在打开数据库文件时,打开文件中的第一个成员,除非先用OVRDBF命令规定了不同的成员(MBR参数)。假如过程和程序由于错误而结束,则文件关闭。由于文件在过程和程序完成操作前一直保持打开,那么就很容易在运行的过程和程序中打开文件,然后可与另外的过程和程序共享打开数据路径:
文件用SHARE(*YES)打开或修改过
用SHARE(*YES)代替文件生效
文件可用这种方式在任何两个过程和程序间共享。详细内容请看CL参考手册中的有关生成命令的SHARE参数说明。在CL过程和程序打开一个显示文件时,总是用于即输入又输出。而在CL过程和程序打开一个数据库文件时,总是仅用于输入。
在使用文件的CL过程和程序的RCLRSC中不要规定LVL(*CALLER)。如果规定了,所有由过程和程序打开的文件会立即关闭。任何试图访问文件的企图都异常结束。
5.2.3说明文件
用DCLF命令来说明CL过程和程序中的显示文件和数据库文件。它不能说明磁带、软盘、打印和混合文件。在过程和程序中仅允许有一个DCLF命令,它有下列参数:
DCLFFILE(库名/文件名)
RCDFMT(记录格式名)
注:在模块或程序编译前文件必须存在。
在过程和程序使用的文件必须在DDS中规定输入/输出字段,这些字段做为程序变量。在用DCLF时,编译程序把文件中每个字段和指示器说明为变量。对字段,CL变量的名为字段名前加&号。对可选指示器,为指示器前加&IN。例如,在DDS中定义了字段INPUT和指示器10,那么DCLF命令自动把它们说明为&INPUT和&IN10,这是在编译时完成的。在一个命令中可以规定50个记录格式名,但不能有一个是变量。对数据库文件只能规定一个记录格式。如果用下列的DDS生成显示文件CNTRLDSP放在库存MCGANN中:
|...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8
AR MASTER
ACA01(01 'F1 RESPONSE')
ATEXT30024
ARESPONSE15184 BLINK
A
A
从显示文件中可有三个变量&IN01,&TEXT,&RESPONSE,在CL过程中要引用这个显示文件,可输入下列DCLF源语句:
DCLF MCGANN/CNTRLDSP
编译程序将分开解释所有显示文件变量,在输出的编译清单中有下面显示的内容:
500-DCLFMCGANN/CNTRLDSP
QUALIFIED FILE NAME'MCGANN''CNTRLDSP'
RECORD FORMAT NAME'MASTER'
CL VARIABLETYPELENGTHPRECISION (IF *DEC)
&IN01*LGL1
&TEXT*CHAR300
&RESPONSE*CHAR15
5.2.4用显示文件接收和发送数据
在CL过程和程序中用SNDF,RCVF,SNDRCVF命令使显示文件接收和发送数据。在运行SNDF时,与记录格式中输出和输出/输入字段相关的变量的内容由系统格式化后送到显示设备上。同样,在运行RCVF时,记录格式中输入和输入/输出字段的值放在相应的CL变量中。SNDRCVF命令把CL变量的内容送往显示然后从显示中得到更新后的字段。一般讲,在显示文件中定义为区位十进制的字段在CL过程和程序中定义为*DEC类型,*DEC字段内部解释为压缩十进制。CL命令认为压缩和区位数据类型是等价的。在显示文件中有重叠的字段由于显示位置重合引起其后定义的CL变量不能是重叠的。有浮点数据的记录格式不能用在CL过程和程序中。
注:如果对一个工作站,SNDRCVF或RCVF命令指出WAIT(*NO),或用有INVITEDDS键字的记录格式发出SNDF命令,则用WAIT命令接收数据。
除了信息子文件外,任何试图发送或接收子文件的记录都产生运行时错误,大多数在DDS中规定的显示文件的功能都可用,某些功能(例如使用可变的起始行号)不可用,详细内容请看第八章。
下例给出生成程序员菜单的必须步骤,用SNDRCVF发送和接收数据。屏幕如下所示:
Operator Menu
1. Accounts Payable
2. Accounts Receivable
90. Signoff
Option:
首先,输入下列DDS源语句,记录格式是MENU,OPTION是一个仅输入字段,它用DSPATR(MDT),它让系统检查此字段值的有效性。
|...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8
AR MENU
A12'Operator Menu'
A34'1. Accounts Payable'
A54'2. Accounts Receivable'
A54'90. Signoff'
A72'Option'
AOPTION2Y 01+ 2VALUES(1 2 90) DSPATR(MDT)
A
A
用CRTDSPF命令生成显示文件,在CL程序设计中,显示文件的名字(INTMENU)可与记录格式(MENU)同名,但有些信息不可以这样做,比如RPG/400,也可用SDA来生成显示文件。
下一步,进入CL源语句来运行此菜单,CL源语句为:
PGM /* OPERATOR MENU */
DCLF INTMENU
BEGIN:SNDRCVF RCDFMT(MENU)
IF COND(&OPTION *EQ 1) THEN(CALL ACTSPAYMNU)
IF COND(&OPTION *EQ 2) THEN(CALL ACTSRCVMNU)
IF COND(&OPTION *EQ 90) THEN(SIGNOFF)
GOTO BEGIN
ENDPGM
在编译以上源语句时,DCLF命令自动地把字段OPTION说明为一个CL变量。
SNDRCVF命令缺省为WAIT(*YES),即程序要等待由它接收的输入。
5.2.5控制菜单的CL程序
下例给出用CL过程显示和控制菜单。用其它方法生成和控制菜单,请看应用显示编程一书。
此例中CL过程叫做ORD040C,它控制显示菜单且根据从菜单选择的选项来决定调用哪个HLL过程,它在显示器上给出菜单,菜单显示如下:
Order Dept General Menu
1 Inquire into customer file
2 Inquire into item file
3 Customer name search
4 Inquire into orders for a customer
5 Inquire into an existing order
6 Order entry
98 End of menu
Option:
显示文件的DDS如下:
|...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8
A* MENU ORDO4OCD ORDER DEPT GENERAL MENU
A
AR MENUTEXT('General Menu')
A12'Order Dept General Menu'
A33'1 Inquire into customer file'
A43'2 Inquire into item file'
A53'3 Customer name search'
A63'4 Inquire into orders for a custom+
Aer'
A73'5 Inquire into existing order'
A83'6 Order Entry'
A92'98 End of menu'
A112'Option'
ARESP2Y001 11 10VALUES(1 2 3 4 5 6 98)
ADSPATR(MDT)
A
A
CL源语句如下:
PGM /* ORD040C Order Dept General Menu */
DCLF FILE(ORD040CD)
START: SNDRCVF RCDFMT(MENU)
IF (&RESP=1) THEN(CALLPRC CUS210)
/* Customer inquiry */
ELSE +
IF (&RESP=2) THEN(CALLPRC ITM210)
/*Item inquiry*/
ELSE +
IF (&RESP=3) THEN(CALLPRC CUS220)
/* Cust name search */
ELSE +
IF (&RESP=4) THEN(CALLPRC ORD215)
/* Orders by cust */
ELSE +
IF (&RESP=5) THEN(CALLPRC ORD220)
/* Existing order */
ELSE +
IF (&RESP=6) THEN(CALLPRC ORD410C)
/* Order entry */
ELSE +
IF (&RESP=98) THEN(RETURN)
/* End of Menu */
GOTO START
ENDPGM
DCLF命令指出在处理SNDRCVF命令时哪个文件有需要的字段属性。SNDRCVF命令往显示上发送菜单且接收从显示中选择的选项。如果从菜单上选98,ORD040C返回到调用它的过程,ELSE语句处理替换的响应。
注:此菜单用CALL运行,用GO命令运行的菜单请看应用显示编程一书。
5.2.6在CL过程中替换显示文件
可用OVRDSPF命令代替在CL过程和程序中使用的显示文件或修改显示文件的某些参数,这在对CL过程和程序编译时用的文件修改或移动时很有用,OVRDSPF的初始参数为:
OVRDSPFFILE(被替换的文件名) TOFILE(新文件名)DEV(设备名)
OVRDSPF仅对CL过程和程序生成时DCLF规定的显示文件有效。程序运行时和生成时所用的文件类型必须一致。
必须在被替换的文件打开前用OVRDSPF命令。
在下列情况下,文件可以被替换:
在有OVRDSPF命令的过程和程序中打开
在由CALLPRC命令把控制转给的另外过程和程序中打开
在由CALL命令把控制转给的另外过程和程序中打开
有关替换文件的内容请看数据管理一书。
在替换成不同的文件时,仅在SNDF、RCVF或SNDRCVF命令中引用的记录格式名需要在替换文件中,在下面的解释中,显示文件FILEY不用记录格式TWO和THREE。
显示文件程序
MCGANN/FILEX
PGM
DCLF MCGANN/FILEX
ž
ž
ž
OVRDSP FILE(FILEX) TOFILE(FILEY)
ž
ž
ž
SNDF RCDFMT(ONE)
ž
ž
ž
ENDPGMRCDFMT ONE
Feld 1
RCDFMT TWO
Field 2
RCDFMT THREE
Field 3
MCGANN/FILEY
RCDFMT ONE
Field 1
要保证原文件和替换文件有相同的字段定义和指示器名,且要顺序胡同。如果规定LVLCHK(*NO)要导致非期望结果。在用OVRDSPF时另一个要考虑的是SNDF,RCVF和SNDRCVF中的DEV参数。如果规定DEV(*FILE),系统自动地用被替换文件的当前设备操作,如果在DEV中规定一个特别设备,可以发生以下情况之一:
如果用一个显示设备显示文件,假如不是用在RCVF、SNDF或SNDRCVF命令中规定的设备替换显示文件,则出错。
如果用多个设备显示文件,假如在RCVF,SNDF或SNDRCVF规定的设备不是OVRDSPF命令规定的那些,则出错。
5.2.7处理多设备显示文件
系统中正常的操作方式是工作站用户注册来请求一个交互作业,同时可有多个用户这样做,他们使用过程的一个逻辑考贝,其中包括过程使用的显示文件,每个请求都用这种使用方式来调用作业,这时不考虑使用多设备显示文件。
在一个用户请求调用一个作业,通过一个显示文件与多个显示工作站通讯时,发生多设备显示的配置,而一个CL过程仅能处理一个显示文件,这个显示文件或其中不同的记录格式能被送往几个设备显示。显示设备文件所用的命令主要有:
ENDRCV(结束接收):它结束已经满足的输入请求。
WAIT(等待):在命令中规定WAIT(*NO)时,由前面一个或多个RCVF或
SNDRCVF命令从任何显示设备上接收请求的用户数据。或由一个
或多个以前的SNDF命令送出包括INVITE DDS键字的记录格式。
如果用多设备显示文件,设备名必须在CRTDSPF中的DEV参数中规定,或在修改显示文件时用CHGDSPF规定,或在替换命令中规定。设备数必须小于或等于CRTDSPF中的MAXDEV参数中规定的数。多设备显示配置影响SNDRCVF和RCVF命令,需要用WAIT和ENDRCV命令。在多设备用RCVF或SNDRCVF时,缺省值WAIT(*YES)能避免进一步的操作,要等到从DEV中规定的设备上有输入属性字段返给程序。由于响应可能延迟,也常规定WAIT(*NO)。这样可以过程和程序在满足接收操作前能继续运行其它的命令。
如果用RCFVF或SNDRCVF且规定WAIT(*NO),过程和程序继续运行直到处理WAIT命令。
在记录格式的DDS有INVITE键字且使用SNDF命令,它等价于用SNDRCVF且规定WAIT(*NO)。对SNDRCVF和RCVF,忽略INVITE键字。
要访问一个数据记录必须有WAIT命令。如果没有可用数据,过程要挂起,直到从显示设备上接收到数据或等待时间超过在CRTDSPF、CHGDSPF或OVRDSPF中WAITRCD参数中规定的时间限制。如果超时,则发出SPF0889信息。
在ENDJOB、ENDSYS、PWRDWNSYS和ENDSBS命令中的控制选项也要有WAIT,以便能满足取消作业的条件。这时,发出CPF0888信息且没有返回数据。如果WAIT不与前面的接收请求有关,(例如规定WAIT(*NO)),则发生处理错误。典型的多设备显示配置如图所示:
DSPFILEWS2
SNDF DEV(WS2) RCDFMT(1)
RCVF DEV(WS2) RCDFMT(1) WAIT(*YES)
ž
ž
SNDRCVF DEV(WS1) RCDFMT(2) WAIT(*NO)
CALL PROGA
ž
ž
ž
WAIT
ž
ž
žFMT 1FMT 2WS1
在上面的例子中,两个命令给出用缺省值的典型顺序。处理等待从WS2的接收操作完成,由于在DEV中规定了WS2,则在WS2没响应前不执行RCVF命令,即使前面的从其它工作站的请求(没给出)已满足也是这样。但在SNDRCVF命令中规定了WAIT(*NO),所以不等待从WS1的响应,继续处理,调用PROGA,然后停在WAIT命令处,等待满足工作站的没完成的请求或直到功能超时。
WAIT有下格式:
WAITDEV(CL变量名)
如果规定了DEV参数,CL变量名是响应的设备名(缺省值名*NONE)。如果有几个接收请求,变量就用遇到WAIT命令后的第一个能响应的设备名,然后继续处理,接收的数据放在与设备显示字段相关的变量中。
与RCVF一起用WAIT(*YES)能等待从某个设备来的数据。在起动设备请求的操作和RCVF中规定的记录格式名必须相同。在某些情况下,几个接收请求都没完成,但不能进一步处理没有回答的设备显示。在下例中,有三个命令规定了WAIT(*NO)。但只能在WS3回答后才能继续处理LOOP:
PGM
.
.
.
SNDF DEV(WS1) RCDFMT(ONE)
SNDF DEV(WS2) RCDFMT(TWO)
SNDRCVF DEV(WS3) RCDFMT(THREE) WAIT(*NO)
RCVF DEV(WS2) RCDFMT(TWO) WAIT(*NO)
RCVF DEV(WS1) RCDFMT(ONE) WAIT(*NO)
CALL...
CALL...
.
.
RCVF DEV(WS3) RCDFMT(THREE) WAIT(*YES)
LOOP:WAIT DEV(&WSNAME)
MONMSG CPF0882 EXEC(GOTO REPLY)
.
.
.
GOTOLOOP
REPLY:CALL...
.
.
.
ENDPGM
CL过程和程序也支持ENDRCV命令,它让你能取消没满足的输入请求。SNDF或SNDRCVF也能取消没满足的输入请求,但如果在处理SNDF或SNDRCVF时有可用数据,则送出CPF0887信息。这时,必须用WAIT或RCVF命令接收数据,或用ENDRCV命令明确地取消这个请求,才能再执行SNDF或SNDRCVF命令。
5.2.8从数据库文件接收数据
用来从数据库文件接收数据的命令只有一个RCVF。
在运行RCVF命令时,读文件的访问路径中的下一条记录,把在数据库记录格式中定义的字段值放在相应的CL变量中。CL不支持区位十进制或二进制数,这样,文件中定义为区位十进制或二进制的字段在CL过程和程序中要定义为*DEC字段,*DEC字段做为压缩十进制。如果需要,RCVF命令会完成从区位十进制或二进制到压缩十进制的转换。有浮点数据的数据库文件不能在CL过程和程序中使用。在到达文件末尾时,有CPF0864信息送出,这时,说明为记录格式的CL变量不因RCVF命令的执行而有变化。程序员要监控这个信息,且要采取相应的动作。如果在文件末时要运行DRCVF命令,则再次发送CPF0864信息。
5.2.9在CL过程和程序中替换数据库文件
可用OVRDBF命令来替换CL过程和程序中命名的数据库文件或修改已有的数据库文件的某些参数,这在过程和程序生成之后修改文件名或移出文件是很有用的。它可也用来访问文件中除第一个成员以外的其它成员。
此命令的初始参数为:
OVRDBFFILE(被替换的文件名) TOFILE(新文件名)MBR(成员名)
这条命令仅在CL过程和程序引用编译时用DCLF说明的数据库文件的模块或程序时是有效的。程序处理使用的文件必须和引用的模块或程序生成时所用的文件类型相同。
OVRDBF命令必须在被替换文件打开之前处理。(第一次使用RCVF命令时打开文件),在下列情况下文件会被替换:
文件在有OVRDBF命令的过程或OPM程序中打开
或文件在由CALL命令把控制传给另外的程序时被打开
或文件在由CALLPRC命令把控制传给另外的过程时被打开
有关OVRDBF的详细内容请看数据管理一书。
在替换不同文件时,替换文件必须仅是只读记录格式。用DDS定义的多记录格式的逻辑文件如果被定义为只引用一个物理文件成员,则可用做替换文件,在DDS中定义的仅一个记录格式的逻辑文件可以定义为引用多个物理文件成员。在程序生成时,格式名不必非得与引用它的格式名相同,但必须保证替换文件的格式与原文件相同。如果规定LVLCHK(*NO)将导致非期望结果。详细内容请看DB2数据库程序设计一书。
5.2.10引用的显示命令输出文件
有些IBM显示命令允许允许将命令的输出放在数据库文件中(QUTFILE参数)。文件中的数据可直接输入到CL过程和程序中且处理它,这些命令的详细内容请看DB2数据库程序设计一书。
下面的CL过程接收两个参数:用户名和库名,过程确定库中所有程序名、文件名和数据区名,并且正常分配用户权限。
PGM PARM(&USER &LIB)
DCL &USER *CHAR 10
DCL &LIB *CHAR 10
(1)DCLF QSYS/QADSPOBJ
(2)DSPOBJD OBJ(&LIB/*ALL) OBJTYPE(*FILE *PGM *DTAARA) +
OUTPUT(*OUTFILE) OUTFILE(QTEMP/DSPOBJD)
(3)OVRDBF QADSPOBJ TOFILE(QTEMP/DSPOBJD)
(4)READ:RCVF
(5)MONMSG CPF0864 EXEC(RETURN)/* EXIT WHEN END OF FILE REACHED*/
(6)GRTOBJAUT OBJ(&ODLBNM/&ODOBNM) OBJTYPE(&ODOBTP) +
USER(&USER) AUT(*CHANGE)
GOTO READ/*GO BACK FOR NEXT RECORD*/
ENDPGM
(1)QSYS中的QADSPOBJ文件是IBM支持的由DSPOBJD命令使用的文件,它是在生
成输出文件时由命令引用的主要文件,它由CL编译程序引用来确定记录格式并且说
明记录格式中字段所用的变量。
(2)DSPOBJD命令生成名为DSPOBJD的文件,放在库QTEMP中,它与QADSPOBJ有
相同格式。
(3)OVRDBF命令用DSPOBJD命令生成的文件替换说明的文件(QADSPOBJ)。
(4)RCVF命令从DSPOBJD文件中读一个记录,字段的值复制到相应的CL变量中。它
隐含由DCLF命令说明了,由于使用了OVRDBF命令,读QTEMP/DSPOBJD文件而不是读QSYS/QADSPOBJ文件。
(5)监控CPF0864信息,它指出已到达文件末,把控制返回给调用它的过程。
(6)处理GRTOBJAUT命令,它使用库名、目标名及类型变量,它们是由RCVF命令读到的。
注:QUSRTOOL中也有几个能生成输出文件的命令(CVTxxx)。