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

上传人:帮**** 文档编号:860528 上传时间:2019-08-08 格式:DOC 页数:20 大小:128KB
返回 下载 相关 举报
RPG AS400程序员培训手册9.doc_第1页
第1页 / 共20页
RPG AS400程序员培训手册9.doc_第2页
第2页 / 共20页
点击查看更多>>
资源描述

《RPG AS400程序员培训手册9.doc》由会员分享,可在线阅读,更多相关《RPG AS400程序员培训手册9.doc(20页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、8 其它 8.1 报表打印 在这里,简单说一下报表。其实据说 RPG 设计之初,主要就是为了解决报表问题。不 过发展到现在,在我接触过的系统中,觉得报表在 RPG 编程之中反而退居其次,大部分程 序都是对数据库中磁盘文件(即 PF 文件)的操作。 报表文件其实在某种意义上与普通的磁盘文件很类似,都是有记录格式(Record Format),都可以进行写操作(WRITE),RPGLE 的程序对它们的操作方式也比较雷同。所 不同的是普通的磁盘文件的数据是存储在数据库中,而报表文件 WRITE 了之后,是以脱机 文件(Spool File)的形式存在。所以在一个库中,磁盘文件具有唯一性,即不能有同名

2、的 磁盘文件;而在同一个输出队列中,同名的报表文件(即生成的脱机文件),允许有多个。 要做一个全新的报表打印,大致上可以分为画报表文件(PRTF),与编写打印程序这两 部分。 一、画报表文件(PRTF) 1、 新建立一个属性为 PRTF 的文件,然后使用 19 进入报表编辑状态。(即 STRRLU) 2、 定义一个新的记录格式(Record Format):DR + F18 + F10,注意看下方的功能 键说明 3、 在一个记录格式之下,追加内容时,要在新的编辑行前加“CLC”,表示此行 的内容,是属于上面记录格式的。 4、 编辑行前加: DC: 定义常量 CF: 使当前行的内容居中 5、 常

3、用功能键: F13: 标记 / 取消标记(光标所指的字段)。多试一下就知道使用方法,可以将 同一行的多个相连的字段标记成为一个块(对首尾两个字段操作 F13 即可)。 高亮部分表示已被标记的块。 F14: 将已标记的块 COPY 到光标指定处。(其实这个我用得不多) F15: 将已标记的块 MOVE 到光标指定处。(这个用得不少) F16: 删除已标记的块。(这个用的频率也不少) F11: 定义新变量 F23: 进入当前字段的功能菜单画面 6、 对新变量的定义,按 F11 之后,见到画面如下: Edited length . . . . . . . . . . . . : 1 Record f

4、ormat . . . . . . . . . . . . : 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 Y=Yes, N=No

5、 Starting line . . . . . . . . . . . . 1-255 Starting position . . . . . . . . . . 6 1-255, +nn Length of data . . . . . . . . . . . 1 1-378, +nn, -nn 翻页,还有: Data type . . . . . . . . . . . . . . 1 1=Character 2=Zoned 3=Floating point 4=Open 5=Graphic 6=Date 7=Time 8=Time stamp Decimal positions . .

6、 . . . . . . . . 0-31, +n, -n Reference a field . . . . . . . . . . N Y=Yes, N=No Use referenced values . . . . . . . Y Y=Yes, N=No 可以采用直接定义长度、类型的方法,即在第 1 页的最末尾,Length of data 处, 填上字段长度;如果是字符型,就不需要再填其它内容;如果是数字型,在第 2 页 Decimal positions 处填上小数位数。 也可以采用参照字段的方法(即参照已存在的 PF 文件中的字段)。如果选用这种 方法,就用需要在 Length

7、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 CHRS

8、IZ 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 format . . . . .

9、 . . . . . File . . . . . . . . . . . . . . . Library . . . . . . . . . . . . . *CURLIB 各选项的含义: Field: 当前变量所参照的字段 Record Format: 当前变量所参照字段,在 PF 文件中所属的记录格式 File: PF 文件名 Library: PF 文件所在的库名 7、 其它几个常用功能选项的含义: SKIPA:Skip After, 在 WRITE 操作时,写该字段后,自动换页; SKIPB:Skip Before 在 WRITE 操作时,写该字段前,自动换页 SPACEA:Spac

10、e After 写该字段后,再打印一个空格; SPACEB:Space Before 写该字段前,打印一个空格(可用来解决错行问题) EDTCDE:定义当前字段的显示方式,比如说当前字段为数字类型时,是否显 示逗号,前面是补零等等。根据 F1 键,看 Help 中的说明: Edit Code Description No Sign CR Sign - Sign(R) - Sign(L) 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

11、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; 其实这一项我觉得控制起来有点不爽,所以我通常都是自行控制换页,不用这

12、 个指示器来判断;我常使用的自行控制换页的方法在下面会说明。 2. 对报表文件的处理 和磁盘文件(DISK)一样,报表文件其实也有 OPEN,CLOSE,WRITE 的操 作。不过使用 OPEN,CLOSE 操作时,不需要使用 USROPN 关键字。同时也因为 生成的是脱机文件,所以不能进行 CHAIN、UPDATE 等定位、修改的操作。 如果在程序中,只需要生成一份报表,那么可以不使用 OPEN/CLOSE 操作, 因为程序在运行之初,以及运行结束时,已默认打开,关闭了一次所有已声明的文 件,包括报表打印文件。 但如果程序在运行时,需要生成多份报表,那么必须在每次生成报表前使用 OPEN 操

13、作;在生成完报表后,使用 CLOSE 操作,以保证脱机文件的完整。 在生成完当前报表前,还可能需要使用 CHGPRTF 的命令,将报表生成到指定 的输出队列中。如果不更改,那么报表会生成到当前用户默认的脱机文件存放处。 当一个 RPGLE 中,生成多份同名报表时,常会在生成报表前使用 CHGPRTF,以 便于管理,避免混乱。 报表的操作,也与磁盘文件(普通 PF 文件)类似,在 OPEN 与 CLOSE 之间, 对各字段进行赋值,赋值完之后再通过“WRITE 记录格式名” 的语句,来写指 定的记录格式。 3. 自行控制换页 在声明报表时,可以通过 OFLINE 关键字,定义换页指示器,不过可能

14、是换页 指示器的使用方法我摸索得还不够,所以使用起来总觉得不够自如。 我通常是先在报表文件中,定义一个记录格式(Record Format),该记录格式下 只有一个字段,同时这个字段的功能选项处要标识为“SKIPA”,然后该字段尽量 做成不可见字符。在 RPGLE 程序中,当程序运行逻辑上判断需要换页时,WRITE 这个记录格式,就可以实现换页了(也就是通过字段的 SKIPA 选项来实现换页, 当然大家也可以使用其它更便捷的方法,这里只是介绍我常用的方法,因为我觉得 这个方法比较稳定)。 至于如何判断换页,当然要看具体报表的需求是如何要求的。最重要的,是不 要忘记定义一个数字型变量用来统计当前

15、页已打印过的行数,当大于等于 60 行, 要进行换页处理(我通常会留出几行来做为冗余,大家可以自已选择,但肯定不能 大于 66 行,否则会自动换页) 三、几点补充 呵呵,找出我以前写的关于报表打印的贴子,做为使用时补充 1、 关于记录格式 其实这个本来没什么可说的,不过我就经常搞错,还是说说吧。 同一个记录格式之下,格式应该如下: 记录格式名 0001.00+ 打印内容 0002.00+ 打印内容 0003.00+ 每行要有这个+,才归属于同一个记录格式。如果是个点的话,也就是说明这一行 并不属于该记录格式,如果想让它属于这个记录格式,就要用 CLC 命令; 当我们用 19 编辑的时候,如果是

16、 3 来 COPY 记录行,系统经常会自动在 COPY 处 新增一个记录格式,所以要注意。(说来简单,但是我最开始画报表的时候,就曾经被 这个问题折磨) 2、 关于变量的命名 不同的记录格式,可以使用相同的变量名。 有的时候,为了少写赋值语句,可以直接将变量命名得与 PF 中的字段相同。 (不过我不太喜欢这种做法) 如果在 RPGLE 程序中,给某个变量赋值,但没有对相应的记录格式进行 WRITE 操作,编译会不通过,报 4030 字段未定义的错。 3、 关于打印时会错行的问题 有的时候,打印会错行,比如记录格式定义 0001.00+ 变量 A(比如说 10 个字符长) 0002.00+ 变量

17、 B(比如说 5 个字符长) 变量 A 的起始处位于第一列 变量 B 在变量 A 的下一行,且起始处位于第三列 当变量 A=AAAAAAAAAA, 变量 B=BBBBB时,会打印出 AAAAAAAAAA BBBBB 这很正常。 但当 A= A或空时,本来我们是希望打印出: A(或者这里就是一空行) BBBBB 这样的效果,但是系统就会打印成为 BBBBBA 或 BBBBB (没有打印出空行) 也就是说,当某一行的前面为空时,(好象空格也算空)如果下一行有数据,就会 挤上来。解决办法是在将 A 字段的首位赋值为非空;如果想让客户看不见,可以考虑 使用汉字指示器。想打印空行,也可以用这个办法。 又

18、或者是将该字段的功能选项加上“SPACEB”,即打印前空一格,也可以解决这 个问题。(报表的这个特点困扰我最久) 4、关于报表的测试 其实这个东西最简单,不过我以前一向很少去留意。 以前测试报表,尤其是测试换页的时候,都是老老实实的用打印机去打,打出来了 再检查换页对不对,慢不说,还费纸。 其实我们进入到 SPLF 里,查看刚生成的报表文件,右上角就有当前的页数,行数, 如第 1 页第 1 行,右上角就是 1/1,第 2 页第 3 行,就是 3/2,好象页数在后面。 在“position to”这里,+1 就是下一行,W+1 就是向右移一列,慢慢+,就可以看 到换页是否正确了。 8.2 SQL

19、RPGLE 在 RPG/RPGLE 程序中,也是可以使用 SQL 命令的,首先,需要将程序的类型设置为 SQLRPG 或 SQLRPGLE,SQL 语句的用法都一样,RPG / RPGLE 是指非 SQL 语句使用什 么格式。这类程序写完之后与普通的 RPG/RPGLE 程序一样编译,运行。 不过需要注意,SQLRPG 编译时有一个“COMMIT”参数,此参数如果没有使用 “*NONE”,或“*NC”,那么 SQL 语句中更改的表将会由系统默认加一个 COMMIT 声明。 如果执行 RPG 程序后没有执行 COMMIT 操作,那么当时数据是更改过来的,但当用户 SIGNOFF 之后,SQL 更

20、改的表数据将会回滚(这也是在维护阶段常见的维护失误之一)。 不过这个参数只会影响到 SQL 语句中做了数据更改的表,不会影响到 RPG/RPGLE 程序段 中的数据。 1、不带任何参数的 SQL: C/EXEC SQL C+ UPDATE PFFHS SET FHS01=0 WHERE FHS02=1 C/END-EXEC 2、动态游标 C* C* 定义动态 SQL C* C/EXEC SQL C+ PREPARE W#SQL FROM :A C/END-EXEC C* C* C* 执行动态 SQL,结果保存到游标 C1 中 C* C/EXEC SQL DECLARE C1 CURSOR FO

21、R W#SQL C/END-EXEC C* C* C* C* 打开游标 C1 C* C/EXEC SQL C+ OPEN C1 C/END-EXEC C* C* C* 取数据 C* C* SQLCOD DOUNE *ZERO C* C/EXEC SQL C+ FETCH C1 INTO :W#FLD1, C+ :W#FLD2, C+ :W#FLD3 C/END-EXEC C* C* ENDDO C* C* C* 关闭游标 C1 C* C/EXEC SQL C+ CLOSE C1 C/END-EXEC 8.3 SAVF,备份与恢复 SAVF,全称 SAVE FILE,存储文件。可以将 SAVF

22、视为一个存储容器,它能够将指定 的库,或指定的数据文件,或源代码保存在其中,有点类似于 UNIX 中的 TAR。 SAVF 只用于备份与恢复。虽然通常这些事情是系统管理员做的,但是如果环境许可的 情况下,开发人员能了解这些命令,自行做做备份,就可以更好地对程序进行测试、保护源 码。当然,在使用 RESTORE 命令时,一定要谨慎谨慎再谨慎,千万不能追求操作速度,切 记切记。 1. 建立 SAVF 要使用 SAVF,首先我们当然需要建立一个 SAVF。如已有自己的 SAVF,可跳过此步。 建立 SAVF 的命令是: CRTSAVF FILE(库名/SAVF 名) 如果建立成功,就会在指定库中,生

23、成一个空的 SAVF。 2. 清空 SAVF 使用 SAVF 前,必须保证 SAVF 是空的。SAVF 不能追加内容。新生成的 SAVF 一定的 空的,不需要特别处理; 如果是已存在的 SAVF,需要使用 CLRSAVF 的命令,确保清空 SAVF CLRSAVF FILE(库名/SAVF 名) 3. 将指定的库备份到 SAVF 中 备份库,使用下列命令来进行备份 SAVLIB LIB(要备份的库名) DEV(*SAVF) SAVF(SAVF 所在库名/SAVF 名) ACCPTH(*YES) ACCPTH(*YES),表示备份时,备份存储路径。也就是对应于数据文件,将其逻辑文件 的相关信息也

24、备份下来,会增加备份时间与备份空间;但恢复时,不需要对逻辑文件重新建 立索引,可以省很多时间。所以在备份数据文件建议加上这个参数。当然,如果是备份源代 码,就不需要这个参数了。 4. 恢复已备份的库 RSTLIB SAVLIB(备份的库名) DEV(*SAVF) SAVF(SAVF 所在的库/SAVF 名) RSTLIB(恢复的库名) RSTLIB 这个参数,表示恢复的库名,其默认值等于“备份的库名”。也就是说,如果 我将 FHSLIB 整个库备份下来,再使用 RSTLIB 恢复,如果不更改 RSTLIB 中的值,那么将 直接将 FHSLIB 整个都覆盖恢复;而如果指定 RSTLIB 的值为

25、OTHERLIB,那么将么把备 份的 FHSLIB 的内容,覆盖恢复到指定的 OTHERLIB 库中。 5. 将指定的目标备份到 SAVF 中 SAVOBJ OBJ(目标名) LIB(目标所在的库) DEV(*SAVF) SAVF(SAVF 所在的库 /SAVF 名) 一次可以备份多个目标。 如果是备份源码,那么 OBJ 就表示源码所在的 SRCFILE,MEMBER 项就是源码名。 可以使用 F4 键,来备份更多的目标,或更多的源码。 6. 恢复目标 RSTOBJ OBJ(*ALL) SAVLIB(目标所在库) DEV(*SAVF) SAVF(SAVF 所在库名/SAVF 名) RSTLIB

26、( 恢复的库名) 与 RSTLIB 类似。当然,OBJ 选项使用*ALL,表示恢复 SAVF 中备份的所有的目标, 也可以指定只恢复单个/多个目标。 8.4 菜单-MENU 如果有例子的话,做菜单其实也不复杂。我对菜单做得也不多,感觉对于一般开发 人员来说,使用频率不是太高,还是简单说一下吧 随便找一个已存在的菜单,应该是包含 DDS 与 CMD 这两种 TYPE,COPY 一下; 然后用 17,或 19 进入 DDS。 用 19 进入时,可以像编辑报表一样,对菜单进行编辑; 用 17 进入时,在“Work with menu image and commands”选项中选择“Y”,然后 用

27、F10 可以看到自行定义的每条输入项对应要运行的程序名,修改之; 用 17 进入后,再退出时,系统会自动提示编译菜单。 成功之后,查看属性为“CMD”的源,会看到里面也有自定义的输入项对应的要 运行程序名。 GO 菜单名,就可以进入生成的菜单。 8.5 实用命令 WRKACTJOB 这个使用的频率应该是很高的吧,在这里只提一个用法:Coding 的时候断线异常 退出时,再登录之后,用 2 进入刚才编辑的程序,会报错“正在被使用”。除了等一会, 一直等到它自动退出之外,还可以用 WRKACTJOB + 10,来查找刚才自己的那个进程 (显示出来的命令应该是 STRSEU),然后把它 KILL 掉

28、就行了。 DSPFD DSPFD + PF 名,查看文件的信息,包括文件的 MEMBER 数,总记录数,被删除 的记录数,CCSID 等等。 DSPFD + LF 名,查看逻辑文件的键值,结合 DSPDBR,可以找出一个 PF 文件对 应的所有 LF 文件的键值。 DSPFD + 库名 + *MBRLIST,可以看到该库之下所有的文件名。 这个命令可以使用*OUTFILE,将输出变成一个文件。 对于 LF 文件,TYPE 项选择“*ACCPTH”,可以看到该 LF 文件的键值。如果把输 入设定为 OUTFILE,那么每条记录指明了一个键值字段。 TYPE 项选择“*SELECT”,可以把这个

29、LF 文件的筛选条件列出来。 灵活运用此命令,将会是很多自行编写的工具的基础之一。 DSPFFD 注意,和上面的命令相差一个“F”,该命令表示查看 PF 文件的字段信息。比如该 PF 文件共有多少个字段,每个字段的类型如何。 与 DSPFD 相似,DSPFFD 也可以使用*OUTFILE,将输出变成一个文件。每条记 录标识一个字段。同理,灵活运用,也是众多自行编写工具的基础。 MRGSRC 比较两个程序的差异。按照 A、B、A 的顺序,MRGSRC 时,A 程序在上面,B 程 序在下面,白色的地方,即表示两个程序的差异。 F13 表示接受当前差异,F17 表示接受所有差异,F16 表示继续查找

30、下一处差异。 在接受差异时,表示按照 B 程序,更改 A 程序。(即 B 程序不变) 把 SPLF 变成 MEMBER(源文件) 必须知道 SPLF 名,以及生成 SPLF 的 JOB、USR、NUMBER 名 CRTSRCPF FILE(库名/SRCPF) RCDLEN(212) IGCDTA(*YES) CHGPF FILE(库名/SRCPF) CCSID(935) CRTPF FILE(库名/PF) RCDLEN(200) IGCDTA(*YES) CPYSPLF FILE(SPLF 名) TOFILE(库名/PF) + JOB(NUMBER 名 / USER 名 / JOB 名) SP

31、LNBR(*LAST) CPYF FROMFILE(库名/PF) TOFILE(库名/SRCPF) + TOMBR(MBR0001) MBROPT(*ADD) FMTOPT(*CVTSRC) 最后,SRCPF 下的 MBR001 就是 SPLF 转成的 MEMBER 当然,做为中间转换的临时文件,PF 文件会保留 SPLF 的信息。 把 MSGF 变成 SPLF CHGSYSLIBL LIB(QSYS2989) DSPMSGD RANGE(*FIRST *LAST) MSGF(MSGF 所在库名/MSGF 名) + DETAIL(*BASIC) OUTPUT(*PRINT) CHGSYSLIB

32、L LIB(QSYS2989) OPTION(*REMOVE) 这个命令,再结合上面的“把 SPLF 变成 MEMBER”,就可以把 MSGF 搞成 MEMBER,然后再 FTP 到 WINDOWS 上,就可以很方便地查找已定义的 MSG 信息了。 不过必须要有权限执行 CHGSYSLIBL 这个命令。 DSPOBJD 根据程序名,查找编译时源代码所在的库名、SRCFILE 名。 DETAIL 参数用“*SERVICE”,OBJTYPE 选项用“*PGM” 不过好象 RPGLE 的程序用这个命令查不出来,要用 DSPPGM 命令。 DSPPGM 根据目标 DSPPGM + RPGLE 程序名,

33、参数用“*MODULE”,然后再选择 5,就可以看到编 译时 RPGLE 程序时,源代码所在的库名,SRCFILE 名。 DSPDBR 根据物理文件查其对应的所有逻辑文件 DSPPGMREF 查找程序与 PF、LF 的关系。 PGM 参数用“*ALL”,OUTPUT 参数用“*OUTFILE”,OBJTYPE 参数用“*ALL”, 然后执行,再输入输出文件名与所在库就可以了。然之后,就可以 SQL 在这个生成的 文件中查找(生成的过程可能会有点慢,要耐心)。 在生成的文件中,字段 WHRFNM,表示记录格式名。举例来说,如果物理文件更 改过,那么物理文件与逻辑文件就都重新编译过了,所以它们对应

34、的的所有的程序都要 重新编译,通常物理文件与逻辑文件使用相同的记录格式名(当然,如果不同就算了) 这时就需要按记录格式名来查找。比如 SELECT * FROM 刚生成的文件 WHERE WHRFNM = “记录格式名”,找出所有涉及到这个记录格式名的程序。 在生成的文件中,字段 WHFNAM,表示文件名,包括物理文件与逻辑文件。比如 说当我们只修改了某个逻辑文件时,那么当然是只需要重新编译与该逻辑文件有关的程 序,也就是说只根据文件名来查找就足够了。 RTVCLSRC 如果编译 CL 程序时,不是刻意带*NONE 参数,那么一般来说 CL 程序都可以使 用这个命令来反编译。具体用途试试便知

35、RGZPFM 重整文件,即回收已删除记录的空间。不过这个命令我没实际用过。 WRKMSGQ QSYSOPR 显示错误信息 CHGCMGDFT 更改某些命令的默认参数,如更改 CRTPF 的 WAITRCD 参数: CHGCMDDFT CMD(QSYS/CRTPF) NEWDFT(WAITRCD(*IMMED) SBMJOB 将任务提交后台处理。 普通程序的流程中,如果 A 程序 CALL 了 B 程序,那么 A 程序必须等待 B 程序运 行结束之后,才会继续执行 CALL 之后的语句; 如果是使用 SBMJOB 的话,那么 A 程序就将 B 程序提交到后台去运行,不等待 B 程序结行完毕,直接

36、继续向下运行。 SBMJOB 命令仅仅只是表示将任务提交给后台,所以此句运行完毕,也仅表示后 台已开始运行,并不表示运行的程序结束。 Submit Job (SBMJOB) Type choices, press Enter. Command to run . . . . . . . . . . Job name . . . . . . . . . . . . *JOBD Name, *JOBD Job description . . . . . . . . *USRPRF Name, *USRPRF Library . . . . . . . . . . . Name, *LIBL, *CU

37、RLIB Job queue . . . . . . . . . . . *JOBD Name, *JOBD Library . . . . . . . . . . . Name, *LIBL, *CURLIB 如上所示,第一行 Command to run 处,填写需要提交后台运行的命令语句(通常是 CALL 某个程序); Job name 表示的,是显示在屏幕上的,运行的程序的名字,可以随便写,只是用来标识 用的; Job description, 填写对应的 JOBD(如果想将程序提交到指定的子系统下,那么此处 填写子系统对应的 JOBD,Job queue 处填写子系统对应的 JOBQ

38、),如果不填,即表示默认 为当前用户的 JOBD,JOBQ 8.6 关于代码风格的几点想法 1、 绝大多数情况下,不做硬性要求,一切都以维护时程序的易读性为主导。 2、 一定要在程序最开始,简要说明程序实现的功能,输入输出参数,这个必须的。 3、 临时变量的命名: 这个应该算是最具有可规范性的了。总之最好就是一望之下,就知道这个临时 变量是代表什么意思。变量名的长度可以不做局限,当然最好不要太长。通常项目 开发对此都会有明文或潜在的规范,多参照即可。 4、 定义临时变量的位置: 在首次使用该临时变量前定义,同时加汉字注释,简单说明这个临时变量在什 么情况下,应该赋什么样的值。(当然了,如果是多

39、个用途相似的临时变量,可以 用一行注释来搞定,不强求每个变量都要有一行注释) 见过的大部分规范里面,都是统一在程序开始处定义一大堆临时变量,规范的 同时,总觉得用起来不够方便,比如说不知道这个临时变量什么时候使用,代表什 么意思,怎么使用,该怎么赋值等等。 5、 子过程的使用: 主程序最好只写主流程,将具体处理交给各子过程;同时在调用子过程之前, 加注释,说明这个子过程的处理功能。而子过程代码最开始,也要有这个子过程的 功能说明,最好详细一点。 把子过程尽量写成类似于 CALL 程序的感觉,也就是自已定一个输入输出接 口。当然,这个并不是真的输入输出接口参数,因为子过程中的变量在整个程序中 都

40、可以用到,只是说类似。比如说,某个字段,是子过程中需要使用到的关键的一 个字段,那我们就可以将其做为输入字段,并在整个子过程的代码中,尽量不要去 改它的值;再比如说,子过程的功能是计算出一个金额,那我们就可以把这个金额 字段做为输出字段,在使用子过程之前将其清零。然后,在子过程前,加注释说明 输入输出字段。 这样做的意义在于:维护修改代码的便利性,COPY 代码的便利性。 6、 视觉上的分隔: RPGLE 的程序,写出来都是一坨坨的,尤其是 IF 语句,用多了的确很难分清 逻辑判断到底是怎样。我通常对代码都是采用视觉上的分隔,因为我觉得这样最直 观。比如说,主代码段与子过程段之间,用全行“*”

41、来做分隔;各段之内,也用 长短不一的“*”来分隔,表示不同情况的处理,或表示当前是几层之内的“IF”。 这个规律现在还没有总结出数字化的东西来,大部分情况下还是凭感觉,以后有时 间做做统计看看。 总之最后的效果,是从视觉上,将不同的处理情况隔开。比如说 * *注释 C IF XXXX C ENDIF * 这种方式之下的 ENDIF,就比较好找了吧。 “*”当然还可以再打得长一点,如果层次多了,还可以用单横线,等号,诸 如此类。 7、 注释 注释的重要性毋庸致疑,这里单指以下情况的注释: 如果写程序时,某些需求不是很明确,或自己对这个需求的理解不是很清晰, 或者是用户特意要求某种情况之下不按常规方式处理,又或者是处理判断在逻辑上 比较复杂比较绕,那么不妨把自己当时的想法或客户要求也写在注释中。事实上, 有不少明显的 BUG,就是通过这种注释发现的。_

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 管理文献 > 管理制度

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com