RPG AS400程序员培训手册(大全五篇)

时间:2019-05-12 19:20:12下载本文作者:会员上传
简介:写写帮文库小编为你整理了多篇相关的《RPG AS400程序员培训手册》,但愿对你工作学习有帮助,当然你在写写帮文库还可以找到更多《RPG AS400程序员培训手册》。

第一篇:RPG AS400程序员培训手册

2.8.4.4 O--R

ON-ERROR(On-Error)

没用过

OPEN {(E)}(Open File for Processing)打开文件

Factory 1 Operation Factory 2 Result HI LO EQ

OPEN 文件名

OPEN 后面的目标,必须是在当前程序中已声明的文件名(不是文件的记录格式名),而且在OPEN 操作之后,在程序结束之前之前,必须有对应的CLOSE 操作。

使用OPEN 操作,文件在声明时,必须使用USROPN 关键字(详见D 行说明)。

ORxx(Or)逻辑判断—或

Factory 1 Operation Factory 2 Result HI LO EQ

FLD01 IFGT FLD0

3FLD01 OREQ FLD0

2等价于

IF FLD01>FLD03 OR FLD01=FLD02

与IF、IFxx,AND、ANDxx 类似,RPGLE 的写法OR,比RPG 的写法ORxx 要灵活,而且可以用来表达一些复杂的逻辑关系。有鉴于此,所以通常IF 语句中,我会以OR 为主,基本不用ORxx。如果在编程序方面,公司/项目组无硬性要求,那我觉得还是少用ORxx 吧,总觉得这种写法的逻辑关系看起来不直接,尤其是有很复杂的AND,OR 时。

OTHER(Otherwise Select)分支语句的判断

与分支语句SELECT 一起使用,表示不符合上述所有条件时的操作,如下:

Factory 1 Operation Factory 2 Result HI LO EQ

SELECT

WHEN 条件判断1 处理语句1

WHEN 条件判断

2处理语句2

OTHER

处理语句

3ENDSL

在这个例子中,当满足条件判断1 时,运行处理语句1,运行结束后跳至ENDSL 处;

如果不满足条件判断1,则程序继续向下执行,判断是否满足条件判断2。当满足条件判断2 时,运行处理语句2,跳至ENDSL;当不满足

当不满足条件判断2 时,程序继续向下执下,当读到OTHER 操作码时,无条件运

