首页 > 学技术 > 技术网文 > IBM AS400应用论坛 > 正文

[精华] 3写给刚接触RPG的朋友 --- 如何编写RPG程序(1)


来源 chinaunix.net 酷勤网整理

刚刚开始学习400,真有点不知从何下手好,在网上逛了几天,找到了一些适合初学者的资料,和大家一起分享一下。

这部分我也循序渐进的讲解如何RPG里头更项的含义。

先说说RPG一般用来做什么吧,举例说:
1. 整个RPG程序不包含任何外部程序,只是做些简单的数学运算,或者对数据区、DATAQ等非文件目标进行操作,这属于相对最简单的情况;
2. RPG程序对物理文件或者逻辑文件进行读、写、更新、删除操作;
3. RPG程序结合物理文件或逻辑文件、以及显示文件进行操作,这属于比较复杂的情况;
4. RPG程序结合物理文件或逻辑文件、显示文件、以及ICF文件(即通讯文件)进行操作,这种情况也比较复杂。
当然,以上的情况只是平时使用的归纳,你也可以根据自己的实际需要结合各种情况,此处不再深入探讨。
=============================================
以下结合例子简单说说各种情况,假设以下源码文件存放的路径是 库MYLIB、源物理文件MYSRCPF
1. (1)做个简单的运算,比如AXB/(C-D)+E,有加减乘除等运算,代码如下:

        *************** Beginning of data *************************************
0001.00      C                     Z-ADD2          A         10                   
0002.00      C                     Z-ADD10        B         20                   
0003.00      C                     Z-ADD5          C         10                   
0004.00      C                     Z-ADD1          D         10                   
0005.00      C                     Z-ADD2          E         10                   
0006.00      C                     Z-ADD0          TEM     30                   
0007.00      C                     Z-ADD0          RST      30                   
0008.00      C           A        MULT B          TEM                          
0009.00      C           C        SUB  D           RST                          
0010.00      C           TEM    DIV  RST        RST                          
0011.00      C                     MVR               TEM2    30                   
0012.00      C           RST    ADD  E           RST                          
0013.00      C           RST    DSPLY                                       
0014.00      C                    SETON                             LR                
        ****************** End of data ****************************************
                                                                               



<注>:
    (a) Z-ADD表明把Factor2处的变量值赋给Result处的变量,值得注意的是这两个变量都是数值型的,例如,"Z-ADD2 A 10 "表示把2赋给变量A,后面的"10"中的“1”表示变量A的长度是1,“0”表示小数位长度是0,即A是一个长度为1整型变量;
    (b) MULT表示做乘法运算,“A MULT B TEM”表示AXB,把结果赋给整型变量TEM;
    (c) SUB表示做减法运算,“C SUB D RST”表示C-D,把结果赋给整型变量RST;
    (d) DIV表示做除法运算,“TEM DIV RST RST”表示TEM/RST,把结果赋给整型变量RST;
    (e) MVR表示做取余数运算,“MVR TEM2 30”表示把余数赋给整型变量TEM2;
    (f) ADD表示做取加法运算,“RST ADD E RST”表示RST+E,把结果赋给整型变量RST,这句一般写成“ADD E RST”也可以。
    (g) DSPLY表示显示变量值,“RST DSPLY”表示显示变量RST的值;
    (h) SETON表示给指示器置为*ON的状态,即'1',“SETON LR”表示把LR指示器置为*ON,该句的意思表示最后一条记录,即程序结束。

按F3保存,假设该文件名是MYRPG,所在的库是MYLIB,源物理文件是MYSRCPF。

程序写好之后,应该进行编译了。用WRKMBRPDM FILE(MYLIB/MYSRCPF),找到刚才的文件MYRPG,输入14,按F4,进入“Create RPG/400 Program (CRTRPGPGM)” 画面,参数:
(i) Program: 生成的目标名(假如为MYOBJ);
(ii) Library:   生成的目标存放的库(假如为MYLIB)。
参数填好之后,按确认键即进行编译,如果程序没错,则生成目标文件,假设为MYOBJ。
在命令行输入CALL MYLIB/MYOBJ,这时命令上应该显示RST的值。
(<注>:目标即可执行文件)

[ 本帖最后由 wxn100 于 2007-4-4 12:47 编辑 ]



 qingzhou 回复于:2007-04-03 21:53:49

感谢分享~~~

