Chinaunix首页 | 论坛 | 博客
  • 博客访问: 308442
  • 博文数量: 40
  • 博客积分: 1
  • 博客等级: 民兵
  • 技术积分: 670
  • 用 户 组: 普通用户
  • 注册时间: 2011-07-31 11:19
个人简介

从事银行核心系统设计开发的程序猿

文章存档

2019年(1)

2018年(4)

2017年(11)

2016年(6)

2015年(18)

分类: 信息化

2016-04-04 19:37:48

*命名限定


在以往的RPG程序中,很让人头疼的一点就是字段的来源不直观,以及同名字段的相互影响。在程序中,字段可以是通过F表定义文件而引入的记录格式字段,也可以是EXTNAME引入的参照外部文件形成的结构字段,还可以是DS定义的字段以及直接用D定义的变量。如果考虑到有/COPY引入DS定义的情况,通常会造成在程序中看到一个字段名,一下子不清楚到底是在哪里定义的。如果文件、DS结构内遇到字段名相同,程序会认定同名字段为同一块内存空间,字段的值同步变动,这给程序查错带来了很大的困扰。
现代的程序设计语言中,已经注意到了全局名字空间污染的问题,对于结构内的字段,通常采用“结构名.字段名”的方式表示。RPGLE的自由格式扩展了语法的长度限制,消除了写法上的障碍,因此现在全面采用这种写法已经没有问题了。下面详细介绍一下QUALIFIED关键字的用法。


F表定义文件中使用QUALIFIED的方式。
表ACNTLMF的定义摘选如下。

  1. A UNIQUE
  2. A REF(DICT)
  3. A R RACNTLMF
  4. A BKTLNO R REFFLD(@@TLNO)
  5. A TEXT('柜员号')
  6. A COLHDG('柜员号')
  7. A BKTLTP R REFFLD(@@TLTP)
  8. A TEXT('柜员类型')
  9. A COLHDG('柜员' '类型')
  10. A TLPCNM R REFFLD(@@PCNM)
  11. A TEXT('柜员姓名')
  12. A COLHDG('柜员' '姓名')
  13. A BKBRNO R REFFLD(@@BRNO)
  14. A TEXT('机构号')
  15. A COLHDG('机构号')
  16. A K BKTLNO
RPGLE程序中写法示意如下。
  1. FACNTLMF UF A E K DISK COMMIT QUALIFIED
  2. **
  3. DR_CNTLMF1 DS LIKEREC(ACNTLMF.RACNTLMF:*INPUT)
  4. DR_CNTLMF2 DS LIKEREC(ACNTLMF.RACNTLMF:*OUTPUT)
  5. DK_CNTLMF DS LIKEREC(ACNTLMF.RACNTLMF:*KEY)
  6. **
  7. /FREE
  8. CLEAR R_CNTLMF1;
  9. CLEAR K_CNTLMF;
  10. K_CNTLMF.BKTLNO = TLADF1.BKTLNO;
  11. CHAIN K_CNTLMF ACNTLMF.RACNTLMF R_CNTLMF1;
  12. CLEAR R_CNTLMF2;
  13. EVAL-CORR R_CNTLMF2 = R_CNTLMF1;
  14. R_CNTLMF2.BKPCNM = TLADF1.BKPCNM;
  15. UPDATE ACNTLMF.RACNTLMF R_CNTLMF2;
  16. /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关键字来达到效果。
以下面的代码片段为例。

  1. **引入数据字典
  2. DDICT E DS EXTNAME(DICT) QUALIFIED TEMPLATE
  3. DC_NBTLADF2 C CONST(50)
  4. DT_TLADF2 E DS EXTNAME(SCNTLADF2) QUALIFIED TEMPLATE
  5. DTLADF1 E DS EXTNAME(SCNTLADF1) QUALIFIED
  6. DTLADF2 DS QUALIFIED
  7. D RECD LIKE(DICT.@@RECD)
  8. D ARR DIM(C_NBTLADF2) LIKEDS(T_TLADF2)
  9. **程序原型定义
  10. DSCNTLAD PR EXTPGM('SCNTLAD')
  11. D TLADF1 LIKEDS(TLADF1)
  12. 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) |
给主人留下些什么吧!~~