行处理语句3(即当程序当前不满足以上所以条件判断时,则执行OTHER 之后的语句。

处理语句允许有很多句;

条件判断可以写得很复杂,也允许对不同的字段进行判断;比如说C 语言也有分支语

句switch,但是这个语句只能对一个字段进行分支判断,ILE 语言与它不同,允许对不同的字段进行判断

就我目前掌握的测试情况,上述的SELECT—WHEN--OTHER—ENDSL,其实也可以

写做:

IF 条件判断

1处理语句1

ELSEIF 条件判断2

处理语句2

ELSE

处理语句3

ENDIF 即WHEN 与ELSEIF 是类似的,这样说,应该可以明白了吧。

总之,SELECT—ENDSL 是一个很好用的语法,尤其是在表示很多不同的分支处理时。

OUT {(E)}(Write a Data Area)

没用过,讲数据域的。

PARM(Identify Parameters)定义入口参数

Factory 1 Operation Factory 2 Result HI LO EQR

*ENTRY PLIST

PARM FLD01

关于具体内容讲解,详见前面所说“入口参数”一章。

允许做为入口参数的有:普通变量、结构变量、数组变量

关于PARM、PLIST,还有一种在Factory 1,Factory 2 也填写变量或指示器的用

法,不过我不知道它具体表示什么意思,也不知道该怎么用。请用过的来补充。PLIST(Identify a Parameter List)同上

POST {(E)}(Post)

没用过

READ {(N | E)}(Read a Record)读取记录

1.基本语法:

Factory 1 Operation Factory 2 Result HI LO EQ

READ 文件记录格式名 45 46

READ后面跟的,必须是声明的文件记录格式名;

LO 指示器表示锁表指示器,当在指定的时间(CHGPF,WAITRCD 项可看到),需要读取的记录仍被锁,将会打开LO 指示器,即*IN45=’1’;

EQ指示器为是否读到指示器。当未读到仸何记录时,打开EQ 指示器,即*IN46=’1’

2.当文件在程序中,是用只读的方式声明时,READ 操作并不会造成锁表; 如果文件在程序中是用修改的方式声明,READ 操作成功后,该记录被锁;直到执

行解锁操作(UNLOCK,或UPDATE),或READ 该文件的其它记录,才会解锁

如果文件是用修改的方式声明,但希望READ 操作不锁表时,那么就用READ(N),即

Factory 1 Operation Factory 2 Result HI LO EQ

READ(N)文件记录格式名 45 46

这样读文件,就不会锁记录,但是同时也不能修改记录。如果需要修改记录,那么 在修改之前(包括对文件字段赋值之前),还必须再对该记录进行一次定位操作(比如

CHAIN、READ 语句均可)。也就是说,如果要修改记录,必须先锁住当前记录(很合理吧)

3.当执行READ 操作时,程序是根据游标当前在文件中所指向的位置,顺序读取下

一条记录。关于游标是如何指向,还不是一个很简单的问题,所以将会在下一章“数

据库相关知识”中具体讲解。

4.执行READ 操作时,允许声明的文件没有键值。(即PF 文件)

READC {(E)}(Read Next Changed Record)

没用过,读下一次修改过的记录?

READE {(N | E)}(Read Equal Key)读取键值相等的记录

语法与READ 操作码大致一样,这里不再重复,只说不同的:

假设程序中已声明逻辑文件PFFHSL3(键值为FHS01+FHS02)

Factory 1 Operation Factory 2 Result HI LO EQ

FHSKEY KLIST

KFLD FLD0

1KFLD FLD02

FHSKEY SETLL FMTFHS DOW 1=1

FHSKEY READE FMTFHS 1

5IF *IN15=’1’

LEAVE

ENDIF

ENDDO

这段话的意思,就是定义组合键值FHSKEY,然后根据这个FHSKEY 在逻辑文件

PFFHSL3 中去定位,循环读取PFFHSL3 中,FHS01、FHS03 与FLD01、FLD02 相等的记

录。当读取记录结束,或键值不等时,退出循环(*IN15 是EQ 指示器)。如果将READE 操

作码换成READ 操作码的话(当然,Factory 1 处也就不能有值),就没有“键值不等时退出

循环”这一层意思,只是读不到记录时就退出循环,但有时我们使用逻辑文件,仅仅是需要

它的排序,而不需要读不到键值相等的记录就退出循环。所以说,使用READ 操作码,还

是READE 操作码,需要根据实际的要求来决定。

以上的Factory 1 处填写值的系统处理,当READE 操作码在Factory 1 处未填写值时,系统实际上是将当前的值与读到的上一条记录的关键字进行比较,而不是与SETLL 时的键

值做比较(读第一条记录不做比较!),如果键值不等时,置EQ 指示器为1。也就是说,如果没有与FHSKEY 键值相同的录,那么系统并不是直接找开EQ 指示器,而是会一直保

持正常地往下读,直到找到与读到的第一条记录关键字不同的记录,才会打开EQ 指示器,所以要注意。

READP {(N | E)}(Read Prior Record)读取记录—游标上移

简单来说,READ、READE 操作时,游标在数据文件中,是下移的;即读完第一条记

录,游标指向第二条记录;读完第二条记录,游标指向第三条记录,依此类推,直至最后一 条记录。但READP 则正好相反,游标是上移的,即读完第三条记录后,游标指向第二条记

录;读完第二条记录后,游标指向第一条记录,直至读完第一条记录。一般来说,用READ、READE 的概率会比READP、READPE 的概率高得多,不过在某些情况下,使用READP 操作,又的确会很省事,这个一时间想不起例子来,大家可在编

程序时多实践。

READPE {(N | E)}(Read Prior Equal)

虽然我没用过,但猜想它应该就是指游标上移,按键值去读取文件。与READP 的关系,就类似于READE 与READ 的关系。

REALLOC {(E)}(Re-allocate Storage)

没用过

REL {(E)}(Release)

没用过

RESET {(E)}(Reset)

将数据结构赋值成为初始值。

注意是初始值,不是清空。如定义结构:

D FHSDS DS

D FHS01 10 INZ(’ABCD’)

D FHS02 5 INZ(’EFGH’)

那么,不管对该结构如何赋值,当执行语句: C RESET FHSDS

之后,FHS01 将会变成’ABCD,FHS02 将会变成’EFGH’,即恢复成为初始值。

RETURN {(H | M | R)}(Return to Caller)

RETURN 是程序结束。

在前面,“简单的程序流程”中,我们讲过,“SETON LR” 与RETURN 这两句话一

起,做为程序的结束。这里,再详细解释一下两者之间的区别,以及关系: 如果不写RETURN,只写“SETON LR”,程序执行完最后一句之后,将会再从第一

句开始执行,造成死循环。在简单的程序流程这个例子中,程序原来只想修改读到的第一条 记录,而如果没有RETURN 的话,将会把所有的记录都修改掉,直到最后找不到可修改的记录,然后系统报错,异常中断。(这种离奇的现象现在又测试不到了,可能是当时写错程 序了?把F 写成了P?不管它,当是我写错了,总之RETURN 是表示程序结束,没有

RETURN,主程序无可执行的语句时,它也会结束;如果RETURN 出现在主程序的中间,那么RETURN 后面的语句将不会执行)

如果只写RETURN,不打开指示器*INLR,根据blogliou 所说 “程序不会强制将内存

中的数据写到磁盘中。400 缺省的是BLOCK 输出,即数据记录满一个BLOCK 块时才会将

这一组记录写到磁盘上。那么如果这时BLOCK 没满,数据信息不会立刻写到磁盘上。之后 有其它作业用到该文件,读取的数据就不完整。”

但如果文件有唯一键字,或记录日志,必须同步写时,其实BLOCK 实际被忽略,也就 是此时不会有错。目前我们用的是MIMIX 备份,客户实际上将所有的文件都列入日志,这

时不写也不会出现上述错误。但为避免一些潜在的问题,养成良好的编程风格,建议将 SETON LR 与RETURN 一同,做为程序结束的标志。当然,如果某个程序频繁被调用,且 不涉及文 操作时,可考虑不打开指示器*INLR,仅用RETURN 作为结束,这样程序不

会被PURGE 出内存,可提高调用效率。

如果没写RETURN,也没有打开指示器*INLR,在编译时,系统将会报40 级错,说找

不到程序结束的语句,所以大可放心。ROLBK {(E)}(Roll Back)

1.基本语法

Factory 1 Operation Factory 2 Result

ROLBK

2.该操作码无其它参数,就是指对事务处理进行回滚操作。3.ILE 程序中,ROLBK 操作可随时进行,也允许在没有声明COMMIT 类型的文件的情况下,仍进行ROLBK 操作(对该进程这前的事务进行确认处理)f

4.关于日志的确认回滚操作,在后面会另设专门章节讲述。

2.8.4.5 S--Z SCAN {(E)}(Scan Character String)扫描字符串

扫描字符或字符串Factory 1 在目标字符串Factory 2 中是否存在Factory 1 Operation Factory 2 Result HI LO EQ

FLD01 SCAN FLD02 N 26

FLD01 可以是字符,也可以是字符变量;可以是一位长,也可以是多位长。

当FLD01 在FLD02 中存在时,EQ 指示器打开,即*IN26=’1’,同时将FLD02 中的起始

位置,赋值给N;

当FLD01 在FLD02 中不存在时,EQ 指示器保持关闭状态,即*IN26=’0’,同时N=0

允许从FLD02 中的指定位置开始检查:

FLD01 SCAN FLD02:2 N 26

如上句,即表示从FLD02 的第2 位,开始扫描。

在实际使用中,比如说我们判断某个字符是否为数字,就可以先定义一个0—9 的常量,然后将要判断的字符去SCAN 一下这个常量

SELECT(Begin a Select Group)分支语句

在操作码“OTHER”中讲过,为方便读者,列出简单语法如下:

Factory 1 Operation Factory 2 Result HI LO EQ

SELECT

WHEN 条件判断

1处理语句1

WHEN 条件判断2 处理语句

2OTHER

处理语句

3ENDSL

要注意,SELECT 操作码,必须有对应的ENDSL 操作码,否则编译无法通过。

SETGT {(E)}(Set Greater Than)定位操作—大于

举个例子吧,假设文件中有一个字段,是标识顺序号的,1、2、3、4。即该字段为1,表示第一条记录,该字段为2,表示第2 条记录。那么: Factory 1 Operation Factory 2 Result HI LO EQSETGT 文件记录格式名

READ 文件记录格式名

这个READ 操作,READ 到的,是第3 条记录。也就是说,SETGT 操作码,会将游标

定位到大于键值的第一条记录前。

在实际使用中,如果我们是按逻辑文件读取,而且读了一条记录之后,对其键值相同的 记录都不需要再读取时,就可以用SETGT,不过需要注意,Factory 1 项,需要是与键值相

同的变量,即如果文件是使用多个字段做为键值,那么我们也需要先定义一个组合键值的变

量,然后Factory 1 处填写这个组合键值的变量名。

当声明文件的键值有多项时,Factory 1 项的键值,允许小于文件的键值,但顺序必须

一致。即声明的文件如果键值为:FHS01、FHS02、FHS03,那么我们在程序中定义三个类

型与之相同的变量FLD01、FLD02、FLD03,以下写法都是有效的FLDKEY KLIST

KFLD FLD0

1KFLD FLD0

2KFLD FLD03 FLDKEY SETGT 文件记录格式名

FLDKEY KLIST

KFLD FLD01

KFLD FLD02

FLDKEY SETGT 文件记录格式名

FLD01 SETLL 文件记录格式名

SETLL {(E)}(Set Lower Limit)定位操作—小于

语法与SETGT 相同,含义与SETGT 不同。SETLL 操作码,会将游标定位到与键值相

等的第一条记录之前,仍是上例,如果是 2 SETLL 文件记录格式名

READ 文件记录格式名

那么READ 操作码读到的记录,就是第2 条记录,看到了吧,和SETGT 不同。

SETLL 操作码还可以用来简单判断当前键值是否存在有记录,以PFFHSL3 为例(键值

为FHS01、FHS02)

Factory 1 Operation Factory 2 Result HI LO EQ

FHSKEY KLIST

KFLD FLD0

1KFLD FLD0

2EVAL FLD01=’01’

EVAL FLD02=’02’

FHSKEY SETLL 文件记录格式名 44

当文件中有相应记录时,EQ 指示器打开,即*IN44=’1’

当文件中无相应记录时,EQ 指示器关闭,即*IN44=’0’(与CHAIN 正好相反,要注意)

而在这种用法中,SETLL 与CHAIN 的区别在于,CHAIN 是定位读取了记录,而SETLL 仅仅只是判断该记录是否存在。所以用SETLL 操作,不能修改记录,也无法取出记录的值。

只能判断记录是否存在。如果要修改记录,或取出记录的值,还需要有一个读取定位的操作,如READ,或READE、READP 等(最常用的,应该就是READ 操作)

SETOFF(Set Indicator Off)关闭指示器

Factory 1 Operation Factory 2 Result HI LO EQ

SETOFF 10 11 1

2等价于

EVAL *IN10=’0’

EVAL *IN11=’0’

EVAL *IN12=’0’

在SETOFF 这个操作码中,指示器填在HI、LO、EQ 哪里都没关系,都是表示要被关

闭的指示器

SETON(Set Indicator On)打开指示器

Factory 1 Operation Factory 2 Result HI LO EQ

SETOFF 10 11 1

2等价于

EVAL *IN10=’1’

EVAL *IN11=’1’

EVAL *IN12=’1’

在SETON 这个操作码中,指示器填在HI、LO、EQ 哪里都没关系,都是表示要被关闭的指示器

SHTDN(Shut Down)

没用过

SORTA(Sort an Array)没用过

SQRT {(H)}(Square Root)开方

Factory 1 Operation Factory 2 Result HI LO EQSQRT 3 N

这时,N=3(因为3 的平方为9)9、3 都可以是数字型变量,或者直接是数字 SUB {(H)}(Subtract)减法操作

Factory 1 Operation Factory 2 Result HI LO EQ

FLD01 SUB FLD02 FLD0

3SUB FLD02 FLD03

看过前面的ADD、MULT 操作码,这里不用解释也应该明白是什么意思了吧。那就不

多说了。

SUBDUR {(E)}(Subtract Duration)日期相减

1.减日期

Factory 1 Operation Factory 2 Result HI LO EQ

FLD01 SUBDUR N:*Y FLD02

表示将日期型变量FLD01 减去N 年,赋值到日期型变量FLD02 中;

N 可以是一个数字型变量,也可以就是一个数字,N 允许为负数 *Y,*M,*D(还有其它的参数值,可见ADDDUR,其中有详细解释)

2.判断两个日期型变量之间的天/月/年数

Factory 1 Operation Factory 2 Result HI LO EQ

FLD01 SUBDUR FLD02 N:*D

这时,N 做为一结果变量,表示日期型变量FLD01 与FLD02 之间的天数

SUBST {(P | E)}(Substring)取字符/字符串 Factory 1 Operation Factory 2 Result HI LO EQSUBST FLD01:3 FLD02

表示从字段FLD01 的第3 位开始,取2 位,左对齐赋值到字段FLD02 中。

要求字段FLD01 的长度必须大于或等于3+2 位,否则程序会报错。

可以尝试用%SUBST 语句,也是等价的,如下

EVAL FLD02=%SUBST(FLD01:3:2)

表示的是同样的意思。

起始位数3,取的长度2,在两种写法之下,都可以使用数字型变量来表达。

相比较之下,%SUBST 还有一种用法,就是对字符的指定位置赋值,这个就厉害了:

EVAL %SUBST(FLD02:3:2)=’01’

看到了吧,这句话就是说,使字段FLD02 的第3、4 位(即从第三位开始,两位长)等

于“01”

TAG(Tag)定义标签,与GOTO 同用

Factory 1 Operation Factory 2 Result HI LO EQ

FHSTAG TAG

TEST {(D | T | Z | E)}(Test Date/Time/Timestamp)

没用过

TESTB(Test Bit)

没用过

TESTN(Test Numeric)

没用过

TESTZ(Test Zone)

没用过

TIME(Time of Day)--取当前系统时间 Factory 1 Operation Factory 2 Result HI LO EQ

TIME FLD01

FLD01 可以是时间型或数字型变量

UNLOCK {(E)}(Unlock a Data Area or Release a Record)解锁

Factory 1 Operation Factory 2 Result HI LO EQ

UNLOCK 文件记录格式名

UNLOCK 是解锁操作,在某种程度上,可以将UNLOCK 视为ROLBK,将UPDATE

视为COMMIT。即如果锁定某条记录,并对其字段进行赋值之后,使用UPDATE 语句,将

会把修改后的结果保存下来,即修改文件,而UNLOCK 语句则不会修改文件,即否认了之 前对文件字段做的赋值修改。

从程序的执行效率上来讲,UNLOCK 的执行效率是高于UPDATE 的,因为UPDATE

操作时,系统需要对文件的每一个字段进行确认处理(DEBUG 时可以看到),而UNLOCK 就

是简单的解锁而已。

UPDATE(Modify Existing Record)修改记录

语法与UNLOCK 一样。

这里需要说明一下,在执行UPDATE 的时候,必须先使用READ、CHAIN 等操作码锁

定一条记录。如果未锁住记录,UPDATE 操作码将会报错。当执行了UNLOCK、UPDATE、以及ROLBK 语句时,等于是解锁,此时再执行UPDATE 操作码之前,必须再次锁住记录

操作;

WHEN {(M | R)}(When)分支判断语句中的条件判断

在操作码“OTHER”,“SELECT”中都讲过,仍列出简单语法如下:

Factory 1 Operation Factory 2 Result HI LO EQ

SELECT

WHEN 条件判断1 处理语句1

WHEN 条件判断

2处理语句2

OTHER

处理语句

3ENDSL

WHENxx(When True Then Select)

上面的语法,是RPGLE 的语法,WHENxx 是RPG 的语法,也就是

SELECT

FLD01 WHENEQ FLD02

处理语句

1……..这样的语法,在表达复杂的逻辑关系时,必须与ANDxx,ORxx 一起使用,所以我不

使用WHENxx 这个操作码。

WRITE(Create New Records)写记录

常用的方式:

Factory 1 Operation Factory 2 Result HI LO EQ

CLEAR 文件记录格式名

EVAL 文件字段1=xxxx

EVAL 文件字段2=xxxx

WRITE 文件记录格式名

表示在文件中写入一条新记录。文件需要声明为可写的。

通常会在给文件字段赋值之前,作一次CLEAR 操作来进行初始化,以避免不必要的麻烦。XFOOT {(H)}(Sum the Elements of an Array)

没用过,看帮助,是表示对数组字段的累加统计。

假设DIMDATA 定义为一个数字型的数组变量,FHS01 为一个足够大的数字型变量

Factory 1 Operation Factory 2 Result HI LO EQ

XFOOT DIMDATA FHS01

就表示将数组DIMDATA 中的所有记录的值都取出来,汇总相加,赋值到数字变量

FHS01 中

XLATE {(P | E)}(Translate)

将一个字符串中指定的字符,更换成另外的字符。

举例:如MYCHAR1,MYCHAR2 都是两个20 位长的字符型变量

C MOVEL 'ABCAAAC123' MYCHAR1

C 'A':'9' XLATE MYCHAR1 MYCHAR2

执行过这个语句之后,MYCHAR2 就等于”9BC999C123’,即将字符串MYCHAR1 中所

有的“A”都变成了“9”;

XLATE 也可能指定起始位置。如上句更改为:

C 'A':'9' XLATE MYCHAR1:4 MYCHAR2

则MYCHAR2 等于“ABC999C123”,指从第4 位开始(含第4 位),将“A”变成“9”

赋值。

Z-ADD {(H)}(Zero and Add)向数字型变量赋值

Factory 1 Operation Factory 2 Result HI LO EQ

Z-ADD FLD01 FLD02

将数字型变量FLD01,赋值到数字型变量FLD02 中。

Z-ADD、MOVE 虽然同是赋值操作码,但Z-ADD 的用法就远没有MOVE 那么变化多

端,只能在数字型变量之间赋值。所以也没有什么可说的了。zero 如果要对数字型变量赋初值,使用*ZERO

Z-ADD *ZERO FLD02

Z-SUB {(H)}(Zero and Subtract)用0 减

Factory 1 Operation Factory 2 Result HI LO EQ

Z-SUB FLD01 FLD02

等价于

0 SUB FLD01 FLD02

等价于

EVAL FLD02=FLD01*(-1)

*ALL

*ALL 是个很有意义的变量,举例:

EVAL FLD01=*ALL’0’

表示将字符型变量FLD01 赋值为全’0’

CLOSE *ALL

就表示关闭所有文件,意义与上面是不同的%LEN

取字符串的长度,举例:

(MYLEN 为数字型变量,FLD01 为字符型变量)

EVAL MYLEN = %LEN(FLD01)

这句话的意思,是指取字符串FLD01 的长度,不过通常这样用是没意义的,因为直接

用%LEN 操作码,取到的是字符串的总长度,不是有效字符的长度,也就是说FLD01 长度

为2,那么MYLEN 就恒等于2,不会变。就算变量FLD01 中没有值,取出的MYLEN 也等

于2.。所以,%LEN 通常会与%TRIM 或是%TRIMR 一起使用,语法在下面介绍。

%TRIM,%TRIMR

都是去字符串变量中的空字符意思,%TRIM 是去字符串左边的空字符;%TRIMR 是去

字符串右边的空格。

通常我们在写程序中,都是默认字符串变量左对齐,所以我们使用%TRIMR 操作码的概率应该高一点。举例:

EVAL MYLEN = %LEN(%TRIMR(FLD01))

这时的MYLEN,就是指变量FLD01 中的有效长度(前提条件是FLD01 中如果有值,是左对齐)。如果FLD01 为空,那么MYFLEN 为0;如果FLD01 首位有值,第二位为空,那么MYLEN 为1;如果FLD01 两位都不为空,那么MYLEN 就等于2。

如果字符串左对齐,那么就使用%TRIMR

还有一种用法,假设字符串FLD04 为4 位长的字符,FLD01,FLD02 都是2 位长的字

符,且FLD01 等于“A ”,FLD02 等于“BC”,那我们执行:

EVAL FLD04 = FLD01 + FLD01 + FLD02

FLD04 就等于“A A ”,也就是第二位与第四位都是空的,最后加的FLD02 其实无

效。

而如果执行

EVAL FLD04 = %TRIMR(FLD01)+ %TRIMR(FLD01)+ FLD02

则FLD04 就等于“AABC”,也就是说,在这里,%TRIMR(FLD01),是等价于单字符

“A”的MONITOR

监控程序信息。据说是可以屏蔽掉出错信息,避免程序异常中断,未经测试。

第二篇:《程序员岗前培训手册》

程序员岗前培训手册

北京应用技术大学

目录(CONTENTS)

前言

面试是双向选择

软件公司研发技术岗位扫描与岗位职责

如何快速融入技术团队(程序员入岗的注意事项)优秀程序员应具有的品质与习惯 谈谈学习方法

外包软件、商品软件、项目软件简介

前言

同学们经过在北京应用技术大学两年的学习,都满怀憧憬地向往程序人生的开始,也对即将走上的工作岗位和环境充满了期待,期待通过程序来证明自我的价值。程序员,相信在很多同学眼中是一个有趣、特别、高薪、充满艰辛而又非常神秘的职业,因为手下那一行行跳动的代码不仅实现了生动的功能,同时也表达着程序员对人生的理解和追求。当程序员实现了一个独到的创意之后准备熄灯休息时,天已蒙蒙亮…..当程序员看着用户熟练地操作自己的软件解决一个个复杂事件时,脸上那写满成就的微笑…..的确在这个行业里出现了太多的英雄人物和企业,而每一个英雄的事迹和成就都足以让我们热血沸腾、摩拳擦掌……

在同学们即将步入程序员岗位之前,需要对软件研发相关职位的职责范围与工作特点有所了解,掌握一些入职的基本技巧和注意事项,检查自己的技能与行为习惯,有的放矢,提高面试和就业的成功率。入职后能尽快地融入到技术团队,近而快速成长,成为团队技术骨干和最优秀的职员。在工作中养成积极而良好的行为习惯和职业素养,为自己的职业发展创造一个良好的开端。

本手册从面试、技术岗位职责、如何快速融入技术团队、优秀程序员的品质与习惯、学习方法、外包软件/商业软件/项目软件简介等几个方面阐述了同学们在踏入工作岗位之前应该了解的知识和注意事项。

面试是双向选择

一般同学都会误认为面试时应聘者处于弱势,要接受招聘者的挑选,从而从心理上承受很大的压力,而影响自己正常的发挥和才能展示。其实大可不必,因为面试是双向的,选人和择业是平等的。况且现在市面上的用人单位或招聘岗位也是良莠不齐,甚至还有一些骗子公司,这就要求同学们在应聘时擦亮眼睛,注意分辨。当然大多数公司都是良性的,他们要么是已具规模,各部门及岗位功能分工很明确,他们会根据业务的发展或作为人才储备而有针对性的招聘相关技术人员,而有的公司可能是刚刚成立,业务与核心技术还未形成,他们需要招聘到能为他们提供解决方案或创意的技术人员,所以对于这些类型的公司,他们对人才的渴求也都不亚于同学们对工作岗位的渴求,若是聘到一个优秀的技术人员对业务或项目的推进将会使公司获得更大的利益,或者使公司的发展少走弯路甚至能改变一个公司的命运。相反,如果招不到合适的人才或者使用一个较差的技术人才,不但不能推进项目的进展,还要花费几个月的培养时间和费用,甚至阻碍业务开拓甚至项目搁浅。所以当同学们想得到一个工作岗位的同时,也要看到企业更需要一个优秀的员工,二者是平等的。在面试时,同学们在一种非常平和的心态下,充分发挥,尽可能地展示自己已经掌握的技能,展示学习能力和发展潜能;另一方面也要尽可能地提前了解公司的背景和业务以及应聘岗位的职能,从而加以辨别和选择。一旦本次面试不能成功,表明要么岗位不适合你,要么你不适合岗位,或者因为你本次的表现不佳,这都是很正常的,一定不要有挫败感,要及时总结面试时的表现方式以及沟通技巧,若感觉自己的确能够胜任该岗位,只是因为自己的临场发挥不佳而没有展示出自己的实际水平,也可及时和招聘公司联系,经询问确认对方没有找到合适人选的情况下,表明诚意,请求复试机会。总之,若本次失败,一定不要影响下一次的面试,要积极总结,为一下次面试作准备。

正常运营的公司因业务的不断发展,人才需要不断的更新、补充和储备,所以他们一直都需要人才,况且公司每次组织招聘都会花费一大笔费用,也希望能够找到合适的人才,所以公司面试时一般不会出太吊钻的问题来为难你,同学们也不要过分担心。

另一方面,同学们在坚信“天生我才必有用”的同时,也要正确看待现在的就业形势,对第一份工作也不要过于理想化,要摆正心态,坚持从基层做起,先就业再择业,职场上“骑驴找马”也未必不是一种现实的理性选择。

总之,面试是双向性的,是招聘单位与同学们相互展示、相互认识、互相挑选的一次沟通过程。同学们 在求职的过程中,要正确看待面试,放下思想包袱,充分重视,充分准备,从容应对。

软件公司研发技术岗位扫描与岗位职责

一般中小型软件公司设置的技术岗位有:研发总监、项目经理、需求分析人员、系统架构与分析人员、数据库设计人员、程序员、项目助理与文档专员、测试人员、技术支持(售前/售后)、美工或网站前台人员等,这些职位的工作联系非常密切,根据公司规模的大小,以上职位可由一人或多人兼任,比如一个小型的软件公司可能只有一个人完成软件的总体设计、架构、编码、测试、文档等工作。这些岗位的职责范围大致是:

研发总监:全面负责研发及技术部门的整体工作。

项目经理:在整个项目开发过程中组织项目所需的各项资源,对项目的范围、项目的质量、项目时间以及项目成本进行管理与控制。根据项目范围、质量、时间与成本的综合因素的考虑,进行项目的总体规划与阶段计划,保证项目组目标明确且理解一致;在项目生命周期的各个阶段,跟踪、检查项目组成员的工作质量;保证项目在预算成本范围内按规定的质量和进度达到项目目标。

需求分析人员:项目前期与客户方打交道最多的人,对于客户来说,他可以代表整个项目组,对于项目组成员来说他的意见可以代表客户方的意见,项目组内所有与客户需求相关的事情必需得到他的认可。他的工作主要是:

1、在项目前期根据《需求调研计划》对客户进行需求调研。

2、收集整理客户需求,负责编写《用户需求说明书》。

3、代表项目组与用户沟通与项目需求有关的所有事项。

4、代表客户与项目组成员沟通项目需求有关的所有事项。

5、负责《用户需求说明书》得到用户的认可与签字。

6、负责将完成的项目模块给客户做演示,并收集对完成模块的意见。

7、完成《需求变更说明书》,并得到用户的认可与签字。

8、协助项目组有关人员对需求进行理解。

系统架构与分析人员:是项目的总体设计师,组织构建新产品的开发与集成、新技术体系等,也可以理解为技术总监。是在技术上对所有重要事情做出决定的人。系统架构在整个软件开发过程中都起着非常重要的作用,并随着开发进程的推进而其职责或关注点不断地变化。

1、在需求阶段,负责理解和管理非功能性系统需求,比如软件的可维护性、性能、复用性、可靠性、有效性和可测试性等。审查客户和市场人员所提出的需求,确认开发团队所提出的设计;组织开发团队成员和开发过程的定义;协助需求分析师完成《用户需求说明书》、《需求变更说明书》等。

2、在设计阶段,负责对整个软件架构、关键模块、接口的设计。对系统进行分析与建模,完成《系统架构说明书》、《系统概要设计说明书》、《系统详细设计说明书》。

3、编码阶段,成为程序员的顾问,负责重点代码检查,并且经常性地要举行一些技术研讨会、技术培训班等;

4、测试及实施阶段,随着软件开始测试、集成和交付,集成和测试支持将成为工作重点;

数据库设计人员:根据《系统架构说明书》负责进行数据库选型与建模。由于数据库是整个系统运行的核心,数据库设计的好差直接影响着整个系统的开发效率和系统运行的优劣。他是项目组中唯一能对数据库进行直接操作的人,对数据库结构的每一次改动都要得到他的认可。主要职责:

1、根据数据库建模结果,绘制数据库关系图。进行数据库建库以及数据库进行初始化操作。

2、对数据库进行维护、备份、恢复、同步。

3、负责客户数据的导入导出。

4、根据《系统详细设计说明书》编写对应的视图、存储过程、函数、触发器等。

5、对项目组其它成员进行SQL方面的指导。

6、为测试建立相关测试数据。

程序员:负责系统的最终代码实现。主要职责:

1、参与需求调研、项目可行性分析、技术可行性分析和需求分析。

2、协助完成《系统详细设计说明书》,并根据《系统详细设计说明书》进行编码实现;

3、对自己代码进行复查,并进行简单的测试。

4、撰写相关技术实现或功能描述文档。

5、负责向项目经理及时反馈软件开发中的情况,并根据实际情况提出改进建议。

6、参与软件开发和维护过程中重大技术问题的解决。

项目助理或文档专员:协助项目经理在项目日常管理和数据分析方面的工作,进行与项目有关的协调工作,编写项目进度报表,参与组织项目协调会,组织项目非技术文档的编写、传递与归档,以及与市场人员或其他部门的日常沟通,协助项目资源协调工作。跟踪项目进展。项目或软件包的打包、发布以及授权锁的制作等工作。

测试员:负责实施软件测试。测试是整个项目系统中非常重要的一个环节,项目质量的保证,他的主要工作就是找到项目中存在的不合理、不合格的部份,并要求项目其它成员按其给定的项目质量完成项目。保证了系统功能实现是否与功能设计和需求定义一致。主要职责:

1、根据软件项目规范编写测试计划,设计测试数据和测试用例。

2、采用合适的测试方法实施软件测试,形成各阶段的测试报告,并对软件问题进行跟踪分析和反馈,推动测试中发现问题及时合理地解决。

3、完成对产品的集成测试与系统测试,对产品的功能、性能及其他方面的测试负责。

4、协助程序员进行软件代码检查,提出对软件的进一步改进的要求。

技术支持人员:主要负责软件产品或项目在技术层面上与客户的交流,根据工作重点分为售前支持和售后支持。

 售前支持:是销售人员和开发人员的桥梁,协调销售人员、用户、开发人员的关系,制作产品功能演示PPT文档或多媒体资料,将公司的技术实力向用户展示,技术标书的撰写,定期采集、分析和整理用户的需求,配合销售制订产品销售策略,从技术上支持市场销售业务等。

 售后支持:负责编写《用户手册》、《操作手册》,制作系统操作视频教程等多媒体培训教材;负责系统实施(包括系统安装、用户培训、系统试运行等),协助用户进行“用户确认测试”和编写《确认测试报告》;通过电话、网络、及时通讯等多种渠道解答用户在使用中的问题,提供售后服务。收集、整理用户的建议等。

美工或网站前台人员:负责完成软件设计师安排的功能界面设计和简单网站的设计。

1、负责对项目整体色彩的调配。

2、向系统分析师提出项目美化的建议。

3、为BS 项目提供一套或几套CSS样式表及HTML结构表

4、为CS项目提供符合项目内容的静态、动态图片。

5、并为程序员提供界面指导。

如何快速融入技术团队

——程序员入岗的注意事项

同学们刚刚结束学校的集体生活,面对新的工作环境、新领导、新同事、新任务、新的制度、新的生活节奏,很多的变化需要你尽快适应,很多的事情需要你独挡一面,而又有许多事情需要你与同事通力协作来完成…… 以下是新程序员入职后尽快融入技术团队应注意的事项:

1、认真学习公司的发展背景与历程、主营业务以及规章制度。

进入公司前可能对公司已经有了一些了解,入职后,相关人力资源管理部门会组织培训,解读公司文化,介绍公司发展背景、主要职能部门以及主要业务特点,学习公司考勤、人事、办公等管理规定和规章制度。有些新入职的程序员或技术人员,认为这些不含技术成分没有必要花精力去学习,其实这种认识是错误的,公司文化及各种制度是整个公司的灵魂,是公司正常经营活动保障和员工行为的一种约定,新职员只有对公司的发展背景和经营状态有充分的了解,接受公司文化,高度认同公司的核心价值观,严格遵守各种规章制度,才能自觉地规范自己的行为习惯,在工作学习中才有主动性,遇到工作压力时也能坦然地接受,不会有抵触心理,从而能更快地推动自己的工作。

2、积极学习业务知识、类库及现有程序资源,把握学习的技术方向。

程序员入职后,若有一个成熟的开发团队,一般都会有一个老职员来带领学习,这一阶段主要有三个方面的学习任务,第一是公司业务知识,因为程序员只有对业务知识熟悉了,才能更好的理解和把握功能需求,比如做通信方面的软件,你要学习一些通信行业知识;若做财务软件,你要了解一些财务知识。第二,现有的类库是公司开发部门积累的程序资源,学习和使用它可以规范统一程序的风格,提高开发的速度,掌握并能使用这些资源,可使你尽快与老职员有程序上的共同语言。第三,学习并加强在此领域的编程技能,因为在学校学习的是通用的知识,掌握的是一种知识导入与学习的方法,那么在公司应用方面也许要求你某一个方面很精通,比如网站的前台、数据库、图形处理、多媒体、网络编程等某些方面的技能需要强化。案例:

小张(男)和小胡(女)是同一个大学毕业的应届生,在2005年4月份同时进入公司做技术支持,当时两人的工资都是每月1500元,而两年后的今天小胡已是研发部的一个程序员,工资是每月4300元,而且是公司重点培养的对象之一。小张现在还是在做技术支持,工资是每月2600元,他们两人可以说是起点相同,但两年的发展却让他们有了明显的差距,小胡比较爱学习,工作非常踏实,对业务知识也掌握得非常精通,而且在做技术支持工作的时候,业余时间学习编程,由于做技术支持与程序员交流比较多,小胡抓住了这个学习编程的机会,但她从不在公司上班时间学习程序,在做技术支持工作时,她上班时间钻研业务知识、软件需求、学习程序实现的思想,业余时间练习代码。在做技术支持一年后,她通过了研发部的考核,进入研发部开始做编程。而小张与她对比就不同了,他只是做好本质工作,没有潜心学习,对业务知识、软件知识只是一般了解,工作上很业绩平平,总体上不出色也没出大的差错。工资涨得当然也慢,小张和小胡的起点相同,但小胡比较主动学习,很明显他们两个在职场上的差距就拉开了。

3、展示进步,创新思考,体现价值。

入职之初,通过积极的学习与适应,应该说进步是非常快的,要及时的总结,并把工作学习的总结和进步程度及时向主管汇报(口头、邮件、书面),阶段工作总结应包括以下几点:已经完成的工作、技术上的进步、业务上的进步、从学生到职员心态上的转变、八小时之外的学习状态等。这样一方面可以疏理一下知识结构,把握自己的学习阶段,一方面让主管根据你的知识结构和技能状态有针对性地给你分配合适的任务。

另外在工作当中也要注重思考,对工作进行适当的改进,并提出改进意见,这样能更快是体现出你的进步和工作价值。

4、积极参加团队活动,适应团队文化,创造与团队成员友好而积极的协作氛围。

能尽快适应团队文化,与同事友好沟通是任何岗位都需要的职业素质,只是在研发团队里要显得尤为重要,由于研发工作的重要与特殊性,若在软件商品化和产品化的开发阶段,不良的沟通协作可能导致项目的流产。另外,部分程序员写程序久了都会很注重与机器或代码交流,有的不容易与新职员交流,有的他们因有大量的工作任务而顾不上,有的是因为他们有太多的思想与创意,和一个新来的职员没有共同语言,有的是人为设置“技术壁垒”(因担心新职员威胁到自己的岗位,而不愿传授一些知识)。那么新职员一定不要因为他们没有主动与你交流而放弃交流,或者认为自己被冷落而与逐渐远离团队,而是要在适当的时间与他们主动交流,主动向他们请教,积极参加团队的集体活动,创造与同事交流合作的良好氛围。要尽可能地为团队多做贡献,不要因为多干一些工作或多加一点班,就有不良的情绪,从而影响正常的沟通与交流。另外,在研发团队里的沟通与协作,还体现在代码上,自己设计的功能模块是否能为别人提供良好的说明和程序接口。总之,与同事友好愉快的协作,尽快融入研发团队,是新入职的程序员技术快速进步和稳定职位的重要因素。

5、正确面对工作压力,学会释放“厌职”情绪。

许多同学进入一个新的工作环境,面对的是很多新事物,感觉工作节奏太快,工作压力太大。其实新职员有工作压力也是正常的,从职业生涯发展的角度来看,这种工作压力是非常必要的。同学们在进入公司后,要勇于接受工作压力,把这种压力作为进入初职锻炼的良好机会,树立良好的心态,不要逃避,更不要产生“厌职”情绪,公司还正在培养你,你却选择退缩而自炒“鱿鱼”。工作中要学会积极与同学沟通,注意工作方法,释放和减轻压力。其实我发现一些新职员说工作压力大,做事不顺心,仔细分析之后可以发现他们感觉的工作压力大与“不合群”有很大的关系。有些同学到公司后,一坐下就是八小时,语言和行为与同事格格不入导致他不敢言语不敢行动,下班时间到了,其实他不是工作学习本身的累,他们感到更累的是“心”。这些新职员在工作中总是希望别人主动接近自己,自己却不会主动与人交流,时间长了,同事觉得他“不爱说话”,也就逐渐放弃了与他的交往,这时他又会感到被排挤,感到孤独,心理压力就会增大。另外技术上单打独斗,不能利用别人的资源,因此完成相同的工作,付出的努力和压力就要比其他同事大得多。所以新职员在入职之初,一定要正确看待工作上正常的工作压力,学会与团队成员友好相处,创造一种“如鱼得水”的工作氛围,那么真正技术上的压力都不会成为问题的。

如果公司还没有成熟的开发团队,需要你一个人承担开发项目,着手组建开发团队,那么就要求你充分一切时间,利用网络资源,有技术难点及时到网络上寻求帮助,同时与相关部门人员密切合作,保持动态及时的沟通,及时报告工作进度,争取尽快拟出解决方案或产品。

优秀程序员应具有的品质与习惯

 善于理解与把握需求

程序员的劳动成果就是满足需求的程序,那么在动手写代码之前,只有完整地理解一个模块的需求才能做出好的程序,优秀的程序员在分析需求的基础上,应该能抓住问题的关键技术,从而能够建立合适的数据模型,尽量在代码中少走“弯路”。 善于学习与总结

当然善于学习,是对任何行业任何职业的最根本的要求,对于程序员,这种要求就更加高了。其实研发部门招聘程序员,其实并不一定注重你现在能做什么,而更注重的是你的学习能力、你的编程潜力,因为程序员是很容易被淘汰,很容易落伍的职业,一种技术可能仅仅在三两年内具有领先性,若你不能跟进新的技术,不学习新的技能,那么不断出现的新技术会使你显得非常笨拙。善于总结,也是学习能力的一种体现,每次完成一个研发任务,完成一段代码,都应当有目的的跟踪该程序的应用状况和用户反馈,随时总结,找到自己的不足,这样逐步提高,才能成长起来。

 规范化的编码习惯

养成良好的编码习惯,比如:变量命名清晰,语句嵌套明确,函数具有独立功能,适当注释等等,因为这些不但有助于代码的移植和纠错,也有助于不同人员之间的协作。 良好的文档习惯

良好的文档是正规研发流程中非常重要的环节,作为代码程序员,30%的工作时间写技术文档是很正常的,而作为高级程序员和系统分析员,这个比例还要高很多。缺乏文档,一个软件系统就缺乏生命力,在未来的查错,升级以及模块的复用时就都会遇到极大的麻烦。 代码复用性,模块化思维能力

复用性设计,模块化思维就是要程序员在完成任何一个功能模块或函数的时候,要多想一些,不要局限在完成当前任务的简单思路上,想想看该模块是否可以脱离这个系统存在,是否可以通过简单的修改参数的方式在其他系统和应用环境下直接引用,这样就能极大避免重复性的开发工作,如果一个软件研发单位和工作组能够在每一次研发过程中都考虑到这些问题,那么程序员就不会在重复性的工作中耽误太多时间,就会有更多时间和精力投入到创新的代码工作中去。 团队精神与沟通协作能力

这是程序员应该具备的最基本的,也是最重要的安身立命之本。软件或项目的各模块功能需求的理解准确,一个功能实现的修定,是否会影响其他模块等,没有充分及时的协作对一个项目来说几乎是不可想象的。我做了几年开发,感觉沟通真的太重要了,其实软件研发过程中最重要的不是技术问题,而是管理中的沟通问题,比如初级程序员或许是碍于面子或其他原因,不懂的问题也不想问,总是把问题掖着藏着,而高级程序员又不理解初级程序员的开发任务总是完不成,其实可能是高级程序员不了解初级程序员的真正困难,或者没有把要实现的逻辑和思路讲解清楚。合作起来总会有一些不透彻,要么一个问题讨论多次依然是问题没有结果,要么是有些问题根本不反映,大家都掖着藏着,报喜不报忧,待到问题暴露已无法挽回,严重的阻碍了项目的进度。所以我最好的建议就是,高级程序员应该把问题讲到明白为止,初级程序员应该把问题问到明白为止,并且不仅仅是口头上讲明白、听明白,还一定要形成文字,现在网络非常方便,公司都会有企业邮箱,把问题的讨论过程通过mail的形式记录保存,明确确认,这样障碍才能去除,项目才能得以顺利进展。

案例1:

陈某是北京某重点大学自动化专业的毕业生,编程基础知识非常扎实,在学校学习期间也有许多代码积累,从技术上说应该是很有潜力的,但他性格有点孤僻,不太容易与同事沟通,当时录用他时公司是看在他的编程基础很好,以为在研发部大家多带动他,应该会好些的。进公司有两个多月了,一次在做某油田项目中负责其中一个小模块的开发,在开发过程中我经常询问他有没什么问题,他每次都有些含糊地说没有。可当项目交付的时候,发现他做的某一功能与当初功能定义不符,客户就抓住这一点说与合同中需求描述不符,由此延期支付28万的余款,使该项目后期维护起来非常被动。而导致这一结果就是陈某在做程序时有问题自己绕过去了,没有及时与项目组成员交流,而独自采用了他熟悉的一种解决办法。项目汇报会刚结束,人事部门就通知陈某交接工作,到财务结算工资…..文摘:下面这故事《请按一下九层》我一直和我的同事们分享。是《读者》中的一篇文章: 这是全市最忙的一部电梯,上下班高峰时期,和公共汽车差不多,人挨着人。上电梯前和公司的人力资源总监相遇,说笑间,电梯来了,我们随人群一拥而进。每个人转转身子,做一小小的调整,找到了一种相对融洽的关系。这时,一只胳膊从人逢中穿过来,出现在我的鼻子前头。我扭头望去,一个小伙子隔着好几个人,伸手企图按电钮。他够得很辛苦,好几个人刚刚站踏实的身子不得不前挺后撅,发生了一阵小小的骚动。

那个人力资源总监问道:“你要去哪一层?”“九层。”有人抬起一个手指头立刻帮他按好了。没有谢谢。

下午在楼道里又碰到那个人力资源总监。“还记得早上电梯里那个要去九层的小伙子吗?”她问我。

“记得呀,是来应聘的吧?”九层,人力资源部所在地。“没错,挺好的小伙子,可我没要他。”“为什么?”

“缺少合作精神。”她露出一副专业HR的神情,“开口请求正当的帮助对他来说是件很困难的事情,得到帮助也不懂得感激。这种人很难让别人与他合作。”

我点头称是。如果那个小伙子坦然而自信地说一句“请按一下九层”,结果会怎样呢?大家不但不会反感他的打扰,而且帮助他的人还会心生助人的快乐,最后他也能得到想要的工作。

这个故事表明,良好沟通不仅仅体现在礼貌地说声“请”、“谢谢”,而是一个职员能够创造愉快、高效、和谐工作氛围的素质和习惯。

 时刻修定自己的认识和行为与公司的核心价值观(短期目标、长期目标)保持一致

公司或研发团队在什么时段做什么样的项目,或者根据项目进度的计划,在什么时间做什么功能模块,作为程序员要高度地与这些目标保持一致,不要在关键时刻“掉链子”,这是最重要的。

案例:

小张是公司里的转正不久的程序员,很聪明,对新技术接受很快,缺点就是非常的贪玩,对项目组的事缺乏主动性和责任心,平时的工作中主管已经提醒过他多次要注意工作的责任心,但他都不太放在心上,对事依然是敷衍。一次在做上海铁通的项目中,小张负责项目中的一个模块,当软件架构出来以后,需要出差上海为客户现场演示和进一步确认需求,由于合同还没有正式签下来,所以此行的技术交流对公司能不能签下这个项目至关重要,公司派由我和小张在内的项目组4人出差上海,临行前我们多次开会研究方案,确保拿下这个项目,下午到了上海之后约好第二天上午与客户见面,正当大家为第二天的交流捏一把汗,积极准备的时候,小张却说是第一次到上海,要求先去外滩看夜景,在得到项目组的否定之后,小张竟一个人偷偷到外滩看夜景至到深夜才回到宾馆。第二天的技术交流会上,小张负责的模块问题最多,虽然最后整个项目的交流还算成功,公司总算签下了这个项目,但小张也被辞退了。原因很简单,小张一直没有把公司的事放在心上,项目组出差第一目标是与客户交流好,拿下项目,而小张出差上海的第一目标是看一下外滩。所以象小张这样的技术上不管有多么出色,但总在公司的关键时刻“掉链子”,被公司辞退也是早晚的事。就在写此案例的前几天,在地铁上我偶遇小张,谈话中得知他被辞退后半年内又经历了一家公司。而此刻他又在匆匆地找工作。

谈谈学习方法

说起学习的方法,其实每个人都有自己的学习方法,也许这种方法对我来说有用,但不见得就对所有的人有用。所以,不要盲目的跟着别人的学习方法学习,要思考属于自己的学习方法。但以下几个原则是要遵守的:  坚持学习。首先要有毅力,对编程的狂热也可以在一定程度上起到帮助。学习编程应该说要经历好奇——困难——容易——郁闷——成就感——困惑——轻松的几个阶段的循回,不管哪个阶段都需要天天学习,坚持每天都要进步,不能半途而废,培养一种坚持克服困难的毅力。案例: 记得开发团队里有一个基础不是太好的程序员,刚入职两个多月,表现一般,有一天早上他眉飞色舞地在讲述昨天电视中的一个情节,我听到后就说了一句:“你还好意思说你看电视?”。他立刻明白了,就没说什么。从此他的进步是可以说是突飞猛进的,代码的质量和工作效率明显上了一个台阶,对项目的推动也是有目共睹的。几个月后的一次公司庆典上,他被评为“进步最快员工奖”,奖金3000元。奖后在他给我的Mail中发现了这句话:“你说我看电视的那句话改变了我的学习状态….我现在是马桶上、公交车上都在看书或笔记。”

 坚持实践。当你学到了一种新的技术或知识时,多实践是巩固学习的一种最好最有效的方法。这个实践不是照著书上的例子做一遍,而是根据自己的能力,给自己出题,然后去完成它。只有这样,你才能发现自己的不足,同时又增加了编程经验。要成为合格的程序员,光会写代码是远远不够的,更重要的是在实践中思考创新。实践的多少决定着“高手”和一般程序员界线,高手们并不是天才,他们是在无数个日日夜夜中磨炼出来的。成功能给我们带来无比的喜悦,但实践的过程却是无比的枯燥乏味。

 掌握编程思想。学一门语言,不能仅仅是语言,还要注重语言背后的思想方法,获得提出问题,分析问题,解决问题的能力,不是为编程而学习,因为编程语言和我们日常所说的语言一样,日常所说的语言是一种思想的表达,而编程语言是一种功能的实现。要学习它是如何来解决某一问题的,为什么要这样去做,他总是要符合客观事实的,存在某种逻辑,数据的组织,信息的传递,然后看该怎么样用编程语言来表达自己的想法。

 多问、多总结、多记笔记。“三人行必有我师”,也许在一次和别人不经意的谈话中,就可以迸出灵感的火花。著名的交换苹果理论说的是:“你有一个苹果,我有一个苹果,当我们互相交换苹果后,我们仍然互得一个苹果;你有一个想法,我有一个想法,当我们互相交换想法,我们则互得两个想法”。遇到问题,上网查看一些技术论坛,看看别人对同一问题的看法,会给你很大的启发。在这个网络时代,资料到处都有,无论什么先进的技术,你可以问身边的高手,问网上的同仁,只要查到资料,快的学上几天慢的一两个月也能学会,学会后总结出技术要点记下来,可写在本子上也可写在Blog上,编程技能的提高靠的是代码的积累,把所有自己的代码保存起来,并附有适当的笔记,这样,到用到时才能信手拈来,才能获得踏踏实实的进步。所以现在已没有写不出的程序了,写不出不是因为不够聪明,而是因为你没有耐心和找 BUG 的细心。

 不钻“牛角尖”,只抓主要问题,一些不影响工作的难点只要会用就行,这也体现了OOP的思想,你只要知道一个技术能完成什么功能就可以,至于它是如何实现的可暂时放一放,有时回过头来再看就不是什么难点了。当你遇到技术障碍的时候,不妨暂时远离电脑,看看窗外的风景,听听轻音乐,和朋友聊聊天。当重新开始工作的时候,我会发现那些难题现在竟然可以迎刃而解。

外包软件、商品软件、项目软件的操作模式简介

软件外包

就是一些发达国家的软件公司将他们的一些非核心的软件项目通过外包的形式交给人力资源成本相对较低的国家的公司开发,以达到降低软件开发成本的目的。因为软件开发的成本中70%是人力资源成本,所以,降低人力资源成本将有效地降低软件开发的成本。软件外包已经成为发达国家的软件公司降低成本的一种重要的手段。软件外包的大幅度增长为人力资源成本相对较低的印度和中国带来了新的发展机会。企业与企业之间的外包就是:企业(A)为了专注核心竞争力业务和降低软件项目成本,将软件项目中的全部或部分工作发包给提供企业(B)完成; 商业软件 商业软件(又叫“商品软件”)就是由商业公司在调研大多数行业用户的需求上开发的软件,该软件基本上能满足这些用户的需求,而且它的功能不会因个别或少数用户的要求而改动。随着互联网的兴起和软件授权销售方式的普及,商品软件的销售可软件公司直销、代理销售、专业下载网站销售等多种渠道,软件授权许可的销售模式往往是根据使用商品软件的用户数和安装该软件的计算机数来收取许可费用。项目软件 就是软件公司专门为某个客户开发的软件系统,该系统由委托开发的客户配合调研需求,“量体裁衣”,在关键阶段双方可派技术人员互相“渗透”,密切合作,共同完成系统的开发和实施以及运行。项目软件与外包软件的操作模式有相同性也有不同性。产品经理与项目经理

简单地说,产品经理是做正确的事,其所领导的产品是否符合市场的需求,是否能给公司带来利润的。而项目经理是把事情做正确,把事情作得完美,在时间,成本和资源约束的条件下完成目标。项目经理要对某个产品进行开发的管理,负责开发的进度,开发过程中的协调等有关开发方面的问题,他最大的目标是时间第一、立项目标达成第一。并不会很尊重产品本身的市场需求以及业务逻辑的问题。

而产品经理是横向管理的,也就是说他将负责某个产品或者某个产品线从商业计划市场竞争开发需求推广方案渠道策略等各个方面。产品经理一个产品线从头到尾的重要参与人。

第三篇:RPG AS400程序员培训手册6

CL、CMD

其实有关这一章,以及屏幕文件的,在网上已经有很多人写过了,想了想,还是说一下吧。

5.1 CL 程序

5.1.1 基本认识

简单的理解,CL 程序就是和RPG 相对应的,是控制语言(Control Language)。类型为

CLP、CLLE 的源代码编译出来的程序,都属于CL 程序。

可能还是不够直观,这么说吧,我们在交互式命令行上输入的命令,用程序的方式来执

行,这个执行的程序,就是CL 程序。

学过UNIX 的会比较好懂,CL 程序有点类似于SHELL,不过SHELL 是可以直接执行的,而且不用编译;CL 程序需要编译,而且要用CALL 的方式来执行。不过原理是接近的,都是在程序中直接调用命令行的语句。

所以说,CL 程序其实很好写,只要会输入命令,就可以写CL 程序了。在编辑CL 程

序时,也可以用“命令 + F4”的方式来写,不需要老老实实的整行输入。

CL 程序不像RPGLE 程序,在编写时,可以使用自由格式书写;一行的内容如果太长

要,在最末尾处用“+”表示换行

举个最简单的例子,比如说新建个名为FHS01CL 的CLP 源程序,代码如下:

PGM

WRKACTJOB

ENDPGM

编译此程序,然后CALL 之,系统就会执行命令WRKACTJOB,查看当前的活动作业,效果与在交互式命令行下输入WRKACTJOB 是一样的。

当我们输入F12,退出WRKACTJOB 时,系统就会继续向下执行,发现是ENDPGM,表示程序结束了,于是判定执行完毕,退出至交互式画面。

5.1.2 CL 程序的常用语法及命令:

一、程序的开始与结束:

PGM PARM(&A &B)/* 开始CL 程序 */

ENDPGM /* 结束CL 程序 */

CL 程序,和RPGLE 程序一样,也可以有程序的入口参数,而且程序的入口参数

都是可传递的(也就是输入的参数如果在程序中被修改过,那么原调用的程序中的相应

参数也会进行变化。不过CL 的入口参数只能为字符型,或数字型的单个字段,不能象

RPGLE 程序中那么多样化(字段、结构、数组、指针)。

如果CL 程序没有入口参数时,那么就可以不需要后面的PARM 语句,直接写成PGM

即可。

写CL 程序时,不妨多使用F4,看看系统的帮助,这样就不用记那么多命令的参

数名。

二、变量及其定义

CL程序中的所有变量,都使用&做为前缀,这一点与RPGLE 程序不同。比如说

PGM PARM(&A &B)

就表示入口参数为A、B 这两个变量

在CL 程序中使用到的变量,都必须使用DCL 语句来定义:

DCL VAR(&FLD01)TYPE(*CHAR)LEN(10)

DCL VAR(&FLD02)TYPE(*DEC)LEN(10 2)

上述语句表示:

定义变量FLD01,10 位长的字符型变量

定义变量FLD02,10 长,其中2 位小数的数字型变量

除了字符、数字之外,CL 程序还可以定义逻辑变量(*LGL),逻辑变量允许的值只

能为’1’或’0’。不过通常有字符与数字也就够了。CL 程序的主要功能在于进行命令处理,而不是处理字符串以及数据库

三、CL 常用命令:

CHGVAR--变量赋值

CHGVAR VAR(&FLD01)VALUE(‘ABCD’)

即是将变量FLD01 赋值成为’ABCD’(左对齐),同理,VALUE 的括号中也可

以填写一个变量,即表示将此变量的值赋值到变量FLD01 中。

数字型变量的赋值同样也是使用CHGVAR 语句。

当变量中只包含数字时(0—9),数字型变量与字符型变量可以使用CHGVAR

语句进行转换,这一点与RPGLE 中的MOVE 语句比较类似。

IF--条件判断语句

IF COND(&FLD01 *EQ '1')THEN(CHGVAR VAR(&FLD02)+

VALUE('0'))

当变量FLD01 等于’1’时,将变量FLD02 中的值更改为’0’

THEN 后面,即是当符合条件时,要执行的命令。写起来其实没有看上去那么

复杂,多用F4 就会发现CL 程序写简单。

就比如上例,先写IF,然后按F4,在Condition 处填写条件语句,然后在

Command 处填上CHGVAR,再按F4,再去填相应的处理语句,这样写,就比直

接把整句抄下来就简单多了。

上面这种写法,只能在符合条件时,执行一条CL 语句;如果要执行多条,就

必须写做:

IF COND(&FLD01 *EQ '1')THEN(DO)

CHGVAR VAR(&FLD02)VALUE(‘0’)

其它执行语句

ENDDO 也就是THEN 后面,用DO,表示接下来的语句都是在这个IF 条件成立时才

执行(DO)的。

然后结束处用ENDDO,必须要有。ENDDO 在这里和循环没有任何关系,表

示的是ENDIF 的意思,但是CL 语句里没有ENDIF,只有ENDDO。

IF 语句中,表示判断的关键字与RPGLE 中的Ifxx 操作码类似,有

*EQ *GT *LT *GE *LE *NE

用来表示逻辑关系的关键字有

*AND, *OR, *NOT

GOTO--跳转语句

GOTO 语句与RPGLE 中的GOTO 是一样的,都是跳转的意思。

FHSTAG:

GOTO CMDLBL(FHSTAG)

注意,这里定义标签是用“:” 冒号

MONMSG--监控错误信息

我们使用CL 语句时,执行的命令可能会报出一些异常错误,从而导致整个程

序中断,需要手工干预。MONMSG 命令可以监控我们预定的错误信息,使CL 程

序正常的向下运行。举例而言,如果CL 程序中有如下语句:

CALL PGM(FHS01R)

MONMSG MSGID(CPF4131)

则表示当系统调用程序FHS01R 时,如果发现有CPF4131(声明的文件重新编

译过,但程序未重新编译)的错,那么CL 程序将不会异常中断,仅仅只是不运行

程序FHS01R,然后继续向下执行CL 程序

MONMSG 还可以用于在监控到错误信息之后,进行处理,如下:

CALL PGM(FHS01R)MONMSG MSGID(CPF4131)EXEC(CHGVAR VAR(&FLD01)+

VALUE('0'))

这句话就表示当发现有CPF4131 的错误之时,将变量FLD01 赋值成为’0’

如果要执行多句的话,和IF 语句的方法类似,也是使用DO 与ENDDO

MONMSG MSGID(CPF4131)EXEC(DO)

CHGVAR VAR(&FLD01)VALUE(‘0’)

其它处理语句

ENDDO

5.1.3 不常用的语法

%SST--取字符串

CHGVAR VAR(&FLD01)VALUE(%SST(&FLD02 3 1))

表示将字符变量FLD02,从第3 位开始,取1 位,左对齐赋值到变量FLD01 中。

%SST 的括号的参数中,第一个参数必须为字符型变量,第二个参数表示起始位,第三个参数表示要截取的长度。

*CAT--拼字符串

DCL VAR(&FLD01)TYPE(*CHAR)LEN(10)

CHGVAR VAR(&FLD01)VALUE('A' *CAT 'B')

即表示将10 位长的字符型变量赋值成为’AB ‘

‘A’,‘B’,也可以使用变量,如

CHGVAR VAR(&FLD01)VALUE(&FLD02 *CAT &FLD03)

要注意,*CAT 不能去掉字符串末尾的空,从效果上来看,有点类似于RPGLE 中的EVAL 操作码,而不是CAT 操作码

+、-、*、/--数学运算

数字型变量,可以进行数学运算 CHGVAR VAR(&FLD01)VALUE(&FLD01 + &FLD02)

即等同于RPGLE 程序中的 EVAL FLD01 = FLD01 + FLD0

2同理,-、*、/ 分别对应减、乘、除

不过数学运行常用于RPGLE 程序中,较少用在CL 控制里面,这里只是介绍一下。

读取文件:(From Cuer:P1421)

DCL VAR(&FLD01)TYPE(*CHAR)LEN(2)

DCLF FILE(FHSLIB/PFFHS)

RCVF

CHGVAR VAR(&FLD01)VALUE(&FHS01)

以上这段CL 的意思,就是在CL 程序中读取PFFHS 文件,然后将读到的第一条记

录赋值到CL 的临时变量FLD01 中。

如果要将一个文件从头读到尾,则可以用如下语句来实现:

DCLF FILE(FHSLIB/PFFHS)

LOOP:

RCVF

MONMSG MSGID(CPF0864)EXEC(GOTO CMDLBL(EXIT))

读取到每条记录后的处理语句

GOTO CMDLBL(LOOP)

EXIT:

也就是说,信息CPF0864,即表示未读取到记录。

在CL 程序中声明文件使用DCLF 语句,一个CL 文件中只能声明一个文件,声明

语句必须在CL 控制语句之前。

使用声明的文件中的字段,同样需要在字段名前加上“&” ;

CL 程序中,无法控制游标,无法对记录进行定位操作。所以CL 程序对文件的操 作是比较弱的,通常我最多只用来读取某些只含少量记录的参数文件。

5.2 CMD

CMD 是用来生成命令的,执行后可以像其它系统命令一样,直接输入命令,或是F4,不需要像CLP 一样,要CALL 一下。

其实CMD 本质上也是执行CLP 或RPGLE(在编译时指定),用起来,无非就是好看点,直接一些,除此之外的意义,似乎也就没什么了。

举个例子,比如我们查看一个文件中的内容时,可以使用SQL 来查看,也可以使用命

令RUNQRY 命令来实现(RUNQRY QRYFILE(文件名))。但在我们要频繁查看文件

时,这两种方式似乎都不是很爽,也就是说要输入的内容都不是最少的,那我们可以设计一

个CMD,譬如说叫SEE,希望实现的最终效果,是在命令行输入“SEE 文件名”,就

可以查看PF 文件中的记录。那么,我们按如下步骤来实现:

1.建立一个CLP 程序,比如叫SEECLP,代码如下

PGM PARM(&FILENAME)

RUNQRY QRYFILE(&FILENAME)

ENDPGM

2.编译此程序

3.建立一个CMD 程序(即源代码的属性为CMD),代码如下:

CMD PROMPT(' 显示文件记录 ')

PARM KWD(NAME)TYPE(*CHAR)LEN(10)MIN(1)+

CHOICE(' 显示文件记录内容 ')+

PROMPT('Display file record')

4.编译此CMD,用F4,可见如下画面:

Create Command(CRTCMD)

Type choices, press Enter.Command............> SEE Name

Library...........> FHSLIB Name, *CURLIB

Program to process command...> SEE Name, *REXX

Library...........> *LIBL Name, *LIBL, *CURLIB

Source file..........> FHSFILE Name

Library...........> FHSLIB Name, *LIBL, *CURLIB

Source member.........> SEE Name, *CMD

Threadsafe...........*NO *YES, *NO, *COND

其中,蓝色字体显示的,就是我们需要输入这个CMD 要调用的程序名(默认值与

CMD同名),这里我们将此项内容填为SEECLP,表示SEE 这个CMD,调用的是SEECLP

这个程序

5.编译成功之后,我们在命令行执行“SEE 文件名”,就可以看到指定文件的记录。也可以用SEE + F4 的方式来使用

6.要注意,CMD 中,PARM 表示的就是CMD 命令的参数,参数的个数、类型、长

度都必须与其调用的程序相匹配,但名称可以与其调用的程序中的参数名称不一

样,而且名称前面不能有“&”字符。

7.在PARM 参数中,MIN(1),表示该项参数必须有值(即最小的有效长度为1),当

参数无值时,将会自动出现SEE + F4 的效果,同时该项参数高亮显示。试一试

就知道了

第四篇:程序员入门进阶手册

这篇文章,我主要是让你成为更为专业的入门程序员。请注意,此时,你可能需要读一些比较枯燥的书,但我想说,这些是非常非常重要的。你一定要坚持住。

编程技能

在系统地学习编程技能之前,我希望你能先看一下 “ The Key To Accelerating Your Coding Skills”,这篇文章会告诉你如何有效地快速提高自己的编程能力。然后接下来是下面几大块内容,但还只是入门级的。

编程技巧方面这个阶段,你可以开始了解一下 Java 语言了,我个人觉得 Java 是世界上目前为止综合排名最好的语言。你一定要学好这门语言。推荐《Java 核心技术(卷 1)》,除了让你了解 Java 的语法,它还会让你了解面向对象编程是个什么概念(如果你觉得这本书有点深,那么,你可以降低难度看更为基础的《Head First Java》)。然后,既然开始学习Java 了,那就一定要学 Spring,推荐看看《Spring in Action》或是直接从最新的 Spring Boot 开始,推荐看看《Spring Boot 实战》。关于 Spring 的这两本书,里面可能会有很多你从来没有听说过的东西,比如,IoC 和 AOP 之类的东西,能看懂多少就看懂多少,没事儿。

操作系统。这里你可以看看《鸟哥的 Linux 私房菜》,这本书会让你对计算机和操作系统,以及 Linux 有一个非常全面的了解,并能够管理或是操作好一个 Linux 系统。当然,这本书有很多比较专业的知识,你可能会看不懂,没关系,就暂时略过就好了。这本书的确并不适合初学者,你能看多少就看多少吧。

 网络协议你需要系统地了解一下数据库设计中的那些东西,这里推荐慕课网的一个在线课程--“数据库设计的那些事”。每个小课程不过 5-6 分钟,全部不到 2 个小时,我相信你一定能跟下来。你需要搞清楚数据的那几个范式,还有 SQL 语句的一些用法。当然,你还要学习和使用一下数据库,这里推荐学习开源的 MySQL。你可以看官方文档,也可以看一下这本书《MySQL 必知必会》。 前端方面在你处理中文时有时会发现有乱码出现,此时需要了解 ASCII 和 Unicode 这样的字符编码。这里推荐一篇文章Character encoding。还有 Github 上的这两个 Awesome 仓库:Awesome Unicode 和 Awesome Code Points。

为什么转成 Java 语言?

相信你可能会问,为什么之前学习的 Python 和 JavaScript 不接着学,而是直接切到 Java 语言上来,这样会不会切得太快了。这是一个好问题,这里需要说明一下,为什么我会切到 Java 这个语言上来,主要是有以下几方面考虑。1.Java 是所有语言里面综合实力最强的,这也是为什么几乎所有大型的互联网或是分布式架构基本上都是 Java 技术栈。所以,这是一个工业级的编程语言(Python 和 JavaScript 还达不到这样的水准)。

2.之所以,没有用 Java 来做入门语言而是用了 Python,这是因为编程是一件比较费脑子的事,一开始学习时,兴趣的培养很重要。Python 比较简单,容易上手,能够比较容易地提起兴趣,而用 Java 则可能比较难。3.在你有了一些编程语言的基础后,有了一些代码的逻辑后,切到工业级的编程语言上来,更为专业地学习编程,是非常有帮助的。像 Python 和 JavaScript 这样的动态语言用着是很爽,但是,只有像 C、C++ 和 Java 这样的静态语言才可以让你真正地进阶。

4.对于一个合格的程序员,掌握几门语言是非常正常的事情。一方面,这会让你对不同的语言进行比较,让你有更多的思考。另一方面,这也是一种学习能力的培养,会让你对于未来的新技术学习得更快。很多时候,一些程序员只在自己熟悉的技术而不是合适的技术上工作,这其实并不好,这会让你的视野受限,而视野会决定你的高度。综上所述,这就是在入门的时候我故意让你多学几门语言的原因。

编程工具

编程工具方面,你需要开始学习使用下面这些工具了。

 编程的 IDE。传统一点的,你可以使用 Eclipse。当然,我推荐你使用 Intellij IDEA。这两个工具都可以开发各种语言,但是主要用在 Java。如果你想玩得更时髦一些的话,使用 Visual Studio Code 也不错,这个工具潜力十足,用其开发 Python、JavaScript、Java、Go、C 和 C++ 都能得心应手(教程-本文发布时还基本没怎么翻译完)。

 版本管理工具。版本管理工具是非常重要的编程工具。传统的有 P4、SVN、CVS 等,但都会被 Git 取代,所以,你就只用学习Git 就好了。学习Git 的教程网上有很多,这里我推荐非常系统的 Pro Git 第二版(如 果你觉得 Pro Git 比较枯燥的话,备选猴子都能懂的 Git 入门),然后你要学会使用 GitHub。关于一些 Git 环境安装和准备以及 GitHub 使用,你可以自行 Google(比如:这篇Github and Git 图文教程 或是这篇Git 图文教程及详解)。

 调试前端程序。你需要学会使用 Chrome 调试前端程序,Google 一下会有很多文章,你可以看看 超完整的 Chrome 浏览器客户端调试大全。 数据库设计工具。你需要学会使用 MySQL WorkBench,这个工具很容易使用。相关的手册,你可以看一下官方文档。

实践项目

这回我们需要设计一个投票系统的项目。业务上的需求如下:

     用户只有在登录后,才可以生成投票表单。投票项可以单选,可以多选。

其它用户投票后显示当前投票结果(但是不能刷票)。投票有相应的时间,页面上需要出现倒计时。

投票结果需要用不同颜色不同长度的横条,并显示百分比和人数。

技术上的需求如下:

这回要用 Java Spring Boot 来实现了,然后,后端不返回任何的 HTML,只返回 JSon 数据给前端。

 由前端的 JQuery 来处理并操作相关的 HTML 动态生成在前端展示的页面。

 前端的页面还要是响应式的,也就是可以在手机端和电脑端有不同的呈现。这个可以用 Bootstrap 来完成。

如果你有兴趣,还可以挑战以下这些功能。

在微信中,通过微信授权后记录用户信息,以防止刷票。 可以不用刷页面,就可以动态地看到投票结果的变化。

 Google 一些画图表的 JavaScript 库,然后把图片表得风骚一些。

小结 上面那些书和知识你要看完,还要能理解并掌握,我估计你最少也要花 1-2 年左右的时间。如果你能够走到这里,把前面的那些知识都了解了,不用精通,能独立地做出上面的那些实践项目,那么,你就算是真正的入门了。

而且,你已经是一个 “ 全栈工程师 ” 的样子了,在这里我要给你一个大大的赞。如果这个时候,你对编程还有很大的热情,那么我要恭喜你了,你可能会是一个非常不错的程序员。加油啊!

上面的那些技术已经算是比较专业的了。如果你已经大致掌握了,我相信你可以找到至少年薪 20 万以上的工作了,而且你的知识面算是有不错的广度了。但是深度还不够,这个时候,是一个比较关键点了。

你可能已经沉醉在沾沾自喜的骄傲的情绪中,那么你也可以就此止步,加入一些公司,在那里按部就班地完成一些功能性的开发,成为一个搬砖的码农。你也可以开始选择一个方向开始深入。

我给你的建议是选择一个方向开始深入。因为你并不知道你未来会有多大的可能性,也不知道你会成为什么样的人,所以为什么不再更努力一把呢?

后面,我们就开始非常专业的程序员之路了。这也是一般程序员和高级程序员的分水岭了,能不能过去就看你的了。

第五篇:RPG AS400程序员培训手册9

其它

8.1 报表打印

在这里,简单说一下报表。其实据说RPG 设计之初,主要就是为了解决报表问题。不

过发展到现在,在我接触过的系统中,觉得报表在RPG 编程之中反而退居其次,大部分程

序都是对数据库中磁盘文件(即PF 文件)的操作。

报表文件其实在某种意义上与普通的磁盘文件很类似,都是有记录格式(Record

Format),都可以进行写操作(WRITE),RPGLE 的程序对它们的操作方式也比较雷同。所

不同的是普通的磁盘文件的数据是存储在数据库中,而报表文件WRITE 了之后,是以脱机

文件(Spool File)的形式存在。所以在一个库中,磁盘文件具有唯一性,即不能有同名的磁盘文件;而在同一个输出队列中,同名的报表文件(即生成的脱机文件),允许有多个。

要做一个全新的报表打印,大致上可以分为画报表文件(PRTF),与编写打印程序这两

部分。

一、画报表文件(PRTF)

1、新建立一个属性为PRTF的文件,然后使用19 进入报表编辑状态。(即STRRLU)

2、定义一个新的记录格式(Record Format):DR + F18 + F10,注意看下方的功能

键说明

3、在一个记录格式之下,追加内容时,要在新的编辑行前加“CLC”,表示此行的内容,是属于上面记录格式的。

4、编辑行前加:

DC: 定义常量

CF: 使当前行的内容居中

5、常用功能键:

F13:

标记 / 取消标记(光标所指的字段)。多试一下就知道使用方法,可以将 同一行的多个相连的字段标记成为一个块(对首尾两个字段操作F13 即可)。

高亮部分表示已被标记的块。

F14:

将已标记的块COPY 到光标指定处。(其实这个我用得不多)

F15:

将已标记的块MOVE 到光标指定处。(这个用得不少)

F16:

删除已标记的块。(这个用的频率也不少)

F11:

定义新变量

F23:

进入当前字段的功能菜单画面

6、对新变量的定义,按F11 之后,见到画面如下:

Edited length............: 1

Record format............: RCD00

1Number 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

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..........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 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 format..........File...............Library.............*CURLIB

各选项的含义:

Field: 当前变量所参照的字段

Record Format: 当前变量所参照字段,在PF 文件中所属的记录格式

File: PF文件名

Library: PF 文件所在的库名

7、其它几个常用功能选项的含义:

SKIPA:Skip After,在WRITE 操作时,写该字段后,自动换页; SKIPB:Skip Before 在WRITE 操作时,写该字段前,自动换页

SPACEA:Space After 写该字段后,再打印一个空格;

SPACEB:Space Before 写该字段前,打印一个空格(可用来解决错行问题)

EDTCDE:定义当前字段的显示方式,比如说当前字段为数字类型时,是否显

示逗号,前面是补零等等。根据F1 键,看Help 中的说明:

Edit Code Description No Sign CR SignSign(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

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 Format),该记录格式下

只有一个字段,同时这个字段的功能选项处要标识为“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 就是下一行,W+1 就是向右移一列,慢慢+,就可以看

到换页是否正确了。

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/EXEC SQL

C+ UPDATE PFFHS SET FHS01='0' WHERE FHS02=’1’

C/END-EXEC2、动态游标

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 FOR 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 视为一个存储容器,它能够将指定的库,或指定的数据文件,或源代码保存在其中,有点类似于UNIX 中的TAR。

SAVF 只用于备份与恢复。虽然通常这些事情是系统管理员做的,但是如果环境许可的情况下,开发人员能了解这些命令,自行做做备份,就可以更好地对程序进行测试、保护源

码。当然,在使用RESTORE 命令时,一定要谨慎谨慎再谨慎,千万不能追求操作速度,切

记切记。

1.建立SAVF

要使用SAVF,首先我们当然需要建立一个SAVF。如已有自己的SAVF,可跳过此步。

建立SAVF 的命令是:

CRTSAVF FILE(库名/SAVF 名)

如果建立成功,就会在指定库中,生成一个空的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),表示备份时,备份存储路径。也就是对应于数据文件,将其逻辑文件的相关信息也备份下来,会增加备份时间与备份空间;但恢复时,不需要对逻辑文件重新建

立索引,可以省很多时间。所以在备份数据文件建议加上这个参数。当然,如果是备份源代

码,就不需要这个参数了。

4.恢复已备份的库

RSTLIB SAVLIB(备份的库名)DEV(*SAVF)SAVF(SAVF 所在的库/SAVF 名)

RSTLIB(恢复的库名)

RSTLIB 这个参数,表示恢复的库名,其默认值等于“备份的库名”。也就是说,如果

我将FHSLIB 整个库备份下来,再使用RSTLIB 恢复,如果不更改RSTLIB 中的值,那么将

直接将FHSLIB 整个都覆盖恢复;而如果指定RSTLIB 的值为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(恢复的库名)

与RSTLIB 类似。当然,OBJ 选项使用*ALL,表示恢复SAVF 中备份的所有的目标,也可以指定只恢复单个/多个目标。

8.4 菜单--MENU

如果有例子的话,做菜单其实也不复杂。我对菜单做得也不多,感觉对于一般开发

人员来说,使用频率不是太高,还是简单说一下吧

随便找一个已存在的菜单,应该是包含DDS 与CMD 这两种TYPE,COPY 一下;

然后用17,或19 进入DDS。

用19 进入时,可以像编辑报表一样,对菜单进行编辑;

用17 进入时,在“Work with menu image and commands”选项中选择“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 名 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 名)SPLNBR(*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)