论坛很需要这样的朋友支持.


 just a kid 回复于:2007-04-03 22:42:55

还是MM面子大啊~~~


 lordlost 回复于:2007-04-04 09:35:29

Z-ADD在處理時,會把Result的值先回復成0再做ADD的動作,這點初學者要留意。
if X=3
Z-ADD 1      X
X=1

if x=5
ADD  1       x
x=6


 qingzhou 回复于:2007-04-04 10:11:05

引用:原帖由 just a kid 于 2007-4-3 22:42 发表
还是MM面子大啊~~~ 


什么时候你也 秀 一下。 :mrgreen:


 wxn100 回复于:2007-04-04 12:55:20

刚刚开始学习400,真有点不知从何下手好,在网上逛了几天,找到了一些适合初学者的资料,和大家一起分享一下。

续《写给刚接触RPG的朋友 --- 如何编写RPG程序(1)》

上文中,只举例说明了如何进行简单的数学运算,下面再举一例子讲解如何操作数据区(DATAARA)和数据队列(DTAQ)。

1. (1) 如何建立数据区(DATAARA)

<注>:
    下面只建立*CHAR型的数据区,其他类型的有兴趣可以自己试试。在系统命令行输入CRTDTAARA,按F4,进入“Create Data Area (CRTDTAARA)”画面,参数如下:
    (a) Data area:数据区的名字,这里假设为MYDTAARA;
    (b) Library:存放数据区的库,默认值是*CURLIB,即当前库,这里我们输入MYLIB;

<注>:
    MYLIB库之前的文章里头已建立,这里不再重复讲述了,如果还不知道如何建立,请参考《写给刚接触AS/400的朋友 --- 如何建立属于自己的库、文件和成员》
    (c) Type:数据区的类型,*DEC数值型,*CHAR字符型,*LGL逻辑型,*DDM分布式数据管理(这个我没用过),这里我们选择*CHAR;       
    (d) Length:数据区的长度,这里假设是20,当然你可以根据自己需要输入对应的长度值;
    (e) Decimal positions:指小数位位数,一般是针对*DEC型的才需要设置;
    (f) Initial value:数据区初始值,可填可不填,我们这里选择不填,在程序里进行更改;
    (g) Text:注释。

整个命令请参考如下:

CRTDTAARA DTAARA(MYLIB/MYDTAARA) TYPE(*CHAR) LEN(20) TEXT('建立属于自己的数据区MYDTAARA')

(2)在RPG里如何操作数据区,假设该源码文件名为DTAARAR,存放在MYLIB/MYFILE下:

        *************** Beginning of data ************************************* 
0001.00      I#DTA        DS                                                20                     
0002.00      I                                                                 1   8 CURDAT              
0003.00      I                                                               11  16 CURTME              
0004.00      C           *NAMVAR   DEFN MYDTAARA  #DTA                          
0005.00      C           *LOCK       IN      #DTA                                    
0006.00      C                            TIME                     DATTME 140                    
0007.00      C                            MOVE DATTME      CURDAT                        
0008.00      C                            MOVELDATTME     CURTME                        
0009.00      C                            OUT  #DTA                                    
0010.00      C                            UNLCK#DTA                                    
0014.00      C                            SETON                     LR                 
        ****************** End of data **************************************** 

<注>:
    (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,那么在命令行 CALL DTAARAR,那么数据区已经成功更改了,使用命令 DSPDTAARA MYDTAARA 就可以查看数据区内容了。
================================================================================

到此为止,你已经基本懂得如何对数据区进行操作了!


 qingzhou 回复于:2007-04-04 13:07:38

OK,验收通过!

合并为一个主题吧。

:mrgreen:


 sh-vagrant 回复于:2007-04-04 16:03:17

呵呵,比我学的快,我用了1年as400后才开始涉及到dtaara,惭愧哈


 三个石头 回复于:2007-04-05 13:14:14

这些好像在新儒论坛里面有呀。


 紫菜蛋汤 回复于:2007-04-06 22:22:48

又是非自由格式的:shock::shock::shock:看的很晕。。。


 wxn100 回复于:2007-04-13 10:41:06

这样是不太好,但是排了半天也排不好啊,而且比较浪费时间,
不过大家可以到我的博客里看一下原文件,代码部分是帖图的,
就不会有什么问题了。




原文链接:http://bbs.chinaunix.net/viewthread.php?tid=919039
转载请注明作者名及原文出处



收藏本页到: