第一篇:RPG AS400程序員培訓(xùn)手冊
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 后面的目標(biāo),必須是在當(dāng)前程序中已聲明的文件名(不是文件的記錄格式名),而且在OPEN 操作之后,在程序結(jié)束之前之前,必須有對應(yīng)的CLOSE 操作。
使用OPEN 操作,文件在聲明時(shí),必須使用USROPN 關(guān)鍵字(詳見D 行說明)。
ORxx(Or)邏輯判斷—或
Factory 1 Operation Factory 2 Result HI LO EQ
FLD01 IFGT FLD0
3FLD01 OREQ FLD0
2等價(jià)于
IF FLD01>FLD03 OR FLD01=FLD02
與IF、IFxx,AND、ANDxx 類似,RPGLE 的寫法OR,比RPG 的寫法ORxx 要靈活,而且可以用來表達(dá)一些復(fù)雜的邏輯關(guān)系。有鑒于此,所以通常IF 語句中,我會(huì)以O(shè)R 為主,基本不用ORxx。如果在編程序方面,公司/項(xiàng)目組無硬性要求,那我覺得還是少用ORxx 吧,總覺得這種寫法的邏輯關(guān)系看起來不直接,尤其是有很復(fù)雜的AND,OR 時(shí)。
OTHER(Otherwise Select)分支語句的判斷
與分支語句SELECT 一起使用,表示不符合上述所有條件時(shí)的操作,如下:
Factory 1 Operation Factory 2 Result HI LO EQ
SELECT
WHEN 條件判斷1 處理語句1
WHEN 條件判斷
2處理語句2
OTHER
處理語句
3ENDSL
在這個(gè)例子中,當(dāng)滿足條件判斷1 時(shí),運(yùn)行處理語句1,運(yùn)行結(jié)束后跳至ENDSL 處;
如果不滿足條件判斷1,則程序繼續(xù)向下執(zhí)行,判斷是否滿足條件判斷2。當(dāng)滿足條件判斷2 時(shí),運(yùn)行處理語句2,跳至ENDSL;當(dāng)不滿足
當(dāng)不滿足條件判斷2 時(shí),程序繼續(xù)向下執(zhí)下,當(dāng)讀到OTHER 操作碼時(shí),無條件運(yùn)
行處理語句3(即當(dāng)程序當(dāng)前不滿足以上所以條件判斷時(shí),則執(zhí)行OTHER 之后的語句。
處理語句允許有很多句;
條件判斷可以寫得很復(fù)雜,也允許對不同的字段進(jìn)行判斷;比如說C 語言也有分支語
句switch,但是這個(gè)語句只能對一個(gè)字段進(jìn)行分支判斷,ILE 語言與它不同,允許對不同的字段進(jìn)行判斷
就我目前掌握的測試情況,上述的SELECT—WHEN--OTHER—ENDSL,其實(shí)也可以
寫做:
IF 條件判斷
1處理語句1
ELSEIF 條件判斷2
處理語句2
ELSE
處理語句3
ENDIF 即WHEN 與ELSEIF 是類似的,這樣說,應(yīng)該可以明白了吧。
總之,SELECT—ENDSL 是一個(gè)很好用的語法,尤其是在表示很多不同的分支處理時(shí)。
OUT {(E)}(Write a Data Area)
沒用過,講數(shù)據(jù)域的。
PARM(Identify Parameters)定義入口參數(shù)
Factory 1 Operation Factory 2 Result HI LO EQR
*ENTRY PLIST
PARM FLD01
關(guān)于具體內(nèi)容講解,詳見前面所說“入口參數(shù)”一章。
允許做為入口參數(shù)的有:普通變量、結(jié)構(gòu)變量、數(shù)組變量
關(guān)于PARM、PLIST,還有一種在Factory 1,F(xiàn)actory 2 也填寫變量或指示器的用
法,不過我不知道它具體表示什么意思,也不知道該怎么用。請用過的來補(bǔ)充。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 指示器表示鎖表指示器,當(dāng)在指定的時(shí)間(CHGPF,WAITRCD 項(xiàng)可看到),需要讀取的記錄仍被鎖,將會(huì)打開LO 指示器,即*IN45=’1’;
EQ指示器為是否讀到指示器。當(dāng)未讀到仸何記錄時(shí),打開EQ 指示器,即*IN46=’1’
2.當(dāng)文件在程序中,是用只讀的方式聲明時(shí),READ 操作并不會(huì)造成鎖表; 如果文件在程序中是用修改的方式聲明,READ 操作成功后,該記錄被鎖;直到執(zhí)
行解鎖操作(UNLOCK,或UPDATE),或READ 該文件的其它記錄,才會(huì)解鎖
如果文件是用修改的方式聲明,但希望READ 操作不鎖表時(shí),那么就用READ(N),即
Factory 1 Operation Factory 2 Result HI LO EQ
READ(N)文件記錄格式名 45 46
這樣讀文件,就不會(huì)鎖記錄,但是同時(shí)也不能修改記錄。如果需要修改記錄,那么 在修改之前(包括對文件字段賦值之前),還必須再對該記錄進(jìn)行一次定位操作(比如
CHAIN、READ 語句均可)。也就是說,如果要修改記錄,必須先鎖住當(dāng)前記錄(很合理吧)
3.當(dāng)執(zhí)行READ 操作時(shí),程序是根據(jù)游標(biāo)當(dāng)前在文件中所指向的位置,順序讀取下
一條記錄。關(guān)于游標(biāo)是如何指向,還不是一個(gè)很簡單的問題,所以將會(huì)在下一章“數(shù)
據(jù)庫相關(guān)知識(shí)”中具體講解。
4.執(zhí)行READ 操作時(shí),允許聲明的文件沒有鍵值。(即PF 文件)
READC {(E)}(Read Next Changed Record)
沒用過,讀下一次修改過的記錄?
READE {(N | E)}(Read Equal Key)讀取鍵值相等的記錄
語法與READ 操作碼大致一樣,這里不再重復(fù),只說不同的:
假設(shè)程序中已聲明邏輯文件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,然后根據(jù)這個(gè)FHSKEY 在邏輯文件
PFFHSL3 中去定位,循環(huán)讀取PFFHSL3 中,F(xiàn)HS01、FHS03 與FLD01、FLD02 相等的記
錄。當(dāng)讀取記錄結(jié)束,或鍵值不等時(shí),退出循環(huán)(*IN15 是EQ 指示器)。如果將READE 操
作碼換成READ 操作碼的話(當(dāng)然,F(xiàn)actory 1 處也就不能有值),就沒有“鍵值不等時(shí)退出
循環(huán)”這一層意思,只是讀不到記錄時(shí)就退出循環(huán),但有時(shí)我們使用邏輯文件,僅僅是需要
它的排序,而不需要讀不到鍵值相等的記錄就退出循環(huán)。所以說,使用READ 操作碼,還
是READE 操作碼,需要根據(jù)實(shí)際的要求來決定。
以上的Factory 1 處填寫值的系統(tǒng)處理,當(dāng)READE 操作碼在Factory 1 處未填寫值時(shí),系統(tǒng)實(shí)際上是將當(dāng)前的值與讀到的上一條記錄的關(guān)鍵字進(jìn)行比較,而不是與SETLL 時(shí)的鍵
值做比較(讀第一條記錄不做比較?。?,如果鍵值不等時(shí),置EQ 指示器為1。也就是說,如果沒有與FHSKEY 鍵值相同的錄,那么系統(tǒng)并不是直接找開EQ 指示器,而是會(huì)一直保
持正常地往下讀,直到找到與讀到的第一條記錄關(guān)鍵字不同的記錄,才會(huì)打開EQ 指示器,所以要注意。
READP {(N | E)}(Read Prior Record)讀取記錄—游標(biāo)上移
簡單來說,READ、READE 操作時(shí),游標(biāo)在數(shù)據(jù)文件中,是下移的;即讀完第一條記
錄,游標(biāo)指向第二條記錄;讀完第二條記錄,游標(biāo)指向第三條記錄,依此類推,直至最后一 條記錄。但READP 則正好相反,游標(biāo)是上移的,即讀完第三條記錄后,游標(biāo)指向第二條記
錄;讀完第二條記錄后,游標(biāo)指向第一條記錄,直至讀完第一條記錄。一般來說,用READ、READE 的概率會(huì)比READP、READPE 的概率高得多,不過在某些情況下,使用READP 操作,又的確會(huì)很省事,這個(gè)一時(shí)間想不起例子來,大家可在編
程序時(shí)多實(shí)踐。
READPE {(N | E)}(Read Prior Equal)
雖然我沒用過,但猜想它應(yīng)該就是指游標(biāo)上移,按鍵值去讀取文件。與READP 的關(guān)系,就類似于READE 與READ 的關(guān)系。
REALLOC {(E)}(Re-allocate Storage)
沒用過
REL {(E)}(Release)
沒用過
RESET {(E)}(Reset)
將數(shù)據(jù)結(jié)構(gòu)賦值成為初始值。
注意是初始值,不是清空。如定義結(jié)構(gòu):
D FHSDS DS
D FHS01 10 INZ(’ABCD’)
D FHS02 5 INZ(’EFGH’)
那么,不管對該結(jié)構(gòu)如何賦值,當(dāng)執(zhí)行語句: C RESET FHSDS
之后,F(xiàn)HS01 將會(huì)變成’ABCD,F(xiàn)HS02 將會(huì)變成’EFGH’,即恢復(fù)成為初始值。
RETURN {(H | M | R)}(Return to Caller)
RETURN 是程序結(jié)束。
在前面,“簡單的程序流程”中,我們講過,“SETON LR” 與RETURN 這兩句話一
起,做為程序的結(jié)束。這里,再詳細(xì)解釋一下兩者之間的區(qū)別,以及關(guān)系: 如果不寫RETURN,只寫“SETON LR”,程序執(zhí)行完最后一句之后,將會(huì)再從第一
句開始執(zhí)行,造成死循環(huán)。在簡單的程序流程這個(gè)例子中,程序原來只想修改讀到的第一條 記錄,而如果沒有RETURN 的話,將會(huì)把所有的記錄都修改掉,直到最后找不到可修改的記錄,然后系統(tǒng)報(bào)錯(cuò),異常中斷。(這種離奇的現(xiàn)象現(xiàn)在又測試不到了,可能是當(dāng)時(shí)寫錯(cuò)程 序了?把F 寫成了P?不管它,當(dāng)是我寫錯(cuò)了,總之RETURN 是表示程序結(jié)束,沒有
RETURN,主程序無可執(zhí)行的語句時(shí),它也會(huì)結(jié)束;如果RETURN 出現(xiàn)在主程序的中間,那么RETURN 后面的語句將不會(huì)執(zhí)行)
如果只寫RETURN,不打開指示器*INLR,根據(jù)blogliou 所說 “程序不會(huì)強(qiáng)制將內(nèi)存
中的數(shù)據(jù)寫到磁盤中。400 缺省的是BLOCK 輸出,即數(shù)據(jù)記錄滿一個(gè)BLOCK 塊時(shí)才會(huì)將
這一組記錄寫到磁盤上。那么如果這時(shí)BLOCK 沒滿,數(shù)據(jù)信息不會(huì)立刻寫到磁盤上。之后 有其它作業(yè)用到該文件,讀取的數(shù)據(jù)就不完整?!?/p>
但如果文件有唯一鍵字,或記錄日志,必須同步寫時(shí),其實(shí)BLOCK 實(shí)際被忽略,也就 是此時(shí)不會(huì)有錯(cuò)。目前我們用的是MIMIX 備份,客戶實(shí)際上將所有的文件都列入日志,這
時(shí)不寫也不會(huì)出現(xiàn)上述錯(cuò)誤。但為避免一些潛在的問題,養(yǎng)成良好的編程風(fēng)格,建議將 SETON LR 與RETURN 一同,做為程序結(jié)束的標(biāo)志。當(dāng)然,如果某個(gè)程序頻繁被調(diào)用,且 不涉及文 操作時(shí),可考慮不打開指示器*INLR,僅用RETURN 作為結(jié)束,這樣程序不
會(huì)被PURGE 出內(nèi)存,可提高調(diào)用效率。
如果沒寫RETURN,也沒有打開指示器*INLR,在編譯時(shí),系統(tǒng)將會(huì)報(bào)40 級錯(cuò),說找
不到程序結(jié)束的語句,所以大可放心。ROLBK {(E)}(Roll Back)
1.基本語法
Factory 1 Operation Factory 2 Result
ROLBK
2.該操作碼無其它參數(shù),就是指對事務(wù)處理進(jìn)行回滾操作。3.ILE 程序中,ROLBK 操作可隨時(shí)進(jìn)行,也允許在沒有聲明COMMIT 類型的文件的情況下,仍進(jìn)行ROLBK 操作(對該進(jìn)程這前的事務(wù)進(jìn)行確認(rèn)處理)f
4.關(guān)于日志的確認(rèn)回滾操作,在后面會(huì)另設(shè)專門章節(jié)講述。
2.8.4.5 S--Z SCAN {(E)}(Scan Character String)掃描字符串
掃描字符或字符串Factory 1 在目標(biāo)字符串Factory 2 中是否存在Factory 1 Operation Factory 2 Result HI LO EQ
FLD01 SCAN FLD02 N 26
FLD01 可以是字符,也可以是字符變量;可以是一位長,也可以是多位長。
當(dāng)FLD01 在FLD02 中存在時(shí),EQ 指示器打開,即*IN26=’1’,同時(shí)將FLD02 中的起始
位置,賦值給N;
當(dāng)FLD01 在FLD02 中不存在時(shí),EQ 指示器保持關(guān)閉狀態(tài),即*IN26=’0’,同時(shí)N=0
允許從FLD02 中的指定位置開始檢查:
FLD01 SCAN FLD02:2 N 26
如上句,即表示從FLD02 的第2 位,開始掃描。
在實(shí)際使用中,比如說我們判斷某個(gè)字符是否為數(shù)字,就可以先定義一個(gè)0—9 的常量,然后將要判斷的字符去SCAN 一下這個(gè)常量
SELECT(Begin a Select Group)分支語句
在操作碼“OTHER”中講過,為方便讀者,列出簡單語法如下:
Factory 1 Operation Factory 2 Result HI LO EQ
SELECT
WHEN 條件判斷
1處理語句1
WHEN 條件判斷2 處理語句
2OTHER
處理語句
3ENDSL
要注意,SELECT 操作碼,必須有對應(yīng)的ENDSL 操作碼,否則編譯無法通過。
SETGT {(E)}(Set Greater Than)定位操作—大于
舉個(gè)例子吧,假設(shè)文件中有一個(gè)字段,是標(biāo)識(shí)順序號(hào)的,1、2、3、4。即該字段為1,表示第一條記錄,該字段為2,表示第2 條記錄。那么: Factory 1 Operation Factory 2 Result HI LO EQSETGT 文件記錄格式名
READ 文件記錄格式名
這個(gè)READ 操作,READ 到的,是第3 條記錄。也就是說,SETGT 操作碼,會(huì)將游標(biāo)
定位到大于鍵值的第一條記錄前。
在實(shí)際使用中,如果我們是按邏輯文件讀取,而且讀了一條記錄之后,對其鍵值相同的 記錄都不需要再讀取時(shí),就可以用SETGT,不過需要注意,F(xiàn)actory 1 項(xiàng),需要是與鍵值相
同的變量,即如果文件是使用多個(gè)字段做為鍵值,那么我們也需要先定義一個(gè)組合鍵值的變
量,然后Factory 1 處填寫這個(gè)組合鍵值的變量名。
當(dāng)聲明文件的鍵值有多項(xiàng)時(shí),F(xiàn)actory 1 項(xiàng)的鍵值,允許小于文件的鍵值,但順序必須
一致。即聲明的文件如果鍵值為:FHS01、FHS02、FHS03,那么我們在程序中定義三個(gè)類
型與之相同的變量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 操作碼,會(huì)將游標(biāo)定位到與鍵值相
等的第一條記錄之前,仍是上例,如果是 2 SETLL 文件記錄格式名
READ 文件記錄格式名
那么READ 操作碼讀到的記錄,就是第2 條記錄,看到了吧,和SETGT 不同。
SETLL 操作碼還可以用來簡單判斷當(dāng)前鍵值是否存在有記錄,以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
當(dāng)文件中有相應(yīng)記錄時(shí),EQ 指示器打開,即*IN44=’1’
當(dāng)文件中無相應(yīng)記錄時(shí),EQ 指示器關(guān)閉,即*IN44=’0’(與CHAIN 正好相反,要注意)
而在這種用法中,SETLL 與CHAIN 的區(qū)別在于,CHAIN 是定位讀取了記錄,而SETLL 僅僅只是判斷該記錄是否存在。所以用SETLL 操作,不能修改記錄,也無法取出記錄的值。
只能判斷記錄是否存在。如果要修改記錄,或取出記錄的值,還需要有一個(gè)讀取定位的操作,如READ,或READE、READP 等(最常用的,應(yīng)該就是READ 操作)
SETOFF(Set Indicator Off)關(guān)閉指示器
Factory 1 Operation Factory 2 Result HI LO EQ
SETOFF 10 11 1
2等價(jià)于
EVAL *IN10=’0’
EVAL *IN11=’0’
EVAL *IN12=’0’
在SETOFF 這個(gè)操作碼中,指示器填在HI、LO、EQ 哪里都沒關(guān)系,都是表示要被關(guān)
閉的指示器
SETON(Set Indicator On)打開指示器
Factory 1 Operation Factory 2 Result HI LO EQ
SETOFF 10 11 1
2等價(jià)于
EVAL *IN10=’1’
EVAL *IN11=’1’
EVAL *IN12=’1’
在SETON 這個(gè)操作碼中,指示器填在HI、LO、EQ 哪里都沒關(guān)系,都是表示要被關(guān)閉的指示器
SHTDN(Shut Down)
沒用過
SORTA(Sort an Array)沒用過
SQRT {(H)}(Square Root)開方
Factory 1 Operation Factory 2 Result HI LO EQSQRT 3 N
這時(shí),N=3(因?yàn)? 的平方為9)9、3 都可以是數(shù)字型變量,或者直接是數(shù)字 SUB {(H)}(Subtract)減法操作
Factory 1 Operation Factory 2 Result HI LO EQ
FLD01 SUB FLD02 FLD0
3SUB FLD02 FLD03
看過前面的ADD、MULT 操作碼,這里不用解釋也應(yīng)該明白是什么意思了吧。那就不
多說了。
SUBDUR {(E)}(Subtract Duration)日期相減
1.減日期
Factory 1 Operation Factory 2 Result HI LO EQ
FLD01 SUBDUR N:*Y FLD02
表示將日期型變量FLD01 減去N 年,賦值到日期型變量FLD02 中;
N 可以是一個(gè)數(shù)字型變量,也可以就是一個(gè)數(shù)字,N 允許為負(fù)數(shù) *Y,*M,*D(還有其它的參數(shù)值,可見ADDDUR,其中有詳細(xì)解釋)
2.判斷兩個(gè)日期型變量之間的天/月/年數(shù)
Factory 1 Operation Factory 2 Result HI LO EQ
FLD01 SUBDUR FLD02 N:*D
這時(shí),N 做為一結(jié)果變量,表示日期型變量FLD01 與FLD02 之間的天數(shù)
SUBST {(P | E)}(Substring)取字符/字符串 Factory 1 Operation Factory 2 Result HI LO EQSUBST FLD01:3 FLD02
表示從字段FLD01 的第3 位開始,取2 位,左對齊賦值到字段FLD02 中。
要求字段FLD01 的長度必須大于或等于3+2 位,否則程序會(huì)報(bào)錯(cuò)。
可以嘗試用%SUBST 語句,也是等價(jià)的,如下
EVAL FLD02=%SUBST(FLD01:3:2)
表示的是同樣的意思。
起始位數(shù)3,取的長度2,在兩種寫法之下,都可以使用數(shù)字型變量來表達(dá)。
相比較之下,%SUBST 還有一種用法,就是對字符的指定位置賦值,這個(gè)就厲害了:
EVAL %SUBST(FLD02:3:2)=’01’
看到了吧,這句話就是說,使字段FLD02 的第3、4 位(即從第三位開始,兩位長)等
于“01”
TAG(Tag)定義標(biāo)簽,與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)--取當(dāng)前系統(tǒng)時(shí)間 Factory 1 Operation Factory 2 Result HI LO EQ
TIME FLD01
FLD01 可以是時(shí)間型或數(shù)字型變量
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。即如果鎖定某條記錄,并對其字段進(jìn)行賦值之后,使用UPDATE 語句,將
會(huì)把修改后的結(jié)果保存下來,即修改文件,而UNLOCK 語句則不會(huì)修改文件,即否認(rèn)了之 前對文件字段做的賦值修改。
從程序的執(zhí)行效率上來講,UNLOCK 的執(zhí)行效率是高于UPDATE 的,因?yàn)閁PDATE
操作時(shí),系統(tǒng)需要對文件的每一個(gè)字段進(jìn)行確認(rèn)處理(DEBUG 時(shí)可以看到),而UNLOCK 就
是簡單的解鎖而已。
UPDATE(Modify Existing Record)修改記錄
語法與UNLOCK 一樣。
這里需要說明一下,在執(zhí)行UPDATE 的時(shí)候,必須先使用READ、CHAIN 等操作碼鎖
定一條記錄。如果未鎖住記錄,UPDATE 操作碼將會(huì)報(bào)錯(cuò)。當(dāng)執(zhí)行了UNLOCK、UPDATE、以及ROLBK 語句時(shí),等于是解鎖,此時(shí)再執(zhí)行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……..這樣的語法,在表達(dá)復(fù)雜的邏輯關(guān)系時(shí),必須與ANDxx,ORxx 一起使用,所以我不
使用WHENxx 這個(gè)操作碼。
WRITE(Create New Records)寫記錄
常用的方式:
Factory 1 Operation Factory 2 Result HI LO EQ
CLEAR 文件記錄格式名
EVAL 文件字段1=xxxx
EVAL 文件字段2=xxxx
WRITE 文件記錄格式名
表示在文件中寫入一條新記錄。文件需要聲明為可寫的。
通常會(huì)在給文件字段賦值之前,作一次CLEAR 操作來進(jìn)行初始化,以避免不必要的麻煩。XFOOT {(H)}(Sum the Elements of an Array)
沒用過,看幫助,是表示對數(shù)組字段的累加統(tǒng)計(jì)。
假設(shè)DIMDATA 定義為一個(gè)數(shù)字型的數(shù)組變量,F(xiàn)HS01 為一個(gè)足夠大的數(shù)字型變量
Factory 1 Operation Factory 2 Result HI LO EQ
XFOOT DIMDATA FHS01
就表示將數(shù)組DIMDATA 中的所有記錄的值都取出來,匯總相加,賦值到數(shù)字變量
FHS01 中
XLATE {(P | E)}(Translate)
將一個(gè)字符串中指定的字符,更換成另外的字符。
舉例:如MYCHAR1,MYCHAR2 都是兩個(gè)20 位長的字符型變量
C MOVEL 'ABCAAAC123' MYCHAR1
C 'A':'9' XLATE MYCHAR1 MYCHAR2
執(zhí)行過這個(gè)語句之后,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)向數(shù)字型變量賦值
Factory 1 Operation Factory 2 Result HI LO EQ
Z-ADD FLD01 FLD02
將數(shù)字型變量FLD01,賦值到數(shù)字型變量FLD02 中。
Z-ADD、MOVE 雖然同是賦值操作碼,但Z-ADD 的用法就遠(yuǎn)沒有MOVE 那么變化多
端,只能在數(shù)字型變量之間賦值。所以也沒有什么可說的了。zero 如果要對數(shù)字型變量賦初值,使用*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
等價(jià)于
0 SUB FLD01 FLD02
等價(jià)于
EVAL FLD02=FLD01*(-1)
*ALL
*ALL 是個(gè)很有意義的變量,舉例:
EVAL FLD01=*ALL’0’
表示將字符型變量FLD01 賦值為全’0’
而
CLOSE *ALL
就表示關(guān)閉所有文件,意義與上面是不同的%LEN
取字符串的長度,舉例:
(MYLEN 為數(shù)字型變量,F(xiàn)LD01 為字符型變量)
EVAL MYLEN = %LEN(FLD01)
這句話的意思,是指取字符串FLD01 的長度,不過通常這樣用是沒意義的,因?yàn)橹苯?/p>
用%LEN 操作碼,取到的是字符串的總長度,不是有效字符的長度,也就是說FLD01 長度
為2,那么MYLEN 就恒等于2,不會(huì)變。就算變量FLD01 中沒有值,取出的MYLEN 也等
于2.。所以,%LEN 通常會(huì)與%TRIM 或是%TRIMR 一起使用,語法在下面介紹。
%TRIM,%TRIMR
都是去字符串變量中的空字符意思,%TRIM 是去字符串左邊的空字符;%TRIMR 是去
字符串右邊的空格。
通常我們在寫程序中,都是默認(rèn)字符串變量左對齊,所以我們使用%TRIMR 操作碼的概率應(yīng)該高一點(diǎn)。舉例:
EVAL MYLEN = %LEN(%TRIMR(FLD01))
這時(shí)的MYLEN,就是指變量FLD01 中的有效長度(前提條件是FLD01 中如果有值,是左對齊)。如果FLD01 為空,那么MYFLEN 為0;如果FLD01 首位有值,第二位為空,那么MYLEN 為1;如果FLD01 兩位都不為空,那么MYLEN 就等于2。
如果字符串左對齊,那么就使用%TRIMR
還有一種用法,假設(shè)字符串FLD04 為4 位長的字符,F(xiàn)LD01,F(xiàn)LD02 都是2 位長的字
符,且FLD01 等于“A ”,F(xiàn)LD02 等于“BC”,那我們執(zhí)行:
EVAL FLD04 = FLD01 + FLD01 + FLD02
FLD04 就等于“A A ”,也就是第二位與第四位都是空的,最后加的FLD02 其實(shí)無
效。
而如果執(zhí)行
EVAL FLD04 = %TRIMR(FLD01)+ %TRIMR(FLD01)+ FLD02
則FLD04 就等于“AABC”,也就是說,在這里,%TRIMR(FLD01),是等價(jià)于單字符
“A”的MONITOR
監(jiān)控程序信息。據(jù)說是可以屏蔽掉出錯(cuò)信息,避免程序異常中斷,未經(jīng)測試。
第二篇:《程序員崗前培訓(xùn)手冊》
程序員崗前培訓(xùn)手冊
北京應(yīng)用技術(shù)大學(xué)
目錄(CONTENTS)
前言
面試是雙向選擇
軟件公司研發(fā)技術(shù)崗位掃描與崗位職責(zé)
如何快速融入技術(shù)團(tuán)隊(duì)(程序員入崗的注意事項(xiàng))優(yōu)秀程序員應(yīng)具有的品質(zhì)與習(xí)慣 談?wù)剬W(xué)習(xí)方法
外包軟件、商品軟件、項(xiàng)目軟件簡介
前言
同學(xué)們經(jīng)過在北京應(yīng)用技術(shù)大學(xué)兩年的學(xué)習(xí),都滿懷憧憬地向往程序人生的開始,也對即將走上的工作崗位和環(huán)境充滿了期待,期待通過程序來證明自我的價(jià)值。程序員,相信在很多同學(xué)眼中是一個(gè)有趣、特別、高薪、充滿艱辛而又非常神秘的職業(yè),因?yàn)槭窒履且恍行刑鴦?dòng)的代碼不僅實(shí)現(xiàn)了生動(dòng)的功能,同時(shí)也表達(dá)著程序員對人生的理解和追求。當(dāng)程序員實(shí)現(xiàn)了一個(gè)獨(dú)到的創(chuàng)意之后準(zhǔn)備熄燈休息時(shí),天已蒙蒙亮…..當(dāng)程序員看著用戶熟練地操作自己的軟件解決一個(gè)個(gè)復(fù)雜事件時(shí),臉上那寫滿成就的微笑…..的確在這個(gè)行業(yè)里出現(xiàn)了太多的英雄人物和企業(yè),而每一個(gè)英雄的事跡和成就都足以讓我們熱血沸騰、摩拳擦掌……
在同學(xué)們即將步入程序員崗位之前,需要對軟件研發(fā)相關(guān)職位的職責(zé)范圍與工作特點(diǎn)有所了解,掌握一些入職的基本技巧和注意事項(xiàng),檢查自己的技能與行為習(xí)慣,有的放矢,提高面試和就業(yè)的成功率。入職后能盡快地融入到技術(shù)團(tuán)隊(duì),近而快速成長,成為團(tuán)隊(duì)技術(shù)骨干和最優(yōu)秀的職員。在工作中養(yǎng)成積極而良好的行為習(xí)慣和職業(yè)素養(yǎng),為自己的職業(yè)發(fā)展創(chuàng)造一個(gè)良好的開端。
本手冊從面試、技術(shù)崗位職責(zé)、如何快速融入技術(shù)團(tuán)隊(duì)、優(yōu)秀程序員的品質(zhì)與習(xí)慣、學(xué)習(xí)方法、外包軟件/商業(yè)軟件/項(xiàng)目軟件簡介等幾個(gè)方面闡述了同學(xué)們在踏入工作崗位之前應(yīng)該了解的知識(shí)和注意事項(xiàng)。
面試是雙向選擇
一般同學(xué)都會(huì)誤認(rèn)為面試時(shí)應(yīng)聘者處于弱勢,要接受招聘者的挑選,從而從心理上承受很大的壓力,而影響自己正常的發(fā)揮和才能展示。其實(shí)大可不必,因?yàn)槊嬖囀请p向的,選人和擇業(yè)是平等的。況且現(xiàn)在市面上的用人單位或招聘崗位也是良莠不齊,甚至還有一些騙子公司,這就要求同學(xué)們在應(yīng)聘時(shí)擦亮眼睛,注意分辨。當(dāng)然大多數(shù)公司都是良性的,他們要么是已具規(guī)模,各部門及崗位功能分工很明確,他們會(huì)根據(jù)業(yè)務(wù)的發(fā)展或作為人才儲(chǔ)備而有針對性的招聘相關(guān)技術(shù)人員,而有的公司可能是剛剛成立,業(yè)務(wù)與核心技術(shù)還未形成,他們需要招聘到能為他們提供解決方案或創(chuàng)意的技術(shù)人員,所以對于這些類型的公司,他們對人才的渴求也都不亞于同學(xué)們對工作崗位的渴求,若是聘到一個(gè)優(yōu)秀的技術(shù)人員對業(yè)務(wù)或項(xiàng)目的推進(jìn)將會(huì)使公司獲得更大的利益,或者使公司的發(fā)展少走彎路甚至能改變一個(gè)公司的命運(yùn)。相反,如果招不到合適的人才或者使用一個(gè)較差的技術(shù)人才,不但不能推進(jìn)項(xiàng)目的進(jìn)展,還要花費(fèi)幾個(gè)月的培養(yǎng)時(shí)間和費(fèi)用,甚至阻礙業(yè)務(wù)開拓甚至項(xiàng)目擱淺。所以當(dāng)同學(xué)們想得到一個(gè)工作崗位的同時(shí),也要看到企業(yè)更需要一個(gè)優(yōu)秀的員工,二者是平等的。在面試時(shí),同學(xué)們在一種非常平和的心態(tài)下,充分發(fā)揮,盡可能地展示自己已經(jīng)掌握的技能,展示學(xué)習(xí)能力和發(fā)展?jié)撃?;另一方面也要盡可能地提前了解公司的背景和業(yè)務(wù)以及應(yīng)聘崗位的職能,從而加以辨別和選擇。一旦本次面試不能成功,表明要么崗位不適合你,要么你不適合崗位,或者因?yàn)槟惚敬蔚谋憩F(xiàn)不佳,這都是很正常的,一定不要有挫敗感,要及時(shí)總結(jié)面試時(shí)的表現(xiàn)方式以及溝通技巧,若感覺自己的確能夠勝任該崗位,只是因?yàn)樽约旱呐R場發(fā)揮不佳而沒有展示出自己的實(shí)際水平,也可及時(shí)和招聘公司聯(lián)系,經(jīng)詢問確認(rèn)對方?jīng)]有找到合適人選的情況下,表明誠意,請求復(fù)試機(jī)會(huì)。總之,若本次失敗,一定不要影響下一次的面試,要積極總結(jié),為一下次面試作準(zhǔn)備。
正常運(yùn)營的公司因業(yè)務(wù)的不斷發(fā)展,人才需要不斷的更新、補(bǔ)充和儲(chǔ)備,所以他們一直都需要人才,況且公司每次組織招聘都會(huì)花費(fèi)一大筆費(fèi)用,也希望能夠找到合適的人才,所以公司面試時(shí)一般不會(huì)出太吊鉆的問題來為難你,同學(xué)們也不要過分擔(dān)心。
另一方面,同學(xué)們在堅(jiān)信“天生我才必有用”的同時(shí),也要正確看待現(xiàn)在的就業(yè)形勢,對第一份工作也不要過于理想化,要擺正心態(tài),堅(jiān)持從基層做起,先就業(yè)再擇業(yè),職場上“騎驢找馬”也未必不是一種現(xiàn)實(shí)的理性選擇。
總之,面試是雙向性的,是招聘單位與同學(xué)們相互展示、相互認(rèn)識(shí)、互相挑選的一次溝通過程。同學(xué)們 在求職的過程中,要正確看待面試,放下思想包袱,充分重視,充分準(zhǔn)備,從容應(yīng)對。
軟件公司研發(fā)技術(shù)崗位掃描與崗位職責(zé)
一般中小型軟件公司設(shè)置的技術(shù)崗位有:研發(fā)總監(jiān)、項(xiàng)目經(jīng)理、需求分析人員、系統(tǒng)架構(gòu)與分析人員、數(shù)據(jù)庫設(shè)計(jì)人員、程序員、項(xiàng)目助理與文檔專員、測試人員、技術(shù)支持(售前/售后)、美工或網(wǎng)站前臺(tái)人員等,這些職位的工作聯(lián)系非常密切,根據(jù)公司規(guī)模的大小,以上職位可由一人或多人兼任,比如一個(gè)小型的軟件公司可能只有一個(gè)人完成軟件的總體設(shè)計(jì)、架構(gòu)、編碼、測試、文檔等工作。這些崗位的職責(zé)范圍大致是:
研發(fā)總監(jiān):全面負(fù)責(zé)研發(fā)及技術(shù)部門的整體工作。
項(xiàng)目經(jīng)理:在整個(gè)項(xiàng)目開發(fā)過程中組織項(xiàng)目所需的各項(xiàng)資源,對項(xiàng)目的范圍、項(xiàng)目的質(zhì)量、項(xiàng)目時(shí)間以及項(xiàng)目成本進(jìn)行管理與控制。根據(jù)項(xiàng)目范圍、質(zhì)量、時(shí)間與成本的綜合因素的考慮,進(jìn)行項(xiàng)目的總體規(guī)劃與階段計(jì)劃,保證項(xiàng)目組目標(biāo)明確且理解一致;在項(xiàng)目生命周期的各個(gè)階段,跟蹤、檢查項(xiàng)目組成員的工作質(zhì)量;保證項(xiàng)目在預(yù)算成本范圍內(nèi)按規(guī)定的質(zhì)量和進(jìn)度達(dá)到項(xiàng)目目標(biāo)。
需求分析人員:項(xiàng)目前期與客戶方打交道最多的人,對于客戶來說,他可以代表整個(gè)項(xiàng)目組,對于項(xiàng)目組成員來說他的意見可以代表客戶方的意見,項(xiàng)目組內(nèi)所有與客戶需求相關(guān)的事情必需得到他的認(rèn)可。他的工作主要是:
1、在項(xiàng)目前期根據(jù)《需求調(diào)研計(jì)劃》對客戶進(jìn)行需求調(diào)研。
2、收集整理客戶需求,負(fù)責(zé)編寫《用戶需求說明書》。
3、代表項(xiàng)目組與用戶溝通與項(xiàng)目需求有關(guān)的所有事項(xiàng)。
4、代表客戶與項(xiàng)目組成員溝通項(xiàng)目需求有關(guān)的所有事項(xiàng)。
5、負(fù)責(zé)《用戶需求說明書》得到用戶的認(rèn)可與簽字。
6、負(fù)責(zé)將完成的項(xiàng)目模塊給客戶做演示,并收集對完成模塊的意見。
7、完成《需求變更說明書》,并得到用戶的認(rèn)可與簽字。
8、協(xié)助項(xiàng)目組有關(guān)人員對需求進(jìn)行理解。
系統(tǒng)架構(gòu)與分析人員:是項(xiàng)目的總體設(shè)計(jì)師,組織構(gòu)建新產(chǎn)品的開發(fā)與集成、新技術(shù)體系等,也可以理解為技術(shù)總監(jiān)。是在技術(shù)上對所有重要事情做出決定的人。系統(tǒng)架構(gòu)在整個(gè)軟件開發(fā)過程中都起著非常重要的作用,并隨著開發(fā)進(jìn)程的推進(jìn)而其職責(zé)或關(guān)注點(diǎn)不斷地變化。
1、在需求階段,負(fù)責(zé)理解和管理非功能性系統(tǒng)需求,比如軟件的可維護(hù)性、性能、復(fù)用性、可靠性、有效性和可測試性等。審查客戶和市場人員所提出的需求,確認(rèn)開發(fā)團(tuán)隊(duì)所提出的設(shè)計(jì);組織開發(fā)團(tuán)隊(duì)成員和開發(fā)過程的定義;協(xié)助需求分析師完成《用戶需求說明書》、《需求變更說明書》等。
2、在設(shè)計(jì)階段,負(fù)責(zé)對整個(gè)軟件架構(gòu)、關(guān)鍵模塊、接口的設(shè)計(jì)。對系統(tǒng)進(jìn)行分析與建模,完成《系統(tǒng)架構(gòu)說明書》、《系統(tǒng)概要設(shè)計(jì)說明書》、《系統(tǒng)詳細(xì)設(shè)計(jì)說明書》。
3、編碼階段,成為程序員的顧問,負(fù)責(zé)重點(diǎn)代碼檢查,并且經(jīng)常性地要舉行一些技術(shù)研討會(huì)、技術(shù)培訓(xùn)班等;
4、測試及實(shí)施階段,隨著軟件開始測試、集成和交付,集成和測試支持將成為工作重點(diǎn);
數(shù)據(jù)庫設(shè)計(jì)人員:根據(jù)《系統(tǒng)架構(gòu)說明書》負(fù)責(zé)進(jìn)行數(shù)據(jù)庫選型與建模。由于數(shù)據(jù)庫是整個(gè)系統(tǒng)運(yùn)行的核心,數(shù)據(jù)庫設(shè)計(jì)的好差直接影響著整個(gè)系統(tǒng)的開發(fā)效率和系統(tǒng)運(yùn)行的優(yōu)劣。他是項(xiàng)目組中唯一能對數(shù)據(jù)庫進(jìn)行直接操作的人,對數(shù)據(jù)庫結(jié)構(gòu)的每一次改動(dòng)都要得到他的認(rèn)可。主要職責(zé):
1、根據(jù)數(shù)據(jù)庫建模結(jié)果,繪制數(shù)據(jù)庫關(guān)系圖。進(jìn)行數(shù)據(jù)庫建庫以及數(shù)據(jù)庫進(jìn)行初始化操作。
2、對數(shù)據(jù)庫進(jìn)行維護(hù)、備份、恢復(fù)、同步。
3、負(fù)責(zé)客戶數(shù)據(jù)的導(dǎo)入導(dǎo)出。
4、根據(jù)《系統(tǒng)詳細(xì)設(shè)計(jì)說明書》編寫對應(yīng)的視圖、存儲(chǔ)過程、函數(shù)、觸發(fā)器等。
5、對項(xiàng)目組其它成員進(jìn)行SQL方面的指導(dǎo)。
6、為測試建立相關(guān)測試數(shù)據(jù)。
程序員:負(fù)責(zé)系統(tǒng)的最終代碼實(shí)現(xiàn)。主要職責(zé):
1、參與需求調(diào)研、項(xiàng)目可行性分析、技術(shù)可行性分析和需求分析。
2、協(xié)助完成《系統(tǒng)詳細(xì)設(shè)計(jì)說明書》,并根據(jù)《系統(tǒng)詳細(xì)設(shè)計(jì)說明書》進(jìn)行編碼實(shí)現(xiàn);
3、對自己代碼進(jìn)行復(fù)查,并進(jìn)行簡單的測試。
4、撰寫相關(guān)技術(shù)實(shí)現(xiàn)或功能描述文檔。
5、負(fù)責(zé)向項(xiàng)目經(jīng)理及時(shí)反饋軟件開發(fā)中的情況,并根據(jù)實(shí)際情況提出改進(jìn)建議。
6、參與軟件開發(fā)和維護(hù)過程中重大技術(shù)問題的解決。
項(xiàng)目助理或文檔專員:協(xié)助項(xiàng)目經(jīng)理在項(xiàng)目日常管理和數(shù)據(jù)分析方面的工作,進(jìn)行與項(xiàng)目有關(guān)的協(xié)調(diào)工作,編寫項(xiàng)目進(jìn)度報(bào)表,參與組織項(xiàng)目協(xié)調(diào)會(huì),組織項(xiàng)目非技術(shù)文檔的編寫、傳遞與歸檔,以及與市場人員或其他部門的日常溝通,協(xié)助項(xiàng)目資源協(xié)調(diào)工作。跟蹤項(xiàng)目進(jìn)展。項(xiàng)目或軟件包的打包、發(fā)布以及授權(quán)鎖的制作等工作。
測試員:負(fù)責(zé)實(shí)施軟件測試。測試是整個(gè)項(xiàng)目系統(tǒng)中非常重要的一個(gè)環(huán)節(jié),項(xiàng)目質(zhì)量的保證,他的主要工作就是找到項(xiàng)目中存在的不合理、不合格的部份,并要求項(xiàng)目其它成員按其給定的項(xiàng)目質(zhì)量完成項(xiàng)目。保證了系統(tǒng)功能實(shí)現(xiàn)是否與功能設(shè)計(jì)和需求定義一致。主要職責(zé):
1、根據(jù)軟件項(xiàng)目規(guī)范編寫測試計(jì)劃,設(shè)計(jì)測試數(shù)據(jù)和測試用例。
2、采用合適的測試方法實(shí)施軟件測試,形成各階段的測試報(bào)告,并對軟件問題進(jìn)行跟蹤分析和反饋,推動(dòng)測試中發(fā)現(xiàn)問題及時(shí)合理地解決。
3、完成對產(chǎn)品的集成測試與系統(tǒng)測試,對產(chǎn)品的功能、性能及其他方面的測試負(fù)責(zé)。
4、協(xié)助程序員進(jìn)行軟件代碼檢查,提出對軟件的進(jìn)一步改進(jìn)的要求。
技術(shù)支持人員:主要負(fù)責(zé)軟件產(chǎn)品或項(xiàng)目在技術(shù)層面上與客戶的交流,根據(jù)工作重點(diǎn)分為售前支持和售后支持。
? 售前支持:是銷售人員和開發(fā)人員的橋梁,協(xié)調(diào)銷售人員、用戶、開發(fā)人員的關(guān)系,制作產(chǎn)品功能演示PPT文檔或多媒體資料,將公司的技術(shù)實(shí)力向用戶展示,技術(shù)標(biāo)書的撰寫,定期采集、分析和整理用戶的需求,配合銷售制訂產(chǎn)品銷售策略,從技術(shù)上支持市場銷售業(yè)務(wù)等。
? 售后支持:負(fù)責(zé)編寫《用戶手冊》、《操作手冊》,制作系統(tǒng)操作視頻教程等多媒體培訓(xùn)教材;負(fù)責(zé)系統(tǒng)實(shí)施(包括系統(tǒng)安裝、用戶培訓(xùn)、系統(tǒng)試運(yùn)行等),協(xié)助用戶進(jìn)行“用戶確認(rèn)測試”和編寫《確認(rèn)測試報(bào)告》;通過電話、網(wǎng)絡(luò)、及時(shí)通訊等多種渠道解答用戶在使用中的問題,提供售后服務(wù)。收集、整理用戶的建議等。
美工或網(wǎng)站前臺(tái)人員:負(fù)責(zé)完成軟件設(shè)計(jì)師安排的功能界面設(shè)計(jì)和簡單網(wǎng)站的設(shè)計(jì)。
1、負(fù)責(zé)對項(xiàng)目整體色彩的調(diào)配。
2、向系統(tǒng)分析師提出項(xiàng)目美化的建議。
3、為BS 項(xiàng)目提供一套或幾套CSS樣式表及HTML結(jié)構(gòu)表
4、為CS項(xiàng)目提供符合項(xiàng)目內(nèi)容的靜態(tài)、動(dòng)態(tài)圖片。
5、并為程序員提供界面指導(dǎo)。
如何快速融入技術(shù)團(tuán)隊(duì)
——程序員入崗的注意事項(xiàng)
同學(xué)們剛剛結(jié)束學(xué)校的集體生活,面對新的工作環(huán)境、新領(lǐng)導(dǎo)、新同事、新任務(wù)、新的制度、新的生活節(jié)奏,很多的變化需要你盡快適應(yīng),很多的事情需要你獨(dú)擋一面,而又有許多事情需要你與同事通力協(xié)作來完成…… 以下是新程序員入職后盡快融入技術(shù)團(tuán)隊(duì)?wèi)?yīng)注意的事項(xiàng):
1、認(rèn)真學(xué)習(xí)公司的發(fā)展背景與歷程、主營業(yè)務(wù)以及規(guī)章制度。
進(jìn)入公司前可能對公司已經(jīng)有了一些了解,入職后,相關(guān)人力資源管理部門會(huì)組織培訓(xùn),解讀公司文化,介紹公司發(fā)展背景、主要職能部門以及主要業(yè)務(wù)特點(diǎn),學(xué)習(xí)公司考勤、人事、辦公等管理規(guī)定和規(guī)章制度。有些新入職的程序員或技術(shù)人員,認(rèn)為這些不含技術(shù)成分沒有必要花精力去學(xué)習(xí),其實(shí)這種認(rèn)識(shí)是錯(cuò)誤的,公司文化及各種制度是整個(gè)公司的靈魂,是公司正常經(jīng)營活動(dòng)保障和員工行為的一種約定,新職員只有對公司的發(fā)展背景和經(jīng)營狀態(tài)有充分的了解,接受公司文化,高度認(rèn)同公司的核心價(jià)值觀,嚴(yán)格遵守各種規(guī)章制度,才能自覺地規(guī)范自己的行為習(xí)慣,在工作學(xué)習(xí)中才有主動(dòng)性,遇到工作壓力時(shí)也能坦然地接受,不會(huì)有抵觸心理,從而能更快地推動(dòng)自己的工作。
2、積極學(xué)習(xí)業(yè)務(wù)知識(shí)、類庫及現(xiàn)有程序資源,把握學(xué)習(xí)的技術(shù)方向。
程序員入職后,若有一個(gè)成熟的開發(fā)團(tuán)隊(duì),一般都會(huì)有一個(gè)老職員來帶領(lǐng)學(xué)習(xí),這一階段主要有三個(gè)方面的學(xué)習(xí)任務(wù),第一是公司業(yè)務(wù)知識(shí),因?yàn)槌绦騿T只有對業(yè)務(wù)知識(shí)熟悉了,才能更好的理解和把握功能需求,比如做通信方面的軟件,你要學(xué)習(xí)一些通信行業(yè)知識(shí);若做財(cái)務(wù)軟件,你要了解一些財(cái)務(wù)知識(shí)。第二,現(xiàn)有的類庫是公司開發(fā)部門積累的程序資源,學(xué)習(xí)和使用它可以規(guī)范統(tǒng)一程序的風(fēng)格,提高開發(fā)的速度,掌握并能使用這些資源,可使你盡快與老職員有程序上的共同語言。第三,學(xué)習(xí)并加強(qiáng)在此領(lǐng)域的編程技能,因?yàn)樵趯W(xué)校學(xué)習(xí)的是通用的知識(shí),掌握的是一種知識(shí)導(dǎo)入與學(xué)習(xí)的方法,那么在公司應(yīng)用方面也許要求你某一個(gè)方面很精通,比如網(wǎng)站的前臺(tái)、數(shù)據(jù)庫、圖形處理、多媒體、網(wǎng)絡(luò)編程等某些方面的技能需要強(qiáng)化。案例:
小張(男)和小胡(女)是同一個(gè)大學(xué)畢業(yè)的應(yīng)屆生,在2005年4月份同時(shí)進(jìn)入公司做技術(shù)支持,當(dāng)時(shí)兩人的工資都是每月1500元,而兩年后的今天小胡已是研發(fā)部的一個(gè)程序員,工資是每月4300元,而且是公司重點(diǎn)培養(yǎng)的對象之一。小張現(xiàn)在還是在做技術(shù)支持,工資是每月2600元,他們兩人可以說是起點(diǎn)相同,但兩年的發(fā)展卻讓他們有了明顯的差距,小胡比較愛學(xué)習(xí),工作非常踏實(shí),對業(yè)務(wù)知識(shí)也掌握得非常精通,而且在做技術(shù)支持工作的時(shí)候,業(yè)余時(shí)間學(xué)習(xí)編程,由于做技術(shù)支持與程序員交流比較多,小胡抓住了這個(gè)學(xué)習(xí)編程的機(jī)會(huì),但她從不在公司上班時(shí)間學(xué)習(xí)程序,在做技術(shù)支持工作時(shí),她上班時(shí)間鉆研業(yè)務(wù)知識(shí)、軟件需求、學(xué)習(xí)程序?qū)崿F(xiàn)的思想,業(yè)余時(shí)間練習(xí)代碼。在做技術(shù)支持一年后,她通過了研發(fā)部的考核,進(jìn)入研發(fā)部開始做編程。而小張與她對比就不同了,他只是做好本質(zhì)工作,沒有潛心學(xué)習(xí),對業(yè)務(wù)知識(shí)、軟件知識(shí)只是一般了解,工作上很業(yè)績平平,總體上不出色也沒出大的差錯(cuò)。工資漲得當(dāng)然也慢,小張和小胡的起點(diǎn)相同,但小胡比較主動(dòng)學(xué)習(xí),很明顯他們兩個(gè)在職場上的差距就拉開了。
3、展示進(jìn)步,創(chuàng)新思考,體現(xiàn)價(jià)值。
入職之初,通過積極的學(xué)習(xí)與適應(yīng),應(yīng)該說進(jìn)步是非??斓?,要及時(shí)的總結(jié),并把工作學(xué)習(xí)的總結(jié)和進(jìn)步程度及時(shí)向主管匯報(bào)(口頭、郵件、書面),階段工作總結(jié)應(yīng)包括以下幾點(diǎn):已經(jīng)完成的工作、技術(shù)上的進(jìn)步、業(yè)務(wù)上的進(jìn)步、從學(xué)生到職員心態(tài)上的轉(zhuǎn)變、八小時(shí)之外的學(xué)習(xí)狀態(tài)等。這樣一方面可以疏理一下知識(shí)結(jié)構(gòu),把握自己的學(xué)習(xí)階段,一方面讓主管根據(jù)你的知識(shí)結(jié)構(gòu)和技能狀態(tài)有針對性地給你分配合適的任務(wù)。
另外在工作當(dāng)中也要注重思考,對工作進(jìn)行適當(dāng)?shù)母倪M(jìn),并提出改進(jìn)意見,這樣能更快是體現(xiàn)出你的進(jìn)步和工作價(jià)值。
4、積極參加團(tuán)隊(duì)活動(dòng),適應(yīng)團(tuán)隊(duì)文化,創(chuàng)造與團(tuán)隊(duì)成員友好而積極的協(xié)作氛圍。
能盡快適應(yīng)團(tuán)隊(duì)文化,與同事友好溝通是任何崗位都需要的職業(yè)素質(zhì),只是在研發(fā)團(tuán)隊(duì)里要顯得尤為重要,由于研發(fā)工作的重要與特殊性,若在軟件商品化和產(chǎn)品化的開發(fā)階段,不良的溝通協(xié)作可能導(dǎo)致項(xiàng)目的流產(chǎn)。另外,部分程序員寫程序久了都會(huì)很注重與機(jī)器或代碼交流,有的不容易與新職員交流,有的他們因有大量的工作任務(wù)而顧不上,有的是因?yàn)樗麄冇刑嗟乃枷肱c創(chuàng)意,和一個(gè)新來的職員沒有共同語言,有的是人為設(shè)置“技術(shù)壁壘”(因擔(dān)心新職員威脅到自己的崗位,而不愿傳授一些知識(shí))。那么新職員一定不要因?yàn)樗麄儧]有主動(dòng)與你交流而放棄交流,或者認(rèn)為自己被冷落而與逐漸遠(yuǎn)離團(tuán)隊(duì),而是要在適當(dāng)?shù)臅r(shí)間與他們主動(dòng)交流,主動(dòng)向他們請教,積極參加團(tuán)隊(duì)的集體活動(dòng),創(chuàng)造與同事交流合作的良好氛圍。要盡可能地為團(tuán)隊(duì)多做貢獻(xiàn),不要因?yàn)槎喔梢恍┕ぷ骰蚨嗉右稽c(diǎn)班,就有不良的情緒,從而影響正常的溝通與交流。另外,在研發(fā)團(tuán)隊(duì)里的溝通與協(xié)作,還體現(xiàn)在代碼上,自己設(shè)計(jì)的功能模塊是否能為別人提供良好的說明和程序接口。總之,與同事友好愉快的協(xié)作,盡快融入研發(fā)團(tuán)隊(duì),是新入職的程序員技術(shù)快速進(jìn)步和穩(wěn)定職位的重要因素。
5、正確面對工作壓力,學(xué)會(huì)釋放“厭職”情緒。
許多同學(xué)進(jìn)入一個(gè)新的工作環(huán)境,面對的是很多新事物,感覺工作節(jié)奏太快,工作壓力太大。其實(shí)新職員有工作壓力也是正常的,從職業(yè)生涯發(fā)展的角度來看,這種工作壓力是非常必要的。同學(xué)們在進(jìn)入公司后,要勇于接受工作壓力,把這種壓力作為進(jìn)入初職鍛煉的良好機(jī)會(huì),樹立良好的心態(tài),不要逃避,更不要產(chǎn)生“厭職”情緒,公司還正在培養(yǎng)你,你卻選擇退縮而自炒“魷魚”。工作中要學(xué)會(huì)積極與同學(xué)溝通,注意工作方法,釋放和減輕壓力。其實(shí)我發(fā)現(xiàn)一些新職員說工作壓力大,做事不順心,仔細(xì)分析之后可以發(fā)現(xiàn)他們感覺的工作壓力大與“不合群”有很大的關(guān)系。有些同學(xué)到公司后,一坐下就是八小時(shí),語言和行為與同事格格不入導(dǎo)致他不敢言語不敢行動(dòng),下班時(shí)間到了,其實(shí)他不是工作學(xué)習(xí)本身的累,他們感到更累的是“心”。這些新職員在工作中總是希望別人主動(dòng)接近自己,自己卻不會(huì)主動(dòng)與人交流,時(shí)間長了,同事覺得他“不愛說話”,也就逐漸放棄了與他的交往,這時(shí)他又會(huì)感到被排擠,感到孤獨(dú),心理壓力就會(huì)增大。另外技術(shù)上單打獨(dú)斗,不能利用別人的資源,因此完成相同的工作,付出的努力和壓力就要比其他同事大得多。所以新職員在入職之初,一定要正確看待工作上正常的工作壓力,學(xué)會(huì)與團(tuán)隊(duì)成員友好相處,創(chuàng)造一種“如魚得水”的工作氛圍,那么真正技術(shù)上的壓力都不會(huì)成為問題的。
如果公司還沒有成熟的開發(fā)團(tuán)隊(duì),需要你一個(gè)人承擔(dān)開發(fā)項(xiàng)目,著手組建開發(fā)團(tuán)隊(duì),那么就要求你充分一切時(shí)間,利用網(wǎng)絡(luò)資源,有技術(shù)難點(diǎn)及時(shí)到網(wǎng)絡(luò)上尋求幫助,同時(shí)與相關(guān)部門人員密切合作,保持動(dòng)態(tài)及時(shí)的溝通,及時(shí)報(bào)告工作進(jìn)度,爭取盡快擬出解決方案或產(chǎn)品。
優(yōu)秀程序員應(yīng)具有的品質(zhì)與習(xí)慣
? 善于理解與把握需求
程序員的勞動(dòng)成果就是滿足需求的程序,那么在動(dòng)手寫代碼之前,只有完整地理解一個(gè)模塊的需求才能做出好的程序,優(yōu)秀的程序員在分析需求的基礎(chǔ)上,應(yīng)該能抓住問題的關(guān)鍵技術(shù),從而能夠建立合適的數(shù)據(jù)模型,盡量在代碼中少走“彎路”。? 善于學(xué)習(xí)與總結(jié)
當(dāng)然善于學(xué)習(xí),是對任何行業(yè)任何職業(yè)的最根本的要求,對于程序員,這種要求就更加高了。其實(shí)研發(fā)部門招聘程序員,其實(shí)并不一定注重你現(xiàn)在能做什么,而更注重的是你的學(xué)習(xí)能力、你的編程潛力,因?yàn)槌绦騿T是很容易被淘汰,很容易落伍的職業(yè),一種技術(shù)可能僅僅在三兩年內(nèi)具有領(lǐng)先性,若你不能跟進(jìn)新的技術(shù),不學(xué)習(xí)新的技能,那么不斷出現(xiàn)的新技術(shù)會(huì)使你顯得非常笨拙。善于總結(jié),也是學(xué)習(xí)能力的一種體現(xiàn),每次完成一個(gè)研發(fā)任務(wù),完成一段代碼,都應(yīng)當(dāng)有目的的跟蹤該程序的應(yīng)用狀況和用戶反饋,隨時(shí)總結(jié),找到自己的不足,這樣逐步提高,才能成長起來。
? 規(guī)范化的編碼習(xí)慣
養(yǎng)成良好的編碼習(xí)慣,比如:變量命名清晰,語句嵌套明確,函數(shù)具有獨(dú)立功能,適當(dāng)注釋等等,因?yàn)檫@些不但有助于代碼的移植和糾錯(cuò),也有助于不同人員之間的協(xié)作。? 良好的文檔習(xí)慣
良好的文檔是正規(guī)研發(fā)流程中非常重要的環(huán)節(jié),作為代碼程序員,30%的工作時(shí)間寫技術(shù)文檔是很正常的,而作為高級程序員和系統(tǒng)分析員,這個(gè)比例還要高很多。缺乏文檔,一個(gè)軟件系統(tǒng)就缺乏生命力,在未來的查錯(cuò),升級以及模塊的復(fù)用時(shí)就都會(huì)遇到極大的麻煩。? 代碼復(fù)用性,模塊化思維能力
復(fù)用性設(shè)計(jì),模塊化思維就是要程序員在完成任何一個(gè)功能模塊或函數(shù)的時(shí)候,要多想一些,不要局限在完成當(dāng)前任務(wù)的簡單思路上,想想看該模塊是否可以脫離這個(gè)系統(tǒng)存在,是否可以通過簡單的修改參數(shù)的方式在其他系統(tǒng)和應(yīng)用環(huán)境下直接引用,這樣就能極大避免重復(fù)性的開發(fā)工作,如果一個(gè)軟件研發(fā)單位和工作組能夠在每一次研發(fā)過程中都考慮到這些問題,那么程序員就不會(huì)在重復(fù)性的工作中耽誤太多時(shí)間,就會(huì)有更多時(shí)間和精力投入到創(chuàng)新的代碼工作中去。? 團(tuán)隊(duì)精神與溝通協(xié)作能力
這是程序員應(yīng)該具備的最基本的,也是最重要的安身立命之本。軟件或項(xiàng)目的各模塊功能需求的理解準(zhǔn)確,一個(gè)功能實(shí)現(xiàn)的修定,是否會(huì)影響其他模塊等,沒有充分及時(shí)的協(xié)作對一個(gè)項(xiàng)目來說幾乎是不可想象的。我做了幾年開發(fā),感覺溝通真的太重要了,其實(shí)軟件研發(fā)過程中最重要的不是技術(shù)問題,而是管理中的溝通問題,比如初級程序員或許是礙于面子或其他原因,不懂的問題也不想問,總是把問題掖著藏著,而高級程序員又不理解初級程序員的開發(fā)任務(wù)總是完不成,其實(shí)可能是高級程序員不了解初級程序員的真正困難,或者沒有把要實(shí)現(xiàn)的邏輯和思路講解清楚。合作起來總會(huì)有一些不透徹,要么一個(gè)問題討論多次依然是問題沒有結(jié)果,要么是有些問題根本不反映,大家都掖著藏著,報(bào)喜不報(bào)憂,待到問題暴露已無法挽回,嚴(yán)重的阻礙了項(xiàng)目的進(jìn)度。所以我最好的建議就是,高級程序員應(yīng)該把問題講到明白為止,初級程序員應(yīng)該把問題問到明白為止,并且不僅僅是口頭上講明白、聽明白,還一定要形成文字,現(xiàn)在網(wǎng)絡(luò)非常方便,公司都會(huì)有企業(yè)郵箱,把問題的討論過程通過mail的形式記錄保存,明確確認(rèn),這樣障礙才能去除,項(xiàng)目才能得以順利進(jìn)展。
案例1:
陳某是北京某重點(diǎn)大學(xué)自動(dòng)化專業(yè)的畢業(yè)生,編程基礎(chǔ)知識(shí)非常扎實(shí),在學(xué)校學(xué)習(xí)期間也有許多代碼積累,從技術(shù)上說應(yīng)該是很有潛力的,但他性格有點(diǎn)孤僻,不太容易與同事溝通,當(dāng)時(shí)錄用他時(shí)公司是看在他的編程基礎(chǔ)很好,以為在研發(fā)部大家多帶動(dòng)他,應(yīng)該會(huì)好些的。進(jìn)公司有兩個(gè)多月了,一次在做某油田項(xiàng)目中負(fù)責(zé)其中一個(gè)小模塊的開發(fā),在開發(fā)過程中我經(jīng)常詢問他有沒什么問題,他每次都有些含糊地說沒有??僧?dāng)項(xiàng)目交付的時(shí)候,發(fā)現(xiàn)他做的某一功能與當(dāng)初功能定義不符,客戶就抓住這一點(diǎn)說與合同中需求描述不符,由此延期支付28萬的余款,使該項(xiàng)目后期維護(hù)起來非常被動(dòng)。而導(dǎo)致這一結(jié)果就是陳某在做程序時(shí)有問題自己繞過去了,沒有及時(shí)與項(xiàng)目組成員交流,而獨(dú)自采用了他熟悉的一種解決辦法。項(xiàng)目匯報(bào)會(huì)剛結(jié)束,人事部門就通知陳某交接工作,到財(cái)務(wù)結(jié)算工資…..文摘:下面這故事《請按一下九層》我一直和我的同事們分享。是《讀者》中的一篇文章: 這是全市最忙的一部電梯,上下班高峰時(shí)期,和公共汽車差不多,人挨著人。上電梯前和公司的人力資源總監(jiān)相遇,說笑間,電梯來了,我們隨人群一擁而進(jìn)。每個(gè)人轉(zhuǎn)轉(zhuǎn)身子,做一小小的調(diào)整,找到了一種相對融洽的關(guān)系。這時(shí),一只胳膊從人逢中穿過來,出現(xiàn)在我的鼻子前頭。我扭頭望去,一個(gè)小伙子隔著好幾個(gè)人,伸手企圖按電鈕。他夠得很辛苦,好幾個(gè)人剛剛站踏實(shí)的身子不得不前挺后撅,發(fā)生了一陣小小的騷動(dòng)。
那個(gè)人力資源總監(jiān)問道:“你要去哪一層?”“九層。”有人抬起一個(gè)手指頭立刻幫他按好了。沒有謝謝。
下午在樓道里又碰到那個(gè)人力資源總監(jiān)?!斑€記得早上電梯里那個(gè)要去九層的小伙子嗎?”她問我。
“記得呀,是來應(yīng)聘的吧?”九層,人力資源部所在地。“沒錯(cuò),挺好的小伙子,可我沒要他。”“為什么?”
“缺少合作精神?!彼冻鲆桓睂I(yè)HR的神情,“開口請求正當(dāng)?shù)膸椭鷮λ麃碚f是件很困難的事情,得到幫助也不懂得感激。這種人很難讓別人與他合作?!?/p>
我點(diǎn)頭稱是。如果那個(gè)小伙子坦然而自信地說一句“請按一下九層”,結(jié)果會(huì)怎樣呢?大家不但不會(huì)反感他的打擾,而且?guī)椭娜诉€會(huì)心生助人的快樂,最后他也能得到想要的工作。
這個(gè)故事表明,良好溝通不僅僅體現(xiàn)在禮貌地說聲“請”、“謝謝”,而是一個(gè)職員能夠創(chuàng)造愉快、高效、和諧工作氛圍的素質(zhì)和習(xí)慣。
? 時(shí)刻修定自己的認(rèn)識(shí)和行為與公司的核心價(jià)值觀(短期目標(biāo)、長期目標(biāo))保持一致
公司或研發(fā)團(tuán)隊(duì)在什么時(shí)段做什么樣的項(xiàng)目,或者根據(jù)項(xiàng)目進(jìn)度的計(jì)劃,在什么時(shí)間做什么功能模塊,作為程序員要高度地與這些目標(biāo)保持一致,不要在關(guān)鍵時(shí)刻“掉鏈子”,這是最重要的。
案例:
小張是公司里的轉(zhuǎn)正不久的程序員,很聰明,對新技術(shù)接受很快,缺點(diǎn)就是非常的貪玩,對項(xiàng)目組的事缺乏主動(dòng)性和責(zé)任心,平時(shí)的工作中主管已經(jīng)提醒過他多次要注意工作的責(zé)任心,但他都不太放在心上,對事依然是敷衍。一次在做上海鐵通的項(xiàng)目中,小張負(fù)責(zé)項(xiàng)目中的一個(gè)模塊,當(dāng)軟件架構(gòu)出來以后,需要出差上海為客戶現(xiàn)場演示和進(jìn)一步確認(rèn)需求,由于合同還沒有正式簽下來,所以此行的技術(shù)交流對公司能不能簽下這個(gè)項(xiàng)目至關(guān)重要,公司派由我和小張?jiān)趦?nèi)的項(xiàng)目組4人出差上海,臨行前我們多次開會(huì)研究方案,確保拿下這個(gè)項(xiàng)目,下午到了上海之后約好第二天上午與客戶見面,正當(dāng)大家為第二天的交流捏一把汗,積極準(zhǔn)備的時(shí)候,小張卻說是第一次到上海,要求先去外灘看夜景,在得到項(xiàng)目組的否定之后,小張竟一個(gè)人偷偷到外灘看夜景至到深夜才回到賓館。第二天的技術(shù)交流會(huì)上,小張負(fù)責(zé)的模塊問題最多,雖然最后整個(gè)項(xiàng)目的交流還算成功,公司總算簽下了這個(gè)項(xiàng)目,但小張也被辭退了。原因很簡單,小張一直沒有把公司的事放在心上,項(xiàng)目組出差第一目標(biāo)是與客戶交流好,拿下項(xiàng)目,而小張出差上海的第一目標(biāo)是看一下外灘。所以象小張這樣的技術(shù)上不管有多么出色,但總在公司的關(guān)鍵時(shí)刻“掉鏈子”,被公司辭退也是早晚的事。就在寫此案例的前幾天,在地鐵上我偶遇小張,談話中得知他被辭退后半年內(nèi)又經(jīng)歷了一家公司。而此刻他又在匆匆地找工作。
談?wù)剬W(xué)習(xí)方法
說起學(xué)習(xí)的方法,其實(shí)每個(gè)人都有自己的學(xué)習(xí)方法,也許這種方法對我來說有用,但不見得就對所有的人有用。所以,不要盲目的跟著別人的學(xué)習(xí)方法學(xué)習(xí),要思考屬于自己的學(xué)習(xí)方法。但以下幾個(gè)原則是要遵守的: ? 堅(jiān)持學(xué)習(xí)。首先要有毅力,對編程的狂熱也可以在一定程度上起到幫助。學(xué)習(xí)編程應(yīng)該說要經(jīng)歷好奇——困難——容易——郁悶——成就感——困惑——輕松的幾個(gè)階段的循回,不管哪個(gè)階段都需要天天學(xué)習(xí),堅(jiān)持每天都要進(jìn)步,不能半途而廢,培養(yǎng)一種堅(jiān)持克服困難的毅力。案例: 記得開發(fā)團(tuán)隊(duì)里有一個(gè)基礎(chǔ)不是太好的程序員,剛?cè)肼殐蓚€(gè)多月,表現(xiàn)一般,有一天早上他眉飛色舞地在講述昨天電視中的一個(gè)情節(jié),我聽到后就說了一句:“你還好意思說你看電視?”。他立刻明白了,就沒說什么。從此他的進(jìn)步是可以說是突飛猛進(jìn)的,代碼的質(zhì)量和工作效率明顯上了一個(gè)臺(tái)階,對項(xiàng)目的推動(dòng)也是有目共睹的。幾個(gè)月后的一次公司慶典上,他被評為“進(jìn)步最快員工獎(jiǎng)”,獎(jiǎng)金3000元。獎(jiǎng)后在他給我的Mail中發(fā)現(xiàn)了這句話:“你說我看電視的那句話改變了我的學(xué)習(xí)狀態(tài)….我現(xiàn)在是馬桶上、公交車上都在看書或筆記?!?/p>
? 堅(jiān)持實(shí)踐。當(dāng)你學(xué)到了一種新的技術(shù)或知識(shí)時(shí),多實(shí)踐是鞏固學(xué)習(xí)的一種最好最有效的方法。這個(gè)實(shí)踐不是照著書上的例子做一遍,而是根據(jù)自己的能力,給自己出題,然后去完成它。只有這樣,你才能發(fā)現(xiàn)自己的不足,同時(shí)又增加了編程經(jīng)驗(yàn)。要成為合格的程序員,光會(huì)寫代碼是遠(yuǎn)遠(yuǎn)不夠的,更重要的是在實(shí)踐中思考創(chuàng)新。實(shí)踐的多少?zèng)Q定著“高手”和一般程序員界線,高手們并不是天才,他們是在無數(shù)個(gè)日日夜夜中磨煉出來的。成功能給我們帶來無比的喜悅,但實(shí)踐的過程卻是無比的枯燥乏味。
? 掌握編程思想。學(xué)一門語言,不能僅僅是語言,還要注重語言背后的思想方法,獲得提出問題,分析問題,解決問題的能力,不是為編程而學(xué)習(xí),因?yàn)榫幊陶Z言和我們?nèi)粘Kf的語言一樣,日常所說的語言是一種思想的表達(dá),而編程語言是一種功能的實(shí)現(xiàn)。要學(xué)習(xí)它是如何來解決某一問題的,為什么要這樣去做,他總是要符合客觀事實(shí)的,存在某種邏輯,數(shù)據(jù)的組織,信息的傳遞,然后看該怎么樣用編程語言來表達(dá)自己的想法。
? 多問、多總結(jié)、多記筆記。“三人行必有我?guī)煛?,也許在一次和別人不經(jīng)意的談話中,就可以迸出靈感的火花。著名的交換蘋果理論說的是:“你有一個(gè)蘋果,我有一個(gè)蘋果,當(dāng)我們互相交換蘋果后,我們?nèi)匀换サ靡粋€(gè)蘋果;你有一個(gè)想法,我有一個(gè)想法,當(dāng)我們互相交換想法,我們則互得兩個(gè)想法”。遇到問題,上網(wǎng)查看一些技術(shù)論壇,看看別人對同一問題的看法,會(huì)給你很大的啟發(fā)。在這個(gè)網(wǎng)絡(luò)時(shí)代,資料到處都有,無論什么先進(jìn)的技術(shù),你可以問身邊的高手,問網(wǎng)上的同仁,只要查到資料,快的學(xué)上幾天慢的一兩個(gè)月也能學(xué)會(huì),學(xué)會(huì)后總結(jié)出技術(shù)要點(diǎn)記下來,可寫在本子上也可寫在Blog上,編程技能的提高靠的是代碼的積累,把所有自己的代碼保存起來,并附有適當(dāng)?shù)墓P記,這樣,到用到時(shí)才能信手拈來,才能獲得踏踏實(shí)實(shí)的進(jìn)步。所以現(xiàn)在已沒有寫不出的程序了,寫不出不是因?yàn)椴粔蚵斆鳎且驗(yàn)槟銢]有耐心和找 BUG 的細(xì)心。
? 不鉆“牛角尖”,只抓主要問題,一些不影響工作的難點(diǎn)只要會(huì)用就行,這也體現(xiàn)了OOP的思想,你只要知道一個(gè)技術(shù)能完成什么功能就可以,至于它是如何實(shí)現(xiàn)的可暫時(shí)放一放,有時(shí)回過頭來再看就不是什么難點(diǎn)了。當(dāng)你遇到技術(shù)障礙的時(shí)候,不妨?xí)簳r(shí)遠(yuǎn)離電腦,看看窗外的風(fēng)景,聽聽輕音樂,和朋友聊聊天。當(dāng)重新開始工作的時(shí)候,我會(huì)發(fā)現(xiàn)那些難題現(xiàn)在竟然可以迎刃而解。
外包軟件、商品軟件、項(xiàng)目軟件的操作模式簡介
軟件外包
就是一些發(fā)達(dá)國家的軟件公司將他們的一些非核心的軟件項(xiàng)目通過外包的形式交給人力資源成本相對較低的國家的公司開發(fā),以達(dá)到降低軟件開發(fā)成本的目的。因?yàn)檐浖_發(fā)的成本中70%是人力資源成本,所以,降低人力資源成本將有效地降低軟件開發(fā)的成本。軟件外包已經(jīng)成為發(fā)達(dá)國家的軟件公司降低成本的一種重要的手段。軟件外包的大幅度增長為人力資源成本相對較低的印度和中國帶來了新的發(fā)展機(jī)會(huì)。企業(yè)與企業(yè)之間的外包就是:企業(yè)(A)為了專注核心競爭力業(yè)務(wù)和降低軟件項(xiàng)目成本,將軟件項(xiàng)目中的全部或部分工作發(fā)包給提供企業(yè)(B)完成; 商業(yè)軟件 商業(yè)軟件(又叫“商品軟件”)就是由商業(yè)公司在調(diào)研大多數(shù)行業(yè)用戶的需求上開發(fā)的軟件,該軟件基本上能滿足這些用戶的需求,而且它的功能不會(huì)因個(gè)別或少數(shù)用戶的要求而改動(dòng)。隨著互聯(lián)網(wǎng)的興起和軟件授權(quán)銷售方式的普及,商品軟件的銷售可軟件公司直銷、代理銷售、專業(yè)下載網(wǎng)站銷售等多種渠道,軟件授權(quán)許可的銷售模式往往是根據(jù)使用商品軟件的用戶數(shù)和安裝該軟件的計(jì)算機(jī)數(shù)來收取許可費(fèi)用。項(xiàng)目軟件 就是軟件公司專門為某個(gè)客戶開發(fā)的軟件系統(tǒng),該系統(tǒng)由委托開發(fā)的客戶配合調(diào)研需求,“量體裁衣”,在關(guān)鍵階段雙方可派技術(shù)人員互相“滲透”,密切合作,共同完成系統(tǒng)的開發(fā)和實(shí)施以及運(yùn)行。項(xiàng)目軟件與外包軟件的操作模式有相同性也有不同性。產(chǎn)品經(jīng)理與項(xiàng)目經(jīng)理
簡單地說,產(chǎn)品經(jīng)理是做正確的事,其所領(lǐng)導(dǎo)的產(chǎn)品是否符合市場的需求,是否能給公司帶來利潤的。而項(xiàng)目經(jīng)理是把事情做正確,把事情作得完美,在時(shí)間,成本和資源約束的條件下完成目標(biāo)。項(xiàng)目經(jīng)理要對某個(gè)產(chǎn)品進(jìn)行開發(fā)的管理,負(fù)責(zé)開發(fā)的進(jìn)度,開發(fā)過程中的協(xié)調(diào)等有關(guān)開發(fā)方面的問題,他最大的目標(biāo)是時(shí)間第一、立項(xiàng)目標(biāo)達(dá)成第一。并不會(huì)很尊重產(chǎn)品本身的市場需求以及業(yè)務(wù)邏輯的問題。
而產(chǎn)品經(jīng)理是橫向管理的,也就是說他將負(fù)責(zé)某個(gè)產(chǎn)品或者某個(gè)產(chǎn)品線從商業(yè)計(jì)劃市場競爭開發(fā)需求推廣方案渠道策略等各個(gè)方面。產(chǎn)品經(jīng)理一個(gè)產(chǎn)品線從頭到尾的重要參與人。
第三篇:RPG AS400程序員培訓(xùn)手冊6
CL、CMD
其實(shí)有關(guān)這一章,以及屏幕文件的,在網(wǎng)上已經(jīng)有很多人寫過了,想了想,還是說一下吧。
5.1 CL 程序
5.1.1 基本認(rèn)識(shí)
簡單的理解,CL 程序就是和RPG 相對應(yīng)的,是控制語言(Control Language)。類型為
CLP、CLLE 的源代碼編譯出來的程序,都屬于CL 程序。
可能還是不夠直觀,這么說吧,我們在交互式命令行上輸入的命令,用程序的方式來執(zhí)
行,這個(gè)執(zhí)行的程序,就是CL 程序。
學(xué)過UNIX 的會(huì)比較好懂,CL 程序有點(diǎn)類似于SHELL,不過SHELL 是可以直接執(zhí)行的,而且不用編譯;CL 程序需要編譯,而且要用CALL 的方式來執(zhí)行。不過原理是接近的,都是在程序中直接調(diào)用命令行的語句。
所以說,CL 程序其實(shí)很好寫,只要會(huì)輸入命令,就可以寫CL 程序了。在編輯CL 程
序時(shí),也可以用“命令 + F4”的方式來寫,不需要老老實(shí)實(shí)的整行輸入。
CL 程序不像RPGLE 程序,在編寫時(shí),可以使用自由格式書寫;一行的內(nèi)容如果太長
要,在最末尾處用“+”表示換行
舉個(gè)最簡單的例子,比如說新建個(gè)名為FHS01CL 的CLP 源程序,代碼如下:
PGM
WRKACTJOB
ENDPGM
編譯此程序,然后CALL 之,系統(tǒng)就會(huì)執(zhí)行命令WRKACTJOB,查看當(dāng)前的活動(dòng)作業(yè),效果與在交互式命令行下輸入WRKACTJOB 是一樣的。
當(dāng)我們輸入F12,退出WRKACTJOB 時(shí),系統(tǒng)就會(huì)繼續(xù)向下執(zhí)行,發(fā)現(xiàn)是ENDPGM,表示程序結(jié)束了,于是判定執(zhí)行完畢,退出至交互式畫面。
5.1.2 CL 程序的常用語法及命令:
一、程序的開始與結(jié)束:
PGM PARM(&A &B)/* 開始CL 程序 */
ENDPGM /* 結(jié)束CL 程序 */
CL 程序,和RPGLE 程序一樣,也可以有程序的入口參數(shù),而且程序的入口參數(shù)
都是可傳遞的(也就是輸入的參數(shù)如果在程序中被修改過,那么原調(diào)用的程序中的相應(yīng)
參數(shù)也會(huì)進(jìn)行變化。不過CL 的入口參數(shù)只能為字符型,或數(shù)字型的單個(gè)字段,不能象
RPGLE 程序中那么多樣化(字段、結(jié)構(gòu)、數(shù)組、指針)。
如果CL 程序沒有入口參數(shù)時(shí),那么就可以不需要后面的PARM 語句,直接寫成PGM
即可。
寫CL 程序時(shí),不妨多使用F4,看看系統(tǒng)的幫助,這樣就不用記那么多命令的參
數(shù)名。
二、變量及其定義
CL程序中的所有變量,都使用&做為前綴,這一點(diǎn)與RPGLE 程序不同。比如說
PGM PARM(&A &B)
就表示入口參數(shù)為A、B 這兩個(gè)變量
在CL 程序中使用到的變量,都必須使用DCL 語句來定義:
DCL VAR(&FLD01)TYPE(*CHAR)LEN(10)
DCL VAR(&FLD02)TYPE(*DEC)LEN(10 2)
上述語句表示:
定義變量FLD01,10 位長的字符型變量
定義變量FLD02,10 長,其中2 位小數(shù)的數(shù)字型變量
除了字符、數(shù)字之外,CL 程序還可以定義邏輯變量(*LGL),邏輯變量允許的值只
能為’1’或’0’。不過通常有字符與數(shù)字也就夠了。CL 程序的主要功能在于進(jìn)行命令處理,而不是處理字符串以及數(shù)據(jù)庫
三、CL 常用命令:
CHGVAR--變量賦值
CHGVAR VAR(&FLD01)VALUE(‘ABCD’)
即是將變量FLD01 賦值成為’ABCD’(左對齊),同理,VALUE 的括號(hào)中也可
以填寫一個(gè)變量,即表示將此變量的值賦值到變量FLD01 中。
數(shù)字型變量的賦值同樣也是使用CHGVAR 語句。
當(dāng)變量中只包含數(shù)字時(shí)(0—9),數(shù)字型變量與字符型變量可以使用CHGVAR
語句進(jìn)行轉(zhuǎn)換,這一點(diǎn)與RPGLE 中的MOVE 語句比較類似。
IF--條件判斷語句
IF COND(&FLD01 *EQ '1')THEN(CHGVAR VAR(&FLD02)+
VALUE('0'))
當(dāng)變量FLD01 等于’1’時(shí),將變量FLD02 中的值更改為’0’
THEN 后面,即是當(dāng)符合條件時(shí),要執(zhí)行的命令。寫起來其實(shí)沒有看上去那么
復(fù)雜,多用F4 就會(huì)發(fā)現(xiàn)CL 程序?qū)懞唵巍?/p>
就比如上例,先寫IF,然后按F4,在Condition 處填寫條件語句,然后在
Command 處填上CHGVAR,再按F4,再去填相應(yīng)的處理語句,這樣寫,就比直
接把整句抄下來就簡單多了。
上面這種寫法,只能在符合條件時(shí),執(zhí)行一條CL 語句;如果要執(zhí)行多條,就
必須寫做:
IF COND(&FLD01 *EQ '1')THEN(DO)
CHGVAR VAR(&FLD02)VALUE(‘0’)
其它執(zhí)行語句
ENDDO 也就是THEN 后面,用DO,表示接下來的語句都是在這個(gè)IF 條件成立時(shí)才
執(zhí)行(DO)的。
然后結(jié)束處用ENDDO,必須要有。ENDDO 在這里和循環(huán)沒有任何關(guān)系,表
示的是ENDIF 的意思,但是CL 語句里沒有ENDIF,只有ENDDO。
IF 語句中,表示判斷的關(guān)鍵字與RPGLE 中的Ifxx 操作碼類似,有
*EQ *GT *LT *GE *LE *NE
用來表示邏輯關(guān)系的關(guān)鍵字有
*AND, *OR, *NOT
GOTO--跳轉(zhuǎn)語句
GOTO 語句與RPGLE 中的GOTO 是一樣的,都是跳轉(zhuǎn)的意思。
FHSTAG:
GOTO CMDLBL(FHSTAG)
注意,這里定義標(biāo)簽是用“:” 冒號(hào)
MONMSG--監(jiān)控錯(cuò)誤信息
我們使用CL 語句時(shí),執(zhí)行的命令可能會(huì)報(bào)出一些異常錯(cuò)誤,從而導(dǎo)致整個(gè)程
序中斷,需要手工干預(yù)。MONMSG 命令可以監(jiān)控我們預(yù)定的錯(cuò)誤信息,使CL 程
序正常的向下運(yùn)行。舉例而言,如果CL 程序中有如下語句:
CALL PGM(FHS01R)
MONMSG MSGID(CPF4131)
則表示當(dāng)系統(tǒng)調(diào)用程序FHS01R 時(shí),如果發(fā)現(xiàn)有CPF4131(聲明的文件重新編
譯過,但程序未重新編譯)的錯(cuò),那么CL 程序?qū)⒉粫?huì)異常中斷,僅僅只是不運(yùn)行
程序FHS01R,然后繼續(xù)向下執(zhí)行CL 程序
MONMSG 還可以用于在監(jiān)控到錯(cuò)誤信息之后,進(jìn)行處理,如下:
CALL PGM(FHS01R)MONMSG MSGID(CPF4131)EXEC(CHGVAR VAR(&FLD01)+
VALUE('0'))
這句話就表示當(dāng)發(fā)現(xiàn)有CPF4131 的錯(cuò)誤之時(shí),將變量FLD01 賦值成為’0’
如果要執(zhí)行多句的話,和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 的括號(hào)的參數(shù)中,第一個(gè)參數(shù)必須為字符型變量,第二個(gè)參數(shù)表示起始位,第三個(gè)參數(shù)表示要截取的長度。
*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 不能去掉字符串末尾的空,從效果上來看,有點(diǎn)類似于RPGLE 中的EVAL 操作碼,而不是CAT 操作碼
+、-、*、/--數(shù)學(xué)運(yùn)算
數(shù)字型變量,可以進(jìn)行數(shù)學(xué)運(yùn)算 CHGVAR VAR(&FLD01)VALUE(&FLD01 + &FLD02)
即等同于RPGLE 程序中的 EVAL FLD01 = FLD01 + FLD0
2同理,-、*、/ 分別對應(yīng)減、乘、除
不過數(shù)學(xué)運(yùn)行常用于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 的臨時(shí)變量FLD01 中。
如果要將一個(gè)文件從頭讀到尾,則可以用如下語句來實(shí)現(xiàn):
DCLF FILE(FHSLIB/PFFHS)
LOOP:
RCVF
MONMSG MSGID(CPF0864)EXEC(GOTO CMDLBL(EXIT))
讀取到每條記錄后的處理語句
GOTO CMDLBL(LOOP)
EXIT:
也就是說,信息CPF0864,即表示未讀取到記錄。
在CL 程序中聲明文件使用DCLF 語句,一個(gè)CL 文件中只能聲明一個(gè)文件,聲明
語句必須在CL 控制語句之前。
使用聲明的文件中的字段,同樣需要在字段名前加上“&” ;
CL 程序中,無法控制游標(biāo),無法對記錄進(jìn)行定位操作。所以CL 程序?qū)ξ募牟? 作是比較弱的,通常我最多只用來讀取某些只含少量記錄的參數(shù)文件。
5.2 CMD
CMD 是用來生成命令的,執(zhí)行后可以像其它系統(tǒng)命令一樣,直接輸入命令,或是F4,不需要像CLP 一樣,要CALL 一下。
其實(shí)CMD 本質(zhì)上也是執(zhí)行CLP 或RPGLE(在編譯時(shí)指定),用起來,無非就是好看點(diǎn),直接一些,除此之外的意義,似乎也就沒什么了。
舉個(gè)例子,比如我們查看一個(gè)文件中的內(nèi)容時(shí),可以使用SQL 來查看,也可以使用命
令RUNQRY 命令來實(shí)現(xiàn)(RUNQRY QRYFILE(文件名))。但在我們要頻繁查看文件
時(shí),這兩種方式似乎都不是很爽,也就是說要輸入的內(nèi)容都不是最少的,那我們可以設(shè)計(jì)一
個(gè)CMD,譬如說叫SEE,希望實(shí)現(xiàn)的最終效果,是在命令行輸入“SEE 文件名”,就
可以查看PF 文件中的記錄。那么,我們按如下步驟來實(shí)現(xiàn):
1.建立一個(gè)CLP 程序,比如叫SEECLP,代碼如下
PGM PARM(&FILENAME)
RUNQRY QRYFILE(&FILENAME)
ENDPGM
2.編譯此程序
3.建立一個(gè)CMD 程序(即源代碼的屬性為CMD),代碼如下:
CMD PROMPT(' 顯示文件記錄 ')
PARM KWD(NAME)TYPE(*CHAR)LEN(10)MIN(1)+
CHOICE(' 顯示文件記錄內(nèi)容 ')+
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
其中,藍(lán)色字體顯示的,就是我們需要輸入這個(gè)CMD 要調(diào)用的程序名(默認(rèn)值與
CMD同名),這里我們將此項(xiàng)內(nèi)容填為SEECLP,表示SEE 這個(gè)CMD,調(diào)用的是SEECLP
這個(gè)程序
5.編譯成功之后,我們在命令行執(zhí)行“SEE 文件名”,就可以看到指定文件的記錄。也可以用SEE + F4 的方式來使用
6.要注意,CMD 中,PARM 表示的就是CMD 命令的參數(shù),參數(shù)的個(gè)數(shù)、類型、長
度都必須與其調(diào)用的程序相匹配,但名稱可以與其調(diào)用的程序中的參數(shù)名稱不一
樣,而且名稱前面不能有“&”字符。
7.在PARM 參數(shù)中,MIN(1),表示該項(xiàng)參數(shù)必須有值(即最小的有效長度為1),當(dāng)
參數(shù)無值時(shí),將會(huì)自動(dòng)出現(xiàn)SEE + F4 的效果,同時(shí)該項(xiàng)參數(shù)高亮顯示。試一試
就知道了
第四篇:程序員入門進(jìn)階手冊
這篇文章,我主要是讓你成為更為專業(yè)的入門程序員。請注意,此時(shí),你可能需要讀一些比較枯燥的書,但我想說,這些是非常非常重要的。你一定要堅(jiān)持住。
編程技能
在系統(tǒng)地學(xué)習(xí)編程技能之前,我希望你能先看一下 “ The Key To Accelerating Your Coding Skills”,這篇文章會(huì)告訴你如何有效地快速提高自己的編程能力。然后接下來是下面幾大塊內(nèi)容,但還只是入門級的。
編程技巧方面這個(gè)階段,你可以開始了解一下 Java 語言了,我個(gè)人覺得 Java 是世界上目前為止綜合排名最好的語言。你一定要學(xué)好這門語言。推薦《Java 核心技術(shù)(卷 1)》,除了讓你了解 Java 的語法,它還會(huì)讓你了解面向?qū)ο缶幊淌莻€(gè)什么概念(如果你覺得這本書有點(diǎn)深,那么,你可以降低難度看更為基礎(chǔ)的《Head First Java》)。然后,既然開始學(xué)習(xí)Java 了,那就一定要學(xué) Spring,推薦看看《Spring in Action》或是直接從最新的 Spring Boot 開始,推薦看看《Spring Boot 實(shí)戰(zhàn)》。關(guān)于 Spring 的這兩本書,里面可能會(huì)有很多你從來沒有聽說過的東西,比如,IoC 和 AOP 之類的東西,能看懂多少就看懂多少,沒事兒。?
操作系統(tǒng)。這里你可以看看《鳥哥的 Linux 私房菜》,這本書會(huì)讓你對計(jì)算機(jī)和操作系統(tǒng),以及 Linux 有一個(gè)非常全面的了解,并能夠管理或是操作好一個(gè) Linux 系統(tǒng)。當(dāng)然,這本書有很多比較專業(yè)的知識(shí),你可能會(huì)看不懂,沒關(guān)系,就暫時(shí)略過就好了。這本書的確并不適合初學(xué)者,你能看多少就看多少吧。
? 網(wǎng)絡(luò)協(xié)議你需要系統(tǒng)地了解一下數(shù)據(jù)庫設(shè)計(jì)中的那些東西,這里推薦慕課網(wǎng)的一個(gè)在線課程--“數(shù)據(jù)庫設(shè)計(jì)的那些事”。每個(gè)小課程不過 5-6 分鐘,全部不到 2 個(gè)小時(shí),我相信你一定能跟下來。你需要搞清楚數(shù)據(jù)的那幾個(gè)范式,還有 SQL 語句的一些用法。當(dāng)然,你還要學(xué)習(xí)和使用一下數(shù)據(jù)庫,這里推薦學(xué)習(xí)開源的 MySQL。你可以看官方文檔,也可以看一下這本書《MySQL 必知必會(huì)》。? 前端方面在你處理中文時(shí)有時(shí)會(huì)發(fā)現(xiàn)有亂碼出現(xiàn),此時(shí)需要了解 ASCII 和 Unicode 這樣的字符編碼。這里推薦一篇文章Character encoding。還有 Github 上的這兩個(gè) Awesome 倉庫:Awesome Unicode 和 Awesome Code Points。?
為什么轉(zhuǎn)成 Java 語言?
相信你可能會(huì)問,為什么之前學(xué)習(xí)的 Python 和 JavaScript 不接著學(xué),而是直接切到 Java 語言上來,這樣會(huì)不會(huì)切得太快了。這是一個(gè)好問題,這里需要說明一下,為什么我會(huì)切到 Java 這個(gè)語言上來,主要是有以下幾方面考慮。1.Java 是所有語言里面綜合實(shí)力最強(qiáng)的,這也是為什么幾乎所有大型的互聯(lián)網(wǎng)或是分布式架構(gòu)基本上都是 Java 技術(shù)棧。所以,這是一個(gè)工業(yè)級的編程語言(Python 和 JavaScript 還達(dá)不到這樣的水準(zhǔn))。
2.之所以,沒有用 Java 來做入門語言而是用了 Python,這是因?yàn)榫幊淌且患容^費(fèi)腦子的事,一開始學(xué)習(xí)時(shí),興趣的培養(yǎng)很重要。Python 比較簡單,容易上手,能夠比較容易地提起興趣,而用 Java 則可能比較難。3.在你有了一些編程語言的基礎(chǔ)后,有了一些代碼的邏輯后,切到工業(yè)級的編程語言上來,更為專業(yè)地學(xué)習(xí)編程,是非常有幫助的。像 Python 和 JavaScript 這樣的動(dòng)態(tài)語言用著是很爽,但是,只有像 C、C++ 和 Java 這樣的靜態(tài)語言才可以讓你真正地進(jìn)階。
4.對于一個(gè)合格的程序員,掌握幾門語言是非常正常的事情。一方面,這會(huì)讓你對不同的語言進(jìn)行比較,讓你有更多的思考。另一方面,這也是一種學(xué)習(xí)能力的培養(yǎng),會(huì)讓你對于未來的新技術(shù)學(xué)習(xí)得更快。很多時(shí)候,一些程序員只在自己熟悉的技術(shù)而不是合適的技術(shù)上工作,這其實(shí)并不好,這會(huì)讓你的視野受限,而視野會(huì)決定你的高度。綜上所述,這就是在入門的時(shí)候我故意讓你多學(xué)幾門語言的原因。
編程工具
編程工具方面,你需要開始學(xué)習(xí)使用下面這些工具了。
? 編程的 IDE。傳統(tǒng)一點(diǎn)的,你可以使用 Eclipse。當(dāng)然,我推薦你使用 Intellij IDEA。這兩個(gè)工具都可以開發(fā)各種語言,但是主要用在 Java。如果你想玩得更時(shí)髦一些的話,使用 Visual Studio Code 也不錯(cuò),這個(gè)工具潛力十足,用其開發(fā) Python、JavaScript、Java、Go、C 和 C++ 都能得心應(yīng)手(教程-本文發(fā)布時(shí)還基本沒怎么翻譯完)。
? 版本管理工具。版本管理工具是非常重要的編程工具。傳統(tǒng)的有 P4、SVN、CVS 等,但都會(huì)被 Git 取代,所以,你就只用學(xué)習(xí)Git 就好了。學(xué)習(xí)Git 的教程網(wǎng)上有很多,這里我推薦非常系統(tǒng)的 Pro Git 第二版(如 果你覺得 Pro Git 比較枯燥的話,備選猴子都能懂的 Git 入門),然后你要學(xué)會(huì)使用 GitHub。關(guān)于一些 Git 環(huán)境安裝和準(zhǔn)備以及 GitHub 使用,你可以自行 Google(比如:這篇Github and Git 圖文教程 或是這篇Git 圖文教程及詳解)。
? 調(diào)試前端程序。你需要學(xué)會(huì)使用 Chrome 調(diào)試前端程序,Google 一下會(huì)有很多文章,你可以看看 超完整的 Chrome 瀏覽器客戶端調(diào)試大全。? 數(shù)據(jù)庫設(shè)計(jì)工具。你需要學(xué)會(huì)使用 MySQL WorkBench,這個(gè)工具很容易使用。相關(guān)的手冊,你可以看一下官方文檔。
實(shí)踐項(xiàng)目
這回我們需要設(shè)計(jì)一個(gè)投票系統(tǒng)的項(xiàng)目。業(yè)務(wù)上的需求如下:
? ? ? ? ? 用戶只有在登錄后,才可以生成投票表單。投票項(xiàng)可以單選,可以多選。
其它用戶投票后顯示當(dāng)前投票結(jié)果(但是不能刷票)。投票有相應(yīng)的時(shí)間,頁面上需要出現(xiàn)倒計(jì)時(shí)。
投票結(jié)果需要用不同顏色不同長度的橫條,并顯示百分比和人數(shù)。
技術(shù)上的需求如下:
這回要用 Java Spring Boot 來實(shí)現(xiàn)了,然后,后端不返回任何的 HTML,只返回 JSon 數(shù)據(jù)給前端。
? 由前端的 JQuery 來處理并操作相關(guān)的 HTML 動(dòng)態(tài)生成在前端展示的頁面。
? 前端的頁面還要是響應(yīng)式的,也就是可以在手機(jī)端和電腦端有不同的呈現(xiàn)。這個(gè)可以用 Bootstrap 來完成。?
如果你有興趣,還可以挑戰(zhàn)以下這些功能。
在微信中,通過微信授權(quán)后記錄用戶信息,以防止刷票。? 可以不用刷頁面,就可以動(dòng)態(tài)地看到投票結(jié)果的變化。
? Google 一些畫圖表的 JavaScript 庫,然后把圖片表得風(fēng)騷一些。?
小結(jié) 上面那些書和知識(shí)你要看完,還要能理解并掌握,我估計(jì)你最少也要花 1-2 年左右的時(shí)間。如果你能夠走到這里,把前面的那些知識(shí)都了解了,不用精通,能獨(dú)立地做出上面的那些實(shí)踐項(xiàng)目,那么,你就算是真正的入門了。
而且,你已經(jīng)是一個(gè) “ 全棧工程師 ” 的樣子了,在這里我要給你一個(gè)大大的贊。如果這個(gè)時(shí)候,你對編程還有很大的熱情,那么我要恭喜你了,你可能會(huì)是一個(gè)非常不錯(cuò)的程序員。加油啊!
上面的那些技術(shù)已經(jīng)算是比較專業(yè)的了。如果你已經(jīng)大致掌握了,我相信你可以找到至少年薪 20 萬以上的工作了,而且你的知識(shí)面算是有不錯(cuò)的廣度了。但是深度還不夠,這個(gè)時(shí)候,是一個(gè)比較關(guān)鍵點(diǎn)了。
你可能已經(jīng)沉醉在沾沾自喜的驕傲的情緒中,那么你也可以就此止步,加入一些公司,在那里按部就班地完成一些功能性的開發(fā),成為一個(gè)搬磚的碼農(nóng)。你也可以開始選擇一個(gè)方向開始深入。
我給你的建議是選擇一個(gè)方向開始深入。因?yàn)槟悴⒉恢滥阄磥頃?huì)有多大的可能性,也不知道你會(huì)成為什么樣的人,所以為什么不再更努力一把呢?
后面,我們就開始非常專業(yè)的程序員之路了。這也是一般程序員和高級程序員的分水嶺了,能不能過去就看你的了。
第五篇:RPG AS400程序員培訓(xùn)手冊9
其它
8.1 報(bào)表打印
在這里,簡單說一下報(bào)表。其實(shí)據(jù)說RPG 設(shè)計(jì)之初,主要就是為了解決報(bào)表問題。不
過發(fā)展到現(xiàn)在,在我接觸過的系統(tǒng)中,覺得報(bào)表在RPG 編程之中反而退居其次,大部分程
序都是對數(shù)據(jù)庫中磁盤文件(即PF 文件)的操作。
報(bào)表文件其實(shí)在某種意義上與普通的磁盤文件很類似,都是有記錄格式(Record
Format),都可以進(jìn)行寫操作(WRITE),RPGLE 的程序?qū)λ鼈兊牟僮鞣绞揭脖容^雷同。所
不同的是普通的磁盤文件的數(shù)據(jù)是存儲(chǔ)在數(shù)據(jù)庫中,而報(bào)表文件WRITE 了之后,是以脫機(jī)
文件(Spool File)的形式存在。所以在一個(gè)庫中,磁盤文件具有唯一性,即不能有同名的磁盤文件;而在同一個(gè)輸出隊(duì)列中,同名的報(bào)表文件(即生成的脫機(jī)文件),允許有多個(gè)。
要做一個(gè)全新的報(bào)表打印,大致上可以分為畫報(bào)表文件(PRTF),與編寫打印程序這兩
部分。
一、畫報(bào)表文件(PRTF)
1、新建立一個(gè)屬性為PRTF的文件,然后使用19 進(jìn)入報(bào)表編輯狀態(tài)。(即STRRLU)
2、定義一個(gè)新的記錄格式(Record Format):DR + F18 + F10,注意看下方的功能
鍵說明
3、在一個(gè)記錄格式之下,追加內(nèi)容時(shí),要在新的編輯行前加“CLC”,表示此行的內(nèi)容,是屬于上面記錄格式的。
4、編輯行前加:
DC: 定義常量
CF: 使當(dāng)前行的內(nèi)容居中
5、常用功能鍵:
F13:
標(biāo)記 / 取消標(biāo)記(光標(biāo)所指的字段)。多試一下就知道使用方法,可以將 同一行的多個(gè)相連的字段標(biāo)記成為一個(gè)塊(對首尾兩個(gè)字段操作F13 即可)。
高亮部分表示已被標(biāo)記的塊。
F14:
將已標(biāo)記的塊COPY 到光標(biāo)指定處。(其實(shí)這個(gè)我用得不多)
F15:
將已標(biāo)記的塊MOVE 到光標(biāo)指定處。(這個(gè)用得不少)
F16:
刪除已標(biāo)記的塊。(這個(gè)用的頻率也不少)
F11:
定義新變量
F23:
進(jìn)入當(dāng)前字段的功能菜單畫面
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 處,填上字段長度;如果是字符型,就不需要再填其它內(nèi)容;如果是數(shù)字型,在第2 頁Decimal
positions 處填上小數(shù)位數(shù)。
也可以采用參照字段的方法(即參照已存在的PF 文件中的字段)。如果選用這種
方法,就用需要在Length of data 以及Decimal positions 中填寫內(nèi)容,將Reference a
field 項(xiàng)填為“Y”,然后按確認(rèn)鍵(好象F10 鍵也可以),然后可以看到該項(xiàng)高亮顯示。
此時(shí)再按F10,可進(jìn)入該字段的功能菜單(也可以通過在報(bào)表編輯狀態(tài)下,直接在當(dāng)前
字段處按F23 進(jìn)入):
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
以上菜單中,標(biāo)記為藍(lán)色的,是我常用的幾個(gè)選項(xiàng)。
在這些選項(xiàng)前面,選2,即是對當(dāng)前字段加注這些功能;選4,即是去掉這些
功能。
要參照已知字段定義變量,則在“REFFLD”選項(xiàng)前選2,可見
Field...............Record format..........File...............Library.............*CURLIB
各選項(xiàng)的含義:
Field: 當(dāng)前變量所參照的字段
Record Format: 當(dāng)前變量所參照字段,在PF 文件中所屬的記錄格式
File: PF文件名
Library: PF 文件所在的庫名
7、其它幾個(gè)常用功能選項(xiàng)的含義:
SKIPA:Skip After,在WRITE 操作時(shí),寫該字段后,自動(dòng)換頁; SKIPB:Skip Before 在WRITE 操作時(shí),寫該字段前,自動(dòng)換頁
SPACEA:Space After 寫該字段后,再打印一個(gè)空格;
SPACEB:Space Before 寫該字段前,打印一個(gè)空格(可用來解決錯(cuò)行問題)
EDTCDE:定義當(dāng)前字段的顯示方式,比如說當(dāng)前字段為數(shù)字類型時(shí),是否顯
示逗號(hào),前面是補(bǔ)零等等。根據(jù)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
二、編寫打印報(bào)表的程序
1.對報(bào)表文件的聲明:
FEF4322P O E PRINTER OFLIND(*IN99)
可以看到,操作方式是“O”,即只寫;
文件類型為“PRINTER”,即打印文件;
后面的OFLIND 關(guān)鍵字表示該報(bào)表文件的換頁指示器為99;即寫報(bào)表,當(dāng)寫
滿一頁時(shí),*IN99 自動(dòng)變?yōu)?;然后報(bào)表自動(dòng)換頁,*IN99 再自動(dòng)變回0;
其實(shí)這一項(xiàng)我覺得控制起來有點(diǎn)不爽,所以我通常都是自行控制換頁,不用這
個(gè)指示器來判斷;我常使用的自行控制換頁的方法在下面會(huì)說明。
2.對報(bào)表文件的處理 和磁盤文件(DISK)一樣,報(bào)表文件其實(shí)也有OPEN,CLOSE,WRITE 的操
作。不過使用OPEN,CLOSE 操作時(shí),不需要使用USROPN 關(guān)鍵字。同時(shí)也因?yàn)?/p>
生成的是脫機(jī)文件,所以不能進(jìn)行CHAIN、UPDATE 等定位、修改的操作。
如果在程序中,只需要生成一份報(bào)表,那么可以不使用OPEN/CLOSE 操作,因?yàn)槌绦蛟谶\(yùn)行之初,以及運(yùn)行結(jié)束時(shí),已默認(rèn)打開,關(guān)閉了一次所有已聲明的文
件,包括報(bào)表打印文件。
但如果程序在運(yùn)行時(shí),需要生成多份報(bào)表,那么必須在每次生成報(bào)表前使用
OPEN 操作;在生成完報(bào)表后,使用CLOSE 操作,以保證脫機(jī)文件的完整。
在生成完當(dāng)前報(bào)表前,還可能需要使用CHGPRTF 的命令,將報(bào)表生成到指定的輸出隊(duì)列中。如果不更改,那么報(bào)表會(huì)生成到當(dāng)前用戶默認(rèn)的脫機(jī)文件存放處。
當(dāng)一個(gè)RPGLE 中,生成多份同名報(bào)表時(shí),常會(huì)在生成報(bào)表前使用CHGPRTF,以
便于管理,避免混亂。
報(bào)表的操作,也與磁盤文件(普通PF 文件)類似,在OPEN 與CLOSE 之間,對各字段進(jìn)行賦值,賦值完之后再通過“WRITE 記錄格式名” 的語句,來寫指
定的記錄格式。
3.自行控制換頁
在聲明報(bào)表時(shí),可以通過OFLINE 關(guān)鍵字,定義換頁指示器,不過可能是換頁
指示器的使用方法我摸索得還不夠,所以使用起來總覺得不夠自如。
我通常是先在報(bào)表文件中,定義一個(gè)記錄格式(Record Format),該記錄格式下
只有一個(gè)字段,同時(shí)這個(gè)字段的功能選項(xiàng)處要標(biāo)識(shí)為“SKIPA”,然后該字段盡量
做成不可見字符。在RPGLE 程序中,當(dāng)程序運(yùn)行邏輯上判斷需要換頁時(shí),WRITE
這個(gè)記錄格式,就可以實(shí)現(xiàn)換頁了(也就是通過字段的SKIPA 選項(xiàng)來實(shí)現(xiàn)換頁,當(dāng)然大家也可以使用其它更便捷的方法,這里只是介紹我常用的方法,因?yàn)槲矣X得
這個(gè)方法比較穩(wěn)定)。至于如何判斷換頁,當(dāng)然要看具體報(bào)表的需求是如何要求的。最重要的,是不
要忘記定義一個(gè)數(shù)字型變量用來統(tǒng)計(jì)當(dāng)前頁已打印過的行數(shù),當(dāng)大于等于60 行,要進(jìn)行換頁處理(我通常會(huì)留出幾行來做為冗余,大家可以自已選擇,但肯定不能
大于66 行,否則會(huì)自動(dòng)換頁)
三、幾點(diǎn)補(bǔ)充
呵呵,找出我以前寫的關(guān)于報(bào)表打印的貼子,做為使用時(shí)補(bǔ)充
1、關(guān)于記錄格式
其實(shí)這個(gè)本來沒什么可說的,不過我就經(jīng)常搞錯(cuò),還是說說吧。
同一個(gè)記錄格式之下,格式應(yīng)該如下:
記錄格式名
0001.00+ 打印內(nèi)容
0002.00+ 打印內(nèi)容
0003.00+
每行要有這個(gè)+,才歸屬于同一個(gè)記錄格式。如果是個(gè)點(diǎn)的話,也就是說明這一行
并不屬于該記錄格式,如果想讓它屬于這個(gè)記錄格式,就要用CLC 命令;
當(dāng)我們用19 編輯的時(shí)候,如果是3 來COPY 記錄行,系統(tǒng)經(jīng)常會(huì)自動(dòng)在COPY 處
新增一個(gè)記錄格式,所以要注意。(說來簡單,但是我最開始畫報(bào)表的時(shí)候,就曾經(jīng)被
這個(gè)問題折磨)
2、關(guān)于變量的命名
不同的記錄格式,可以使用相同的變量名。
有的時(shí)候,為了少寫賦值語句,可以直接將變量命名得與PF 中的字段相同。
(不過我不太喜歡這種做法)
如果在RPGLE 程序中,給某個(gè)變量賦值,但沒有對相應(yīng)的記錄格式進(jìn)行
WRITE 操作,編譯會(huì)不通過,報(bào)4030 字段未定義的錯(cuò)。
3、關(guān)于打印時(shí)會(huì)錯(cuò)行的問題
有的時(shí)候,打印會(huì)錯(cuò)行,比如記錄格式定義
0001.00+ 變量A(比如說10 個(gè)字符長)
0002.00+ 變量B(比如說5 個(gè)字符長)
變量A 的起始處位于第一列
變量B 在變量A 的下一行,且起始處位于第三列
當(dāng)變量A='AAAAAAAAAA',變量B='BBBBB'時(shí),會(huì)打印出
AAAAAAAAAA
BBBBB
這很正常。
但當(dāng)A=' A'或空時(shí),本來我們是希望打印出:
A(或者這里就是一空行)
BBBBB
這樣的效果,但是系統(tǒng)就會(huì)打印成為
BBBBBA 或
BBBBB(沒有打印出空行)
也就是說,當(dāng)某一行的前面為空時(shí),(好象空格也算空)如果下一行有數(shù)據(jù),就會(huì)
擠上來。解決辦法是在將A 字段的首位賦值為非空;如果想讓客戶看不見,可以考慮
使用漢字指示器。想打印空行,也可以用這個(gè)辦法。
又或者是將該字段的功能選項(xiàng)加上“SPACEB”,即打印前空一格,也可以解決這
個(gè)問題。(報(bào)表的這個(gè)特點(diǎn)困擾我最久)
4、關(guān)于報(bào)表的測試
其實(shí)這個(gè)東西最簡單,不過我以前一向很少去留意。
以前測試報(bào)表,尤其是測試換頁的時(shí)候,都是老老實(shí)實(shí)的用打印機(jī)去打,打出來了 再檢查換頁對不對,慢不說,還費(fèi)紙。
其實(shí)我們進(jìn)入到SPLF 里,查看剛生成的報(bào)表文件,右上角就有當(dāng)前的頁數(shù),行數(shù),如第1 頁第1 行,右上角就是1/1,第2 頁第3 行,就是3/2,好象頁數(shù)在后面。
在“position to”這里,+1 就是下一行,W+1 就是向右移一列,慢慢+,就可以看
到換頁是否正確了。
8.2 SQLRPGLE
在RPG/RPGLE 程序中,也是可以使用SQL 命令的,首先,需要將程序的類型設(shè)置為
SQLRPG 或SQLRPGLE,SQL 語句的用法都一樣,RPG / RPGLE 是指非SQL 語句使用什
么格式。這類程序?qū)懲曛笈c普通的RPG/RPGLE 程序一樣編譯,運(yùn)行。
不過需要注意,SQLRPG 編譯時(shí)有一個(gè)“COMMIT”參數(shù),此參數(shù)如果沒有使用
“*NONE”,或“*NC”,那么SQL 語句中更改的表將會(huì)由系統(tǒng)默認(rèn)加一個(gè)COMMIT 聲明。
如果執(zhí)行RPG 程序后沒有執(zhí)行COMMIT 操作,那么當(dāng)時(shí)數(shù)據(jù)是更改過來的,但當(dāng)用戶
SIGNOFF 之后,SQL 更改的表數(shù)據(jù)將會(huì)回滾(這也是在維護(hù)階段常見的維護(hù)失誤之一)。
不過這個(gè)參數(shù)只會(huì)影響到SQL 語句中做了數(shù)據(jù)更改的表,不會(huì)影響到RPG/RPGLE 程序段
中的數(shù)據(jù)。
1、不帶任何參數(shù)的SQL:
C/EXEC SQL
C+ UPDATE PFFHS SET FHS01='0' WHERE FHS02=’1’
C/END-EXEC2、動(dòng)態(tài)游標(biāo)
C****************************** C* 定義動(dòng)態(tài)SQL
C****************************** C/EXEC SQL C+ PREPARE W#SQL FROM :A C/END-EXEC C*
C****************************** C* 執(zhí)行動(dòng)態(tài)SQL,結(jié)果保存到游標(biāo)C1 中
C******************************
C/EXEC SQL DECLARE C1 CURSOR FOR W#SQL C/END-EXEC C* C*
C****************************** C* 打開游標(biāo)C1
C****************************** C/EXEC SQL C+ OPEN C1 C/END-EXEC C*
C****************************** C* 取數(shù)據(jù)
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* 關(guān)閉游標(biāo)C1
C****************************** C/EXEC SQL C+ CLOSE C1 C/END-EXEC
8.3 SAVF,備份與恢復(fù)
SAVF,全稱SAVE FILE,存儲(chǔ)文件??梢詫AVF 視為一個(gè)存儲(chǔ)容器,它能夠?qū)⒅付ǖ膸?,或指定的?shù)據(jù)文件,或源代碼保存在其中,有點(diǎn)類似于UNIX 中的TAR。
SAVF 只用于備份與恢復(fù)。雖然通常這些事情是系統(tǒng)管理員做的,但是如果環(huán)境許可的情況下,開發(fā)人員能了解這些命令,自行做做備份,就可以更好地對程序進(jìn)行測試、保護(hù)源
碼。當(dāng)然,在使用RESTORE 命令時(shí),一定要謹(jǐn)慎謹(jǐn)慎再謹(jǐn)慎,千萬不能追求操作速度,切
記切記。
1.建立SAVF
要使用SAVF,首先我們當(dāng)然需要建立一個(gè)SAVF。如已有自己的SAVF,可跳過此步。
建立SAVF 的命令是:
CRTSAVF FILE(庫名/SAVF 名)
如果建立成功,就會(huì)在指定庫中,生成一個(gè)空的SAVF。2.清空SAVF
使用SAVF 前,必須保證SAVF 是空的。SAVF 不能追加內(nèi)容。新生成的SAVF 一定的空的,不需要特別處理;
如果是已存在的SAVF,需要使用CLRSAVF 的命令,確保清空SAVF
CLRSAVF FILE(庫名/SAVF 名)
3.將指定的庫備份到SAVF 中
備份庫,使用下列命令來進(jìn)行備份
SAVLIB LIB(要備份的庫名)DEV(*SAVF)SAVF(SAVF 所在庫名/SAVF 名)
ACCPTH(*YES)
ACCPTH(*YES),表示備份時(shí),備份存儲(chǔ)路徑。也就是對應(yīng)于數(shù)據(jù)文件,將其邏輯文件的相關(guān)信息也備份下來,會(huì)增加備份時(shí)間與備份空間;但恢復(fù)時(shí),不需要對邏輯文件重新建
立索引,可以省很多時(shí)間。所以在備份數(shù)據(jù)文件建議加上這個(gè)參數(shù)。當(dāng)然,如果是備份源代
碼,就不需要這個(gè)參數(shù)了。
4.恢復(fù)已備份的庫
RSTLIB SAVLIB(備份的庫名)DEV(*SAVF)SAVF(SAVF 所在的庫/SAVF 名)
RSTLIB(恢復(fù)的庫名)
RSTLIB 這個(gè)參數(shù),表示恢復(fù)的庫名,其默認(rèn)值等于“備份的庫名”。也就是說,如果
我將FHSLIB 整個(gè)庫備份下來,再使用RSTLIB 恢復(fù),如果不更改RSTLIB 中的值,那么將
直接將FHSLIB 整個(gè)都覆蓋恢復(fù);而如果指定RSTLIB 的值為OTHERLIB,那么將么把備
份的FHSLIB 的內(nèi)容,覆蓋恢復(fù)到指定的OTHERLIB 庫中。
5.將指定的目標(biāo)備份到SAVF 中
SAVOBJ OBJ(目標(biāo)名)LIB(目標(biāo)所在的庫)DEV(*SAVF)SAVF(SAVF 所在的庫
/SAVF 名)
一次可以備份多個(gè)目標(biāo)。如果是備份源碼,那么OBJ 就表示源碼所在的SRCFILE,MEMBER 項(xiàng)就是源碼名。
可以使用F4 鍵,來備份更多的目標(biāo),或更多的源碼。
6.恢復(fù)目標(biāo)
RSTOBJ OBJ(*ALL)SAVLIB(目標(biāo)所在庫)DEV(*SAVF)SAVF(SAVF 所在庫名/SAVF 名)
RSTLIB(恢復(fù)的庫名)
與RSTLIB 類似。當(dāng)然,OBJ 選項(xiàng)使用*ALL,表示恢復(fù)SAVF 中備份的所有的目標(biāo),也可以指定只恢復(fù)單個(gè)/多個(gè)目標(biāo)。
8.4 菜單--MENU
如果有例子的話,做菜單其實(shí)也不復(fù)雜。我對菜單做得也不多,感覺對于一般開發(fā)
人員來說,使用頻率不是太高,還是簡單說一下吧
隨便找一個(gè)已存在的菜單,應(yīng)該是包含DDS 與CMD 這兩種TYPE,COPY 一下;
然后用17,或19 進(jìn)入DDS。
用19 進(jìn)入時(shí),可以像編輯報(bào)表一樣,對菜單進(jìn)行編輯;
用17 進(jìn)入時(shí),在“Work with menu image and commands”選項(xiàng)中選擇“Y”,然后
用F10 可以看到自行定義的每條輸入項(xiàng)對應(yīng)要運(yùn)行的程序名,修改之;
用17 進(jìn)入后,再退出時(shí),系統(tǒng)會(huì)自動(dòng)提示編譯菜單。
成功之后,查看屬性為“CMD”的源,會(huì)看到里面也有自定義的輸入項(xiàng)對應(yīng)的要
運(yùn)行程序名。
GO 菜單名,就可以進(jìn)入生成的菜單。
8.5 實(shí)用命令
WRKACTJOB
這個(gè)使用的頻率應(yīng)該是很高的吧,在這里只提一個(gè)用法:Coding 的時(shí)候斷線異常
退出時(shí),再登錄之后,用2 進(jìn)入剛才編輯的程序,會(huì)報(bào)錯(cuò)“正在被使用”。除了等一會(huì),一直等到它自動(dòng)退出之外,還可以用WRKACTJOB + 10,來查找剛才自己的那個(gè)進(jìn)程(顯示出來的命令應(yīng)該是STRSEU),然后把它KILL 掉就行了。
DSPFD
DSPFD + PF 名,查看文件的信息,包括文件的MEMBER 數(shù),總記錄數(shù),被刪除的記錄數(shù),CCSID 等等。
DSPFD + LF 名,查看邏輯文件的鍵值,結(jié)合DSPDBR,可以找出一個(gè)PF 文件對
應(yīng)的所有LF 文件的鍵值。
DSPFD + 庫名 + *MBRLIST,可以看到該庫之下所有的文件名。
這個(gè)命令可以使用*OUTFILE,將輸出變成一個(gè)文件。
對于LF 文件,TYPE 項(xiàng)選擇“*ACCPTH”,可以看到該LF 文件的鍵值。如果把輸
入設(shè)定為OUTFILE,那么每條記錄指明了一個(gè)鍵值字段。
TYPE 項(xiàng)選擇“*SELECT”,可以把這個(gè)LF 文件的篩選條件列出來。
靈活運(yùn)用此命令,將會(huì)是很多自行編寫的工具的基礎(chǔ)之一。
DSPFFD
注意,和上面的命令相差一個(gè)“F”,該命令表示查看PF 文件的字段信息。比如該
PF 文件共有多少個(gè)字段,每個(gè)字段的類型如何。
與DSPFD 相似,DSPFFD 也可以使用*OUTFILE,將輸出變成一個(gè)文件。每條記
錄標(biāo)識(shí)一個(gè)字段。同理,靈活運(yùn)用,也是眾多自行編寫工具的基礎(chǔ)。
MRGSRC
比較兩個(gè)程序的差異。按照A、B、A 的順序,MRGSRC 時(shí),A 程序在上面,B 程
序在下面,白色的地方,即表示兩個(gè)程序的差異。
F13 表示接受當(dāng)前差異,F(xiàn)17 表示接受所有差異,F(xiàn)16 表示繼續(xù)查找下一處差異。
在接受差異時(shí),表示按照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 轉(zhuǎn)成的MEMBER
當(dāng)然,做為中間轉(zhuǎn)換的臨時(shí)文件,PF 文件會(huì)保留SPLF 的信息。
把MSGF 變成SPLF
CHGSYSLIBL LIB(QSYS2989)
DSPMSGD RANGE(*FIRST *LAST)MSGF(MSGF 所在庫名/MSGF 名)+
DETAIL(*BASIC)OUTPUT(*PRINT)
CHGSYSLIBL LIB(QSYS2989)OPTION(*REMOVE)
這個(gè)命令,再結(jié)合上面的“把SPLF 變成MEMBER”,就可以把MSGF 搞成
MEMBER,然后再FTP 到WINDOWS 上,就可以很方便地查找已定義的MSG 信息了。
不過必須要有權(quán)限執(zhí)行CHGSYSLIBL 這個(gè)命令。
DSPOBJD
根據(jù)程序名,查找編譯時(shí)源代碼所在的庫名、SRCFILE 名。
DETAIL 參數(shù)用“*SERVICE”,OBJTYPE 選項(xiàng)用“*PGM”
不過好象RPGLE 的程序用這個(gè)命令查不出來,要用DSPPGM 命令。
DSPPGM
根據(jù)目標(biāo)
DSPPGM + RPGLE 程序名,參數(shù)用“*MODULE”,然后再選擇5,就可以看到編 譯時(shí)RPGLE 程序時(shí),源代碼所在的庫名,SRCFILE 名。
DSPDBR
根據(jù)物理文件查其對應(yīng)的所有邏輯文件
DSPPGMREF
查找程序與PF、LF 的關(guān)系。
PGM 參數(shù)用“*ALL”,OUTPUT 參數(shù)用“*OUTFILE”,OBJTYPE 參數(shù)用“*ALL”,然后執(zhí)行,再輸入輸出文件名與所在庫就可以了。然之后,就可以SQL 在這個(gè)生成的文件中查找(生成的過程可能會(huì)有點(diǎn)慢,要耐心)。
在生成的文件中,字段WHRFNM,表示記錄格式名。舉例來說,如果物理文件更
改過,那么物理文件與邏輯文件就都重新編譯過了,所以它們對應(yīng)的的所有的程序都要
重新編譯,通常物理文件與邏輯文件使用相同的記錄格式名(當(dāng)然,如果不同就算了)
這時(shí)就需要按記錄格式名來查找。比如SELECT * FROM 剛生成的文件 WHERE
WHRFNM = “記錄格式名”,找出所有涉及到這個(gè)記錄格式名的程序。
在生成的文件中,字段WHFNAM,表示文件名,包括物理文件與邏輯文件。比如
說當(dāng)我們只修改了某個(gè)邏輯文件時(shí),那么當(dāng)然是只需要重新編譯與該邏輯文件有關(guān)的程
序,也就是說只根據(jù)文件名來查找就足夠了。
RTVCLSRC
如果編譯CL 程序時(shí),不是刻意帶*NONE 參數(shù),那么一般來說CL 程序都可以使
用這個(gè)命令來反編譯。具體用途試試便知
RGZPFM
重整文件,即回收已刪除記錄的空間。不過這個(gè)命令我沒實(shí)際用過。
WRKMSGQ QSYSOPR
顯示錯(cuò)誤信息
CHGCMGDFT 更改某些命令的默認(rèn)參數(shù),如更改CRTPF 的WAITRCD 參數(shù):
CHGCMDDFT CMD(QSYS/CRTPF)NEWDFT(‘WAITRCD(*IMMED)’)
SBMJOB
將任務(wù)提交后臺(tái)處理。
普通程序的流程中,如果A 程序CALL 了B 程序,那么A 程序必須等待B 程序運(yùn)
行結(jié)束之后,才會(huì)繼續(xù)執(zhí)行CALL 之后的語句;
如果是使用SBMJOB 的話,那么A 程序就將B 程序提交到后臺(tái)去運(yùn)行,不等待B
程序結(jié)行完畢,直接繼續(xù)向下運(yùn)行。
SBMJOB 命令僅僅只是表示將任務(wù)提交給后臺(tái),所以此句運(yùn)行完畢,也僅表示后
臺(tái)已開始運(yùn)行,并不表示運(yùn)行的程序結(jié)束。
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 處,填寫需要提交后臺(tái)運(yùn)行的命令語句(通常是CALL
某個(gè)程序);
Job name 表示的,是顯示在屏幕上的,運(yùn)行的程序的名字,可以隨便寫,只是用來標(biāo)識(shí)
用的;
Job description,填寫對應(yīng)的JOBD(如果想將程序提交到指定的子系統(tǒng)下,那么此處 填寫子系統(tǒng)對應(yīng)的JOBD,Job queue 處填寫子系統(tǒng)對應(yīng)的JOBQ),如果不填,即表示默認(rèn)
為當(dāng)前用戶的JOBD,JOBQ
8.6 關(guān)于代碼風(fēng)格的幾點(diǎn)想法
1、絕大多數(shù)情況下,不做硬性要求,一切都以維護(hù)時(shí)程序的易讀性為主導(dǎo)。
2、一定要在程序最開始,簡要說明程序?qū)崿F(xiàn)的功能,輸入輸出參數(shù),這個(gè)必須的。
3、臨時(shí)變量的命名:
這個(gè)應(yīng)該算是最具有可規(guī)范性的了??傊詈镁褪且煌拢椭肋@個(gè)臨時(shí)
變量是代表什么意思。變量名的長度可以不做局限,當(dāng)然最好不要太長。通常項(xiàng)目
開發(fā)對此都會(huì)有明文或潛在的規(guī)范,多參照即可。
4、定義臨時(shí)變量的位置:
在首次使用該臨時(shí)變量前定義,同時(shí)加漢字注釋,簡單說明這個(gè)臨時(shí)變量在什
么情況下,應(yīng)該賦什么樣的值。(當(dāng)然了,如果是多個(gè)用途相似的臨時(shí)變量,可以
用一行注釋來搞定,不強(qiáng)求每個(gè)變量都要有一行注釋)
見過的大部分規(guī)范里面,都是統(tǒng)一在程序開始處定義一大堆臨時(shí)變量,規(guī)范的同時(shí),總覺得用起來不夠方便,比如說不知道這個(gè)臨時(shí)變量什么時(shí)候使用,代表什
么意思,怎么使用,該怎么賦值等等。
5、子過程的使用:
主程序最好只寫主流程,將具體處理交給各子過程;同時(shí)在調(diào)用子過程之前,加注釋,說明這個(gè)子過程的處理功能。而子過程代碼最開始,也要有這個(gè)子過程的功能說明,最好詳細(xì)一點(diǎn)。
把子過程盡量寫成類似于CALL 程序的感覺,也就是自已定一個(gè)輸入輸出接
口。當(dāng)然,這個(gè)并不是真的輸入輸出接口參數(shù),因?yàn)樽舆^程中的變量在整個(gè)程序中
都可以用到,只是說類似。比如說,某個(gè)字段,是子過程中需要使用到的關(guān)鍵的一
個(gè)字段,那我們就可以將其做為輸入字段,并在整個(gè)子過程的代碼中,盡量不要去 改它的值;再比如說,子過程的功能是計(jì)算出一個(gè)金額,那我們就可以把這個(gè)金額
字段做為輸出字段,在使用子過程之前將其清零。然后,在子過程前,加注釋說明
輸入輸出字段。
這樣做的意義在于:維護(hù)修改代碼的便利性,COPY 代碼的便利性。
6、視覺上的分隔:
RPGLE 的程序,寫出來都是一坨坨的,尤其是IF 語句,用多了的確很難分清
邏輯判斷到底是怎樣。我通常對代碼都是采用視覺上的分隔,因?yàn)槲矣X得這樣最直
觀。比如說,主代碼段與子過程段之間,用全行“*”來做分隔;各段之內(nèi),也用
長短不一的“*”來分隔,表示不同情況的處理,或表示當(dāng)前是幾層之內(nèi)的“IF”。
這個(gè)規(guī)律現(xiàn)在還沒有總結(jié)出數(shù)字化的東西來,大部分情況下還是憑感覺,以后有時(shí)
間做做統(tǒng)計(jì)看看。
總之最后的效果,是從視覺上,將不同的處理情況隔開。比如說
*****************
**注釋
C IF XXXX
C ENDIF
*****************
這種方式之下的ENDIF,就比較好找了吧。
“*”當(dāng)然還可以再打得長一點(diǎn),如果層次多了,還可以用單橫線,等號(hào),諸
如此類。
7、注釋
注釋的重要性毋庸致疑,這里單指以下情況的注釋:
如果寫程序時(shí),某些需求不是很明確,或自己對這個(gè)需求的理解不是很清晰,或者是用戶特意要求某種情況之下不按常規(guī)方式處理,又或者是處理判斷在邏輯上 比較復(fù)雜比較繞,那么不妨把自己當(dāng)時(shí)的想法或客戶要求也寫在注釋中。事實(shí)上,有不少明顯的BUG,就是通過這種注釋發(fā)現(xiàn)的。__