Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1083312
  • 博文数量: 106
  • 博客积分: 9093
  • 博客等级: 中将
  • 技术积分: 2770
  • 用 户 组: 普通用户
  • 注册时间: 2006-06-01 17:22
文章分类

全部博文(106)

文章存档

2014年(1)

2012年(29)

2011年(32)

2010年(20)

2008年(24)

分类:

2011-04-15 17:55:20

我们可以在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字段

下面是具体的例子:
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

RPGLE FILE:TEST
     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

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。
阅读(1483) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~