CHGSYSLIBL LIB(QSYS2989)OPTION(*REMOVE)

这个命令,再结合上面的“把SPLF 变成MEMBER”,就可以把MSGF 搞成

MEMBER,然后再FTP 到WINDOWS 上,就可以很方便地查找已定义的MSG 信息了。

不过必须要有权限执行CHGSYSLIBL 这个命令。

DSPOBJD

根据程序名,查找编译时源代码所在的库名、SRCFILE 名。

DETAIL 参数用“*SERVICE”,OBJTYPE 选项用“*PGM”

不过好象RPGLE 的程序用这个命令查不出来,要用DSPPGM 命令。

DSPPGM

根据目标

DSPPGM + RPGLE 程序名,参数用“*MODULE”,然后再选择5,就可以看到编 译时RPGLE 程序时,源代码所在的库名,SRCFILE 名。

DSPDBR

根据物理文件查其对应的所有逻辑文件

DSPPGMREF

查找程序与PF、LF 的关系。

PGM 参数用“*ALL”,OUTPUT 参数用“*OUTFILE”,OBJTYPE 参数用“*ALL”,然后执行,再输入输出文件名与所在库就可以了。然之后,就可以SQL 在这个生成的文件中查找(生成的过程可能会有点慢,要耐心)。

在生成的文件中,字段WHRFNM,表示记录格式名。举例来说,如果物理文件更

