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