*命名限定
在以往的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
- 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
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)
在RPGLE自由格式中,转换成命名限定的写法,是有必要的。这避免了以前固定格式中用的很多的PREFIX和RENAME,使得程序中的字段更可读。
另外要提一下,在开发过程中,V6R1版本有一个PTF补丁问题,导致TEMPLATE编译造成编译器软件错误。这时候可以用BASED(@)代替TEMPLATE,意为指定为空指针,即无需分配空间。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/283313/viewspace-2075105/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/283313/viewspace-2075105/