改过,那么物理文件与逻辑文件就都重新编译过了,所以它们对应的的所有的程序都要

重新编译,通常物理文件与逻辑文件使用相同的记录格式名(当然,如果不同就算了)

这时就需要按记录格式名来查找。比如SELECT * FROM 刚生成的文件 WHERE

WHRFNM = “记录格式名”,找出所有涉及到这个记录格式名的程序。

在生成的文件中,字段WHFNAM,表示文件名,包括物理文件与逻辑文件。比如

说当我们只修改了某个逻辑文件时,那么当然是只需要重新编译与该逻辑文件有关的程

序,也就是说只根据文件名来查找就足够了。

RTVCLSRC

如果编译CL 程序时,不是刻意带*NONE 参数,那么一般来说CL 程序都可以使

用这个命令来反编译。具体用途试试便知

RGZPFM

重整文件,即回收已删除记录的空间。不过这个命令我没实际用过。

WRKMSGQ QSYSOPR

显示错误信息

CHGCMGDFT 更改某些命令的默认参数,如更改CRTPF 的WAITRCD 参数:

CHGCMDDFT CMD(QSYS/CRTPF)NEWDFT(‘WAITRCD(*IMMED)’)

SBMJOB

将任务提交后台处理。

普通程序的流程中,如果A 程序CALL 了B 程序,那么A 程序必须等待B 程序运

