有没有大神懂as400 工商银行储蓄卡销户销户代码的开发

查看: 5248|回复: 17
哪位前辈来讲讲AS400平台核心系统的架构和实现机制?
论坛徽章:4
本帖最后由 没有一片云 于
12:04 编辑
做过Aix的核心,个人理解就是典型的cs架构,前端-中间件(平台)-后台,一个前端对应一个后台程序,前端输入完毕回车后组成报文发给对应的后台程序,后台程序(c语言编写,嵌入sql)接到相应的数据后进行处理,增删改查表里的数据,记账,写日记。在编译方面,一般系统里都有写好的makefile,程序写好之后放入指定的文件夹,然后make一下就可以完成编译。没做过AS400的核心,不知AS400平台的核心是否也是这个套路,只是后台的程序不是pro c而是RPG?哪位前辈有RPG的核心后台程序能否发给我让我学习一下?
还有几个问题请教大家:
1.个人理解中间件是起分流和保护作用的,该送到哪里的报文送到哪里,同时保证安全性和顺畅性,防止堵塞,不知是否正确?
2.个人理解中间件是平台的一部分,报文的组包和解包工作是由平台完成的,不知道是否正确?如果是这样的话,平台除了中间件还包含什么其他部分?
论坛徽章:1
10多年前做过400的程序,跟主机基本类似
COBOL, DB400 VS. VSAM/DB2, 使用COPYBOOK,
JL VS. JCL
CICS可选,400算是大机的简版,国内还有不少行用,但在亚太多数转开放了
认证徽章论坛徽章:45
核心系统的整体结构和思路是不分平台的,不管unix,400,大机,系统的设计可以是一样的。以前的联想,中联核心系统产品smartFTS,bankvision,就是一套设计,同时有unix版和400版。不同的平台在于程序实现的写法不同,以及一些技术细节区别。例如RPG语言对数据文件增删改很方便,记录加锁机制与普通关系数据库有所不同等,但总体来说大同小异。
感觉对于核心-前置-前端的架构层次理解有些欠缺。你这里列举的中间件这个不是必须的,作为通讯中间件,作用是帮助系统简化报文通讯编程难度,常见的有CICS,tuxedo等,也有不少系统自己写通讯,不使用中间件,所以中间件不作为单独的一层看待。而前置的功能要复杂,服务的发布,组合,一致性管理,作为连接各种系统的汇集点。
论坛徽章:1
谁能罗列出目前在国内使用AS400作为核心银行HW的银行列表??
论坛徽章:4
pacman2000 发表于
核心系统的整体结构和思路是不分平台的,不管unix,400,大机,系统的设计可以是一样的。以前的联想,中联核 ...
受教了,多谢前辈
论坛徽章:4
zhanglp74 发表于
谁能罗列出目前在国内使用AS400作为核心银行HW的银行列表??
股份制银行里招行和中信还是AS400,城商行应该也有不少
认证徽章论坛徽章:45
本帖最后由 pacman2000 于
20:32 编辑
zhanglp74 发表于
谁能罗列出目前在国内使用AS400作为核心银行HW的银行列表??
股份制:招行,中信。
城商:北京银行,宁波银行,汉口银行,九江银行,青岛商行,赣州商行。
农信:北京,天津,重庆,黑龙江,吉林,内蒙古,河北,山西,甘肃,浙江,安徽,江西,福建,深圳,东莞,顺德。
广发正在转大机,深发展被平安合并后转6000,宁波国际银行也转了6000。
论坛徽章:1
pacman2000 发表于
股份制:招行,中信。
城商:北京银行,宁波银行,汉口银行,九江银行,青岛商行,赣州商行。
农信: ...
多谢!!!
论坛徽章:6
pacman2000 发表于
股份制:招行,中信。
城商:北京银行,宁波银行,汉口银行,九江银行,青岛商行,赣州商行。
农信: ...
挺全的,赞一个。
论坛徽章:18
pacman2000 发表于
股份制:招行,中信。
城商:北京银行,宁波银行,汉口银行,九江银行,青岛商行,赣州商行。
农信: ...
除去AS400平台、大机,采用开发平台的还是占大多数。开发平台中,采用UNIX/C做核心的,又占大多数。
itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有    
 北京市公安局海淀分局网监中心备案编号:10 广播电视节目制作经营许可证:编号(京)字第1149号以后AS400和cobol在银行的的前景_百度知道
