免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 6525 | 回复: 6

『分享』在rpgle中使用EXTNAME和LIKEREC定义DS [复制链接]

论坛徽章:
0
发表于 2011-04-16 15:18 |显示全部楼层
本帖最后由 pantierui 于 2011-08-12 15:38 编辑

我们可以在rpgle中使用LIKEREC来定义DS、DS的子字段、procedures的返回值或procedure的参数。

关键字LIKEREC的定义格式如下:
LIKEREC(intrecname{:*ALL|*INPUT|*OUTPUT |*KEY})
LIKEREC参数1:intrecname就是定义DS等时引用的内部文件的record名
EXTNAME参数3:*ALL|*INPUT|*OUTPUT|*KEY的意思是提取format中符号参数的字段来定义DS等。
*ALL:提取全部字段
*INPUT:只提取输入字段
*OUTPUT:只提取输出字段
*KEY:只提取key字段

关键字EXTNAME & EXTFLD的定义格式如下:
EXTNAME(file-name{:format-name}{:*ALL| *INPUT|*OUTPUT|*KEY})
EXTFLD(field_name)

EXTNAME参数1:file-name就是定义DS时引用的外部文件
EXTNAME参数2:format-name就是引用的外部文件的format,如果又多个format的时候。
EXTNAME参数3:与LIKEREC意义相同

EXTFLD是重命名EXTNAME引用的字段的。

EXTNAME只能用来定义DS,不能定义DS的子字段。
d dcustom       e ds                  extname(custom:*key)  QUALIFIED
上面是可以的,但下面就不被允许了。
d dcustom         ds                 
d  subfld                             extname(custom:*key)  QUALIFIED

下面是具体的例子:
DB FILE: CUSTOM
                R CUSTOMR                   TEXT('CUSTOMER FILE')
                  CUST           5          TEXT('CUSTOMER NUMBER')
                                            COLHDG('CUSTOMER NUMBER')
                  NAME          20          TEXT('CUSTOMER NAME')
                                            COLHDG('CUSTOMER NAME')
                  ADDR          20          TEXT('CUSTOMER ADDRESS')
                                            COLHDG('CUSTOMER ADDRESS')
                  CITY          20          TEXT('CUSTOMER CITY')
                                            COLHDG('CUSTOMER CITY')
                  STATE          2          TEXT('STATE ABBREVIATION')
                                            COLHDG('STATE ABBREVIATION')
                  ZIP            5  0       TEXT('ZIP CODE')
                                            COLHDG('ZIP CODE')
                  ARBAL         10  2       TEXT('ACCOUNTS RECEIVABLE BALANCE')
                                            COLHDG('ACCOUNTS RECEIVABLE '-
                                             'BALANCE')
                K CUST
                K STATE

DSP FILE:TESTDSP
     A                                      DSPSIZ(24 80 *DS3)
     A                                      CA03
     A          R DSP1R
     A            FLDA           5A  I  1 25
     A            FLDB           2A  I  2 25
     A            FLDC           2Y 0B  3 25
     A            FLDD           2Y 0O  4 25
     A          R DSP2R
     A            FLDE           5A  O  5 25
     A            FLDF           2A  O  6 25
     A            FLDG           2Y 0B  7 25
     A            FLDH           2Y 0I  8 25

LIKEREC程序例子
RPGLE FILE:TEST1
     hDFTACTGRP(*NO)
     fcustom    if   e           k disk
     ftestdsp   cf   e             WORKSTN
     d************************ Data Structure **********************************
     d dsCustom        ds                  likerec(customr:*key)
     d dsDSPi          ds                  likerec(DSP1R:*input)
     d dsDSPo          ds                  likerec(DSP2R:*output)
     d*
     d wait            s              1a
     d func            pr                  likerec(customr:*key)
     d  parmA                              likerec(dsp1r:*input)
     c*
      /free
             // manipulate *key field
                         dscustom.cust = 'key';
                         dsply     dscustom.cust  wait;
             // manipulate *input field
                         dsDSPi.flda = 'input';
                         dsply     dsDSPi.flda     wait;
             // manipulate *output field
                         dsDSPo.flde = 'outpt';
                         dsply     dsDSPo.flde     wait;
             // manipulate procedure return value & procedure parameter
                         eval      dsCustom = func(dsDSPi);
                         dsply     dsCustom.state  wait;
      /end-free
     c*
     c                   SETON                                        LR
     c                   RETURN
     p func            b
     d*
     d func            pi                  likerec(customr:*key)
     d  parmA                              likerec(dsp1r:*input)
     d*
     d fdscustom       ds                  likerec(customr:*key)
     d*
     c                   eval      fdscustom.cust = parmA.flda
     c                   eval      fdscustom.STATE = %subst(parmA.flda:1:2)
     c                   return    fdscustom
     p func            e