行结束之后,才会继续执行CALL 之后的语句;

如果是使用SBMJOB 的话,那么A 程序就将B 程序提交到后台去运行,不等待B

程序结行完毕,直接继续向下运行。

SBMJOB 命令仅仅只是表示将任务提交给后台,所以此句运行完毕,也仅表示后

台已开始运行,并不表示运行的程序结束。

Submit Job(SBMJOB)

Type choices, press Enter.Command to run...........Job name............*JOBD Name, *JOBD

Job description........*USRPRF Name, *USRPRF

Library...........Name, *LIBL, *CURLIB

Job queue...........*JOBD Name, *JOBD

Library...........Name, *LIBL, *CURLIB

如上所示,第一行Command to run 处,填写需要提交后台运行的命令语句(通常是CALL

某个程序);

Job name 表示的,是显示在屏幕上的,运行的程序的名字,可以随便写,只是用来标识

用的;

Job description,填写对应的JOBD(如果想将程序提交到指定的子系统下,那么此处 填写子系统对应的JOBD,Job queue 处填写子系统对应的JOBQ),如果不填,即表示默认

为当前用户的JOBD,JOBQ

8.6 关于代码风格的几点想法

1、绝大多数情况下,不做硬性要求,一切都以维护时程序的易读性为主导。

