RPG开发基础

1. 如何建立库、文件和成员

鉴于很多朋友都还是刚接触AS/400,我就从系统登陆开始简单说说吧!
打开AS/400仿真终端(可以是PCOM、CA等软件,如何配置就不说了),输入用户名和密码,进入系统。

如果你的权限足够的话,可以使用CRTLIB命令给自己建个库,如:
CRTLIB LIB(MYLIB) TYPE(*TEST) TEXT('for test')
库建好之后,你可以使用STRPDM->2,在Library处输入库名MYLIB,按确认键就进入该库。

这时库下面没任何文件,你可以使用CRTSRCPF命令建立一个源物理文件,用来放置源码,如:
CRTSRCPF FILE(MYLIB/MYSRCPF) IGCDTA(*YES) TEXT('源物理文件')
【注:】参数IGCDTA(*YES)表示该源物理文件里头的源码文件都可以使用中文

到此为止,自己存放源码的地方已经生成,你可以直接使用以下命令直接进入该源物理文件:
WRKMBRPDM FILE(MYLIB/MYSRCPF)

进入该文件之后,就可以建立任何源码文件了,按F6,显示Start Source Entry Utility (STRSEU)画面,参数说明如下:
1. Source member:表示建立的成员名,我们把它理解成存放源码的文件就可以,类似WINDOW平台的TXT文件;
2. Source type:表示建立的成员名的类型,如果不确定,可按 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/create member置为Y即可。
2. 如果只想保存而不想退出的话,在编辑器的顶端的命令行输入SAVE,按确认键即可。
3. 如果要放弃更改,那么在编辑器的顶端的命令行输入CAN,按确认键即可。

以上整个过程,介绍了登陆系统、建立库、建立源物理文件、建立成员(即源码文件)的过程。
///
对于using as400大哥的写给刚接触as400的朋友的补充(感谢using 400大哥)

感谢using as400大哥的文章,他的文章真是太好了,太适合我们初学者了。
下边是我在看using as400大哥文章后,对一些像我一样的新手经常会遇到的问题的补充
如果有问题,欢迎各位大虾指正。
请先阅读using as400大哥的文章

关于连接软件,有些朋友可能找不到。下边是下载地址
安装后把服务器ip添加上就可以了, 别的一般都不需要动。
服务期地址: 222.66.5.170
用户名:     chinaunix
口令:     chinaunix
权限:     user
这是居士大哥提供的一个免费服务器,我没试过,不知道现在还能不能上。

关于as400的一些讲解:

As400的库类似于windows上的文件夹,但他与windows有些区别。
主要的层次关系是:库-〉对象-〉成员
其最上一层是一个叫做QSYS的库,这也是唯一一个特殊的库,因为它的下面仍然可以包含其他的库,而除此之外的库下都不能再有库。也就是说,库只有一个层次,不象windows下面的文件夹是可以多层存在的。

紧跟着库下来的一层是对象。一般来说,对象是一个可以实际应用和运行的。例如:编译后的数据文件,打印文件和程序。当然,对象也不仅仅包括这些,还有其他属性的对象,最常见的就是QPRGSRC\QDDSSRC\QDSPSRC,这些名字都是预定俗成的名字,当然也可以改成其他的名字。
这几个对象是作为物理源文件属性的。

对象的下面一层叫做成员。最常见的成员类型包括 PF LF DSPF RPG PRTF。这些类型的成员是我们在实际编程中经常打交道的,因为我们所作的编码工作就是针对这几个类型的成员进行的。成员编译后形成相应的对象。如PF\LF --->可以存储数据的物理文件和相应的逻辑文件;RPG --->可执行的程序,等等。编译系统根据文件不同的类型编译后会形成不同的对象类型。

AS400下RPG编程的常用命令

EDTLIBL 编辑系统的库列表
STRPDM 启动管理工具(对库,对象,成员进行管理操作的工作)
STRSDA 启动SDA(画面和菜单的可视化操作工具)
WRKLIBPDM (LIBNAME) 直接对库操作
WRKMBRPDM (LIB/OBJ MBR) 直接队成员进行操作
STRISDB 单步调试命令
STRDBG DEBUG命令
ENDDBG ENDDBG 命令
RUNQRY FILENAME数据文件查询命令,查看里面的数据
UPDDTA FILENAME 数据库文件更新命令,可以对数据文件中的数据进行更新操作
CLRPFM FILENAME 删除数据文件中的全部数据
CALL PGMNAME (PARM1 PARM2 ……..) 调用程序的命令

2. 写给刚接触RPG的朋友 --- 如何编写RPG程序(1)

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

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

以下结合例子简单说说各种情况,假设以下源码文件存放的路径是 库MYLIB、源物理文件MYSRCPF
1. (1)做个简单的运算,比如AXB/(C-D)+E,有加减乘除等运算,代码如下:


Code:
.....CL0N01N02N03Factor1+++OpcdeFactor2+++ResultLenDHHiLoEqComments++++
*************** Beginning of data *************************************
     C                                         Z-ADD2                 A            10                  
     C                                         Z-ADD10               B            20                  
     C                                         Z-ADD5                 C            10                  
     C                                         Z-ADD1                 D            10                  
     C                                         Z-ADD2                 E            10                  
     C                                         Z-ADD0                 TEM        30                  
     C                                         Z-ADD0                 RST        30                  
     C                       A                MULT  B                TEM                         
     C                       C                SUB    D                RST                         
     C                       TEM            DIV     RST            RST                         
     C                                         MVR                      TEM2      30
     C                       RST            ADD     E                RST                         
     C                       RST            DSPLY
