*命名限定
在以往的RPG程序中,很让人头疼的一点就是字段的来源不直观,以及同名字段的相互影响。在程序中,字段可以是通过F表定义文件而引入的记录格式字段,也可以是EXTNAME引入的参照外部文件形成的结构字段,还可以是DS定义的字段以及直接用D定义的变量。如果考虑到有/COPY引入DS定义的情况,通常会造成在程序中看到一个字段名,一下子不清楚到底是在哪里定义的。如果文件、DS结构内遇到字段名相同,程序会认定同名字段为同一块内存空间,字段的值同步变动,这给程序查错带来了很大的困扰。
现代的程序设计语言中,已经注意到了全局名字空间污染的问题,对于结构内的字段,通常采用“结构名.字段名”的方式表示。RPGLE的自由格式扩展了语法的长度限制,消除了写法上的障碍,因此现在全面采用这种写法已经没有问题了。下面详细介绍一下QUALIFIED关键字的用法。
F表定义文件中使用QUALIFIED的方式。
表ACNTLMF的定义摘选如下。
-
A UNIQUE
-
A REF(DICT)
-
A R RACNTLMF
-
A BKTLNO R REFFLD(@@TLNO)
-
A TEXT('柜员号')
-
A COLHDG('柜员号')
-
A BKTLTP R REFFLD(@@TLTP)
-
A TEXT('柜员类型')
-
A COLHDG('柜员' '类型')
-
A TLPCNM R REFFLD(@@PCNM)
-
A TEXT('柜员姓名')
-
A COLHDG('柜员' '姓名')
-
A BKBRNO R REFFLD(@@BRNO)
-
A TEXT('机构号')
-
A COLHDG('机构号')
-
A K BKTLNO
RPGLE程序中写法示意如下。
-
FACNTLMF UF A E K DISK COMMIT QUALIFIED
-
**
-
DR_CNTLMF1 DS LIKEREC(ACNTLMF.RACNTLMF:*INPUT)
-
DR_CNTLMF2 DS LIKEREC(ACNTLMF.RACNTLMF:*OUTPUT)
-
DK_CNTLMF DS LIKEREC(ACNTLMF.RACNTLMF:*KEY)
-
**
-
/FREE
-
CLEAR R_CNTLMF1;
-
CLEAR K_CNTLMF;
-
K_CNTLMF.BKTLNO = TLADF1.BKTLNO;
-
CHAIN K_CNTLMF ACNTLMF.RACNTLMF R_CNTLMF1;
-
CLEAR R_CNTLMF2;
-
EVAL-CORR R_CNTLMF2 = R_CNTLMF1;
-
R_CNTLMF2.BKPCNM = TLADF1.BKPCNM;
-
UPDATE ACNTLMF.RACNTLMF R_CNTLMF2;
-
/END-FREE
那么,程序中由于QUALIFIED的存在,记录格式名必须加上文件名限定,并且不能再在程序中直接使用文件中的字段,必须使用自由格式的读写方式,使文件操作结果关联一个指定的DS结构,这个结构是以LIKEREC方式给出。如上面的代码所示,根据ACNTLMF,LIKEREC定义了3个DS结构。*KEY定义的K_CNTLMF用于取代固定格式的KLIST,作为文件操作语句的键值定位,会选取文件定义中的所有KEY字段。*INPUT定义的R_CNTLMF1可用于READ,CHAIN等读取语句存放结果。*OUTPUT定义的R_CNTLMF2可用于UPDATE,WRITE等写入语句的数据来源。V6R1中,*INPUT和*OUTPUT不能通用,给写程序带来了一定的麻烦,READ以后的UPDATE,必须用EVAL-CORR从*INPUT往*OUTPUT赋值(EVAL-CORR前面介绍过,是在两个不同结构间同名字段的赋值)。在V7R2中,放松了这个限制,可以用*ALL定义既可用于读取又可用于写入的结构,就不需要赋值了。注意使用LIKEREC定义的结构,默认均为QUALIFIED方式DS,使用“结构名.字段名”的写法。
DS结构定义中使用QUALIFIED的方式。
DS结构使用了QUALIFIED方式,则使用“结构名.字段名”的写法。如果DS本身是用LIKEREC,LIKEDS定义的,那么系统对这种参照的DS默认必须是QUALIFIED的。其他的DS定义或者EXTNAME的,可以写明QUALIFIED关键字来达到效果。
以下面的代码片段为例。
-
**引入数据字典
-
DDICT E DS EXTNAME(DICT) QUALIFIED TEMPLATE
-
DC_NBTLADF2 C CONST(50)
-
DT_TLADF2 E DS EXTNAME(SCNTLADF2) QUALIFIED TEMPLATE
-
DTLADF1 E DS EXTNAME(SCNTLADF1) QUALIFIED
-
DTLADF2 DS QUALIFIED
-
D RECD LIKE(DICT.@@RECD)
-
D ARR DIM(C_NBTLADF2) LIKEDS(T_TLADF2)
-
**程序原型定义
-
DSCNTLAD PR EXTPGM('SCNTLAD')
-
D TLADF1 LIKEDS(TLADF1)
-
D TLADF2 LIKEDS(TLADF2)
这里定义了SCNTLAD的两个参数DS,一个是单个结构TLADF1,另一个是带实际记录条数的数组复合DS,TLADF2.RECD是实际条数,TLADF2.ARR是DIM数组。这里值得注意的是TEMPLATE关键字的使用。在DS定义中,如果使用了TEMPLATE,那么程序不会为这个定义的DS分配实际的存储空间,而只是用作编译期定义使用。数据字典定义DICT,以及作为数组单个结构参照的T_TLADF2,正好非常符合这个用法。
在RPGLE自由格式中,转换成命名限定的写法,是有必要的。这避免了以前固定格式中用的很多的PREFIX和RENAME,使得程序中的字段更可读。
另外要提一下,在开发过程中,V6R1版本有一个PTF补丁问题,导致TEMPLATE编译造成编译器软件错误。这时候可以用BASED(@)代替TEMPLATE,意为指定为空指针,即无需分配空间。
阅读(3566) | 评论(0) | 转发(1) |