2、一定要在程序最开始,简要说明程序实现的功能,输入输出参数,这个必须的。

3、临时变量的命名:

这个应该算是最具有可规范性的了。总之最好就是一望之下,就知道这个临时

变量是代表什么意思。变量名的长度可以不做局限,当然最好不要太长。通常项目

开发对此都会有明文或潜在的规范,多参照即可。

4、定义临时变量的位置:

在首次使用该临时变量前定义,同时加汉字注释,简单说明这个临时变量在什

么情况下,应该赋什么样的值。(当然了,如果是多个用途相似的临时变量,可以

用一行注释来搞定,不强求每个变量都要有一行注释)

见过的大部分规范里面,都是统一在程序开始处定义一大堆临时变量,规范的同时,总觉得用起来不够方便,比如说不知道这个临时变量什么时候使用,代表什

么意思,怎么使用,该怎么赋值等等。

5、子过程的使用:

主程序最好只写主流程,将具体处理交给各子过程;同时在调用子过程之前,加注释,说明这个子过程的处理功能。而子过程代码最开始,也要有这个子过程的功能说明,最好详细一点。

把子过程尽量写成类似于CALL 程序的感觉,也就是自已定一个输入输出接

口。当然,这个并不是真的输入输出接口参数,因为子过程中的变量在整个程序中