.....CL0N01N02N03Factor1+++OpcdeFactor2+++ResultLenDHHiLoEqComments++++
     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的值。
(【注】目标即可执行文件)

 ///
2、对于using as400大哥的写给刚接触RPG朋友的补充(感谢using as400大哥)

感谢using as400大哥的文章,他的文章真是太好了,太适合我们初学者了。
下边是我在看using as400大哥文章后,对一些像我一样的新手经常会遇到的问题的补充
如果有问题,欢迎各位大虾指正。
请先阅读using as400大哥的文章

AS400下编程的文件

1、文件类型
这里所说的文件主要是指物理文件、逻辑文件、显示文件和打印文件。物理文件和逻辑文件主要是存储数据的文件;显示文件主要是用于画面显示格式和属性的;打印文件主要是控制打印文件的布局和显示格式的。这些文件都是在RPG程序中的F表中进行声明的,供程序中数据处理和存储使用。利用通过RPG程序从多个物理文件中取得相应的数据项显示到画面上,也可以通过RPG程序将用户在画面上输入的数据存储到物理文件中。物理文件中的数据是实际客观存在的,而显示文件和打印文件中的数据只是在程序运行时才有存在,程序退出后其中的数据也相应的消失。

2、文件使用
RPG程序中对所用的文件进行声明以后,这些文件中的字段名称都可以作为已知变量使用。比如当对一个文件进行读操作后,该字段名称中的值即为文件当前读到记录的相应的字段的值,在RPG程序中就可以通过引用该字段名称来获得当前记录的相应字段的值。如果要想文件中写入数据,只需要在RPG程序中,将想要写入的数值传送到相应的字段名称中,然后执行文件的写操作,就可以生成一条新的纪录。更新文件也是一样,不同的就是执行文件的更新操作。显示文件和打印文件的使用也类似,都是将想要的数值传入相应文件的相应字段中,然后执行相应的操作即可。



主要的几种说明表(H, F, I, E, C)

RPG语言中对作用不同的部分分别用开头一列字母来划分,也可以称为XX表或XX部。
RPG语言中包括H表、 F表、 E表、 I表、 C表、 L表、 O表。
但是现在经常用到的主要是H表、 F表、 E表、 I表、 C表。
H表(控制说明标):提供你的程序和系统的信息,其中可说明程序的名字、程序所用日期的格式和是否应用交替核对排序和文件翻译。(可选)
F表(文件说明表):描述程序应用的所有文件信息,包括文件名、如何应用文件、文件记录的大小、文件应用的输入输出设备、文件是否被外部指示器控制等。
E表(扩展说明表):描述所有在程序中应用的记录地址文件、表文件和矩阵文件的信息;包括记录地文件、矩阵或表的名字,表或矩阵数据记录的入口数目,表或矩阵的入口数目及长度。
I表(输入说明表):可以定义数据结构,说明输入文件的记录和字段的一些信息。
C表(计算说明表): 描述在数据上作的计算和计算次序,也可以用于控制某些输入输出操作;其信息包括对操作说明控制级和条件指示器,程序中应用的字段和常数,被处理的操作以及处理之后是否设置结果指示器等,这也是我们编码主要处理的部分,这里实现了程序的处理功能。

在using as400大哥的这篇文章里,我们建立了一个成员
我要提一下的是,在按F6创建成员是,source type一栏我们写RPG
然后按回车,进入编辑界面
按5下空格,输入C、然后按F4,在屏幕下方出现一个输入界面。
在这里边我们就很容易找到每个代码所对应的位置。
其中factory1和2里边是我们所操作的变量,他俩中间是用来操作变量的命令。
在往后的result里边是操作后的结果,然后的len是长度,然后的d是小数位数。
需要注意的是,一般来说,数字在输入的时候是要求右对齐的,字符左对齐。
输入完按回车,把光标移到0001.00处输入I按回车即可进入下一行。
还有一点,最后那一行的LR是对应EQ的,编辑完后按F3,在出现的界面中输入Y保存。

然后按照using as400大哥的操作你就可以完成第一个RPG程序了。
/
3. 写给刚接触RPG的朋友 --- 如何编写RPG程序(1) 【续1】

续《写给刚接触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:               注释。

整个命令请参考如下:


Code:
CRTDTAARA DTAARA(MYLIB/MYDTAARA) TYPE(*CHAR) LEN(20) TEXT('建立属于自己的数据区MYDTAARA')
[Ctrl+A Select All]



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


Code:
 Columns . . . :    1  71            Edit                        MYLIB/MYFILE
 SEU==>                                                                 DTAARAR
 FMT DS .....IDsname....NODsExt-file++.............OccrLen+....................
