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