RPGAS400程序员培训手册9.docx
- 文档编号:7177442
- 上传时间:2023-01-21
- 格式:DOCX
- 页数:18
- 大小:29.40KB
RPGAS400程序员培训手册9.docx
《RPGAS400程序员培训手册9.docx》由会员分享,可在线阅读,更多相关《RPGAS400程序员培训手册9.docx(18页珍藏版)》请在冰豆网上搜索。
RPGAS400程序员培训手册9
RPGAS400程序员培训手册9
8.1报表打印
在那个地点,简单说一下报表。
事实上据说RPG设计之初,要紧确实是为了解决报表问题。
不
过进展到现在,在我接触过的系统中,觉得报表在RPG编程之中反而退居其次,大部分程
序差不多上对数据库中磁盘文件(即PF文件)的操作。
报表文件事实上在某种意义上与一般的磁盘文件专门类似,差不多上有记录格式(Record
Format),都能够进行写操作(WRITE),RPGLE的程序对它们的操作方式也比较雷同。
所
不同的是一般的磁盘文件的数据是储备在数据库中,而报表文件WRITE了之后,是以脱机
文件(SpoolFile)的形式存在。
因此在一个库中,磁盘文件具有唯独性,即不能有同名的
磁盘文件;而在同一个输出队列中,同名的报表文件(即生成的脱机文件),承诺有多个。
要做一个全新的报表打印,大致上能够分为画报表文件(PRTF),与编写打印程序这两
部分。
一、画报表文件(PRTF)
1、新建立一个属性为PRTF的文件,然后使用19进入报表编辑状态。
(即STRRLU)
2、定义一个新的记录格式(RecordFormat):
DR+F18+F10,注意看下方的功能
键说明
3、在一个记录格式之下,追加内容时,要在新的编辑行前加“CLC”,表示此行
的内容,是属于上面记录格式的。
4、编辑行前加:
DC:
定义常量
CF:
使当前行的内容居中
5、常用功能键:
F13:
标记/取消标记(光标所指的字段)。
多试一下就明白使用方法,能够将
同一行的多个相连的字段标记成为一个块(对首尾两个字段操作F13即可)。
高亮部分表示已被标记的块。
F14:
将已标记的块COPY到光标指定处。
(事实上那个我用得不多)
F15:
将已标记的块MOVE到光标指定处。
(那个用得许多)
F16:
删除已标记的块。
(那个用的频率也许多)
F11:
定义新变量
F23:
进入当前字段的功能菜单画面
6、对新变量的定义,按F11之后,见到画面如下:
Editedlength............:
1
Recordformat............:
RCD001
Numberofkeywords.........:
0
Numberofindicators........:
0
Typechoices,pressEnter.
Field................FLD001Name
Optionindicators..........01-99,N01-N99
Moreindicators..........NY=Yes,N=No
Startingline............1-255
Startingposition..........61-255,+nn
Lengthofdata...........11-378,+nn,-nn
翻页,还有:
Datatype..............11=Character
2=Zoned
3=Floatingpoint
4=Open
5=Graphic
6=Date
7=Time
8=Timestamp
Decimalpositions..........0-31,+n,-n
Referenceafield..........NY=Yes,N=No
Usereferencedvalues.......YY=Yes,N=No
能够采纳直截了当定义长度、类型的方法,即在第1页的最末尾,Lengthofdata处,
填上字段长度;假如是字符型,就不需要再填其它内容;假如是数字型,在第2页Decimal
positions处填上小数位数。
也能够采纳参照字段的方法(即参照已存在的PF文件中的字段)。
假如选用这种
方法,就用需要在Lengthofdata以及Decimalpositions中填写内容,将Referencea
field项填为“Y”,然后按确认键(仿佛F10键也能够),然后能够看到该项高亮显示。
现在再按F10,可进入该字段的功能菜单(也能够通过在报表编辑状态下,直截了当在当前
字段处按F23进入):
OptKeywordOptKeywordOptKeyword
ALIASDFTIGCCHRRTT
BARCODEDLTEDTINDTXT
BLKFOLDEDTCDEMSGCON
CDEFNTEDTWRDPAGNBR
CHRIDFLTFIXDECPRTQLTY
CHRSIZFLTPCNREFFLD
COLORFNTCHRSETSKIPA
CPIFONTSKIPB
CVTDTAHIGHLIGHTSPACEA
DATEIGCALTTYPSPACEB
DATFMTIGCANKCNVTEXT
DATSEPIGCCDEFNTTIME
以上菜单中,标记为蓝色的,是我常用的几个选项。
在这些选项前面,选2,即是对当前字段加注这些功能;选4,即是去掉这些
功能。
要参照已知字段定义变量,则在“REFFLD”选项前选2,可见
Field...............
Recordformat..........
File...............
Library.............*CURLIB
各选项的含义:
Field:
当前变量所参照的字段
RecordFormat:
当前变量所参照字段,在PF文件中所属的记录格式
File:
PF文件名
Library:
PF文件所在的库名
7、其它几个常用功能选项的含义:
SKIPA:
SkipAfter,在WRITE操作时,写该字段后,自动换页;
SKIPB:
SkipBefore在WRITE操作时,写该字段前,自动换页
SPACEA:
SpaceAfter写该字段后,再打印一个空格;
SPACEB:
SpaceBefore写该字段前,打印一个空格(可用来解决错行问题)
EDTCDE:
定义当前字段的显示方式,比如说当前字段为数字类型时,是否显
示逗号,前面是补零等等。
依照F1键,看Help中的说明:
EditCodeDescriptionNoSignCRSign-Sign(R)-Sign(L)
Commasandzerobalances1AJN
Commas2BKO
Zerobalances3CLP
Nocommasorzerobalances4DMQ
Userdefinededitcodes5-9
DatefieldeditW
DateeditY
SuppressleadingzerosZ
二、编写打印报表的程序
1.对报表文件的声明:
FEF4322POEPRINTEROFLIND(*IN99)
能够看到,操作方式是“O”,即只写;
文件类型为“PRINTER”,即打印文件;
后面的OFLIND关键字表示该报表文件的换页指示器为99;即写报表,当写
满一页时,*IN99自动变为1;然后报表自动换页,*IN99再自动变回0;
事实上这一项我觉得操纵起来有点不爽,因此我通常差不多上自行操纵换页,不用这
个指示器来判定;我常使用的自行操纵换页的方法在下面会说明。
2.对报表文件的处理
和磁盘文件(DISK)一样,报表文件事实上也有OPEN,CLOSE,WRITE的操
作。
只是使用OPEN,CLOSE操作时,不需要使用USROPN关键字。
同时也因为
生成的是脱机文件,因此不能进行CHAIN、UPDATE等定位、修改的操作。
假如在程序中,只需要生成一份报表,那么能够不使用OPEN/CLOSE操作,
因为程序在运行之初,以及运行终止时,已默认打开,关闭了一次所有已声明的文
件,包括报表打印文件。
但假如程序在运行时,需要生成多份报表,那么必须在每次生成报表前使用
OPEN操作;在生成完报表后,使用CLOSE操作,以保证脱机文件的完整。
在生成完当前报表前,还可能需要使用CHGPRTF的命令,将报表生成到指定
的输出队列中。
假如不更换,那么报表会生成到当前用户默认的脱机文件存放处。
当一个RPGLE中,生成多份同名报表时,常会在生成报表前使用CHGPRTF,以
便于治理,幸免纷乱。
报表的操作,也与磁盘文件(一般PF文件)类似,在OPEN与CLOSE之间,
对各字段进行赋值,赋值完之后再通过“WRITE记录格式名”的语句,来写指
定的记录格式。
3.自行操纵换页
在声明报表时,能够通过OFLINE关键字,定义换页指示器,只是可能是换页
指示器的使用方法我摸索得还不够,因此使用起来总觉得不够自如。
我通常是先在报表文件中,定义一个记录格式(RecordFormat),该记录格式下
只有一个字段,同时那个字段的功能选项处要标识为“SKIPA”,然后该字段尽量
做成不可见字符。
在RPGLE程序中,当程序运行逻辑上判定需要换页时,WRITE
那个记录格式,就能够实现换页了(也确实是通过字段的SKIPA选项来实现换页,
因此大伙儿也能够使用其它更便利的方法,那个地点只是介绍我常用的方法,因为我觉得
那个方法比较稳固)。
至于如何判定换页,因此要看具体报表的需求是如何要求的。
最重要的,是不
要不记得定义一个数字型变量用来统计当前页已打印过的行数,当大于等于60行,
要进行换页处理(我通常会留出几行来做为冗余,大伙儿能够自已选择,但确信不能
大于66行,否则会自动换页)
三、几点补充
呵呵,找出我往常写的关于报表打印的贴子,做为使用时补充
1、关于记录格式
事实上那个本来没什么可说的,只是我就经常搞错,依旧说说吧。
同一个记录格式之下,格式应该如下:
记录格式名
0001.00+打印内容
0002.00+打印内容
0003.00+
每行要有那个+,才归属于同一个记录格式。
假如是个点的话,也确实是说明这一行
并不属于该记录格式,假如想让它属于那个记录格式,就要用CLC命令;
当我们用19编辑的时候,假如是3来COPY记录行,系统经常会自动在COPY处
新增一个记录格式,因此要注意。
(说来简单,然而我最开始画报表的时候,就曾经被
那个问题折磨)
2、关于变量的命名
不同的记录格式,能够使用相同的变量名。
有的时候,为了少写赋值语句,能够直截了当将变量命名得与PF中的字段相同。
(只是我不太喜爱这种做法)
假如在RPGLE程序中,给某个变量赋值,但没有对相应的记录格式进行
WRITE操作,编译会不通过,报4030字段未定义的错。
3、关于打印时会错行的问题
有的时候,打印会错行,比如记录格式定义
0001.00+变量A(比如说10个字符长)
0002.00+变量B(比如说5个字符长)
变量A的起始处位于第一列
变量B在变量A的下一行,且起始处位于第三列
当变量A='AAAAAAAAAA',变量B='BBBBB'时,会打印出
AAAAAAAAAA
BBBBB
这专门正常。
但当A='A'或空时,本来我们是期望打印出:
A(或者那个地点确实是一空行)
BBBBB
如此的成效,然而系统就会打印成为
BBBBBA或
BBBBB(没有打印出空行)
也确实是说,当某一行的前面为空时,(仿佛空格也算空)假如下一行有数据,就会
挤上来。
解决方法是在将A字段的首位赋值为非空;假如想让客户看不见,能够考虑
使用汉字指示器。
想打印空行,也能够用那个方法。
又或者是将该字段的功能选项加上“SPACEB”,即打印前空一格,也能够解决这
个问题。
(报表的那个特点困扰我最久)
4、关于报表的测试
事实上那个东西最简单,只是我往常一向专门少去留意。
往常测试报表,专门是测试换页的时候,差不多上老老实实的用打印机去打,打出来了
再检查换页对不对,慢不说,还费纸。
事实上我们进入到SPLF里,查看刚生成的报表文件,右上角就有当前的页数,行数,
如第1页第1行,右上角确实是1/1,第2页第3行,确实是3/2,仿佛页数在后面。
在“positionto”那个地点,+1确实是下一行,W+1确实是向右移一列,慢慢+,就能够看
到换页是否正确了。
8.2SQLRPGLE
在RPG/RPGLE程序中,也是能够使用SQL命令的,第一,需要将程序的类型设置为
SQLRPG或SQLRPGLE,SQL语句的用法都一样,RPG/RPGLE是指非SQL语句使用什
么格式。
这类程序写完之后与一般的RPG/RPGLE程序一样编译,运行。
只是需要注意,SQLRPG编译时有一个“COMMIT”参数,此参数假如没有使用
“*NONE”,或“*NC”,那么SQL语句中更换的表将会由系统默认加一个COMMIT声明。
假如执行RPG程序后没有执行COMMIT操作,那么当时数据是更换过来的,但当用户
SIGNOFF之后,SQL更换的表数据将会回滚(这也是在爱护时期常见的爱护失误之一)。
只是那个参数只会阻碍到SQL语句中做了数据更换的表,可不能阻碍到RPG/RPGLE程序段
中的数据。
1、不带任何参数的SQL:
C/EXECSQL
C+UPDATEPFFHSSETFHS01='0'WHEREFHS02=’1’
C/END-EXEC
2、动态游标
C******************************
C*定义动态SQL
C******************************
C/EXECSQL
C+PREPAREW#SQLFROM:
A
C/END-EXEC
C*
C******************************
C*执行动态SQL,结果储存到游标C1中
C******************************
C/EXECSQLDECLAREC1CURSORFORW#SQL
C/END-EXEC
C*
C*
C******************************
C*打开游标C1
C******************************
C/EXECSQL
C+OPENC1
C/END-EXEC
C*
C******************************
C*取数据
C******************************
C*SQLCODDOUNE*ZERO
C*
C/EXECSQL
C+FETCHC1INTO:
W#FLD1,
C+:
W#FLD2,
C+:
W#FLD3
C/END-EXEC
C*
C*ENDDO
C*
C******************************
C*关闭游标C1
C******************************
C/EXECSQL
C+CLOSEC1
C/END-EXEC
8.3SAVF,备份与复原
SAVF,全称SAVEFILE,储备文件。
能够将SAVF视为一个储备容器,它能够将指定
的库,或指定的数据文件,或源代码储存在其中,有点类似于UNIX中的TAR。
SAVF只用于备份与复原。
尽管通常这些情况是系统治理员做的,然而假如环境许可的
情形下,开发人员能了解这些命令,自行做做备份,就能够更好地对程序进行测试、爱护源
码。
因此,在使用RESTORE命令时,一定要慎重慎重再慎重,千万不能追求操作速度,切
记切记。
1.建立SAVF
要使用SAVF,第一我们因此需要建立一个SAVF。
如已有自己的SAVF,可跃过此步。
建立SAVF的命令是:
CRTSAVFFILE(库名/SAVF名)
假如建立成功,就会在指定库中,生成一个空的SAVF。
2.清空SAVF
使用SAVF前,必须保证SAVF是空的。
SAVF不能追加内容。
新生成的SAVF一定的
空的,不需要专门处理;
假如是已存在的SAVF,需要使用CLRSAVF的命令,确保清空SAVF
CLRSAVFFILE(库名/SAVF名)
3.将指定的库备份到SAVF中
备份库,使用下列命令来进行备份
SAVLIBLIB(要备份的库名)DEV(*SAVF)SAVF(SAVF所在库名/SAVF名)
ACCPTH(*YES)
ACCPTH(*YES),表示备份时,备份储备路径。
也确实是对应于数据文件,将其逻辑文件
的相关信息也备份下来,会增加备份时刻与备份空间;但复原时,不需要对逻辑文件重新建
立索引,能够省专门多时刻。
因此在备份数据文件建议加上那个参数。
因此,假如是备份源代
码,就不需要那个参数了。
4.复原已备份的库
RSTLIBSAVLIB(备份的库名)DEV(*SAVF)SAVF(SAVF所在的库/SAVF名)
RSTLIB(复原的库名)
RSTLIB那个参数,表示复原的库名,其默认值等于“备份的库名”。
也确实是说,假如
我将FHSLIB整个库备份下来,再使用RSTLIB复原,假如不更换RSTLIB中的值,那么将
直截了当将FHSLIB整个都覆盖复原;而假如指定RSTLIB的值为OTHERLIB,那么将么把备
份的FHSLIB的内容,覆盖复原到指定的OTHERLIB库中。
5.将指定的目标备份到SAVF中
SAVOBJOBJ(目标名)LIB(目标所在的库)DEV(*SAVF)SAVF(SAVF所在的库
/SAVF名)
一次能够备份多个目标。
假如是备份源码,那么OBJ就表示源码所在的SRCFILE,MEMBER项确实是源码名。
能够使用F4键,来备份更多的目标,或更多的源码。
6.复原目标
RSTOBJOBJ(*ALL)SAVLIB(目标所在库)DEV(*SAVF)SAVF(SAVF所在库名/SAVF名)
RSTLIB(复原的库名)
与RSTLIB类似。
因此,OBJ选项使用*ALL,表示复原SAVF中备份的所有的目标,
也能够指定只复原单个/多个目标。
8.4菜单--MENU
假如有例子的话,做菜单事实上也不复杂。
我对菜单做得也不多,感受关于一样开发
人员来说,使用频率不是太高,依旧简单说一下吧
随便找一个已存在的菜单,应该是包含DDS与CMD这两种TYPE,COPY一下;
然后用17,或19进入DDS。
用19进入时,能够像编辑报表一样,对菜单进行编辑;
用17进入时,在“Workwithmenuimageandcommands”选项中选择“Y”,然后
用F10能够看到自行定义的每条输入项对应要运行的程序名,修改之;
用17进入后,再退出时,系统会自动提示编译菜单。
成功之后,查看属性为“CMD”的源,会看到里面也有自定义的输入项对应的要
运行程序名。
GO菜单名,就能够进入生成的菜单。
8.5有用命令
WRKACTJOB
那个使用的频率应该是专门高的吧,在那个地点只提一个用法:
Coding的时候断线专门
退出时,再登录之后,用2进入刚才编辑的程序,会报错“正在被使用”。
除了等一会,
一直等到它自动退出之外,还能够用WRKACTJOB+10,来查找刚才自己的那个进程
(显示出来的命令应该是STRSEU),然后把它KILL掉就行了。
DSPFD
DSPFD+PF名,查看文件的信息,包括文件的MEMBER数,总记录数,被删除
的记录数,CCSID等等。
DSPFD+LF名,查看逻辑文件的键值,结合DSPDBR,能够找出一个PF文件对
应的所有LF文件的键值。
DSPFD+库名+*MBRLIST,能够看到该库之下所有的文件名。
那个命令能够使用*OUTFILE,将输出变成一个文件。
关于LF文件,TYPE项选择“*ACCPTH”,能够看到该LF文件的键值。
假如把输
入设定为OUTFILE,那么每条记录指明了一个键值字段。
TYPE项选择“*SELECT”,能够把那个LF文件的选择条件列出来。
灵活运用此命令,将会是专门多自行编写的工具的基础之一。
DSPFFD
注意,和上面的命令相差一个“F”,该命令表示查看PF文件的字段信息。
比如该
PF文件共有多少个字段,每个字段的类型如何。
与DSPFD相似,DSPFFD也能够使用*OUTFILE,将输出变成一个文件。
每条记
录标识一个字段。
同理,灵活运用,也是众多自行编写工具的基础。
MRGSRC
比较两个程序的差异。
按照A、B、A的顺序,MRGSRC时,A程序在上面,B程
序在下面,白色的地点,即表示两个程序的差异。
F13表示同意当前差异,F17表示同意所有差异,F16表示连续查找下一处差异。
在同意差异时,表示按照B程序,更换A程序。
(即B程序不变)
把SPLF变成MEMBER(源文件)
必须明白SPLF名,以及生成SPLF的JOB、USR、NUMBER名
CRTSRCPFFILE(库名/SRCPF)RCDLEN(212)IGCDTA(*YES)
CHGPFFILE(库名/SRCPF)CCSID(935)
CRTPFFILE(库名/PF)RCDLEN(200)IGCDTA(*YES)
CPYSPLFFILE(SPLF名)TOFILE(库名/PF)+
JOB(NUMBER名/USER名/JOB名)SPLNBR(*LAST)
CPYFFROMFILE(库名/PF)TOFILE(库名/SRCPF)+
TOMBR(MBR0001)MBROPT(*ADD)FMTOPT(*CV
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- RPGAS400 程序员 培训 手册