EXTNAME程序例子:
RPGLE FILE:TEST
     d dcustom       e ds                  extname(custom:*key)  QUALIFIED
     d  custID       e                     extfld(CUST)
     d dsDSPi        e ds                  extname(TESTDSPSP1R:*input)
     d                                     QUALIFIED
     d dsDSPo        e ds                  extname(TESTDSPSP2R:*output)
     d                                     QUALIFIED
     d wait            s              1a
     c*
      /free
             // manipulate *key field
                         dcustom.custID = '*key';
                         dsply     dcustom.custID  wait;
             // manipulate *input field
                         dsDSPi.flda = '*input';
                         dsply     dsDSPi.flda     wait;
             // manipulate *output field
                         dsDSPo.flde = '*output';
                         dsply     dsDSPo.flde     wait;
      /end-free
     c*
     c                   SETON                                        LR
     c                   RETURN

LIKEREC和EXTNAME都可以用来定义DS,那他们的区别是什么那,我认为有以下几点:
1.EXTNAME只能定义DS,不能用来定义DS的子字段、procedure的返回值和procedure的参数。而LIKEREC可以。
2.从引用的文件角度讲,EXTNAME引用的文件不需要在F表中声明,而LIKEREC必须在F表中声明。
3.从使用的角度来讲,如果EXTNAME定义的DS想要DS.SUBFIELD这样使用,必须在定义时使用关键字QUALIFIED,而LIKEREC则不用,因为LIKEREC定义的DS自动添加了关键字QUALIFIED。

欢迎大家来拍砖~~~


【update】
在使用上extname和likerec有些不同,如下面的例子
第一种方式(采用关键字LIKEREC):
F KKPCEP00  IF   E           K DISK                                                                          
D*                                                      
D W#DS             DS                  LIKEREC(KKPCER)   
D PCEDS            DS                  QUALIFIED
D W#FLG                           1A            
D PCE01                           2A            
D PCE02                           2A      
...
C     W#FLG#        CHAIN     KKPCEP00      W#DS   
C                   EVAL      PCEDS =W#DS               


第二种方式(采用关键字EXTNAME):
F KKPCEP00  IF   E           K DISK                                                                          
D*  
D W#DS           E DS                  EXTNAME(KKPCEP00)
D PCEDS            DS                  QUALIFIED   
D W#FLG                           1A            
D PCE01                           2A            
D PCE02                           2A  
  ...
C     W#FLG#        CHAIN     KKPCEP00        
C                   EVAL      PCEDS =W#DS

在第二种方式在执行完chain后W#DS就会有chain到的值。而如果要想用likerec定义ds也有值,那就的是如下的写法
C     W#FLG#        CHAIN     KKPCEP00      W#DS   

主要的原因是QUALIFIED,因为likerec定义的ds会自动添加QUALIFIED,我在上面有说。

持续更新中。。。。。

评分

参与人数 1可用积分 +2 收起 理由
fairyboy + 2 全都忘记了,嘿嘿

查看全部评分

论坛徽章:
0
发表于 2011-04-17 18:21 |显示全部楼层
支持分享~~~ 谢谢!

论坛徽章:
0
发表于 2011-08-11 16:17 |显示全部楼层
支持,叁Q

论坛徽章:
0
发表于 2011-08-12 16:11 |显示全部楼层
讨论完毕前来拍砖

论坛徽章:
0
发表于 2011-08-19 12:40 |显示全部楼层

论坛徽章:
0
发表于 2011-08-19 12:57 |显示全部楼层
PTR V5

论坛徽章:
0
发表于 2011-11-22 10:27 |显示全部楼层
回复 1# pantierui


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

DTCC2020中国数据库技术大会

【架构革新 高效可控】2020年12月21日-23日第十一届中国数据库技术大会将在北京隆重召开。

大会设置2大主会场,20+技术专场,将邀请超百位行业专家,重点围绕数据架构、AI与大数据、传统企业数据库实践和国产开源数据库等内容展开分享和探讨,为广大数据领域从业人士提供一场年度盛会和交流平台。

http://dtcc.it168.com


大会官网>>
  

北京盛拓优讯信息技术有限公司. 版权所有 16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122
中国互联网协会会员  联系我们:huangweiwei@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP