AS400如何编写RPG程序.docx
- 文档编号:24738488
- 上传时间:2023-06-01
- 格式:DOCX
- 页数:24
- 大小:23.50KB
AS400如何编写RPG程序.docx
《AS400如何编写RPG程序.docx》由会员分享,可在线阅读,更多相关《AS400如何编写RPG程序.docx(24页珍藏版)》请在冰豆网上搜索。
AS400如何编写RPG程序
AS400如何编写RPG程序
As400如何编写RPG程序
1.写给刚接触AS/400的朋友---如何建立库、文件和成员
鉴于很多朋友都还是刚接触AS/400,我就从系统登陆开始简单说说吧~
打开AS/400仿真终端(可以是PCOM、CA等软件,如何配置就不说了),输入用户名和密码,进入系统。
如果你的权限足够的话,可以使用CRTLIB命令给自己建个库,如:
CRTLIBLIB(MYLIB)TYPE(*TEST)TEXT('fortest')库建好之后,你可以使用STRPDM->2,在Library处输入库名MYLIB,按确认键就进入该库。
这时库下面没任何文件,你可以使用CRTSRCPF命令建立一个源物理文件,用来放置源码,如:
CRTSRCPFFILE(MYLIB/MYSRCPF)IGCDTA(*YES)TEXT('源物理文件')【注:
】参数IGCDTA(*YES)表示该源物理文件里头的源码文件都可以使用中文
到此为止,自己存放源码的地方已经生成,你可以直接使用以下命令直接进入该源物理文件:
WRKMBRPDMFILE(MYLIB/MYSRCPF)
进入该文件之后,就可以建立任何源码文件了,按F6,显示“StartSourceEntryUtility
(STRSEU)”画面,参数说明如下:
1.Sourcemember:
表示建立的成员名,我们把它理解成存放源码的文件就可以,类似WINDOW平台的TXT文件;
2.Sourcetype:
表示建立的成员名的类型,如果不确定,可按F4查看,常用类型有
(1)PF:
物理文件;
(2)LF:
逻辑文件;
(3)RPG:
RPG程序源码文件;
(4)RPGLE:
RPGLE程序源码文件;
(5)DSPF:
显示文件;
(6)CLP:
CLP程序源码文件;
(7)CMD:
命令文件
……
3.Text'description':
表示对该文件的描述,可填可不填。
上面的参数填好之后,即进入源码编辑环境,可以写代码了。
代码写完之后:
1.如果要保存并且退出编辑器,按F3,出现“Exit”画面,参数Change/createmember置为Y即可。
2.如果只想保存而不想退出的话,在编辑器的顶端的命令行输入SAVE,按确认键即可。
3.如果要放弃更改,那么在编辑器的顶端的命令行输入CAN,按确认键即可。
以上整个过程,介绍了登陆系统、建立库、建立源物理文件、建立成员(即源码文件)的过程。
有欠妥之处,请不吝赐教~
1
RPG开发步骤
1、建立数据库和源物理文件。
CRTLIB和CRTSRCPF。
2、在SEU输入源语句建立相关的PF、LF、DSPF。
PF~物理文件LF~逻辑文件DSPF~显示
文件。
3、用CRTPF、CRTLF、CRTDSPF命令建立物理文件、逻辑文件、显示文件、
4、在SEU中输入源语句(RPG源语句),按照H、F、D、I、C、O顺序输入,其中H~指控
制规范表,F~文件描述规范表,D~定义规范表、I~输入规范表、C~计算规范表、O~输出规范
表。
5、建立程序:
CRTPGMRPG如果编译通过的话,则可以用CALL程序名,来调用程序。
小提示:
如果发现建立文件时,出现找不到某某的信息时,请先用EDTLIBL把文件的LIB加
入。
写给刚接触RPG的朋友---如何编写RPG程序
(1)
这部分我也循序渐进的讲解如何RPG里头更项的含义。
先说说RPG一般用来做什么吧,举例说:
1.整个RPG程序不包含任何外部程序,只是做些简单的数学运算,或者对数据区、DATAQ等
非文件目标进行操作,这属于相对最简单的情况;
2.RPG程序对物理文件或者逻辑文件进行读、写、更新、删除操作;
3.RPG程序结合物理文件或逻辑文件、以及显示文件进行操作,这属于比较复杂的情况;
4.RPG程序结合物理文件或逻辑文件、显示文件、以及ICF文件(即通讯文件)进行操作,这
种情况也比较复杂。
当然,以上的情况只是平时使用的归纳,你也可以根据自己的实际需要结合各种情况,此处不再
深入探讨。
以下结合例子简单说说各种情况,假设以下源码文件存放的路径是库MYLIB、源物理文件
MYSRCPF
1.
(1)做个简单的运算,比如AXB/(C-D)+E,有加减乘除等运算,代码如下:
.....CL0N01N02N03Factor1+++OpcdeFactor2+++ResultLenDHHiLoEqComments+
+++
***************Beginningofdata
*************************************
CZ-ADD2A10
CZ-ADD10B20
CZ-ADD5C10
CZ-ADD1D10
CZ-ADD2E10
CZ-ADD0TEM30
CZ-ADD0RST30
CAMULTBTEM
CCSUBDRST
2
CTEMDIVRSTRST
CMVRTEM230
CRSTADDERST
CRSTDSPLY.....CL0N01N02N03Factor1+++OpcdeFactor2+++ResultLenDHHiLoEqComments+
+++
CSETONLR
******************Endofdata
****************************************【注】
(a)Z-ADD表明把Factor2处的变量值赋给Result处的变量,值得注意的是这两个变量都是数值型的,例如,"Z-ADD2A10"表示把2赋给变量A,后面的"10"中的“1”表示变量A的长度是1,“0”表示小数位长度是0,即A是一个长度为1整型变量;
(b)MULT表示做乘法运算,“AMULTBTEM”表示AXB,把结果赋给整型变量TEM;
(c)SUB表示做减法运算,“CSUBDRST”表示C-D,把结果赋给整型变量RST;
(d)DIV表示做除法运算,“TEMDIVRSTRST”表示TEM/RST,把结果赋给整型变量RST;
(e)MVR表示做取余数运算,“MVRTEM230”表示把余数赋给整型变量TEM2;
(f)ADD表示做取加法运算,“RSTADDERST”表示RST+E,把结果赋给整型变量RST,这句一般写成“ADDERST”也可以。
(g)DSPLY表示显示变量值,“RSTDSPLY”表示显示变量RST的值;
(h)SETON表示给指示器置为*ON的状态,即'1',“SETONLR”表示把LR指示器置为*ON,该句的意思表示最后一条记录,即程序结束。
按F3保存,假设该文件名是MYRPG,所在的库是MYLIB,源物理文件是MYSRCPF。
程序写好之后,应该进行编译了。
用WRKMBRPDMFILE(MYLIB/MYSRCPF),找到刚才的文件MYRPG,输入14,按F4,进入“CreateRPG/400Program(CRTRPGPGM)”画面,参数:
(i)Program:
生成的目标名(假如为MYOBJ);
(ii)Library:
生成的目标存放的库(假如为MYLIB)。
参数填好之后,按确认键即进行编译,如果程序没错,则生成目标文件,假设为MYOBJ。
在命令行输入CALLMYLIB/MYOBJ,这时命令上应该显示RST的值。
(【注】目标即可执行文件)
续《写给刚接触RPG的朋友---如何编写RPG程序
(1)》
上文中,只举例说明了如何进行简单的数学运算,下面再举一例子讲解如何操作数据区
(DATAARA)和数据队列(DTAQ)。
============================================================
3
1.
(1)如何建立数据区(DATAARA)
【注:
下面只建立*CHAR型的数据区,其他类型的有兴趣可以自己试试】:
在系统命令行输入CRTDTAARA,按F4,进入“CreateDataArea(CRTDTAARA)”画面,参
数如下:
(a)Dataarea:
数据区的名字,这里假设为MYDTAARA;
(b)Library:
存放数据区的库,默认值是*CURLIB,即当前库,这里我们输入MYLIB;
【注】MYLIB库之前的文章里头已建立,这里不再重复讲述了,如果还不知道如何建立,请参考
《写给刚接触AS/400的朋友---如何建立属于自己的库、文件和成员》
(c)Type:
数据区的类型,
*DEC数值型,
*CHAR字符型,
*LGL逻辑型,
*DDM分布式数据管理(这个我没用过),
这里我们选择*CHAR;
(d)Length:
数据区的长度,这里假设是20,当然你可以根据自己需要输入对应的长度值;
(e)Decimalpositions:
指小数位位数,一般是针对*DEC型的才需要设置;
(f)Initialvalue:
数据区初始值,可填可不填,我们这里选择不填,在程序里进行更改;
(g)Text:
注释。
整个命令请参考如下:
CRTDTAARADTAARA(MYLIB/MYDTAARA)TYPE(*CHAR)LEN(20)
TEXT('建立属于自己的数据区MYDTAARA')
(2)在RPG里如何操作数据区,假设该源码文件名为DTAARAR,存放在MYLIB/MYFILE下:
Columns...:
171EditMYLIB/MYFILE
SEU==>DTAARAR
FMTDS.....IDsname....NODsExt-file++.............OccrLen+....................***************Beginningofdata*******************************
0001.00I#DTADS20FMTJ......I....................................PFromTo++DField+L1M1FrPlMnZr.0002.00I18CURDAT0003.00I1116CURTMEFMTC.....CL0N01N02N03Factor1+++OpcdeFactor2+++ResultLenDHHiLoEq0004.00C*NAMVARDEFN
MYDTAARA#DTA
0005.00C*LOCKIN#DTA0006.00CTIMEDATTME140
0007.00CMOVE
DATTMECURDAT
0008.00CMOVELDATTMECURTME
0009.00COUT#DTA0010.00CUNLCK#DTA
4
0011.00CSETONL
R
******************Endofdata********************************
【注】
(a)第一行#DTA是字段名,与上面的Dsname左对齐,
DS表示#DTA是个字段,与上面的Ds对齐,
20表示字段#DTA的长度,与上面的Len+右对齐,注意,由于我们需要用它来定义数据区
MYDTAARA的格式,所以长度要和MYDTAARA相同,
整行的意思是定义一个长度20的字段#DTA;
(b)第二第三行进一步详细定义字段#DTA的内部结构,
第二行的CURDAT是字段名,与Field+左对齐,1与From右对齐,8与To++右对齐,整行的意思是
把大字段#DTA的第1,8位定义位另一个字段,第三行同样的意思,在此不在赘述;(c)第四行的DEFN表示定义,一般用来定义字段和数据区,
*NAMVAR是定义数据区格式时必用的参数,
整行的意思就是把数据区MYDTAARA的格式按照字段#DTA定义,以后对字段#DTA进行操
作就等于对数据区MYDTAARA进行操作;
(d)第五行的IN用来读数据区,*LOCK表示操作时把数据区MYDTAARA锁住,一般只有对数据区进行更
新操作才需要设置才参数,如果只是读数据区,则不用该参数;
(e)第六行的TIME是取系统当前日期和时间,整行的意思是把系统当前日期和时间赋给一个14位长0位
小数的数值型变量DATTME中,由于系统当前的日期和时间是按照“hhmmssMMDDYYYY”存放,所
以甘好也是14位;
(f)第七行意思是把变量DATTME右移给字段CURDAT,所以CURDAT的值甘好是日期“MMDDYYYY”;
(g)第八行意思是把变量DATTME左移给字段CURTME,所以CURTME的值甘好是日期“hhmmss”;
(h)第九行的OUT表示对数据区进行写操作,记住Factor处是我们程序开始定义的大字段#DTA;
(i)第十行的UNLCK表示解锁,因为我们在第五行使用了参数*LOCK;
(j)第十一行表示程序结束。
===================================================
=========
按F3退出编辑器并保存,进行编译,生成的程序名假设为DTAARAR,
那么在命令行CALLDTAARAR,那么数据区已经成功更改了,
使用命令DSPDTAARAMYDTAARA就可以查看数据区内容了。
5
写给刚接触RPG的朋友---如何编写RPG程序
(2)
续《写给刚接触RPG的朋友---如何编写RPG程序
(1)》
【上文摘要】
RPG一般用来做什么吧,举例说:
1.整个RPG程序不包含任何外部程序,只是做些简单的数学运算,或者对数据区、DATAQ等非文件目标进行操作,这属于相对最简单的情况;
2.RPG程序对物理文件或者逻辑文件进行读、写、更新、删除操作;
3.RPG程序结合物理文件或逻辑文件、以及显示文件进行操作,这属于比较复杂的情况;4.RPG程序结合物理文件或逻辑文件、显示文件、以及ICF文件(即通讯文件)进行操作,这种情况也比较复杂。
当然,以上的情况只是平时使用的归纳,你也可以根据自己的实际需要结合各种情况,此处不再深入探讨。
……
上文中讲到了第1点,现在讲解第2点。
【注】假设以下源码文件存放的路径是:
库MYLIB、源物理文件MYSRCPF
==============================================================
2.
(1)建立物理文件:
使用WRKMBRPDMFILE(MYLIB/MYSRCPF)进入源码存储处,按F6,进入“StartSourceEntryUtility(STRSEU)”画面,“Sourcemember”为源码文件名,此处是我们要建立的物理文件名,假设为MYPF,“Sourcetype”为文件类型,这里我们输入PF表示该文件是物理文件源码,按确认键,进入编辑器。
代码如下:
.....A..........T.Name++++++RLen++TDpB......Functions++++++++++++++++
++
***************Beginningofdata
*************************************
ARFMYPF
APFFLD14ATEXT('FIELD1')
ACOLHDG('FIELD1')
APFFLD25P0TEXT('FIELD2')
ACOLHDG('FIELD2')
******************Endofdata
****************************************【注】
(a)第一行的R处在T处,表示Record,即声明FMYPF是该物理文件的记录名;
(b)第二行中PFFLD1位于Name处,T处为空,表示这是字段名。
该句定义一个叫PFFLD1的字段,长度为4,字段属性是A,表示字符型。
TEXT('FIELD1')给字段做注解,
COLHDG('FIELD1')给字段指定显示时候的列表题;
(c)第三行定义一个叫PFFLD2的字段,长度为5,字段属性是P,表示数值型,0表示小数位是0位。
保存文件,编译生成目标文件MYPF。
6
(2)建立逻辑文件:
建立步骤和物理文件一样,不过值得注意的是,“Sourcetype”必须为LF,表示该文件是逻辑文
件,这里假设文件名为MYLF,代码如下:
.....A..........T.Name++++++.Len++TDpB......Functions++++++++++++++++
++
***************Beginningofdata
*************************************
ARFMYPFPFILE(MYPF)
AKPFFLD1******************Endofdata
****************************************
【注】
(a)第一行中R依然表示FMYPF是记录名,一般和物理文件的一样;
PFILE(MYPF)是声明物理文件名。
(b)第二行中K的位置也是处于T处,表示该处字段PFFLD1是逻辑文件的键值。
(3)建立对物理文件或者逻辑文件进行简单操作的RPG程序:
建立步骤和物理文件一样,不过值得注意的是,“Sourcetype”必须为RPG,表示该文件是RPG
源程序文件,这里假设文件名为MYRPG,代码如下:
.....FFilenameIPEAF........L..I........Device+......KExit++Entry+A....U***************Beginningofdata
*************************************
FMYPFOEDISK
FMYLFIFEKDISK.....F......................Ext-record........................RcdnbrKOptionEntry+++....
FFMYPFKRENAMEFMYLF
Keywords
RENAME(PMYPF:
PMYLF)
.....CL0N01N02N03Factor1+++OpcdeFactor2+++ResultLenDHHiLoEqComments+
+++
CMOVE'RCD1'PFFLD1
CZ-ADD1PFFLD2
CWRITEFMYPF
C*LOVALSETLLFMYLF
CREADFMYLF90
C*IN90IFEQ'0'
CPFFLD1DSPLY
CPFFLD2DSPLY
CENDIF
CSETONLR
******************Endofdata
7
****************************************【注】
(a)第一行MYPF是我们上面建立的物理文件名,记住,不是记录名FMYPF,别搞错了;
O位于IP的I处,表示该文件是只允许写入;
E位于F处,表示该文件是外部文件;
DISK位于Device处,表示该文件是磁盘文件;
(b)第二行MYLF是我们上面建立的逻辑文件名,记住,不是记录名,别搞错了;
I位于IP的I处,表示该文件是只允许读取;
后面的F表示该文件是全过程文件,记住一般都要写这个F的就行了;
E位于F处,表示该文件是外部文件;
K位于I..L的L处,表示该文件有键值;
DISK位于Device处,表示该文件是磁盘文件;
(c)第三行的FMYPF位于Ext-record处,是逻辑文件的记录名;
“KRENAMEFMYLF”其实由三部分组成:
“K”、“RENAME”和“FMYLF”。
"K"表示该句和上一行是连续的,即对上一行的补充,“RENAME”表示重命名,“FMYLF”是任意指定的。
这行的意思就是把逻辑文件MYLF的记录名FMYPF重命名为FMYLF,因为它原本的记录名和物理文件相同,所以必须重命名。
(d)第四行中的MOVE表示右移,该行意思是把常量'RCD1'右移给字段PFFLD1;(e)第五行中的Z-ADD表示对变量置0,再赋值,该行意思是把常量1赋给字段PFFLD2;(f)第六行中的WRITE表示写一笔记录,后面的FMYPF是物理文件记录名,记住,不是物理文件名,别搞错了,该行意思是把PFFLD1、PFFLD2组成的记录写入物理文件;(g)第七行中的SETLL表示给文件设置低界,后面紧跟着的FMYLF是逻辑文件记录名,这个是我们重命名后的名字,*LOVAL是系统常量,表示最小值,该行的意思是把文件指针指向文件头;(h)第八行中的READ表示读一笔记录,后面的FMYLF是逻辑文件记录名,这个是我们重命名后的名字,
90位于Eq处,表示指示器,该行的意思是读逻辑文件的一笔记录,读到的话指示器置为'0',否则,置为'1';
(i)第九行的IFEQ表示如果等于的意思,该句的意思就是如果指示器90等于„0?
,即读到记录;(j)第十行中的DSPLY用来显示字段变量,该行的意思是显示字段变量PFFLD1的值;(k)第十一行中的ENDIF和前面的IF匹配,这是必须的;
(l)第十二行中的SETON用来把指示器的状态改为'1',该句意思是把指示器LR置为„1?
。
到此为止,你应该懂得如何往文件读写数据。
写给刚接触RPG的朋友---如何编写RPG程序
(2)【续】
续《写给刚接触RPG的朋友---如何编写RPG程序
(2)》
上文中,只举例说明了如何对文件进行读写操作,下面再举一例子讲解如何对文件进行更新和删除:
(1)物理文件MYPF结构如下:
.....A..........T.Name++++++RLen++TDpB......Functions++++++++++++++++
++
8
***************Beginningofdata
*************************************
ARFMYPF
APFFLD14ATEXT('FIELD1')
ACOLHDG('FIELD1')
APFFLD25P0TEXT('FIELD2')
ACOLHDG('FIELD2')******************Endofda
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- AS400 如何 编写 RPG 程序