都可以用到,只是说类似。比如说,某个字段,是子过程中需要使用到的关键的一

个字段,那我们就可以将其做为输入字段,并在整个子过程的代码中,尽量不要去 改它的值;再比如说,子过程的功能是计算出一个金额,那我们就可以把这个金额

字段做为输出字段,在使用子过程之前将其清零。然后,在子过程前,加注释说明

输入输出字段。

这样做的意义在于:维护修改代码的便利性,COPY 代码的便利性。

6、视觉上的分隔:

RPGLE 的程序,写出来都是一坨坨的,尤其是IF 语句,用多了的确很难分清

逻辑判断到底是怎样。我通常对代码都是采用视觉上的分隔,因为我觉得这样最直

观。比如说,主代码段与子过程段之间,用全行“*”来做分隔;各段之内,也用

长短不一的“*”来分隔,表示不同情况的处理,或表示当前是几层之内的“IF”。

这个规律现在还没有总结出数字化的东西来,大部分情况下还是凭感觉,以后有时

间做做统计看看。

总之最后的效果,是从视觉上,将不同的处理情况隔开。比如说

*****************

**注释

C IF XXXX

C ENDIF

*****************

这种方式之下的ENDIF,就比较好找了吧。

“*”当然还可以再打得长一点,如果层次多了,还可以用单横线,等号,诸