*************** Beginning of data *******************************
0001.00      I#DTA            DS                                      20                   
FMT J     ......I....................................PFromTo++DF i e l d+L1M1FrPlMnZr.
0002.00      I                                            1       8 CURDAT            
0003.00      I                                          11     16 CURTME            
FMT C     .....CL0N01N02N03Factor1+++OpcdeFactor2+++ResultLenDHHiLoEq
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                                  
0011.00      C                                         SETON                                             LR               
    ****************** End of data********************************

[Ctrl+A Select All]


【注】
(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 就可以查看数据区内容了。

============================================================

到此为止,你已经基本懂得如何对数据区进行操作了!
///
3、对于using as400大哥的写给刚接触RPG的朋友的补充(感谢using 400大哥)

感谢using as400大哥的文章,他的文章真是太好了,太适合我们初学者了。
下边是我在看using as400大哥文章后,对一些像我一样的新手经常会遇到的问题的补充
如果有问题,欢迎各位大虾指正。
请先阅读using as400大哥的文章

在写这篇文章的代码时,和上一篇一样,在第六行输入I按F4
输入#DTA,在ID里输入DS,按回车,然后再按F4,在LEN输入长度
下一行代码的格式我不知道怎么调出来,我是试出来的
1输入的位置是长度20前边大概3位,8在20的下面,然后后边是CURDAT
输完后你按F4,代码输入格式就会被调出来了,你再调一下就可以了。

还有就是编译调用前,要编辑库列表
输入EDTLIBL,按回车,在LIBRARY对应的位置上输入你的库名
在使用某个对象的时候要保证其存在,同时其所在的库也要在系统的库列表上能够找到。系统搜索所要用的对象时是按照系统的库列表的顺序从上向下进行查找的,例如:库列表为下所示
10 QLIB1
20 QLIB2
30 QLIB3
……
如果在QLIB1和QLIB2两个库中都有叫做OBJECT1的对象,那么当程序用到OBJECT1的时候,实际使用的将是位于列表前面的QLIB1中的OBJECT1,而不是QLIB2中的,因此我们在编译和运行程序的时候一定要注意库列表的值,免得使用不合适的对象而造成程序运行不正确。

然后按照using as400大哥的做就可以了。

下边是一些RPG常用语句摘要
Z-ADD   :数值型的附值语句(Z-ADD A   B相当于 B=A)
MOVEL :移动数据语句 MOVEL A   B 是把A的值从左边开始送到B中。
MOVE: 功能于MOVEL类似,区别在于它是从右边开始传送。
MOVEL (P):MOVEL和MOVE的操作在把短的传到长的中时,并不会覆盖其余的部分,因此,  
        加一个扩展功能用的P来表明操作要覆盖其余的部分。
SUB:数值类型的减操作
ADD:加操作
MULT:乘操作
DIV:除操作
MVR:除之后的取余操作
BEGSR:子过程开始
ENDSR:子过程结束
EXSR: 调用子过程
EXFMT:画面记录的显示操作命令
WRITE:写文件记录的操作
UPDAT:更新文件当前记录
DELET:删除文件当前记录
READ:读文件操作(顺序读)
READE:按键值顺序读文件的下一条
READP:向前读文件的一条记录
REDPE:按键值向前读文件的一条记录
CHAIN:随机检索与键值相同的记录
SETLL:文件指针定位操作,所停的位置在小于等于指定键值的前面。
SETGT:文件指针定位操作,所停的位置在等于大于指定键值的后面。
DOWXX (XX=GT, LT, EQ, LE, GE):当循环(XX=大于,小于,等于,小于等于,大于等于)
DOUXX (XX=GT, LT, EQ, LE, GE):直到循环(XX=大于,小于,等于,小于等于,大于等于)
ITER:跳出本次循环(DO),进行下一次循环
LEAVE:结束整个循环,进行循环下面的语句
IFXX (XX=GT, LT, EQ, LE, GE):条件判断(XX=大于,小于,等于,小于等于,大于等于)
SELEC:分支条件开始语句
WHXX (XX=GT, LT, EQ, LE, GE):各个分支的条件判断语句(XX=大于,小于,等于,小于等 于,大于等于)
OTHER:SELECT部分中所有WHEN条件均不成立时执行的部分(可以省略)
ENDXX (IF, DO, SL):循环和分支结构的结束标志语句。
SETON/OFF:将指示器的值设置为 1或 0
PLIST:参数列表名称的定义
PARM:各个参数的定义
KLIST:键值列表名称的定义
KFLD:键值中的各个键域的定义。
CLEAR:清除某个字段或数据域的值。
TIME:取得系统当前的日期或时间
/
4. 写给刚接触RPG的朋友 --- 如何编写RPG程序(2)

续《写给刚接触RPG的朋友 --- 如何编写RPG程序(1)》
【上文摘要】
RPG一般用来做什么吧,举例说:
1. 整个RPG程序不包含任何外部程序,只是做些简单的数学运算,或者对数据区、DATAQ等非文件目标进行操作,这属于相对最简单的情况;
2. RPG程序对物理文件或者逻辑文件进行读、写、更新、删除操作;
3. RPG程序结合物理文件或逻辑文件、以及显示文件进行操作,这属于比较复杂的情况;
4. RPG程序结合物理文件或逻辑文件、显示文件、以及ICF文件(即通讯文件)进行操作,这种情况也比较复杂。
当然,以上的情况只是平时使用的归纳,你也可以根据自己的实际需要结合各种情况,此处不再深入探讨。
……
上文中讲到了第1点,现在讲解第2点。
【注】假设以下源码文件存放的路径是:库MYLIB、源物理文件MYSRCPF
==============================================================
2. (1)建立物理文件:
使用WRKMBRPDM FILE(MYLIB/MYSRCPF)进入源码存储处,按F6,进入Start Source Entry Utility (STRSEU)画面,Source member为源码文件名,此处是我们要建立的物理文件名,假设为MYPF,Source type为文件类型,这里我们输入PF表示该文件是物理文件源码,按确认键,进入编辑器。
代码如下:


Code:
.....A..........T.Name++++++RLen++TDpB......Functions++++++++++++++++++
*************** Beginning of data *************************************
     A          R FMYPF                                                
     A             PFFLD1                     4A            TEXT('FIELD1')             
     A                                                              COLHDG('FIELD1')           
     A             PFFLD2                     5P 0         TEXT('FIELD2')             
     A                                                              COLHDG('FIELD2')           
****************** End of data ****************************************

[Ctrl+A Select All]


【注】
(a) 第一行的R处在T处,表示Record,即声明FMYPF是该物理文件的记录名;
(b) 第二行中PFFLD1位于Name处,T处为空,表示这是字段名。该句定义一个叫PFFLD1的字段,长度为4,字段属性是A,表示字符型。TEXT('FIELD1')给字段做注解,COLHDG('FIELD1')给字段指定显示时候的列表题;
(c) 第三行定义一个叫PFFLD2的字段,长度为5,字段属性是P,表示数值型,0表示小数位是0位。

保存文件,编译生成目标文件MYPF。
 
  (2)建立逻辑文件:
建立步骤和物理文件一样,不过值得注意的是,Source type必须为LF,表示该文件是逻辑文件,这里假设文件名为MYLF,代码如下:


Code:
.....A..........T.Name++++++.Len++TDpB......Functions++++++++++++++++++
*************** Beginning of data *************************************
     A          R FMYPF                                      PFILE(MYPF)               
     A          K PFFLD1                                              
****************** End of data ****************************************

[Ctrl+A Select All]


【注】
(a)第一行中R依然表示FMYPF是记录名,一般和物理文件的一样;
    PFILE(MYPF)是声明物理文件名。
(b)第二行中K的位置也是处于T处,表示该处字段PFFLD1是逻辑文件的键值。

  (3)建立对物理文件或者逻辑文件进行简单操作的RPG程序:
建立步骤和物理文件一样,不过值得注意的是,Source type必须为RPG,表示该文件是RPG源程序文件,这里假设文件名为MYRPG,代码如下:


Code:
.....FFilenameIPEAF........L..I........Device+......KExit++Entry+A....U
*************** Beginning of data *************************************
     FMYPF      O     E                     DISK                           
     FMYLF      IF     E           K        DISK                           
.....F......................Ext-record........................RcdnbrKOptionEntry+++....
     F                      FMYPF                               KRENAMEFMYLF      
.....CL0N01N02N03Factor1+++OpcdeFactor2+++ResultLenDHHiLoEqComments++++
     C                                         MOVE 'RCD1'         PFFLD1                      
     C                                         Z-ADD1                 PFFLD2                      
     C                                         WRITEFMYPF                                 
     C                      *LOVAL       SETLLFMYLF                                 
     C                                         READ FMYLF                                    90           
     C                      *IN90          IFEQ '0'                                   
     C                      PFFLD1        DSPLY                                      
     C                      PFFLD2        DSPLY                                      
     C                                         ENDIF                                      
     C                                         SETON                                            LR               
****************** End of data ****************************************

[Ctrl+A Select All]


【注】
(a) 第一行MYPF是我们上面建立的物理文件名,记住,不是记录名,别搞错了;
  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。



到此为止,你应该懂得如何往文件读写数据。
5. 写给刚接触RPG的朋友 --- 如何编写RPG程序(2) 【续】

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

上文中,只举例说明了如何对文件进行读写操作,下面再举一例子讲解如何对文件进行更新和删除:
(1)物理文件MYPF结构如下:


Code:
.....A..........T.Name++++++RLen++TDpB......Functions++++++++++++++++++
*************** Beginning of data *************************************
    A           R FMYPF                               
    A              PFFLD1                     4A            TEXT('FIELD1')       
    A                                                               COLHDG('FIELD1')       
    A              PFFLD2                     5P 0         TEXT('FIELD2')       
    A                                                               COLHDG('FIELD2')       
****************** End of data ****************************************

[Ctrl+A Select All]


(2)逻辑文件MYLF结构如下:


Code:
.....A..........T.Name++++++.Len++TDpB......Functions++++++++++++++++++
*************** Beginning of data *************************************
     A          R FMYPF                                      PFILE(MYPF)         
     A          K PFFLD1                             
****************** End of data ****************************************

[Ctrl+A Select All]


(3)假如文件有两笔记录如下:
PFFLD1         PFFLD2
================
RCD1               1
RCD2               2
================

(4)现需要把第一笔记录删除,把第二笔记录更新为"RCD2               3",代码如下:


Code:
.....FFilenameIPEAF........L..I........Device+......KExit++Entry+A....U
*************** Beginning of data *************************************
     FMYLF       UF   E           K       DISK                           
     F                      FMYPF                              KRENAMEFMYLF      
     C*                                                               
.....CL0N01N02N03Factor1+++OpcdeFactor2+++ResultLenDHHiLoEqComments++++
     C                      'RCD1'         SETLLFMYLF                                 
     C                      'RCD1'         READEFMYLF                                   90           
     C                      *IN90         IFEQ '0'                                   
     C                                         DELETFMYLF                                 
     C                                         ENDIF                                      
     C*                                                               
     C                      'RCD2'         SETLLFMYLF                                 
     C                      'RCD2'         READEFMYLF                                   90           
     C                      *IN90         IFEQ '0'                                   
     C                                        Z-ADD3                 PFFLD2                      
     C                                        UPDATFMYLF                                 
     C                                        ENDIF                                      
     C*                                                               
     C                                        SETON                                              LR               
****************** End of data ****************************************

[Ctrl+A Select All]


【注】
(a)第一行中的MYLF是逻辑文件名,
  U位于I处,表示该文件只作更新操作,
  F处于P处,表示该文件是全过程文件,一般都写F,
  E位于F处,表示该文件是个外部文件,
  K位于I处,表示该文件有键值,
  DISK位于Device处,表示该文件是磁盘文件。
(注:该句声明文件MYLF只允许做更新操作,如果同时还要对其进行添加记录,那么只要在同行A处写个A就可以了,即
.....FFilenameIPEAF........L..I........Device+......KExit++Entry+A....U
*************** Beginning of data *************************************
  FMYLF     UF   E       K     DISK                       A                          
);

(b)第二行意思是把逻辑文件记录名FMYPF改为FMYLF,这里可改可不改。如果程序里有文件出现同名的记录名,那么必须通过这种方法把其他文件记录名进行重命名;

(c)第三行把指针定位到文件开头处;
(d)第四行中的READE表示读等于键值的记录。该句的意思是用值RCD1去读逻辑文件,注意,逻辑文件的键值是字段PFFLD1,所以执行到该句时,程序会拿这个值去找逻辑文件中字段PFFLD1值为'RCD1'所在的记录,找到的话指示器置为'0',反之,置为'1';

(e)第六行的DELET是删除记录,该句意思是删除当前读到的记录;
(f)第十三行的UPDAT是更新记录,该句的意思是更新当前的记录。

============================================================

到此为止,你对物理文件、逻辑文件的操作应该是基本掌握了!

6. 写给刚接触RPG的朋友 --- 如何编写RPG程序(3)

续《写给刚接触RPG的朋友 --- 如何编写RPG程序(2)》
【上文摘要】
RPG一般用来做什么吧,举例说:
1. 整个RPG程序不包含任何外部程序,只是做些简单的数学运算,或者对数据区、DATAQ等非文件目标进行操作,这属于相对最简单的情况;
2. RPG程序对物理文件或者逻辑文件进行读、写、更新、删除操作;
3. RPG程序结合物理文件或逻辑文件、以及显示文件进行操作,这属于比较复杂的情况;
4. RPG程序结合物理文件或逻辑文件、显示文件、以及ICF文件(即通讯文件)进行操作,这种情况也比较复杂。
当然,以上的情况只是平时使用的归纳,你也可以根据自己的实际需要结合各种情况,此处不再深入探讨。
……
上文中讲到了第2点,现在讲解第3点。
【注】假设以下源码文件存放的路径是:库MYLIB、源物理文件MYSRCPF
==============================================================
3. (1)物理文件MYPF和逻辑文件MYLF使用2中建立的就可以了,假如文件物理文件里有以下记录:
=================
PFFLD1       PFFLD2
=================
RCD1               1
RCD2               2
RCD3               3
=================

(2)建立显示文件:
建立步骤和物理文件一样,不过值得注意的是,Source type必须为DSPF,表示该文件是显示文件,这里假设文件名为MYDSPF,代码如下:


Code:
.....AAN01N02N03T.Name++++++RLen++TDpBLinPosFunctions++++++++++++++++++
*************** Beginning of data *************************************
     A                                                                             DSPSIZ(24 80 *DS3)        
     A                                                                             CA12(12 'CANCEL')         
     A                     R RCDNM                                               
     A                        FLD1                         4     O   4  26DSPATR(UL)                
     A                                                                             DSPATR(HI)                
     A                                                                     4 12'PFFLD1:'                 
     A                                                                     5 12'PFFLD2:'                 
     A                        FLD2                         5S 0O   5 26                          
****************** End of data ****************************************

[Ctrl+A Select All]


【注】
(a) 第一行指定显示大小,一般都是这个;
(b) 第二行中CAxx表示程序里要可用F12按键,'CANCEL'表示注释;
(c) 第三行R跟物理文件一样,表明后面Name对应的RCDNM是一个记录名,在显示文件里指一个显示画面;
(d) 第四行FLD1在Name处,这里指字段名,长度是4,O位于TDpB的B处,表示该字段只允许做输出用,接着的4位于Lin处,表示屏幕第4行,接下来的26位于Pos处,表示屏幕第26列。到此为止,表明在屏幕第4行第26列的位置输入字段FLD1。
后面的DSPATR是显示文件关键字,是用来指定字段显示属性的,后面的UL是单词UnderLine的缩写,表明该字段带下划线,HI是单词High intensity的缩写,表明该字段高亮显示;
(e) 第五行意思是在屏幕第4行第12列输出字符串PFFLD1;

保存文件,编译生成目标文件MYDSPF。


(3)建立对物理文件或者逻辑文件以及显示文件进行简单操作的RPG程序:


Code:
.....FFilenameIPEAF........L..I........Device+......KExit++Entry+A....U
*************** Beginning of data *************************************
     FMYLF      IF     E           K        DISK                           
     F                      FMYPF                              KRENAMEFMYLF      
     FMYDSPF  CF   E                     WORKSTN                        
     C*                                                               
.....CL0N01N02N03Factor1+++OpcdeFactor2+++ResultLenDHHiLoEqComments++++
     C                       *IN12         DOWEQ'0'                                   
     C                                          EXFMTRCDNM                                 
     C      12                                LEAVE                                      
     C                       FLD1           IFEQ *BLANKS                               
     C                                          ITER                                       
     C                                          ENDIF                                      
     C                       FLD1           SETLLFMYLF                                 
     C                       FLD1           READEFMYLF                                  90           
     C                       *IN90         IFEQ '0'                                   
     C                                          Z-ADDPFFLD2     FLD2                        
     C                                          ENDIF                                      
     C                                         ENDDO                                      
     C                                         SETON                                            LR               
****************** End of data ****************************************

[Ctrl+A Select All]


【注】
(a) 第一行声明逻辑文件MYLF为只读的;
(b) 第二行是第一行的延续,把逻辑文件的记录名FMYPF重命名为FMYLF;
(c) 第三行中的MYDSPF是我们上面建立的显示文件名,
  C位于I处,表明允许对该文件进行写入/读出操作,
  F位于P处,表明该文件是全过程文件,一般都这么写,
  E位于F处,表明该文件是外部文件,
  WORKSTN位于Device处,表明该文件是显示文件或报表文件,
这行和第一行声明很相似。
(d) 第四行中的*IN12表示指示器12,这里为什么只用这个指示器,而不用别的呢?看看上面的显示文件MYDSPF的第二行吧,还记得吗?我们通过语句CA12(12 'CANCEL') 声明了程序运行时要用到按键F12,这是提供给用户进行操作用的。该句的意思是当按键没被按下时,进入循环;
(e) 第五行中的EXFMT是用来显示一个画面,并且停留着等待用户做出操作,该句意思是显示画面RCDNM,并且程序停留在该处不继续执行;
(f) 第六行的LEAVE表示退出循环,12位于N01的01处就是按键F12的状态,当用户按下F12,那么指示器就变为1,这时就执行该句,反之,不执行;
(g) 第七行判断画面中的字段FLD1是否为空;
(h) 第八行的ITER表示跳到循环的开始处;
(i) 第七、八、九行的意思是,如果FLD1为空的话,那么跳到循环开始处执行;
(j) 第十行是把指针设置到文件头;
(k) 第十一行是读逻辑文件中字段PFFLD1的值等于FLD1的记录;
(l) 第十二行表示读到记录;
(m) 第十三行表示把逻辑文件中读到的记录的PFFLD2字段值赋给显示画面中的字段FLD2;

============================================================

到此为止,你对显示文件应该有了一点点的了解!
由于显示文件操作起来相对复杂,接下来的功夫就靠各位刚入门的朋友多参考别人写的例子,运行运行,这样体会会更深,收获也会更大的!
7. 写给刚接触RPG的朋友 --- 如何编写RPG程序(4)

续《写给刚接触RPG的朋友 --- 如何编写RPG程序(3)》
【上文摘要】
RPG一般用来做什么吧,举例说:
1. 整个RPG程序不包含任何外部程序,只是做些简单的数学运算,或者对数据区、DATAQ等非文件目标进行操作,这属于相对最简单的情况;
2. RPG程序对物理文件或者逻辑文件进行读、写、更新、删除操作;
3. RPG程序结合物理文件或逻辑文件、以及显示文件进行操作,这属于比较复杂的情况;
4. RPG程序结合物理文件或逻辑文件、显示文件、以及ICF文件(即通讯文件)进行操作,这种情况也比较复杂。
当然,以上的情况只是平时使用的归纳,你也可以根据自己的实际需要结合各种情况,此处不再深入探讨。
……
上文中讲到了第3点,现在讲解第4点。

==========================================================

我对SNA通讯还不是很熟,平时也用得少,就在此大概说说吧。
首先得建立ICF文件,一般都是很简单的,主要含有一个用来传送数据的字段,还有DETACH、EOS等关键字。在程序外部需要建立并配置LIN、CTL、DEV,要求的参数比较多。通讯原理都差不多,这是发送端:
1. 用DEV名ACQ通讯文件(即ICF文件);
2. WRITE存放数据的字段对应的记录名,即写数据;
3. 写DETACH、EOS结束会话。
接受端也差不多这样,即第二点的WRITE改为READ,即读数据。

IBM的SNA协议通讯现在用得越来越少了,现在主流是用TCP/IP,用C写,SOCKET方便,也不用配置什么参数,一般找些程序套用一下就行,嘿嘿。
通讯方面,我实在不熟,望熟悉的朋友可以举举例子供大家分享一下!

==========================================================

刚入门的朋友可以先不要急于学这方面的知识,如果真的要学,建议好好学一下C吧。
一般同主机通讯就用数据队列(DATAQ)存放数据包就可以了,关于这方面,接下来我会通过举例说明的了。
8. 写给刚接触RPG的朋友 --- 如何DEBUG程序

程序虽然编译通过了,但是有时候会因为存在逻辑问题而导致错误的甚至无法预料的结果,
那么这时我们就需要调试程序了,以下就是调试程序的方法:

===============================================
假如我们有一个文件存放路径是
        FILE ......... :     MYFILE
        LIB.............:     MYLIB
        MEMBER.....:     MYRPG

假如编译生成的目标文件存放在MYOBJ库下,那么使用以下命令进行调试:
STRISDB PGM(MYOBJ/MYRPG) UPDPROD(*YES) PARM(PARM1 PARM2 ……)
【注:UPDPROD参数选择*YES,如果没有参数,则PARM参数不用输入】
按确认键,进入DEBUG状态。

F5:   表示一步一步执行;
F17: 即Shift+F5,表示执行;
F6:   设置断点;
F11: 查看变量值(【注】必须把光标移到变量处再F11才能看)
F23: 即Shift+F11,查看变量值(【注】必须把光标移到变量处再F23才能改)
F12: 取消;
F3:   退出。

一般就用这几个键。如果程序里头还CALL到其他程序,
那么可以按 Shift+F2 把改被CALL的程序添加进来。

===============================================

你现在应该可以通过DEBUG工具查找程序为什么结果不对了!
9. 写给有一定RPG基础的朋友 --- 如何使用显示文件的SUBFILE

这里就给出代码,可以先到机器上试运行运行,有问题我们再共同探讨探讨。

1. 物理文件 -- MYPF


Code:
*************** Beginning of data *************************************
     A          R FMYPF                                               
     A             FLD001         5A                                   
     A             FLD002        20A                                   
     A          K FLD001                                              
****************** End of data ****************************************
[Ctrl+A Select All]



【注】假设这个文件有如下记录:
==================================
  FLD001             FLD002
==================================
  00001               FIELD 00001
  00002               FIELD 00002
  00003               FIELD 00003
  00004               FIELD 00004
  00005               FIELD 00005
==================================



2. 显示文件 -- MYDSPF


Code:
*************** Beginning of data *************************************
     A                                                 DSPSIZ(24 80 *DS3)        
     A          R HEAD                                                
     A                                           2   1DATE                      
     A                                                  EDTCDE(Y)                 
     A                                           2 69TIME                      
     A                                           2 34'显示文件记录'          
     A*****************************************************************
     A          R SUBF                             SFL                       
     A            FLD001        5A  O  9 16
     A            FLD002       20A  O  9 28                     
     A*****************************************************************
     A          R SUBFC                           SFLCTL(SUBF)              
     A                                                  SFLSIZ(9999)              
     A                                                  SFLPAG(0010)              
     A  30                                            SFLDSP                    
     A  31                                            SFLDSPCTL                 
     A  32                                            SFLCLR                    
     A  33                                            SFLEND(*MORE)             
     A                                                  OVERLAY                   
     A                                                  CA12(12 'EXIT')           
     A                                           7 15'字段1'                
     A                                                  COLOR(WHT)                
     A                                           7 27'字段2'                
     A                                                  COLOR(WHT)                
     A*****************************************************************
     A          R FOOT                                                
     A                                                  OVERLAY                   
     A                                         24 11'F12=EXIT'                
     A                                                  COLOR(BLU)                
****************** End of data ****************************************
[Ctrl+A Select All]


【注】
(1) 第一个画面HEAD注解:
(a) 第一行表明显示尺寸,一般就这么写;
(b) 第二行的R表示接下来是一个记录,记录名是HEAD,有点象PF的定义,不过在DSPF里的记录代表
  一个画面;
(c) 第三行的DATE是系统关键字,表示日期,该句意思是在第2行第1列显示系统日期;
(d) 第四行的EDTCDE表示编辑字,EDTCDE(Y)表示系统日期按照MM/DD/YY格式显示;
(e) 第五行的TIME是系统关键字,表示时间,该句意思是在第2行第69列显示系统时间;
(f) 第六行意思是在第2行第34列显示字符窜"显示文件记录"。

(2) 第二个画面SUBF注解:
(a) 第一行的R和上面一样,也代表这是一个画面,名字是SUBF;
  后面的SFL是系统关键字,表示该画面是SUBFILE;
(b) 第二行表示在画面第9行第16列显示长度为5的字段FLD001,5是长度,A表示该字段是字符型,
  O表示该字段只用于输出;
(c) 第三行与上一行类似。

(3) 第三个画面SUBFC注解:
(a) 第一行的R和上面一样,也代表这是一个画面,名字是SUBFC,
  SFLCTL是系统关键字,SFLCTL(SUBF)表示该记录是用来对画面SUBF显示的控制,
  一般定义了SUBFILE之后,都要定义这个记录的;
(b) 第二行的SFLSIZ用来说明SUBF的记录数,这里我把它定义为最大9999;
(c) 第三行的SFLPAG用来说明每页显示的记录条数,这里我把定义为10笔;
(d) 第四、五、六行的SFLDSP是用来显示记录的,SFLDSPCTL用来控制显示的,
  SFLCLR用来清除显示的记录的,一般都需要给他们加上指示器,这里分别是30、31、32;
(e) 第七行的SFLEND用来声明每页下方的提示,这里用*MORE来表示,如果还有下一页的话,下方
  就显示More……,否则,就显示Bottom,这里也用个指示器33;
(f) 第八行的OVERLAY表示显示该记录之前不要清除上一屏,即保留;
(g) 第九行的CA12表示在这个画面里我可以用键盘按键F12,对应的指示器是12,
  这里你可以根据自己需要使用别的按键,例如CA03;
(h) 第十一行的COLOR是系统关键字,用来给上面显示的字符窜设置显示颜色,
  这里用BLU,表示字符窜字段1显示为蓝色;

(4) 第四个画面FOOT注解参考上面三点即可,在此不在累赘。



3. RPG程序 -- MYDSPR


Code:
*************** Beginning of data *************************************
     FMYPF       IF  E           K        DISK                           
     FMYDSPF  CF  E                    WORKSTN                        
     F                                                                                   RRN   KSFILE SUBF       
     C           *IN12      DOWEQ'0'                                   
     C                          WRITEHEAD                                  
     C                          WRITEFOOT                                  
     C                          EXSR CLRSFL                                
     C                          EXSR REDRCD                                
     C                          ENDDO                                      
     C*                                                               
     C                          SETON                               LR               
     C*****************************************************************
     C           CLRSFL    BEGSR                                      
     C*                                                               
     C                          Z-ADD0              RRN     40                  
     C                          MOVEA'0011'    *IN,30                      
     C                          WRITESUBFC                                 
     C*                                                               
     C                          ENDSR                                      
     C*****************************************************************
     C           REDRCD    BEGSR                                      
     C*                                                               
     C           *LOVAL    SETLLFMYPF                                 
     C                           READ FMYPF                    90           
     C           *IN90      DOWEQ'0'                                   
     C                          ADD  1         RRN                         
     C                          WRITESUBF                                  
     C                          READ FMYPF                    90           
     C                          ENDDO                                      
     C*                                                               
     C                          SETON                     30               
     C           RRN         IFEQ 0                                     
     C                          SETOF                     30               
     C                          ENDIF                                      
     C                          MOVEA'10'      *IN,31                      
     C                          EXFMTSUBFC                                 
     C*                                                               
     C                          ENDSR                                      
****************** End of data ****************************************
[Ctrl+A Select All]



=======================================================
【注】

处理顺序:

1. 编译物理文件MYPF,输入记录;
2. 编译显示文件MYDSPF;
3. 编译RPG程序MYDSPR;
4. CALL MYDSPR

还等什么,赶紧试试吧!
///
对《9. 写给有一定RPG基础的朋友 --- 如何使用显示文件的SUBFILE》的一点补充

第一次来,就看了这篇文章,写得很好,不过想补充几句:
(a) 第一行表明显示尺寸,一般就这么写;

5250终端有两种显示尺寸,24*80或者27*132,前者更通用一点,不过如果应用环境有支持27*132的终端,而且需要显示的内容比较多的话,可以考虑使用后者(一般不推荐,因为现在大部分都是使用仿真终端,默认的配置都是24*80的。也可以写一个同时支持两种尺寸的显示文件,不过具体怎么写忘了,要找一下老程序或者翻一下书)。
(b) 第二行的SFLSIZ用来说明SUBF的记录数,这里我把它定义为最大9999;
(c) 第三行的SFLPAG用来说明每页显示的记录条数,这里我把定义为10笔;


说的没错,不过有点问题。这个显示文件是靠系统自动处理PAGEUP/PAGEDOWN的,SFLPAG的大小是自己控制的,只要屏幕放得下就行了。SFLSIZ则需要根据实际的数据量来考虑。对于记录数不多的情况,SFLSIZ=11和SFLSIZ=9999的效果是一样的。但是注意一点,Subfile的记录数不能超过9999条(与SFLSIZ的大小无关,SFLSIZ=11的时候也可以写9999条记录的)。范例中的程序,如果MYPF的记录数大于9999的话,程序会出EXCEPTION的。
如果SFLSIZ=SFLPAG的话,PAGEUP/PAGEDOWN是不能翻页的。如果MYPF的记录数大于9999的时候,就需要程序去控制翻页,具体的做法是定义PAGEUP/PAGEDOWN的指示器,当接收到PAGEUP/PAGEDOWN响应的时候读取数据库的前/后十条记录到Sub File里面去。

此外,范例中的程序应该是编译不过去的,因为使用了RRN变量,一般来说RRN是指示当前SFL记录的变量,在SFLCTL里面应该有这个变量的定义,定义如下:


Code:
  A         RRN         4S 0H     SFLRCDNBR(CURSOR)  
[Ctrl+A Select All]
再补充一下,
MOVEA'0011'     *IN,30
这种写法虽然很简练,不过建议对指示器操作还是用SETON/SETOFF,因为用RPG谢的程序大部分都是企业应用,易读性非常重要。

  • 0
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值