以后AS400和cobol在银行的的前景
我去年在银行做了1年的as400外包,现在公司as400项目太少回公司总部待着了。听说cobol在银行的的景比AS400好。现在想自己换公司继续干as400又想自学cobol往cobol方向发展。我在广州工作。请教各位过来人,以后AS400的前景和cobol比起来如何。AS400在银行业是不...
我有更好的答案
我就是保险公司的,我们就用的AS400AS400保险公司用的多,AS400也用cobol呀,调用cobol,前端jsp,后台AS400,银行用cobol的的确多,都是大机的,我现在做系统架构,保费计算程序核心算法还是在AS400上面,前台基本就是展示和工作流,都差不多,可以开发的人太多了,业务导向开发才是真理啊。我也是干了这么几年的一点感悟,外包,自己开发,另外有一些报表的打印。所以语言就那么回事,关键你站在哪里思考问题,我觉得银行保险公司主要倾向还是业务方面,至于实现有很多种方式
采纳率:20%
前国有五大行除农行外几乎都是用cobol开发的,必须知识全面(小型机、大型机、CICS,要是以cobol为以后发展的话,其实cobol语言的前景肯定不如java这种语言的、ORACLE、MQ等)以后可能发展会好一点
我也一直在外包,不过没干过银行项目,前几天还就因为不熟悉AS400面试被刷了呢,请问楼主有AS400与银行相关业务方面的的资料吗,至为感谢!
为您推荐:
其他类似问题
您可能关注的内容
as400的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。当前位置: →
→ AS400高级开发重要知识点汇总
AS400高级开发重要知识点汇总
& 作者及来源: NetAnts - 博客园 &
&收藏到→_→:
摘要: AS400高级开发重要知识点汇总
"AS400高级开发重要知识点汇总"::
数组几乎在所有的中都会涉及到,这里对概念不做详细解释。如果不明白,也可以简单的认为就是许多类型完全相同的变量。&
d&dimdata&&&&&&&&&s&&&&&&&&&&&&&&4&&&&dim(3)&
1.&&&首个&d&,&&表示是d&行(如之前的手册中已提到:文件的定义为f&行,即首位为f;程序代码为c&行,即首位为&c)&
2.&&&dimdata&,&&表示数组的名字。数组中的第一条记录,就是dimdata(1),第二条记录,就是dimdata(2),依此类推。第n&条记录,就是dimdata(n)&,这个&n&,可以使用变量来表示。&
3.&&&s,&&表示这是一个独立的变量,与其它定义的变量无关,通常都是这样定义的。(在结构体中会提到,结构体中可以包含数组;也就是说,如果这个数组的定义在结构体定义之下,且没有&s&,那么就表示这个数组是属于结构体的一个组成项)&
4.&&&&4&&,&&表示数组中的每条记录,都是&4&位长的字符;如果是数字,就是&13&2&(也用f4看)&
5.&&&dim(3),表示这个数组共有三条记录。数组的定义,必须在定义时指定总记录条数&就最简单的赋值操作而言,可以认为定义这个&dimdata&数组,与直接定义三个&4&位长的字符变量dimdata1、dimdata2、dimdata3是等价的,只是定义数组可以少写几行代码;而且数组可以进行查询定位,而独立的变量就做不到这一点了。
数组的初始化,常使用操作码&movea&。即将整个数组中,所有的记录,都赋值成为同样的一个值(通常是空,或0&),如下,即表示将数组中所有记录都赋值为空&
c&&&&&movea&*blanks&dimdata&
1.&&&数组中的记录,可以直接赋值,或被赋值;&
c&&&&&eval&dimdata(1)=&test&&
//&第一条记录赋值成为&test&&
c&&&&&eval&dimdata(3)=dimdata(1)&
&//第三条记录赋值成为第一记录的值,即也为&test&&
2.&&&数组的定位&
数组也可以进行查询定位,使用&lookup操作码。例如当前数组中,已赋值如下:&
&&dimdata(1)&=&&0001&&
&&dimdata(2)&=&&0002&&
&&dimdata(3)&=&&0003&&
c&&&&&&&&&&&eval&&&&&&n=1&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
c&&&&&'0002'&&&&lookup&&&dimdata(n)&&&&&&&&&&&&&&&&&&&&&&&&&&&&&54&
首句n=1&,表示从第一条记录开始查询;如果&n=2&,即表示从第2&条记录开始查询;如果n&大于数组定义时的总记录数(如n=4&),则下面的&lookup语句会报错,跳出程序;&
第二句,表示查询&&&数组&dimdata&中,内容为&0002&&的,是第几条记录;其中,54&是eq&指示器(最后面那个)。当找到记录时,*in54&=&&1&;当未找到记录时,&*in54=&0&。与操作码&chain,&read的指示器含义相反;&
在这个例子中,执行完&lookup语后,*in54=&1&,&n&=&2&(即数组&dimdata&中,
有内容为&0002&&的记录,是第二条记录。&
当数组中有多条内容相同的记录时,n&为顺序查询到的第一条记录&
当数组中无相应记录时,*in54=&0&,&&n&=&&初始值,此例中,即&n&=&1&
在数组的使用中,还有一种在编译程序时,给数组赋初始值的定义方法,如下:&
d&dimtext&&&&&&&&&s&&&&&&&&&&&&&&3&&&&dim(10)&&ctdata&&perrcd(2)&
在key s&这个地方,使用了dim&,ctdata&,perrcd&三个关键字&
dim&(10)&&&指dimtext&这个数组共含有10&条记录&
ctdata&&&&&表明数组dimtext&是一个编译时赋初值的数组。&
perrcd&(2)&&表明数组dimtext&的初始值使用底部数据,每行包含&2&条记录&
如底部为:&
&&&&&&c&&&&&&&&&&&&&&&&&&&seton&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&lr&
&&&&&&c&&&&&&&&&&&&&&&&&&&return&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&**&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&123456&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&789abc&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&defghi&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&******************&end&of&data&****************************************&
1.&&&底部数据的定义,要顶头写(在&rpgle中,shift+f7&屏幕左移,&shift+f8&屏幕右移;之后按两下&f11,可回到正常编辑的画面),位置可对比上面的c&行。&
2.&&&首行的&**&,是标识以下为数据项,必须要有。&
3.&&&*****end&of&data********,是系统自动给出的结束行。&
4.&&&如上述定义之后,那么当编译了这个程序后,程序会将dimtext&初始化为:&
&dimtext(1&)&=&&123&&
&dimtext(2&)&=&&456&&
&dimtext(3&)&=&&789&&
&dimtext(4&)&=&&abc&&
&dimtext(5&)&=&&def&&
&dimtext(6&)&=&&ghi&&
&dimtext(7&),dimtext(8&),dimtext(9&),dimtext(10)都为空。
&数据域(*dtaara),也叫数据区,是系统目标中的一种类型。当建立了这种目标后,可以用来存入数据,以便任何程序进行读取和修改。数据域的典型用途如下:
&&提供用于几个程序中的常数字段,易于共享和修改。如:标题、说明等。
&&在一个作业中提供一个传递信息的区域。
&&在一个作业中提供一个字段作为控制参数,以便容易地得到修改。
一个数据区可以由一个用户锁住。这样就避免其它用户同时操作。
数据区要先生成然后才能使用。一个数据区可以生成为:
最长为字符的字符串。
根据数据区是仅用在过程或程序或也用在其它高级语言过程或程序,使用不同属性的十进制值。对过程或程序,最多位整数位小数,但总共不能多于位。对其它语言,最多位整数位小数,但总共不能多于位。
逻辑值&&或&&。
在生成数据区时,可规定初值。如果没规定,则用下列值:
十进制用零,字符用空格,逻辑值用&&。
如何建立数据区(dataara)
【注】下面例子只建立*char型的数据区,其它类型的可以自己练习
在系统命令行输入crtdtaara,按f4,进入&create&data&area(crtdtaara)&画面,参数如下:
(a)&data&area:数据区的名字,这里假设为mydtaara
(b)&library:&存放数据区的库,默认值是*curlib,即当前库,这里我们输入
(c)&type:&数据区的类型
&&&&&&&&&&&*dec&数值型
&&&&&*char字符型
&&&&&*lgl逻辑型
这里我们选择*char
(d)&length:&数据区的长度,这里假设是20,当然你可以根据自己的需要输入对应的长度值
(e)&decimal&positions:&指小数位位数,一般是针对*dec型的才需要设置;
(f)&initial&value:&数据区初始值,可填可不填,我们这里选择不填,在程序里进行更改;
(g)&text&:&注释
整个命令请参考如下
crtdtaara&dtaara(mylibxx/mydtaara)&type(*char)&len(20)
text(&建立属于自己的数据区&)
如何修改数据区
(2)在rpg里面如何操作数据区,假设该源码文件名为odtaara,存放在mylibxx/srcfile下:
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&odtaara
dname+++++++++++etdsfrom+++to/l+++idc.key s+++++++++++++++++++++++++
***************&beginning&of&data&*************************************
d#dta&&&&&&&&&&&&&ds&&&&&&&&&&&&20&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
d&curdat&&&&&&&&&&&&&&&&&&1&&&&&&8&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
d&curtme&&&&&&&&&&&&&&&&&11&&&&&16&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
c&&&&&*dtaara&&&&&&&define&&&&mydtaara&&&&&&#dta&&&&&&&&&&&&&&&&&&&&&&&
c&&&&&*lock&&&&&&&&&in&&&&&&&&#dta&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
c&&&&&&&&&&&&&&&&&&&time&&&&&&&&&&&&&&&&&&&&dattme&&&&&&&&&&&14&0&&&&&&
c&&&&&&&&&&&&&&&&&&&move&&&&&&dattme&&&&&&&&curdat&&&&&&&&&&&&&&&&&&&&&
c&&&&&&&&&&&&&&&&&&&movel&&&&&dattme&&&&&&&&curtme&&&&&&&&&&&&&&&&&&&&&
c&&&&&&&&&&&&&&&&&&&out&&&&&&&#dta&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
c&&&&&&&&&&&&&&&&&&&unlock&&&&#dta&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
c&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
c&&&&&&&&&&&&&&&&&&&seton&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&lr&&&&
******************&end&of&data&****************************************
1.&第一行#dta是字段名,ds表示#dta是个字段,20表示字段#dta的长度,整行的意思是定此文来自: 马开东博客
转载请注明出处 网址:
义一个长度20的字段#
2.&第二行第三行进一步详细定义字段#dta的内部结构
3.&第四行的define表示定义,一般用来定义字段和数据区,*dtaara是定义数据区格式时必用的参数,整行的意思是把数据区mydtaara的格式按照字段#dta定义,以后对字段#dta进行操作就等于对数据区mydtaara进行操作。
4.&第五行的in用来读数据区,*lock表示操作时把数据区锁住,一般只有对数据区进行更新操作才需要锁住,如果只是读数据区,则不用该参数;
5.&第六行的time是取系统当前日期和时间,整行的意思是把系统当前日期和时间赋给一个14位长0位小数的数值型变量dtatme中,由于系统当前的日期和时间是按照&hhmmssmmddyyyy&存放,所以刚好也是14位;
6.&第七行意思是把变量dattme右移给字段curdat,所以curdat的值刚好是日期&hhmmss&;
7.&第九行的out表示对数据区进行写操作,记住factor处是我们程序开始定义的大字段#
8.&第十行的unlock表示解锁,因为我们在第五行使用了参数*
命令行call&&&odtaara,数据区已经成功更改数据;
使用命令dspdtaara&mydtaara就可以查看数据区内容了
如何使用数据区
dname+++++++++++etdsfrom+++to/l+++idc.key s++++++++++++++++++++++++
***************&beginning&of&data&************************************
d#dta&&&&&&&&&&&&&ds&&&&&&&&&&&&20&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
d&curdat&&&&&&&&&&&&&&&&&&1&&&&&&8&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
d&curtme&&&&&&&&&&&&&&&&&11&&&&&16&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
c&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
c&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
c&&&&&*dtaara&&&&&&&define&&&&mydtaara&&&&&&#dta&&&&&&&&&&&&&&&&&&&&&&
c&&&&&*lock&&&&&&&&&in&&&&&&&&#dta&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
c&&&&&curdat&&&&&&&&dsply&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
c&&&&&curtme&&&&&&&&dsply&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
c*&&&&&&&&&&&&&&&&&&out&&&&&&&#dta&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
c&&&&&&&&&&&&&&&&&&&unlock&&&&#dta&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
c&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
c&&&&&&&&&&&&&&&&&&&seton&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&lr&&&
******************&end&of&data&***************************************
3.&数据队列
数据队列的程序通讯
&&&&&&数据队列(*dtaq)是系统目标中的一种类型,当建立了这种目标后,一个程序可以发送数据给它,另一个程序再从中接收数据,从而达到程序之间的数据通讯。
数据队列的优点
数据队列是两个作业之间进行异步通讯的最快方法。此文来自: 马开东博客
转载请注明出处 网址:
相对、消息队列或数据域而言,它需要较少的额外开销。
多个作业可以向相同的数据队列送数据和取数据,而数据队列的先进先出、后进先出或关键字顺序排列属性,能够保证数据送取的正确性。
在任何高级语言程序中,通过调用系统提供的程序,就可以对数据队列进行操作,而且操作方法灵活方便。数据队列的操作和使用包括两类:第一类使用&cl&命令;第二类调用系统程序。
&&&&&&&&&&&crtdtaq&&&&建立数据队列
&&&&&&&&&&&dltdtaq&&&&删除数据队列
&&&&&&&&&&&wrkdtaq&&& 工作数据队列
系统程序:&
&&&&&&&&&&&qsnddtaq& 发送数据队列
&&&&&&&&&&&qrcvdtaq&&&接收数据队列
&&&&&&&&&&&qclrdtaq&&&清除数据队列
&&&&&&&&&&&qmhqrdqd&&检索数据队列
数据队列的发送
&&&&需要将数据发送给数据队列,只要在程序中调用&qsnddtaq&。在&cl&程序中,调用的格式如下:
call&&pgm(qsnddtaq)&&parm(&qname&&&lib&&+
&&&&&&&&&&&&&fldlen&&&field&&&keylen&&&key)
&qname:&&&是长度为10的字符型,它命名了数据队列,如:
&&&&&&&&&& &in_q。
&lib:& 是长度为10的字符型,它命名了数据队列所在的
&&&&&&&&&& 库,如:*libl。
&fldlen: 是长度为5的数字型,它规定了发送给数据队列的
&&&&&&&&&& 字符数,如:100。
&field: 是长度为&fldlen的字符型,它包含了具体发送
&&&&&&&& 给数据队列的数据。
&keylen: 是长度为3的数字型,它说明了传送给数据队列的
&&&&&&&&& 关键字长度,如:6。
&key:& 是长度为&keylen的字符型,它包含了传送给
&&&&&&&&&& 数据队列的关键字数据。
&&&&注:后两个参数可以自选,如果说明了一个,则必须说明另一个。
&数据队列的接收
&&&&需要从数据队列中接收数据,只要在程序中调用qrcvdtaq&。在&cl&程序中,调用的格式如下:
call&&pgm(qrcvdtaq)&&parm(&qname&&lib&&fldlen&+
&field&&wait&&order&keylen&&key&&sndrlen&&sndr)
&qname:&& 是长度为10的字符型,它命名了数据队列。如:
&&&&&&&&&&&&&out_q。
&lib:&& 是长度为10的字符型,它命名了数据队列所在的
&&&&&&&&&&&&&库。如:*libl。
&fldlen: 是长度为5的数字型,它规定了发送给数据队列
&&&&&&&&&&&&&的字符数。
&field:&& 是长度为&fldlen的字符型,它包含了从数据
&&&&&&&&&&&&&队列中接收到的具体数据。&&&
&wait:&& 是长度为5的数字型,它说明了等待接收数据的
&&&&&&&&&&&& 时间。负数表示无限制的等待;零表示不等待;
正数示要等待的秒数,最大值是9999。这个参数
只有在数据队列中无满足条件的数据时,&才起作&&&&&&&&&&&&&&& 用。
&order:&& 是长度为2的字符型,它说明了按关键字接收数
&&&&&&&&&&&& 据的条件。可用的字符值是:gt、lt、eq、
&&&&&&&&&&&& ge、le。
&keylen:& 是长度为3的数字型,它说明了接收数据队列的关
&&&&&&&&&&&&&键字长度。
&key:&&& 是长度为&keylen的字符型,它标识了用于从
&&&&&&&&&& 数据队列中接收数据的关键字变量。
&sndrlen:是长度为3的数字型,它规定了发送者标识的长
&&&&&&&&&&&&&度。
&sndr:& 是长度为&sndrlen&的字符型,它包含了发送
&&&&&&&&&&&& 者标识的数据。
&&&&注:后三个参数可以任选,但是&order、&keylen和&key&必须同时说明。
数据队列的清除
&&&&需要从数据队列中清除数据,只要在程序中调用&qclrdtaq在&cl&程序中,调用的格式如下:
call&&pgm(qclrdtaq)&parmm(&qname&&&lib)
数据队列的检索
&&&需要检索一个数据队列的描述项,只要在程序中调用&qmhqrdqd。在&cl&程序中,调用的格式如下:
call&&pgm(qmhqrdqd)&parm(&rcvr&&&rcvrlen&+
&&&&&&&&&&&&&&format&&&dqname)
&rcvr:&& 是长度为&rcvrlen的字符型,它标识了含有
数据队列性的变量。
&rcvrlen:&是长度为4的数字型,它说明了&rcvr长度。
&format: 是长度为8的字符型,它定义了接收模板的格
&dqname:&是长度为20的字符型,它标识了数据队列和所
&&&&&&&&&& 在库,前十个字符是队列名字,后十个字符是
******crt_dtaq.rpgle******
f*----从学生信息表读取记录到数据队列------------------------------------*
&&&&&f*----用到的学生信息表--------------------------------------------------*
&&&&&fstudent1&&if&&&e&&&&&&&&&&&k&disk
&&&&&f*------------------------------------------------------------------------*
&&&&&d*-----声明数据队列-----------------------------------------------------*
&&&&&d*&qname&&&&&&&&&&s&&&&&&&&&&&&&10&&&&inz('studentque')
&&&&&d*&lib&&&&&&&&&&&&s&&&&&&&&&&&&&10&&&&inz('design2nd')
&&&&&d*&fldlen&&&&&&&&&s&&&&&&&&&&&&&&5&&0&inz(150)
&&&&&d*&field&&&&&&&&&&s&&&&&&&&&&&&&10&&&&inz('*blank')
&&&&&d*------------------------------------------------------------------------*
&&&&&d*-----定义结构体与学生信息表类型一致用来赋值给数据字段-----------------*
&&&&&d#stu_data&&&&&&&&ds&&&&&&&&&&&150
&&&&&dsstu_id&&&&&&&&&&&&&&&&&&1&&&&&&4a
&&&&&dsstu_nme&&&&&&&&&&&&&&&&&6&&&&&55a
&&&&&dsstu_add&&&&&&&&&&&&&&&&56&&&&105a
&&&&&dsstu_btd&&&&&&&&&&&&&&&110&&&&119d
&&&&&dsstu_tel&&&&&&&&&&&&&&&120&&&&130a
&&&&&dsstu_sex&&&&&&&&&&&&&&&132&&&&133a
&&&&&dsstu_age&&&&&&&&&&&&&&&135&&&&137a
&&&&&dsstu_flg&&&&&&&&&&&&&&&139&&&&140a
&&&&&d*------------------------------------------------------------------------*
&&&&&c*--------------程序从这里开始------------------------------------------*
&&&&&c&&&&&*loval&&&&&&&&setll&&&&&stu
&&&&&c&&&&&&&&&&&&&&&&&&&dow&&&&&&&1=1
&&&&&c&&&&&&&&&&&&&&&&&&&read&&&&&&stu&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&1617
&&&&&c&&&&&&&&&&&&&&&&&&&if&&&&&&&&*in17='0'
&&&&&c&&&&&&&&&&&&&&&&&&&movel&&&&&stu_id&&&&&&&&sstu_id
&&&&&c*&&&&sstu_id&&&&&&&dsply
&&&&&c&&&&&&&&&&&&&&&&&&&movel&&&&&stu_nme&&&&&&&sstu_nme
&&&&&c*&&&&sstu_nme&&&&&&dsply
&&&&&c&&&&&&&&&&&&&&&&&&&movel&&&&&stu_add&&&&&&&sstu_add
&&&&&c*&&&&sstu_add&&&&&&dsply
&&&&&c&&&&&&&&&&&&&&&&&&&movel&&&&&stu_btd&&&&&&&sstu_btd
&&&&&c*&&&&sstu_btd&&&&&&dsply
&&&&&c&&&&&&&&&&&&&&&&&&&movel&&&&&stu_tel&&&&&&&sstu_tel
&&&&&c&&&&&&&&&&&&&&&&&&&movel&&&&&stu_sex&&&&&&&sstu_sex
&&&&&c&&&&&&&&&&&&&&&&&&&movel&&&&&stu_age&&&&&&&sstu_age
&&&&&c&&&&&&&&&&&&&&&&&&&movel&&&&&stu_flg&&&&&&&sstu_flg
&&&&&c&&&&&&&&&&&&&&&&&&&else
&&&&&c&&&&&&&&&&&&&&&&&&&leave
&&&&&c&&&&&&&&&&&&&&&&&&&endif
&&&&&c&&&&&&&&&&&&&&&&&&&call&&&&&&'qsnddtaq'
&&&&&c&&&&&&&&&&&&&&&&&&&parm&&&&&&'studentque'&&qname&&&&&&&&&&&&10
&&&&&c&&&&&&&&&&&&&&&&&&&parm&&&&&&'design2nd'&&&lib&&&&&&&&&&&&&&10
&&&&&c&&&&&&&&&&&&&&&&&&&parm&&&&&&150&&&&&&&&&&&fldlen&&&&&&&&&&&&5&0
&&&&&c&&&&&&&&&&&&&&&&&&&parm&&&&&&#stu_data&&&&&field&&&&&&&&&&&150
&&&&&c&&&&&&&&&&&&&&&&&&&enddo
&&&&&c&&&&&&&&&&&&&&&&&&&seton&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&lr
&&&&&c&&&&&&&&&&&&&&&&&&&return
&&&&&c*------------------------------------------------------------------------*
*******&rcv_dtaq.rpgle******
&&&&&f*----------从数据队列接受记录写入学生信息表2--------------------------*
&&&&&f*--------需要的文件----------------------------------------------------*
&&&&&fstudent2&&uf&a&e&&&&&&&&&&&k&disk
&&&&&f*------------------------------------------------------------------------*
&&&&&d*----------定义的,与学生信息表中各字段对应--------------------*
&&&&&d#stu_data&&&&&&&&ds&&&&&&&&&&&150
&&&&&dsstu_id&&&&&&&&&&&&&&&&&&1&&&&&&4a
&&&&&dsstu_nme&&&&&&&&&&&&&&&&&6&&&&&55a
&&&&&dsstu_add&&&&&&&&&&&&&&&&56&&&&105a
&&&&&dsstu_btd&&&&&&&&&&&&&&&110&&&&119d
&&&&&dsstu_tel&&&&&&&&&&&&&&&120&&&&130a
&&&&&dsstu_sex&&&&&&&&&&&&&&&132&&&&133a
&&&&&dsstu_age&&&&&&&&&&&&&&&135&&&&137a
&&&&&dsstu_flg&&&&&&&&&&&&&&&139&&&&140a
&&&&&d*------------------------------------------------------------------------*
&&&&&c*-----程序由此开始-----------------------------------------------------*
&&&&&c&&&&&&&&&&&&&&&&&&&dow&&&&&&&1=1
&&&&&c&&&&&&&&&&&&&&&&&&&call&&&&&&'qrcvdtaq'
&&&&&c&&&&&&&&&&&&&&&&&&&parm&&&&&&'studentque'&&qname&&&&&&&&&&&&10
&&&&&c&&&&&&&&&&&&&&&&&&&parm&&&&&&'design2nd'&&&lib&&&&&&&&&&&&&&10
&&&&&c&&&&&&&&&&&&&&&&&&&parm&&&&&&0&&&&&&&&&&&&&fldlen&&&&&&&&&&&&5&0
&&&&&c&&&&&&&&&&&&&&&&&&&parm&&&&&&&&&&&&&&&&&&&&field&&&&&&&&&&&150
&&&&&c&&&&&&&&&&&&&&&&&&&parm&&&&&&5&&&&&&&&&&&&&wait&&&&&&&&&&&&&&5&0
&&&&&c&&&&&&&&&&&&&&&&&&&eval&&&&&&#stu_data=field
&&&&&c&&&&&&&&&&&&&&&&&&&if&&&&&&&&fldlen=0
&&&&&c&&&&&&&&&&&&&&&&&&&leave
&&&&&c&&&&&&&&&&&&&&&&&&&else
&&&&&c&&&&&&&&&&&&&&&&&&&movel&&&&&sstu_id&&&&&&&stu_id2
&&&&&c&&&&&&&&&&&&&&&&&&&movel&&&&&sstu_nme&&&&&&stu_nme2
&&&&&c&&&&&&&&&&&&&&&&&&&movel&&&&&sstu_add&&&&&&stu_add2
&&&&&c&&&&&&&&&&&&&&&&&&&movel&&&&&sstu_btd&&&&&&stu_btd2
&&&&&c&&&&&&&&&&&&&&&&&&&movel&&&&&sstu_tel&&&&&&stu_tel2
&&&&&c&&&&&&&&&&&&&&&&&&&movel&&&&&sstu_sex&&&&&&stu_sex2
&&&&&c&&&&&&&&&&&&&&&&&&&movel&&&&&sstu_age&&&&&&stu_age2
&&&&&c&&&&&&&&&&&&&&&&&&&movel&&&&&sstu_flg&&&&&&stu_flg2
&&&&&c&&&&&&&&&&&&&&&&&&&write&&&&&stu2
&&&&&c&&&&&&&&&&&&&&&&&&&endif
&&&&&c&&&&&&&&&&&&&&&&&&&enddo
&&&&&c&&&&&&&&&&&&&&&&&&&seton&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&lr
&&&&&c&&&&&&&&&&&&&&&&&&&return
&&&&&c*------------------------------------------------------------------------*
*****&student1.pf******
&&&&&a*----学生信息表--------------------------------------------------------*
&&&&&a*-----记录格式名-------------------------------------------------------*
&&&&&a&&&&&&&&&&r&stu
&&&&&a*------------------------------------------------------------------------*
&&&&&a*-------各个字段-------------------------------------------------------*
&&&&&a&&&&&&&&&&&&stu_id&&&&&&&&&4p&0&&&&&&&colhdg('&&学号&&&')
&&&&&a&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&text('&学生编号&&')
&&&&&a&&&&&&&&&&&&stu_nme&&&&&&&25o&&&&&&&&&colhdg('姓名')
&&&&&a&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&text('学生名称&&')
&&&&&a&&&&&&&&&&&&stu_add&&&&&&&25o&&&&&&&&&colhdg('&住址&')
&&&&&a&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&text('&学生住址')
&&&&&a&&&&&&&&&&&&stu_btd&&&&&&&&&l&&&&&&&&&colhdg('出生年月')
&&&&&a&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&text('学生生日')
&&&&&a&&&&&&&&&&&&stu_tel&&&&&&&11a&&&&&&&&&colhdg('&&电话&&&')
&&&&&a&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&text('学生电话&')
&&&&&a&&&&&&&&&&&&stu_sex&&&&&&&&2a&&&&&&&&&colhdg('&&性别&')
&&&&&a&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&text('学生性别')
&&&&&a&&&&&&&&&&&&stu_age&&&&&&&&3p&0&&&&&&&colhdg('&&&年龄&&&&')
&&&&&a&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&text('学生年龄')
&&&&&a&&&&&&&&&&&&stu_flg&&&&&&&&2a&&&&&&&&&colhdg('&&备注&&')
&&&&&a&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&text('&&学生信息备用&')
&&&&&a*------------------------------------------------------------------------*
&&&&&a*--------键值----------------------------------------------------------*
&&&&&a&&&&&&&&&&k&stu_id
&&&&&a*------------------------------------------------------------------------*
*****&student2*******
&&&&&a*-----学生信息表-------------------------------------------------------*
&&&&&a*------记录格式名------------------------------------------------------*
&&&&&a&&&&&&&&&&r&stu2
&&&&&a*------------------------------------------------------------------------*
&&&&&a*-------各个字段-------------------------------------------------------*
&&&&&a&&&&&&&&&&&&stu_id2&&&&&&&&4p&0&&&&&&&colhdg('&&学号&&&')
&&&&&a&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&text('&学生编号&&')
&&&&&a&&&&&&&&&&&&stu_nme2&&&&&&25o&&&&&&&&&colhdg('姓名')
&&&&&a&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&text('学生名称&&')
&&&&&a&&&&&&&&&&&&stu_add2&&&&&&25o&&&&&&&&&colhdg('&住址&')
&&&&&a&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&text('&学生住址')
&&&&&a&&&&&&&&&&&&stu_btd2&&&&&&&&l&&&&&&&&&colhdg('出生年月')
&&&&&a&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&text('学生生日')
&&&&&a&&&&&&&&&&&&stu_tel2&&&&&&11a&&&&&&&&&colhdg('&&电话&&&')
&&&&&a&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&text('学生电话&')
&&&&&a&&&&&&&&&&&&stu_sex2&&&&&&&2a&&&&&&&&&colhdg('&&性别&')
&&&&&a&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&text('学生性别')
&&&&&a&&&&&&&&&&&&stu_age2&&&&&&&3p&0&&&&&&&colhdg('&&&年龄&&&&')
&&&&&a&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&text('学生年龄')
&&&&&a&&&&&&&&&&&&stu_flg2&&&&&&&2a&&&&&&&&&colhdg('&&备注&&')
&&&&&a&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&text('&&学生信息备用&')
&&&&&a*------------------------------------------------------------------------*
&&&&&a*--------键值----------------------------------------------------------*
&&&&&a&&&&&&&&&&k&stu_id2
&&&&&a*------------------------------------------------------------------------*
4.&消息队列
  消息机制是as/400最重要的通信手段。无论是工此文来自: 马开东博客
转载请注明出处 网址:
作站之间的通信,工作站与系统程序或之间的通信都是通过消息机制来实现的。在as/400中,发送的消息总是被送往消息队列中等候处理,直到用户处理完毕将消息删除。有了消息队列,即使用户不在机器上工作,消息也不会丢失,也不必对到来的消息做即刻处理。&  本章介绍了信息队列等有关概念和怎样发送、查看、删除和答复信息。&  通过本章学习,要求掌握发送,查看、删除、答复消息的方法,理解信息队列的概念和作用,并能够指定其传送模式。&
1.1&types&of&messages&
a&message&is&a&communication&sent&from&a&person&or&program&to&another&person&or&program.&there&are&two&types&of&message:&informational&-not&requires&reply&◇manufacturing&program&completed&successfully.&◇system&shutdown&at&9:00&pm.&inquiry&-requires&reply&◇are&you&finished&with&the&report?&◇do&you&have&licensed&program&tape?&◇verify&alignment&on&device&prt01.&(i&c&g&n&r)&
名词解释:
types&of&message:&information:&these&messages&do&not&require&a&reply.&the&as/400&system&knows&that&an&informational&message&was&sent&by&the&informational&identifier(*info)&you&specify&when&you&send&the&message.&inquiry:&an&inquiry&message&requires&a&reply.&it&may&also&contain&information.&the&as/400&system&knows&that&an&inquiry&message&was&sent&by&the&inquiry&identifier(*inq)&you&specify&when&you&send&the&message.&
  在as/400系统上,工作站用户之间,系统操作员和工作站用户之间,程序和工作站用户之间都是用消息进行通信的。&  作为系统操作员,经常发送两种类型的消息:&  信息型(informational):&这类消息是不需要回答的。发送方只是把一定的信息告诉对方。在发送此类消息时,应设定类型标志符为*info。&  询问型(inquiry):&此类消息是需要接受方回答的,发送方根据收到的应答再决定下一步的活动。在询问型消息中,也可以携带有信息型消息。询问型消息的标志符为*inq。&  发送消息的每个命令都有参数(msgtype)来控制消息的类型。默认情况下,发送的是信息型(*info)消息。&
1.2&where&messages&come&from&
figure&3-1.&where&messages&come&form&
messages&can&come&from:&  other&users&(including&the&system&operator)&  system&programs&  application&programs&  用户之间、系统操作员与用户之间、和系统系统程序与用户之间都是用消息进行通信的。发送到用户的消息可能来自于:其他用户(包括系统操作员),系统程序,。如图所示来自系统操作员、系统程序及的信息型消息;来自其他工作站的询问型消息。&
1.3&what&is&a&message&queue&
figure&3-2.&what&is&a&message&queue?&
message&are&always&sent&to&message&queue.&a&message&queue&is&similar&to&a&mailbox.&  消息不是直接发送给用户或终端的,而是发到用户或终端的信息队列里。消息队列是一种类型的对象,类型标识符为*msgq。信息队列的作用就如邮箱一样。邮箱先保存邮件直到收信人有空领取。消息队列的作用也一样,也许接受方无法立即读取消息,所以消息先发到消息队列里保存起来直到被读取。&
1.4&how&messages&queue&are&created&
figure&3-3.&how&message&queues&are&created&
a&message&queue&can&be&created&whenever:&1& a&workstation&(display)&is&described&(device&description&is&created)&2& a&user&(profile)&is&described&(created)&3& ibm&supplied&4& using&crtmsgq&command&
1.&a&workstation&(display)&is&described&(device&description&is&created)&a&workstation&message&queue&is&automatically&described&to&the&as/400&system&at&the&same&time&a&workstation&(or&display)&is&described&to&the&system&with&the&create&device&description&&command.&a&workstation&message&queue&is&created&for&each&display&configured&on&the&as/400&system.&the&message&queue&name&is&the&same&as&the&display&name.&2.&a&user&(profile)&is&described&(created)&a&user&message&queue&can&be&specified&when&a&user&profile&is&created&with&the&create&user&profile&&command.&a&user&message&queue&exists&for&each&user&profile.&the&name&of&the&user&message&queue&is&the&same&as&the&user&profile&name&unless&it&is&specified&differently.&a&user&message&queue&is&created&the&first&time&a&user&signs&on&the&system.&3.&ibm&supplied&the&system&operator&message&queue&(qsysopr)&is&supplied&as&part&of&os/400.&when&the&system&is&configured&the&first&time,&qsysopr&is&created.&4.&using&crtmsgq&command&message&queues&can&be&created&by&system&implementers&with&the&create&message&queue&(crtmsgq)&command.&
  消息队列可通过下面的途径创建:&  1.随终端的描述文件一起生成&当建立设备描述文件时,系统会自动为终端生成一个与终端同名的消息队列。&  2.随用户描述文件一起生成&当建立用户描述文件(userprofile),指定用户的消息队列,系统会自动为用户配置一个消息队列。若非特别指明,此消息队列与用户同名。指定的用户消息队列在用户第一次登录系统时被创建。&  3.随os/400一起提供&系统操作员消息队列qsysopr是在系统初次配置时由系统自动创建的。&  4.用crtmsgq命令创建&用crtmsgq命令创建的消息队列不与任何指定用户或工作站相关,它是用来满足应用需求的。例如,图所示的ardept队列作为艺术部门保留消息用。&
1.5&sending&a&message&
sending&an&informational&or&inquiry&message:&
figure&3-4.&sending&an&informational&or&inquiry&message&
sending&and&displaying&messages:&
figure&3-5.&sending&and&displaying&messages&
sndmsg&using&sndmsg&command&to&send&an&informational&or&inquiry&message:&
figure&3-6.&sndmsg&
  重要参数解释:&  tousr:&  指定发送给哪个用户&  tomsgq:&  指定发送给哪个消息队列&  msgtype:&  指定发送消息的类型。*info为信息型,*inq为询问型。&  rpymsgq:&  若发送询问型消息,则此参数指定接收回答信息的消息队列。&
  任何用户都可以用sndmsg命令来发送信息型或询问型信息给:&  ◇&一个或多个用户消息队列&  ◇&一个或多个工作站消息队列&  ◇&所有当前活动的用户&  ◇&系统操作员消息队列(qsysopr)&  ◇系统历史日志(qhst),qhst包含所有系统活动的信息,如作业的运行及中止、设备状态、错误检测等.&  在用sndmsg命令时必须指定tousr或tomsgq参数,但不可两个参数同时指定。信息型消息(*info)一次最多可发到50个消息队列里。询问型消息(*inq)只可一次送给一个用户或终端。rpymsgq参数用来指定应答消息被送的队列。默认下,其应答信息发回到发送方的工作站消息队列里。&  用dspmsg命令显示消息,参数为msgq(*wrkusr)时,先显示工作站消息队列中的消息,再按回车键时才显示用户的消息,若工作站消息队列中没有消息,则直接显示用户消息。参数为msgq(*wrkstn)时,仅显示工作站消息队列中的消息。在参数msgq中可指定想查看的消息队列名。&  用dspmsg命令去查看消息队列时,对需要回答的消息在应答线上输入回答信息,消息处理完后,可用相应的选项(option)或功能健将其删除。但只有获得该消息队列的作业才允许做消息删除操作。消息队列任何时候只能被分配给一个作业。&
1.6&sending&a&break&message&
figure&3-7.&sending&a&break&message&messages&
a&break&message&temporarily&interrupts&one&or&more&user's&current&jobs&and&displays&the&message&directly&on&their&displays.&sndbrkmsg&&
figure&3-8.&sndbrkmsg&
  用sndbrkmsg命令来发送中断消息。特别注意的是:参数tomsgq中的值*allws表示向所有工作站消息队列发送此消息。&
  中断消息会打断用户的当前工作并直接显示在屏幕上。例如,系统操作员可以通过中断消息来告知其他用户一些重要消息(如系统将在10分钟后重启)。因为中断消息会打断用户的当前工作,所以只当有重要消息发送时才可使用。&  用sndbrkmsg命令可向一个或所有的工作站消息队列(*allws)发送信息型或询问型的中断消息,但不能发到用户消息队列里。在有用户登录的工作站上,消息直接显示在屏幕上;若当前没有用户登录,消息会先保存在消息队列中,一旦有用户登录会自动显示在屏幕上。&
1.7&how&messages&are&displayed&
figure&3-9.&how&messages&are&displayed&
  消息显示方式:&  1.用户消息队列和工作站消息队列可以通过dspmsg或wrkmsg命令或oa采单的选项3查看。&  2.中断消息会打断用户当前作业直接显示在屏幕上。消息可以是信息型或询问型。它常常是系统操作员或其它工作站用户所发送。&  3.消息行是系统或与您进行通信的地方。消息行接收的消息告诉你关于作业或系统状态及用户错误,或需要你响应。为了获得附加的消息,可以将光标移到包含消息的行上,按帮助键或f1&
1.8&removing&messages&
assistance&levels&
assistance&levels&
figure&3-12.&assistance&levels&
  assistant&level决定用户与系统交流时所得到的帮助信息的多少。可通过f21键来选择assistance&level为*basic或*intermed,但并不是所有界面下f21键都是激活的。&  以下命令支持f21键:&  dspmsg&-&display&message&  wrkmsg&-&work&with&message&  wrkusrjob&-&work&with&user&jobs&  wrksplf&-&work&with&spooled&files&  wrkwtr&-&work&with&writers&  wrkcfgsts&-&work&with&configuration&status&  wrkusrprf&-&work&with&user&profiles&
*basic&assistance&level&
figure&3-10.&wrkmsg&
from&the&work&with&messages&(wrkmsg)&display&shown&on&the&visual,&you&can:&1.&remove&one&message&at&a&time:option&4&2.&remove&all&messages&not&needing&a&reply:f16&
*intermed&assistance&level&
figure&3-11.&dspmsg&
you&will&see&the&display&messages&display&when&you&run&the&wrkmsg&or&dspmsg&command.&you&can:&1.&remove&one&message&at&a&time:f11&2.&remove&all&except&unanswered&messages:f16&  消息会一直保留在消息队列里直到被删除。如果积累太多消息,会占用大量系统存贮。所以用户应即时删除无用的消息。&
在*basic&assistance&level下:&
  进入wrkmsg的界面后,可用以下方法删除消息:&1.删除某条特定的消息&  在所要删除的消息前按选项4再回车。&2.删除所有信息型消息&  按f16键。&
在*inrtermed&assistance&level下:&
  运行wrkmsg或dspmsg命令都会出现display&message的界面:&1.删除一条消息&  把光标置于所要删除的消息上,按f11.&2.删除所有消息(除了未答复消息)&  按f16键。&
1.9&message&queue&modes&
figure&3-13.&message&queue&modes&
  each&message&queue&has&a&delivery&mode&that&describes&how&you&will&be&notified&of&messages.&  there&are&four&different&delivery&modes:&  &*break& 
*break&interrupts&your&work&and&the&message&is&shown&on&the&display.&
 &*notify& 
*notify&for&an&interactive&job,&lets&you&know&when&a&message&arrives&on&your&message&queue&by&turning&on&your&message&waiting&light,&sounding&your&display&station&alarm,&or&both.&(&this&is&the&way&you&normally&will&receive&messages&at&your&workstation.)&
 &*hold& 
*hold&stops&the&system&from&notifying&you&that&you&have&a&message&on&your&message&queue.&the&messages&are&held&in&the&message&queue&until&a&user&or&program&requests&them.&
*dft&answers&any&messages&requiring&a&reply&with&the&default&reply&set&up&for&the&message.&information-only&messages&are&ignored.&the&message&is&not&put&on&your&message&queue&unless&you&are&the&system&operator.&
  消息到达消息队列后,怎样处理这条消息呢,是马上中断用户的工作,在显示屏上显示该消息;还是提示一下用户,但不中断用户的工作;还是不做任何处理。这是由消息队列的一个属性:交付模式(delivery&mode)来决定的。&  消息队列的发送模式有:&  *break&-打断用户当前工作,消息直接显示在屏幕上。&  *notify&-一旦消息队列接收到消息则在用户屏幕上设置相应的标志或打开工作站上的消息等待灯或发出相应的警告声。(用户一般使用这种模式来接收消息。)&  *hold&-接收到消息后不作任何提示,而是将其保存在消息队列里等待用户查看。&  *dft&-对于接收到的询问式消息自动以该消息的缺省值回答,对接收到的信息式消息则忽略。除系统操作员外其他用户的消息在这种模式下不被放入消息队列。&  当设备描述文件、用户描述文件或用户的消息队列建立时,相应的消息队列的发送模式就在里面设定。qsysopr消息队列的发送模式默认为*notify.可用chgmsgq命令来改变发送模式。&  qsysopr的发送模式应设为*break,否则,一些发到qsysopr的重要的系统信息可能会被忽略。&
1.10&user&and&workstation&messages&queues&
figure&3-14.&user&and&workstation&meaages&queues&
  当用户在工作站上登录时创建一个交互式作业(interactive&job),用户消息队列和工作站消息队列自动被分配给该交互式作业。工作站消息队列被设置成*notify模式;用户消息队列也被设置成*notify模式,但用户可以修改。两个消息队列中的消息被设置成新消息。只有被分配消息队列的作业可以从队列中删除消息,当拥有足够权限时,其他用户也可以查看或者应答消息队列中的消息。当用户从工作站上退出时,用户消息队列和工作站消息队列自动与该作业分离,消息队列的发送模式均被设置成*hold模式,任何发送的消息队列中的消息被自动保存起来。&
1.11&controlling&message&delivery&
figure&3-15.&controlling&message&delivery&
sndmsg&-delivers&the&message&according&to&the&message&queue&delivery&mode&sndbrkmsg&-interrupts&the&work&station&job&and&displays&the&message&  每一条发出的消息都有一个表示该消息重要程度的紧急代码(severity)。代码值为0―99,值越大,紧急级别越高。可以在消息队列中设置这个紧急代码的最低值,以便使到达该消息队列的紧急代码超过这个最低值的消息,按消息队列的delivery&mode值进行相应的处理。消息的类型和发送消息时使用的命令决定消息的紧急代码,sndbrkmsg发送的消息紧急代码为99;sndmsg发送的*inq类型的消息紧急代码为99;sndmsg发送的*info类型的消息紧急代码为80。系统中的每一个消息队列都有一个重要性级别与之关联,我们可以通过chgmsgq命令来设置和改变该值。只有当消息队列接收到的消息紧急代码大于或等于该重要性级别,系统才会中断当前用户的工作显示消息,否则只将消息保存在消息队列中。&  使用chgmsgq命令,用户可随时根据需要修改相应消息队列的delivery&mode和severity的值。当一个用户注销(sign&off)时,系统会自动将该用户消息队列的delivery&mode修改成*hold;用户再次注册时,系统又会将该消息队列的delivery&mode设置成&*notify,如果用户脱机这一段时间有消息到达就会给用户一个提示。&
1.12&allocating&qsysopr&message&queue&
figure&3-16.&allocating&qsysopr&message&queue&
  qsysopr是一个最重要的消息队列,系统在发现异常,或对设备进行某种操作,或发生一些较重要的事件时都会将消息送到这个消息队列中,操作员要随时查看这个消息队列,以便使问题得到及时处理。&  像任何一个消息队列一样,qsysopr在某个时刻只能分配给一个用户作业。其它用户可以用dspmsg&qsysopr命令查看消息队列的消息。当用户用qsysopr登录时,qsysopr消息队列自动地分配给相应此文来自: 马开东博客
转载请注明出处 网址:
的交互式作业,模式为*break。&  使用图所示的步骤可以将qsysopr消息队列分配给另一个用户或工作站。具体为:系统操作员退出所在工作站,然后作为系统操作员在另一工作站上登录或系统操作员改qsysopr消息队列的模式为*hold(chgmsgq&qsysopr&*hold)。然后另一个工作站用户改qsysopr消息队列的模式为*break(chgmsgq&qsysopr&*break)或*notify(chgmsga&qsysopr&*nitify)。&
2.1&常用命令&
??1.&消息的类型、来源。&??2.&消息队列的作用、种类及生成途径。&??3.&发送消息的常用命令有两个sndmsg和sndbrkmsg,它们的区别在于sndbrkmsg发出的消息只能送到工作站的消息队列中,且不受消息队列的delivery&mode制约,消息到达对方后,马上在工作站上显示出来。发出的消息紧急代码一律为99。其他功能同sndmsg。&??4.&学会用dspmsg命令显示消息和响应查询型消息。&??5.&消息队列的交付方式及控制。&??6.&assistant&level的含义,不同的assistant&level(*basic、*intermed)下,如何删除消息队列中的消息及f11、f16键的功能。&
模拟练习测试:
1.&what&command&would&you&use&to&display&the&system&menu&for&messages?2.&messages&can&be&sent&to&message&queues.&name&several&types&of&message&queues&found&on&your&as/400.3.&what&are&the&delivery&modes&that&can&be&specified&for&a&workstation&message&queue?4.&how&to&obtain&additional&help&information&for&a&message&on&the&message&line?5.&how&to&display&the&basic&assistance&level&for&a&display?6.&when&system& arts,&default&message&queue&is&set&to&&&&a.&qsysopr&&&&b.&qusr&&&&&&&&c.&qhist&&&&d.&qmsg&7.&whether&or&not&to&reply&a&message&depends&on&:&&&&a.&message&reply&type&&&&b.&message&type&&&&c.&*msgq&delivery&type&&&&d.&*msgq&reply&type&8.&how&to&send&message&to&one&or&several&workstations?&&&&a.&sndmsg&&&&b.&sndwsmsg&&&&c.&sndallmsg&&&&d.&sndbrkmsg&9.&where&to&find&the&information&when&the&printeris&out&of&paper?&&&a.&problem&log&&&b.&history&log&&&c.&job&log&&&d.&qsysopr10.&where&are&inquiry&messages&stored?&&&&a.&in&the&history&log&for&the&system&operation&&&b.&in&a&message&queue&associated&with&a&user&workstation&&&c.&in&the&job&associated&with&a&user&or&workstation&&&d.&in&a&problem&log&associated&with&a&user&workstation
5.&*pssr-程序出错处理
*pssr&是程序出错处理程序,如果在执行程序时出现错误;而程序中使用了*pssr子过程,那么程序出错总是跳转到*pssr去处理。我们可以在*pssr根据情况编写各种错误处理语句。
&&&&另外,endsr后面&*cancl&表示如果出错,其程序退出方式为以取消(cancel)方式退出。
*pssr&&&begsr
&&&&&&&&&&&&
&&&&&&&&endsr&&&&*cancl&
&&&&&&&&***************&beginning&of&data&*************************************
0001.00&f**pssr&&程序出错处理&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
0002.00&ddivdend&&&&&&&&&&s&&&&&&&&&&&&&&2p&0&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
0003.00&ddivsor&&&&&&&&&&&s&&&&&&&&&&&&&&2p&0&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
0004.00&dresult&&&&&&&&&&&s&&&&&&&&&&&&&&2p&0&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
0005.00&c&&&&&&&&&&&&&&&&&&&z-add&&&&&5&&&&&&&&&&&&&divdend&&&&&&&&&&&&&&&&&&&&
0006.00&c&&&&&&&&&&&&&&&&&&&z-add&&&&&0&&&&&&&&&&&&&divsor&&&&&&&&&&&&&&&&&&&&&
0007.00&c&&&&&&&&&&&&&&&&&&&eval&&&&&&result=&divdend/divsor&&&&&&&&&&&&&&&&&&&
0008.00&c&&&&&result&&&&&&&&dsply&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
0009.00&c&&&&&&&&&&&&&&&&&&&seton&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&lr&&&&
0010.00&c&&&&&&&&&&&&&&&&&&&return&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
0011.00&c&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
0012.00&c&&&&&*pssr&&&&&&&&&begsr&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
0013.00&c&&&&&&&&&&&&&&&&&&&movel&&&&&'divsor&is&0'&errmsg&&&&&&&&&&&12&&&&&&&&
0014.00&c&&&&&errmsg&&&&&&&&dsply&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
0015.00&c&&&&&&&&&&&&&&&&&&&endsr&&&&&'*cancl'&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&******************&end&of&data&****************************************
6.&批处理作业方式debug
1.&建立物理文件、部门表、员工信息表
2.&编写rpg程序,实现从员工信息表中的小计来统计部门表中的合计,并更新部门表
refile&&&&&&pf&&&&&&&&&&&
&&&&&a&&&&&&&&&&r&refmt
&&&&&a*&character&sets
&&&&&a&&&&&&&&&&&&code&&&&&&&&&&&5a
&&&&&a&&&&&&&&&&&&id&&&&&&&&&&&&&7a
&&&&&a&&&&&&&&&&&&sex&&&&&&&&&&&&1a
&&&&&a*dbcs-open&sets
&&&&&a&&&&&&&&&&&&name1&&&&&&&&&12o
&&&&&a&&&&&&&&&&&&name2&&&&&&&&&20o
&&&&&a&&&&&&&&&&&&descrpt&&&&&&&30o
&&&&&a*numerial&sets
&&&&&a&&&&&&&&&&&&age&&&&&&&&&&&&4&&1
&&&&&a&&&&&&&&&&&&amount&&&&&&&&15&&2
&&&&&a&&&&&&&&&&&&price&&&&&&&&&11&&2
&&&&&a&&&&&&&&&&&&quatity&&&&&&&&7&&0
&&&&&a*date&sets
&&&&&a&&&&&&&&&&&&date1&&&&&&&&&&&l
department&&pf&&&&&&&&&&&部门信息
&&&&&a&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&unique
&&&&&a&&&&&&&&&&r&depart
&&&&&a&&&&&&&&&&&&dpcode&&&&r&&&&&&&&&&&&&&&reffld(refmt/code&*libl/refile)
&&&&&a&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&colhdg('部门码&')
&&&&&a&&&&&&&&&&&&dpname&&&&r&&&&&&&&&&&&&&&reffld(refmt/name1&*libl/refile)
&&&&&a&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&colhdg('部门名&')
&&&&&a&&&&&&&&&&&&dptotal&&&r&&&&&&&&&&&&&&&reffld(refmt/amount&*libl/refile)
&&&&&a&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&colhdg('合计&')
&&&&&a&&&&&&&&&&k&dpcode
employees&&&pf&&&&&&&&&&&员工信息表
&&&&&a&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&ref(*libl/refile)
&&&&&a&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&unique
&&&&&a&&&&&&&&&&r&employ
&&&&&a&&&&&&&&&&&&eycode&&&&r&&&&&&&&&&&&&&&reffld(id)
&&&&&a&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&colhdg('雇员码&')
&&&&&a&&&&&&&&&&&&dpcode&&&&r&&&&&&&&&&&&&&&reffld(code)
&&&&&a&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&colhdg('部门码&')
&&&&&a&&&&&&&&&&&&eyname&&&&r&&&&&&&&&&&&&&&reffld(name2)
&&&&&a&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&colhdg('雇员名&')
&&&&&a&&&&&&&&&&&&subtotal&&r&&&&&&&&&&&&&&&reffld(amount)
&&&&&a&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&colhdg('小计&')
&&&&&a&&&&&&&&&&k&eycode
&&&&&a&&&&&&&&&&k&dpcode
empl&&&&&&&&lf&&&&&&&&&&&员工信息表以dpcode为key
&&&&&a&&&&&&&&&&r&employ&&&&&&&&&&&&&&&&&&&&pfile(employees)
&&&&&a&&&&&&&&&&k&dpcode
totaldemo&&&rpgle按部门统计总数
&&&&&fdepartmentuf&&&e&&&&&&&&&&&k&disk
&&&&&fempl&&&&&&if&&&e&&&&&&&&&&&k&disk
&&&&&dtotal&&&&&&&&&&&&s&&&&&&&&&&&&&15&&5
&&&&&c&&&&&*loval&&&&&&&&setll&&&&&depart
&&&&&c&&&&&&&&&&&&&&&&&&&dow&&&&&&&not&%eof(department)
&&&&&c&&&&&&&&&&&&&&&&&&&read&&&&&&department
&&&&&c&&&&&&&&&&&&&&&&&&&if&&&&&&&&not&%eof(department)
&&&&&c&&&&&dpcode&&&&&&&&setll&&&&&employ
&&&&&c&&&&&&&&&&&&&&&&&&&if&&&&&&&&%equal
&&&&&c&&&&&&&&&&&&&&&&&&&eval&&&&&&total=0
&&&&&c&&&&&dpcode&&&&&&&&reade&&&&&employ
&&&&&c&&&&&&&&&&&&&&&&&&&dow&&&&&&&not&%eof(empl)
&&&&&c&&&&&&&&&&&&&&&&&&&eval&&&&&&total=&total&+&subtotal
&&&&&c&&&&&dpcode&&&&&&&&reade&&&&&employ
&&&&&c&&&&&&&&&&&&&&&&&&&enddo
&&&&&c&&&&&&&&&&&&&&&&&&&eval&&&&&&dptotal=total
&&&&&c&&&&&&&&&&&&&&&&&&&update&&&&depart
&&&&&c&&&&&&&&&&&&&&&&&&&endif
&&&&&c&&&&&&&&&&&&&&&&&&&endif
&&&&&c&&&&&&&&&&&&&&&&&&&enddo
&&&&&c&&&&&&&&&&&&&&&&&&&seton&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&lr
&&&&&c&&&&&&&&&&&&&&&&&&&return
&&&&&c&&&&&*pssr&&&&&&&&&begsr
&&&&&c&&&&&'error'&&&&&&&dsply
&&&&&c&&&&&&&&&&&&&&&&&&&endsr&&&&&'*cancl'
sbmjob,使用本命令将一个作业提交到后台队列,在后台排队等待执行。
strsrvjob&本命令将为指令进行远程服务,经常用于debug批处理作业,本命令的终止命令为endsrvjob
wrksbmjob&本命令可以对后台队列中的作业进行调度管理操作。
dspmodsrc在执行strdbg以及strsrvjob命令之后显示源程序,设置断点。注意:这个命令脱离strsrvjob、strdbg不能单独使用。
首先用chgcurlib命令指定需要debug的程序所在的library。注意需要debug的程序编译时debug选项应该定义为*source&或者为*all以支持source&debug.
1)使用sbmjob提交totaldemo程序至后台批处理作业,为了明确分辨作业,可以为此作业命名为test01,作业定义为hold(*yes),其含义是作业设置为挂起状态,作业酱紫批处理作业队列里等候执行,一旦发出了释放(release)指令,作业立即开始运行。
sbmjob&cmd(call&pgm(totaldemo)&job(test01)&hold(*yes)
2)键入wrksbmjob命令获得刚刚提交的作业的作业名、用户名、作业号。
可以观察test01作业为挂起(held)状态。这里键入选项5进入test01作业:
键入执行,可以看到第二行所标注的job:test01&user:trnusr09&number:286641
注意作业号的唯一性,每一次作业号都不可能相同。将此三项记录下来。可以键入两次f3退出本屏幕。这个例子作业号是286641,作业是test01,用户名是trnusr09。
3)使用strsrvjob命令填入第2步获得的信息,例如:
键入执行,开始执行批处理作业服务过程。键入strdbg命令,提示f4如下所示:
需要调试的源程序应该显示出来:
5)使用f21以获得命令行。
6)在命令行上键入wrksbmjob,键入执行:
使用选项6,键入执行释放挂起的作业test01
7)键入f10进入命令行为本作业输入debug命令,注意:不要键入执行,否则在设立断点之前键入执行,程序就会运行,因而无法进行debug断点设置
8)在命令行上使用dspmodsrc以显示源程序,键入执行。
使用f3退出断点设置;
10)使用f12退出命令行,此时又可以看见第6步的系统信息:
11)此时键入执行释放挂起的批处理作业,批处理作业test01开始运行。注意这一次不要使用f10键。
12)程序运行时将停留在我们设置的断点上:例如,停留在第8步设定的断点第23行上
可以如同交互式debug使用debug命令进行处理。
13)一旦程序或者作业结束,必须使用enddbg命令以及endsrvjob命令结束操作。
顺便提醒读者,如果在批处理作业的rpgiv程序中出现了交互式语句,例如dsply:显示文件输入输出语句程序的调用,例如exfmt,作业将会被挂起处于message&wait状态,这是因为后台批处理作业无法处理对外显示信息引起的。
什么是指针
指针是数据在内存或磁盘上的物理地址。因为os400是统一寻址指令系统,即物理内存与磁盘是统一寻址,所以,指针没有区分内存指针还是磁盘指针,都是统一的指针。
指针的表示
在os400下,指针(pointer)是一个16byte,即16字节的符号,是os自动分配指针和其内容。
指针在计算机语言中的应用范围
指针用在除cl之外的高级开发语言中,如c/c++、rpgle等。
如何查看指针地址带出的数据?
在rpgle&debug方式下,在命令行对命名的指针,如ptr,键入:
eval&ptr&:&c&100
c表示是字符型方式显示指针带出的数据;x表示16进制显示指针地址带出的数据。
100表示显示数据的长度。
补充,os400下,debug用f11显示程序变量的长度,默认值是1024字节。如果需要查看1024之后的数据,用eval方式,比如字符变量c_var;eval&c_var&:&c&8096,在debug方式下,os400就开辟一个8096字节区域存放变量c_var的显示内容。
如何确定指针是否有效?
在debug方式下,用eval或f11显示命名的指针,比如ptr,如果显示为:ptr=spp:fc27c1e4f206e1b0,说明这个指针是有效的,否则,os400会报指针无效信息。
指针在rpgle中的应用
指针在rpgle中的定义
指针在rpgle&d表中的定义用符号&*&&进行定义。
被指针定义的对象范围较广,通常在rpgle中用指针定义指向一个&或字符型变量。例如
***************&beginning&of&data&*************************************&
**&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
drefds&&&&&&&&&&&&ds&&&&&&&&&&&&&5&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
d&fld1&&&&&&&&&&&&&&&&&&&&1&&&&&&3a&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
d&fld2&&&&&&&&&&&&&&&&&&&&4&&&&&&5p&0&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
**&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
d*&指针定义方式一&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
dmy_ds&&&&&&&&&&&&ds&&&&&&&&&&&&&&&&&&likeds(refds)&&&&&&&&&&&&&&&&&&&&&
d&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&based(ptr_1)&&&&&&&&&&&&&&&&&&&&&&
dptr_1&&&&&&&&&&&&s&&&&&&&&&&&&&&&*
d*likeds&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
d*&关键字用来将、原型返回值或原型参数定义为与另一个相&&&
d*&似。新项的子字段将与另一的子字段完全相同。&&&&&&&&&&&&&&&&&&&
d&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
d*&based(basing_pointer_name)&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
d*&&对或独立字段指定&&based&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
d*&&关键字时,将使用指定为关键字参数的名称来创建基指针。此基指针存放正&&
d*&&在定义的基或独立字段的地址(位置)。&&&&&&&&&&&&&&&&&&
**&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
d*&指针定义方式二&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
dd_string&&&&&&&&&s&&&&&&&&&&&1024&&&&varying&based(ptr_2)&&&&&&&&&&&&&&
dptr_2&&&&&&&&&&&&s&&&&&&&&&&&&&&&*&&
d*varying&定义变长的变量&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
d&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
d&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
c&&&&&&&&&&&&&&&&&&&seton&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&lr&&&
******************&end&of&data&****************************************
注意:在d表用based到指针的或变量,不能用inz关键字,即不能用程序变量初始赋值键字。
指针的赋值
在rpgle中,指针的赋值可以直接指针间的直接赋值,例如
ptr_1&=&ptr_2
也可以通过rpgle的内置函数%addr进行赋值,例如
***************&beginning&of&data&*************************************
dchar1&&&&&&&&&&&&s&&&&&&&&&&&&&10&&&&inz('abc')&&&&&&&&&&&&&&&&&&&&&&&
dptr&&&&&&&&&&&&&&s&&&&&&&&&&&&&&&*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
/free&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&ptr&=&%addr(char1);&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&*inlr&=*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&/end-free&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
******************&end&of&data&****************************************&
指针ptr指向字符长度为10,内容为&abc&的数据。
指针的应用范围
在rpgle中,通常都是把指针用在程序间传递参数上。
早期的rpg程序基本上都是通过plist对每一个具体参数进行定义。这样的定义对项目联调、修改和代码最终定版,都造成非常大的难度,增加项目的实际开发难度。
我们的成功经验:
在程序间每一个程序代码都定义统一&的参数格式,比如
c&&&*entry&&&&&plist
c&&&&&&&&&&&&&&parm&&&ptr_1
c&&&&&&&&&&&&&&parm&&&ptr_2
c&&&&&&&&&&&&&&parm&&&ptr_3
这段rpgle代码放在统一的copybook中,在每一程序代码中只要定义:
c/copy&库名/文件名,member名
其中,ptr_1只能用在应用项目的系统变量范围,比如交易日,时间等;
ptr_2只能用在应用项目的输出参数范围,比如pgma调用pgmb时,pgma对pgmb传递的参数只能用ptr_2带出;ptr_3只能用在返回结果参数范围,及pgmb对pgma的返回值。
对三个ptr指针引入的参数结构,都可以放在统一的copybook中,在程序代码中直接进行copy定义。这样做的好处,一个应用项目的是唯一的。
用指针偏移取数据
通常情况下,最简单的应用就是一个指针直接指向数据,比如:
d&&d_inds&&&&&&&ds&&&&&&likeds(d_mark1ds)
d&&d_outds&&&&&&ds&&&&&&likeds(d_mark2ds)&based(ptr_3)
当程序代码进行调用后,
d_inds.fld1&=&&abc&;
//把d_mark1ds的地址赋值给指针ptr_2
ptr_2&=&%addr&(d_mark1ds);
callp&&pgma(ptr_1:ptr_2:ptr_3);
调用pgma之后,ptr_3就直接把返回参数引入到程序数据
结构d_outds中了,直接引用。
如果程序的返回结果是包括一个以上的,比如通过
ptr_3返回的参数如下:
d&d_outds&&&&&&&&&&&ds&&&&&&&&&&&&&based(ptr_3)
d&d_datads1&&&&&&&&&&&&&&&&&&&&&&&&likeds(refdatads1)
d&d_datads2&&&&&&&&&&&&&&&&&&&&&&&likeds(refdatads2)
这时,在程序中就要这样定义和用指针偏移读取的
d&&d_datadsa&&&&&&&&ds&&&&&&&&&&&&&likeds(refdatads1)&based(ptr_a)
d&&d_datadsb&&&&&&&&ds&&&&&&&&&&&&&likeds(refdatads2)&based(ptr_b)
d&ptr_a&&&&&&&&&&&&&&s&&&&&&&&&*
d&ptr_b&&&&&&&&&&&&&&s&&&&&&&&&*
&&&callp&&&pgma(ptr_1:ptr_2:ptr_3)&;
&&&ptr_a&=&ptr_3&;&//&返回的数据d_datads1已经放入d_datadsa中了。
&&&ptr_3&=&ptr_3&+&%len(d_datadsa);&//把指针ptr_3偏移到指向
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//第二个的起始地址。
&&&ptr_b&=&ptr_3&;&&//返回的数据d_datads2已经放入d_datadsb中了
深度探讨指针用法
指针层次的概念和用法
在rpgle&中指针是可以嵌套的,是有层次概念的,比如
d&d_ds1&&&&&&&&&&&&&&ds&&&&&&&&&&&&&&based(p_ptr1)
d&&d_parmds1&&&&&&&&&&&&&&&&&&&&&&&&likeds(refds1)&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
d&&p_ptra&&&&&&&&&&&&&&&&&&&&&&&*&&&
d&d_ds2&&&&&&&&&&&&&&ds&&&&&&&&&&&&&&likeds(refds2)
d&ptr1&&&&&&&&&&&&&&&&s&&&&&&&&&&*
d&ptra&&&&&&&&&&&&&&&&s&&&&&&&&&&*
&&&&p_ptra&=&%addr(d_ds2)
&&&&callp&proc(p_ptr1)&;
这时,在代码中表示的指针层次是两层
多层指针结构下,注意事项
指针引入的ds,最好立即用新的ds进行转移保护,如
d&d_dsin&&&&&&&&&&&&ds&&&&&&&&&&&&based(ptr3)
d&p_ptra&&&&&&&&&&&&&&&&&&&&&*
d&d_dsparmds&&&&&&&ds&&&&&&&&&&&&likdds(refds)&&based(p_ptra)
d&d_dsinbak&&&&&&&&&ds&&&&&&&&&&&&likdds(refds)&
d&p_ptr3&&&&&&&&&&&&s&&&&&&&&*
d&p_ptra&&&&&&&&&&&&s&&&&&&&&*
callp&proc(ptr1:ptr2:ptr3)&;
//判断ptr3中的返回码
//如果返回码没有错误,立即备份返回
d_dsinbak&=&d_dsparmds&;
在指针引入复杂结构中,实数据放在前面,变长放在复杂结构后部,如
d&d_inds&&&&&&&&&&&ds&&&&&&&&&&&&&based(ptra)&&qualified
d&&c_string&&&&&&&&&&&&&&&&&10
d&&s_digit&&&&&&&&&&&&&&&&&&&5&&0
d&&d_arrdsset&&&&&&&&&&&&&&&&&&&&likeds(d_arrds)&
d&&p_ptra&&&&&&&&&&&&&&&&&&&&*
d&&p_ptrb&&&&&&&&&&&&&&&&&&&&*
d&d_arrds&&&&&&&&&ds&&&&&&&&&&&&qualified&
d&&s_count&&&&&&&&&&&&&&&&&3s&0&&dim(2)&&&&&&&&&&&&&&&&&
d&&a_ymlst&&&&&&&&&&&&&&&&&10a&&&dim(500)&&&&&&&&&&&&&&&
d&&a_mmlst&&&&&&&&&&&&&&&&10a&&&dim(500)
d&d_dsa&&&&&&&&&&ds&&&&&&&&&&&&&&based(p_ptra)
d&&c_fld&&&&&&&&&&&&&&&&&&&&30
d&&p_fld&&&&&&&&&&&&&&&&&&&&12&&5
d&d_dsb&&&&&&&&&&ds&&&&&&&&&&&&&&based(p_ptrb)
d&&s_atrr&&&&&&&&&&&&&&&&&&3&0&&&&dim(20)
d&&c_string&&&&&&&&&&&&&1024&&&&&&varying
指针的迁移
在程序之间用指针进行传参调用,因为指针仅仅把参数的起始指针进行传递。很多情况下,因为程序运行时,os400在asp中给每一个程序都分配一个程序运行临时区,当程序获取下一级程序返回的临时区域的变量(参数)指针地址时,本身的程序运行临时区,os400就会自动进行调整,这时,可能就会在调整过程中清除掉进入程序的运行临时区的指针引入的内容。
针对上述情况,采取保护措施是必要的。保护方法有:
指针中设置选项用
对输入指针引入的内容进行同类转移保护。
用指针传递多个的常用两种方法
指针分层:
d&d_ds&&&&&&&&&&ds&&&&&&&&&&&&&&&based(ptr)
d&&ptra&&&&&&&&&&&&&&&&&&&&&&*
d&&ptrb&&&&&&&&&&&&&&&&&&&&&&*
d&d_ds1&&&&&&&&&&ds&&&&&&&&&&&&&&&likeds(refds1)
d&d_ds2&&&&&&&&&&ds&&&&&&&&&&&&&&&likeds(refds2)
&ptra&=&%addr(d_ds2)&;
&&&&&ptrb&=&%addr(d_ds1)&;
归集多个,采用一个指针进行传递
d&d_ds&&&&&&&&&&&ds&&&&&&&&&&&&&&based(ptr)
d&&d_ds1&&&&&&&&&&&&&&&&&&&&&&&&likeds(refds1)
d&&d_ds2&&&&&&&&&&&&&&&&&&&&&&&&likeds(refds2)
d&&d_ds1&&&&&&&&&&&&&&&&&&&&&&&&likeds(refds1)
d&&d_ds2&&&&&&&&&&&&&&&&&&&&&&&&likeds(refds2)
d&c_string&&&&&&&&s&&&&10000&&&&&&varying&&based(ptr)
&&&&&c_string&&=&d_ds1&+&ds2&;
用指针分层方法的风险,因为这种方法是多个指针同层传参,即每一个指针引入一个,或复杂,比多个进行归集,然后用一个指针进行传参,前者的比后者差。特别情况下,如果经过多级调用,且都是通过指针进行结果返回,可能出现数据丢失。
用数据归集方法的风险,存在前面中有变长字段。
8.&call/callb/callp(程序调用及传参)&&&
rpgiv提供了3中程序间调用的方法:
call&是程序对程序的动态调用。如程序a&call&程序b,程序b要放在运行程序a环境的库列表中,且如库列表中有重复名字程序b,排在第一位子的程序b总是被调用。
callb是在一个bind程序中,多个module程序的相互调用。是程序静态调用。要注意不要陷入调用不合理循环。调用一个绑定模块,静态调用
callp是最有趣的调用,它结合call和callb的特点,把call的灵活性和callb的响应效率高特点结合在一起。调用原型过程或者原型子过程。callp的最主要用法,用callp调用服务程序的某个组成程序;或在一个bind程序中调用某个过程例程。都是静态调用。callp主要有两种方式调用:1)原形接口调用;2)例程点调用。
rpgiv程序之间的调用以及
call首先表述调用的过程,当程序执行到call语句时,控制转向到call语句后跟的程序并且执行这个程序,当遇到return返回语句,程序转向调用程序并且执行call语句下一条语句。
call语句后跟的可以是常量、字段以及变量、数组元素、包含的程序名。在call语句紧跟的1至n个parm参数语句可以是prgiv所认可的类型,调用与被调用的程序之间的参数数量、参数类型应该一致。
被调用的程序由*entry&plist开始下跟parm参数,下例:
调用程序:
&&&&&&&call&&&prog02&
&&&&&&&parm&&&&&&&&&&&fld1
&&&&&&&parm&&&&&&&&&&&fld2
&&&&&&&parm&&&&&&&&&&&fld3
被调用的程序:
&&*entry&&&&&plist
&&&&&&&&&&&&&parm&&&&&fldx
&&&&&&&&&&&&&parm&&&&&fldy
&&&&&&&&&&&&&parm&&&&&fldz
rpgiv默认的方式是传参,而不是传值。
如果需要在过程中不改变参数值,可以使用如下方法:
&&&&&&&&&&&&&call&&&&&&pro&g02&
&&&&&&&&&&&&&parm&&&&&fldx&&&&&&fldy
将想要传递的值置入fldx,当调用发生的时候,系统复制fldx的值到fldy并且将fldx的地址传入被调用的程序,即便fldy返回值也许被改变,但是fldx不受干扰。
&&&补充知识:
参数根据调用后的效果不同,即是否改变参数的原始数值,可以分为两种:&按值传递的参数与按引用传递的参数。
他们的区别是什么呢?我们看一个案例说明:比如有个女孩非常喜欢qq,
还给自己起了个浪漫的名字&轻舞飞扬&,飞扬小姐认识了一个网友&痞子蔡&(n年前非常火的一个网络 《第一次亲密接触》的两个主人公),他们聊的很投缘,有天飞扬小姐竟然把自己的电话号码告诉了痞子蔡,有天痞子蔡竟然电话过来约飞扬小姐见面,考虑到网络的虚幻与现实人心的叵测,飞扬小姐面临着艰难的选择:是否去见网友?
那么见网友就是调用的程序,方法的参数就是轻舞飞扬,如果痞子蔡是个披着羊皮的狼,那飞扬小姐就可能面临危险,比如身上少些东西或者多些东西,就是说在方法体中有可能改变参数的原始数值。
call&&见网友&&&/*做些事情,改变轻舞飞扬。*/
parm&&&&&&轻舞飞扬&&
现实中飞扬小姐只有两种选择,第一,为了爱情奋不顾身,上刀山下火海,再所不辞,但这有可能改变飞扬状态,即数值;第二,委婉拒绝以求自保,但如果痞子蔡为人特别好,她也许会失去一段大好的姻缘。这里,如果科技足够发达,我们可以完全给出第三种选择,轻舞飞扬制作一个自己的替身,即把自己备份一份,然后把备份传入方法体,这样不论痞子蔡对她做了什么都不会对她的源体发生影响,又能检测痞子蔡对自己是否真心。
ok,这里我们就把飞扬小姐本人去见网友叫按引用传递,这样在方法体中发生的改变在方法调用完对参数还有影响,而把让她替身去叫按值传递,这样方法调用完对参数原始数值没有影响,发生改变的只是参数的备份,比如痞子蔡给她一个大钻石,这份备份在方法调用完会自动消亡,也就是说飞扬的替身在见完网友自动消亡,当然,大钻石也会随着替身消亡。最后可以&&&&&&&&简单概括为一句话:按值传递是让自己备份去,参数数值不变;按引用传递是自己亲自去,参数数值会改变。
原型调用过程:
在命令行键入call&pgm(qcmdexc)&parm(&dspmsg&&&6)可以显示信息:
call&pgm(qcmdexc)&parm('dspmsg'&6)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&display&messages&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&system:&&&ipacs@d&
&queue&.&.&.&.&.&:&&&gaoyong&&&&&&&&&&&&&&&&&program&.&.&.&.&:&&&*dspmsg&
&&&library&.&.&.&:&&&&&qusrsys&&&&&&&&&&&&&&&&&library&.&.&.&:&&&&&&&&&&&
&severity&&.&.&.&:&&&00&&&&&&&&&&&&&&&&&&&&&&delivery&&.&.&.&:&&&*notify&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&type&reply&(if&required),&press&enter.&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&(no&messages&available)&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
我们在命令行上调用了外部程序qcmdexc,仍然在rpgiv中用这个程序:使用call的方法:其中call末端的99是表示*in99指示符变量,检测调用命令是否成功。
&&&&&&&&***************&beginning&of&data&*************************************&
0001.00&c&&&&&&&&&&&&&&&&&&&call&&&&&&'qcmdexc'&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&99&
0002.00&c&&&&&&&&&&&&&&&&&&&parm&&&&&&'dspmsg'&&&&&&command&&&&&&&&&&80&&&&&&&&&
0003.00&c&&&&&&&&&&&&&&&&&&&parm&&&&&&6&&&&&&&&&&&&&cmdlen&&&&&&&&&&&15&5&&&&&&&
0004.00&c&&&&&&&&&&&&&&&&&&&eval&&&&&&*inlr&=&*on&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
0005.00&**&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&******************&end&of&data&****************************************
改用callp的方法:需要指定原型调用pr分别指定了外部程序关键字:extpgm(qcmdexc),参数commandx,cmdlenthx,在第一行第二行使用d描述指定参数类型定义。在一个程序中最大可以使用255个参数。调用时过程名后面的参数之间使用&:&分隔。
&&&&&&&&***************&beginning&of&data&*************************************
0001.00&dcommand&&&&&&&&&&s&&&&&&&&&&&&&80&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
0002.00&dcmdlen&&&&&&&&&&&s&&&&&&&&&&&&&15&&5&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
0003.00&**&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
0004.00&dqcmdexc&&&&&&&&&&pr&&&&&&&&&&&&&&&&&&extpgm('qcmdexc')&&&&&&&&&&&&&&&&
0005.00&dcommandx&&&&&&&&&&&&&&&&&&&&&&&&&&&&&like(command)&&&&&&&&&&&&&&&&&&&&
0006.00&dcmdlenx&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&like(cmdlen)&&&&&&&&&&&&&&&&&&&&&
0007.00&**&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
0008.00&c&&&&&&&&&&&&&&&&&&&eval&&&&&&command&=&'dspmsg'&&&&&&&&&&&&&&&&&&&&&&&
0009.00&c&&&&&&&&&&&&&&&&&&&eval&&&&&&cmdlen&=&6&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
0010.00&c&&&&&&&&&&&&&&&&&&&callp(e)&&qcmdexc(command&:&cmdlen)&&&&&&&&&&&&&&&&
0011.00&c&&&&&&&&&&&&&&&&&&&eval&&&&&&*in99&=&%error&&&&&&&&&&&&&&&&&&&&&&&&&&&
0012.00&c&&&&&&&&&&&&&&&&&&&eval&&&&&&*inlr&=&*on&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
0013.00&**&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&******************&end&of&data&****************************************
为什么要使用callp?最大的好处是对程序的参数校验是在编译时进行的,这样许多参数类型、数量问题在编译时就被检查出来,实际调用的时候会减少调用程序参数出问题。
由于使用较复杂的过程调用可以嵌套在内置函数中使用,可以省略callp直接在程序中使用过程名返回值。
例如:定义&&d&&zipcode&&&pr&&&&&&&10a
&&&&&&&&&&&&d&&number&&&&&&&&&&&&10p&&0&value
&&&&&&&&&&&&/free
调用:&&&&&&string&=&&address&&+&zipcode(number)
&&&&&&&&&&&&/end-free
我们在使用自由格式的时候callp显得更加简练,由于省去在call程序时必要的plist、parm固定格式,可以说callp实际上是使用自由格式调用程序时必要的写法。
callp最大的好处是可以使用静态调用方式,提高程序运行效率。如果要进行调用检查,可以显式使用callp(e)的方法。e是错误检测扩展符,可以使用%error()内置函数对调用状况进行检测。
下例表示两个使用自由格式rpgiv程序parmtest1调用parmtest2:
第2行为pr(原型定义)指明需要调用的外部程序名,pr指定的名字可以和外部程序名不同。第3行到第5行说明pr所调用的程序的参数类型和个数。实际上对参数名p_code、p_amount、p_lgcal是不做检查的,只是为了书写清除的目的。第7行至第9行为程序内部的局部变量定义,分别说明了code、amount、lgcal3个变量,并且pr参数表继承他们的属性,见第3行至第5行like语句。第14行使用callp调用了这个外部程序,它将传递3个参数,第一个参数将编译码&00001&传给外部程序parmtest2,第二个参数使用amount取回值,第三个参数是取回调用是否成功的标志。第15行利用%editc()函数用0编辑吗并且数值左部带$显示amount值。
用到的文件定义:
livoop1.pf
&&&&&a&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&unique
&&&&&a&&&&&&&&&&r&fmt1
&&&&&a&&&&&&&&&&&&code&&&&&&&&&&&5a
&&&&&a&&&&&&&&&&&&name&&&&&&&&&&20o
&&&&&a&&&&&&&&&&&&quantity&&&&&&&9&&0
&&&&&a&&&&&&&&&&&&amount&&&&&&&&15&&2
&&&&&a&&&&&&&&&&k&code
parmtest1.rpg
&&&&&dparmtest&&&&&&&&&pr&&&&&&&&&&&&&&&&&&extpgm('parmtest2')
&&&&&dp_code&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&like(code)
&&&&&dp_amount&&&&&&&&&&&&&&&&&&&&&&&&&&&&&like(amount)
&&&&&dp_lgcal&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&like(lgcal)
&&&&&dcode&&&&&&&&&&&&&s&&&&&&&&&&&&&&5a&&&inz('00001')
&&&&&damount&&&&&&&&&&&s&&&&&&&&&&&&&11p&2
&&&&&dlgcal&&&&&&&&&&&&s&&&&&&&&&&&&&&&n
&&&&&&/free
&&&&&&&&callp&parmtest(code:amount:lgcal);
&&&&&&&&dsply&%editc(amount&:&'o'&:&'$');
&&&&&&&&dsply&
&&&&&&&&*inlr&=&*
&&&&&&/end-free
使用14即crtbndrpg&pgm(*curlib/parmtest1)命令编译此程序。将对所使用的参数进行类型、数量检查,这是call方式调用程序所不及的。
被调用的程序parmtest2在第5行定义pr(原型),第6行至第8行为参数属性个数的定义。第10行至第13行是pi(procedure&interface)定义了被调用程序的入口参数的属性、个数。需要指出的是pi定义的入口参数个数及其属性一定要与调用此程序的参数、个数相同。并且位置相同。
parmtest2.rpg
&&&&&flivoop1&&&if&&&e&&&&&&&&&&&k&disk
&&&&&d&parmtest&&&&&&&&pr&&&&&&&&&&&&&&&&&&extpgm('parmtest2')
&&&&&d&p_code&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&like(codex)
&&&&&d&p_amount&&&&&&&&&&&&&&&&&&&&&&&&&&&&like(amountx)
&&&&&d&p_lgcal&&&&&&&&&&&&&&&&&&&&&&&&&&&&&like(lgcal)
&&&&&d&parmtest&&&&&&&&pi
&&&&&d&codex&&&&&&&&&&&&&&&&&&&&&&&&&&5a
&&&&&d&amountx&&&&&&&&&&&&&&&&&&&&&&&11p&2
&&&&&d&lgcal&&&&&&&&&&&&&&&&&&&&&&&&&&&n
&&&&&&/free
&&&&&&&&&&&&&&&chain&code&livoop1;
&&&&&&&&&&&&&&&if&%found(livoop1);
&&&&&&&&&&&&&&&&amountx&=&
&&&&&&&&&&&&&&&&lgcal&=&%found(livoop1);
&&&&&&&&&&&&&&&endif&;
&&&&&&&&&&&&&&&*inlr&=&*on&;
&&&&&&&&&&&&&&&&
&&&&&&/end-free
使用crtbndrpg&pgm(*curlib/parmtest2)编译此程序。
可以使用call&parmtest1检查程序调用结果。
callb(call&a&bound&*module)
对于使用模块(moduel)进行binding的程序,使用callb的方法调用模块(moduel).
其使用方法为:固定格式:首先将每个模块使用crtrpgmod的方法进行编译,然后使用crtpgm的方法进行组装。
其调用模式为:
&&&&&&&&&&&callb&&&&&&modulename&
&&&&&&&&&&&parm&&&&&&x
&&&&&&&&&&&parm&&&&&&y
&&&&&&&&&&&。。。。。。
注意:这种方法是属于静态调用,运行效率比动态调用高,缺点是必须用固定格式,在自由格式中已经使用callp取代了callb。
使用预定义原型的方式调用module中的过程(procedure)。
使用自由格式:首先在主模块中定义原型mod2:pr是原型定义:pi是调用的原型接口(prototype&interface)参数定义。
使用crtpgm将mod1以及mod2组装成为程序abc.
可以看出在自由格式中必须使用callp。最多在一个程序中可以定义调用399个过程(procedure)。
9.module、callb、callp、srvpgm的概念
*module(模块)是类似*pgm的一种obj,可以用多个*module组装成一个}

我要回帖

更多关于 建行储蓄卡销户 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信