如此类。

7、注释

注释的重要性毋庸致疑,这里单指以下情况的注释:

如果写程序时,某些需求不是很明确,或自己对这个需求的理解不是很清晰,或者是用户特意要求某种情况之下不按常规方式处理,又或者是处理判断在逻辑上 比较复杂比较绕,那么不妨把自己当时的想法或客户要求也写在注释中。事实上,有不少明显的BUG,就是通过这种注释发现的。__

下载RPG AS400程序员培训手册(大全五篇)word格式文档
下载RPG AS400程序员培训手册(大全五篇).doc
将本文档下载到自己电脑,方便修改和收藏,请勿使用迅雷等下载。
点此处下载文档

文档为doc格式


声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:645879355@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。

相关范文推荐

    FastReport 4程序员手册[全文5篇]

    FastReport 程序员手册 一、使用TfrxReport 组件工作 1、加载并存储报表 默认情况下,报表窗体同项目窗体构存储在同一个DFM文件中。多数情况下,无须再操作,因而你就不必采用特......

    程序员培训计划

    程序员培训计划培训目标: 了解xx公司的历史和企业文化,规章制度等 了解xx公司产品主要应用和项目管理的基本知识掌握xx产品的基本业务流程 掌握xx技术开发的基本技能 培训对象......

    培训手册

    成都烛龙科技有限公司 基层党组织分类定级软件支撑系统 培训手册 2012-5-10 1 准备工作.....................................................................................

    培训手册

    员工的必要培训 一:确定培训目标 1.服务技能培训:培训目标是帮助员工按照规范统一的服务准则为客户提供各种服 务,提升员工与顾客之间的人际互动能力。培训的内容主要是零售店......

    程序员内部培训(合集五篇)

    1.前言 虽然题为培训,但我还是想说一句,程序员其实不需要培训,只需要指点。原因有三: 程序员的工作都必须去实践,几乎没有纯理论的领域。 由于互联网的开放性,程序员能找到大量......

    属地化培训手册

    输电线路通道属地化管理 培训手册 国网咸宁供电公司检修分公司 二〇一四年三月 目 录 一、属地化工作概况 ………………………………………. 1 二、属地化的目的及要求 …......

    家具培训手册

    一、皮革的种类及各种皮的主要区别和皮革常识 由于各行各业对皮革制品的工艺要求各不一样,因此皮革种类繁多,对皮革称谓也各不一样,造成现在市场上对皮革称谓混乱。 一般来说,我......

    驾驶员培训手册

    驾驶员培训资料 亲爱的用户: 热忱欢迎您购买和使用“朗晴”牌系列电动车! 广州朗晴电动车有限公司是生产制造电动车的专业公司,专门从事各类电力驱动车辆的研制、设计、生产、......