足球比分直播

RPG AS400程序员培训手册9.doc

返回
RPG AS400程序员培训手册9.doc_第1页
第1页 / 共20页
RPG AS400程序员培训手册9.doc_第2页
第2页 / 共20页
RPG AS400程序员培训手册9.doc_第3页
第3页 / 共20页
RPG AS400程序员培训手册9.doc_第4页
第4页 / 共20页
RPG AS400程序员培训手册9.doc_第5页
第5页 / 共20页
点击查看更多>>
资源描述:
8 其它 8.1 报表打印 在这里,简单说一下报表。其实据说 RPG 设计之初,主要就是为了解决报表问题。不 过发展到现在,在我接触过的系统中, 觉得报表在 RPG 编程之中反而退居其次,大部分程 序都是对数据库中磁盘文件(即 PF 文件)的操作。 报表文件其实在某种意义上与普通的磁盘文件很类似,都是有记录格式(Record at),都可以进行写操作(WRITE ),RPGLE 的程序 对它们的操作方式也比较雷同。所 不同的是普通的磁盘文件的数据是存储在数据库中,而报表文件 WRITE 了之后,是以脱机 文件(Spool File)的形式存在。所以在一个库中,磁盘文件具有唯一性,即不能有同名的 磁盘文件;而在同一个输出队列中,同名的报表文件(即生成的脱机文件),允许有多个。 要做一个全新的报表打印,大致上可以分为画报表文件(PRTF),与编写打印程序这两 部分。 一、画报表文件(PRTF) 1、 新建立一个属性为 PRTF 的文件,然后使用 19 进入报表编辑状态。(即 STRRLU) 2、 定义一个新的记录格式(Record at)DR F18 F10,注意看下方的功能 键说明 3、 在一个记录格式之下,追加内容时,要在新的 编辑 行前加“ CLC”,表示此行 的内容,是属于上面记录格式的。 4、 编辑行前加 DC 定义常量 CF 使当前行的内容居中 5、 常用功能键 F13 标记 / 取消标记(光标所指的字段)。多 试一下就知道使用方法,可以将 同一行的多个相连的字段标记成为一个块(对首尾两个字段操作 F13 即可)。 高亮部分表示已被标记的块。 F14 将已标记的块 COPY 到光 标指定处。(其 实这个我用得不多) F15 将已标记的块 MOVE 到光标指定处。(这个用得不少) F16 删除已标记的块。(这个用的频率也不少) F11 定义新变量 F23 进入当前字段的功能菜单画面 6、 对新变量的定义,按 F11 之后,见到画面如下 Edited length . . . . . . . . . . . . 1 Record at . . . . . . . . . . . . RCD001 Number of keywords . . . . . . . . . 0 Number of indicators . . . . . . . . 0 Type choices, press Enter. Field . . . . . . . . . . . . . . . . FLD001 Name Option indicators . . . . . . . . . . 01-99, N01-N99 More indicators . . . . . . . . . . N YYes, NNo Starting line . . . . . . . . . . . . 1-255 Starting position . . . . . . . . . . 6 1-255, nn Length of data . . . . . . . . . . . 1 1-378, nn, -nn 翻页,还有 Data type . . . . . . . . . . . . . . 1 1Character 2Zoned 3Floating point 4Open 5Graphic 6Date 7Time 8Time stamp Decimal positions . . . . . . . . . . 0-31, n, -n Reference a field . . . . . . . . . . N YYes, NNo Use referenced values . . . . . . . Y YYes, NNo 可以采用直接定义长度、类型的方法,即在第 1 页的最末尾, Length of data 处, 填上字段长度;如果是字符型,就不需要再填其它内容;如果是数字型,在第 2 页 Decimal positions 处填上小数位数。 也可以采用参照字段的方法(即参照已存在的 PF 文件中的字段)。如果选用这种 方法,就用需要在 Length of data 以及 Decimal positions 中填写内容,将 Reference a field 项 填为“Y”,然后按确认键(好象 F10 键也可以),然后可以看到该项高亮显示。 此时再按 F10,可 进入该字段的功能菜单(也可以通过在报表编辑状态下,直接在当前 字段处按 F23 进入) Opt Keyword Opt Keyword Opt Keyword ALIAS DFT IGCCHRRTT BARCODE DLTEDT INDTXT BLKFOLD EDTCDE MSGCON CDEFNT EDTWRD PAGNBR CHRID FLTFIXDEC PRTQLTY CHRSIZ FLTPCN REFFLD COLOR FNTCHRSET SKIPA CPI FONT SKIPB CVTDTA HIGHLIGHT SPACEA DATE IGCALTTYP SPACEB DATFMT IGCANKCNV TEXT DATSEP IGCCDEFNT TIME 以上菜单中,标记为蓝色的,是我常用的几个选项。 在这些选项前面,选 2,即是对当前字段加注这些功能;选 4,即是去掉 这些 功能。 要参照已知字段定义变量,则在“ REFFLD”选项前选 2,可见 Field . . . . . . . . . . . . . . . Record at . . . . . . . . . . File . . . . . . . . . . . . . . . Library . . . . . . . . . . . . . *CURLIB 各选项的含义 Field 当前变量所参照的字段 Record at 当前变量所参照字段,在 PF 文件中所属的记录格式 File PF 文件名 Library PF 文件所在的库名 7、 其它几个常用功能选项的含义 SKIPASkip After, 在 WRITE 操作时,写该字段后,自动换页; SKIPBSkip Before 在 WRITE 操作时,写该字段前,自动换页 SPACEASpace After 写 该字段后,再打印一个空格; SPACEBSpace Before 写 该字段前,打印一个空格(可用来解决 错行问题) EDTCDE定 义当前字段的 显示方式,比如 说当前字段 为数字类型时,是否显 示逗号,前面是补零等等。根据 F1 键,看 Help 中的 说明 Edit Code Description No Sign CR Sign - SignR - SignL Commas and zero balances 1 A J N Commas 2 B K O Zero balances 3 C L P No commas or zero balances 4 D M Q User defined edit codes 5-9 Date field edit W Date edit Y Suppress leading zeros Z 二、编写打印报表的程序 1. 对报表文件的声明 FEF4322P O E PRINTER OFLIND*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 关键字,定 义换页指示器,不过可能是换页 指示器的使用方法我摸索得还不够,所以使用起来总觉得不够自如。 我通常是先在报表文件中,定义一个记录格式Record at,该记录格式下 只有一个字段,同时这个字段的功能选项处要标识为“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,好象页数在后面。 在“position to”这里,1 就是下一行,W1 就是向右移一列,慢慢 ,就可以看 到换页是否正确了。 8.2 SQLRPGLE 在 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/C SQL C UPDATE PFFHS SET FHS01 0 WHERE FHS02’1’ C/END-C 2、动态游标 C****************************** C* 定义动态 SQL C****************************** C/C SQL C PREPARE WSQL FROM A C/END-C C* C****************************** C* 执行动态 SQL,结果保存到游标 C1 中 C****************************** C/C SQL DECLARE C1 CURSOR FOR WSQL C/END-C C* C* C****************************** C* 打开游标 C1 C****************************** C/C SQL C OPEN C1 C/END-C C* C****************************** C* 取数据 C****************************** C* SQLCOD DOUNE *ZERO C* C/C SQL C FETCH C1 INTO WFLD1,
展开阅读全文
收藏
下载资源

加入会员免费下载





足球比分直播