2023年RPGAS400程序員培訓手冊_第1頁
2023年RPGAS400程序員培訓手冊_第2頁
2023年RPGAS400程序員培訓手冊_第3頁
2023年RPGAS400程序員培訓手冊_第4頁
2023年RPGAS400程序員培訓手冊_第5頁
已閱讀5頁,還剩16頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

2.8.4.4O--RON-ERROR(On-Error)沒用過OPEN{(E)}(OpenFileforProcessing)打開文獻Factory1OperationFactory2ResultHILOEQOPEN文獻名OPEN后面的目的,必須是在當前程序中已聲明的文獻名(不是文獻的記錄格式名),并且在OPEN操作之后,在程序結束之前之前,必須有相應的CLOSE操作。使用OPEN操作,文獻在聲明時,必須使用USROPN關鍵字(詳見D行說明)。ORxx(Or)邏輯判斷—或Factory1O(jiān)perationFactory2ResultHILOEQFLD01IFGTFLD03FLD01O(jiān)REQFLD02等價于IFFLD01>FLD03ORFLD01=FLD02與IF、IFxx,AND、ANDxx類似,RPGLE的寫法OR,比RPG的寫法ORxx要靈活,并且可以用來表達一些復雜的邏輯關系。有鑒于此,所以通常IF語句中,我會以OR為主,基本不用ORxx。假如在編程序方面,公司/項目組無硬性規(guī)定,那我覺得還是少用ORxx吧,總覺得這種寫法的邏輯關系看起來不直接,特別是有很復雜的AND,OR時。OTHER(OtherwiseSelect)分支語句的判斷與分支語句SELECT一起使用,表達不符合上述所有條件時的操作,如下:Factory1O(jiān)perationFactory2ResultHILOEQSELECTWHEN條件判斷1解決語句1WHEN條件判斷2解決語句2OTHER解決語句3ENDSL在這個例子中,當滿足條件判斷1時,運營解決語句1,運營結束后跳至ENDSL處;假如不滿足條件判斷1,則程序繼續(xù)向下執(zhí)行,判斷是否滿足條件判斷2。當滿足條件判斷2時,運營解決語句2,跳至ENDSL;當不滿足當不滿足條件判斷2時,程序繼續(xù)向下執(zhí)下,當讀到OTHER操作碼時,無條件運行解決語句3(即當程序當前不滿足以上所以條件判斷時,則執(zhí)行OTHER之后的語句。解決語句允許有很多句;條件判斷可以寫得很復雜,也允許對不同的字段進行判斷;比如說C語言也有分支語句switch,但是這個語句只能對一個字段進行分支判斷,ILE語言與它不同,允許對不同的字段進行判斷就我目前掌握的測試情況,上述的SELECT—WHEN--OTHER—ENDSL,其實也可以寫做:IF條件判斷1解決語句1ELSEIF條件判斷2解決語句2ELSE解決語句3ENDIF即WHEN與ELSEIF是類似的,這樣說,應當可以明白了吧。總之,SELECT—ENDSL是一個很好用的語法,特別是在表達很多不同的分支解決時。OUT{(E)}(WriteaDataArea)沒用過,講數據域的。PARM(IdentifyParameters)定義入口參數Factory1O(jiān)perationFactory2ResultHILOEQR*ENTRYPLISTPARMFLD01關于具體內容講解,詳見前面所說“入口參數”一章。允許做為入口參數的有:普通變量、結構變量、數組變量關于PARM、PLIST,尚有一種在Factory1,Factory2也填寫變量或指示器的用法,但是我不知道它具體表達什么意思,也不知道該怎么用。請用過的來補充。PLIST(IdentifyaParameterList)同上POST{(E)}(Post)沒用過READ{(N|E)}(ReadaRecord)讀取記錄1.基本語法:Factory1OperationFactory2ResultHILOEQREAD文獻記錄格式名4546READ后面跟的,必須是聲明的文獻記錄格式名;LO指示器表達鎖表指示器,當在指定的時間(CHGPF,WAITRCD項可看到),需要讀取的記錄仍被鎖,將會打開LO指示器,即*IN45=’1’;EQ指示器為是否讀到指示器。當未讀到任何記錄時,打開EQ指示器,即*IN46=’1’2.當文獻在程序中,是用只讀的方式聲明時,READ操作并不會導致鎖表;假如文獻在程序中是用修改的方式聲明,READ操作成功后,該記錄被鎖;直到執(zhí)行解鎖操作(UNLOCK,或UPDATE),或READ該文獻的其它記錄,才會解鎖假如文獻是用修改的方式聲明,但希望READ操作不鎖表時,那么就用READ(N),即Factory1O(jiān)perationFactory2ResultHILOEQREAD(N)文獻記錄格式名4546這樣讀文獻,就不會鎖記錄,但是同時也不能修改記錄。假如需要修改記錄,那么在修改之前(涉及對文獻字段賦值之前),還必須再對該記錄進行一次定位操作(比如CHAIN、READ語句均可)。也就是說,假如要修改記錄,必須先鎖住當前記錄(很合理吧)3.當執(zhí)行READ操作時,程序是根據游標當前在文獻中所指向的位置,順序讀取下一條記錄。關于游標是如何指向,還不是一個很簡樸的問題,所以將會在下一章“數據庫相關知識”中具體講解。4.執(zhí)行READ操作時,允許聲明的文獻沒有鍵值。(即PF文獻)READC{(E)}(ReadNextChangedRecord)沒用過,讀下一次修改過的記錄?READE{(N|E)}(ReadEqualKey)讀取鍵值相等的記錄語法與READ操作碼大體同樣,這里不再反復,只說不同的:假設程序中已聲明邏輯文獻PFFHSL3(鍵值為FHS01+FHS02)Factory1Operat(yī)ionFactory2ResultHILOEQFHSKEYKLISTKFLDFLD01KFLDFLD02FHSKEYSETLLFMTFHSDOW1=1FHSKEYREADEFMTFHS15IF*IN15=’1’LEAVEENDIFENDDO這段話的意思,就是定義組合鍵值FHSKEY,然后根據這個FHSKEY在邏輯文獻PFFHSL3中去定位,循環(huán)讀取PFFHSL3中,FHS01、FHS03與FLD01、FLD02相等的記錄。當讀取記錄結束,或鍵值不等時,退出循環(huán)(*IN15是EQ指示器)。假如將READE操作碼換成READ操作碼的話(當然,Factory1處也就不能有值),就沒有“鍵值不等時退出循環(huán)”這一層意思,只是讀不到記錄時就退出循環(huán),但有時我們使用邏輯文獻,僅僅是需要它的排序,而不需要讀不到鍵值相等的記錄就退出循環(huán)。所以說,使用READ操作碼,還是READE操作碼,需要根據實際的規(guī)定來決定。以上的Factory1處填寫值的系統(tǒng)解決,當READE操作碼在Factory1處未填寫值時,系統(tǒng)事實上是將當前的值與讀到的上一條記錄的關鍵字進行比較,而不是與SETLL時的鍵值做比較(讀第一條記錄不做比較!),假如鍵值不等時,置EQ指示器為1。。也就是說,假如沒有與FHSKEY鍵值相同的錄,那么系統(tǒng)并不是直接找開EQ指示器,而是會一直保持正常地往下讀,直到找到與讀到的第一條記錄關鍵字不同的記錄,才會打開EQ指示器,所以要注意。READP{(N|E)}(ReadPriorRecord)讀取記錄—游標上移簡樸來說,READ、READE操作時,游標在數據文獻中,是下移的;即讀完第一條記錄,游標指向第二條記錄;讀完第二條記錄,游標指向第三條記錄,依此類推,直至最后一條記錄。但READP則正好相反,游標是上移的,即讀完第三條記錄后,游標指向第二條記錄;讀完第二條記錄后,游標指向第一條記錄,直至讀完第一條記錄。一般來說,用READ、READE的概率會比READP、READPE的概率高得多,但是在某些情況下,使用READP操作,又的確會很省事,這個一時間想不起例子來,大家可在編程序時多實踐。READPE{(N|E)}(ReadPriorEqual)雖然我沒用過,但猜想它應當就是指游標上移,按鍵值去讀取文獻。與READP的關系,就類似于READE與READ的關系。REALLOC{(E)}(Re-allocateStorage)沒用過REL{(E)}(Release)沒用過RESET{(E)}(Reset)將數據結構賦值成為初始值。注意是初始值,不是清空。如定義結構:DFHSDSDSDFHS0110INZ(’ABCD’)DFHS025INZ(’EFGH’)那么,不管對該結構如何賦值,當執(zhí)行語句:CRESETFHSDS之后,FHS01將會變成’ABCD,FHS02將會變成’EFGH’,即恢復成為初始值。RETURN{(H|M|R)}(ReturntoCaller)RETURN是程序結束。在前面,“簡樸的程序流程”中,我們講過,“SETONLR”與RETURN這兩句話一起,做為程序的結束。這里,再具體解釋一下兩者之間的區(qū)別,以及關系:假如不寫RETURN,只寫“SETONLR”,程序執(zhí)行完最后一句之后,將會再從第一句開始執(zhí)行,導致死循環(huán)。在簡樸的程序流程這個例子中,程序本來只想修改讀到的第一條記錄,而假如沒有RETURN的話,將會把所有的記錄都修改掉,直到最后找不到可修改的記錄,然后系統(tǒng)報錯,異常中斷。(這種離奇的現象現在又測試不到了,也許是當時寫錯程序了?把F寫成了P?不管它,當是我寫錯了,總之RETURN是表達程序結束,沒有RETURN,主程序無可執(zhí)行的語句時,它也會結束;假如RETURN出現在主程序的中間,那么RETURN后面的語句將不會執(zhí)行)假如只寫RETURN,不打開指示器*INLR,根據blogliou所說“程序不會強制將內存中的數據寫到磁盤中。400缺省的是BLOCK輸出,即數據記錄滿一個BLOCK塊時才會將這一組記錄寫到磁盤上。那么假如這時BLOCK沒滿,數據信息不會立刻寫到磁盤上。之后有其它作業(yè)用到該文獻,讀取的數據就不完整?!钡偃缥墨I有唯一鍵字,或記錄日記,必須同步寫時,其實BLOCK實際被忽略,也就是此時不會有錯。目前我們用的是MIMIX備份,客戶事實上將所有的文獻都列入日記,這時不寫也不會出現上述錯誤。但為避免一些潛在的問題,養(yǎng)成良好的編程風格,建議將SETONLR與RETURN一同,做為程序結束的標志。當然,假如某個程序頻繁被調用,且不涉及文操作時,可考慮不打開指示器*INLR,僅用RETURN作為結束,這樣程序不會被PURGE出內存,可提高調用效率。假如沒寫RETURN,也沒有打開指示器*INLR,在編譯時,系統(tǒng)將會報40級錯,說找不到程序結束的語句,所以大可放心。ROLBK{(E)}(RollBack)1.基本語法Factory1O(jiān)perationFactory2ResultROLBK2.該操作碼無其它參數,就是指對事務解決進行回滾操作。3.ILE程序中,ROLBK操作可隨時進行,也允許在沒有聲明COMMIT類型的文獻的情況下,仍進行ROLBK操作(對該進程這前的事務進行確認解決)f4.關于日記的確認回滾操作,在后面會另設專門章節(jié)講述。2.8.4.5S--ZSCAN{(E)}(ScanCharacterString)掃描字符串掃描字符或字符串Factory1在目的字符串Factory2中是否存在Factory1OperationFactory2ResultHILOEQFLD01SCANFLD02N26FLD01可以是字符,也可以是字符變量;可以是一位長,也可以是多位長。當FLD01在FLD02中存在時,EQ指示器打開,即*IN26=’1’,同時將FLD02中的起始位置,賦值給N;當FLD01在FLD02中不存在時,EQ指示器保持關閉狀態(tài),即*IN26=’0’,同時N=0允許從FLD02中的指定位置開始檢查:FLD01SCANFLD02:2N26如上句,即表達從FLD02的第2位,開始掃描。在實際使用中,比如說我們判斷某個字符是否為數字,就可以先定義一個0—9的常量,然后將要判斷的字符去SCAN一下這個常量SELECT(BeginaSelectGroup)分支語句在操作碼“OTHER”中講過,為方便讀者,列出簡樸語法如下:Factory1OperationFactory2ResultHILOEQSELECTWHEN條件判斷1解決語句1WHEN條件判斷2解決語句2OTHER解決語句3ENDSL要注意,SELECT操作碼,必須有相應的ENDSL操作碼,否則編譯無法通過。SETGT{(E)}(SetGreaterThan)定位操作—大于舉個例子吧,假設文獻中有一個字段,是標記順序號的,1、2、3、4。即該字段為1,表達第一條記錄,該字段為2,表達第2條記錄。那么:Factory1OperationFactory2ResultHILOEQ2SETGT文獻記錄格式名READ文獻記錄格式名這個READ操作,READ到的,是第3條記錄。也就是說,SETGT操作碼,會將游標定位到大于鍵值的第一條記錄前。在實際使用中,假如我們是按邏輯文獻讀取,并且讀了一條記錄之后,對其鍵值相同的記錄都不需要再讀取時,就可以用SETGT,但是需要注意,Factory1項,需要是與鍵值相同的變量,即假如文獻是使用多個字段做為鍵值,那么我們也需要先定義一個組合鍵值的變量,然后Factory1處填寫這個組合鍵值的變量名。當聲明文獻的鍵值有多項時,Factory1項的鍵值,允許小于文獻的鍵值,但順序必須一致。即聲明的文獻假如鍵值為:FHS01、FHS02、FHS03,那么我們在程序中定義三個類型與之相同的變量FLD01、FLD02、FLD03,以下寫法都是有效的FLDKEYKLISTKFLDFLD01KFLDFLD02KFLDFLD03FLDKEYSETGT文獻記錄格式名FLDKEYKLISTKFLDFLD01KFLDFLD02FLDKEYSETGT文獻記錄格式名FLD01SETLL文獻記錄格式名SETLL{(E)}(SetLowerLimit)定位操作—小于語法與SETGT相同,含義與SETGT不同。SETLL操作碼,會將游標定位到與鍵值相等的第一條記錄之前,仍是上例,假如是2SETLL文獻記錄格式名READ文獻記錄格式名那么READ操作碼讀到的記錄,就是第2條記錄,看到了吧,和SETGT不同。SETLL操作碼還可以用來簡樸判斷當前鍵值是否存在有記錄,以PFFHSL3為例(鍵值為FHS01、FHS02)Factory1OperationFactory2ResultHILOEQFHSKEYKLISTKFLDFLD01KFLDFLD02EVALFLD01=’01’EVALFLD02=’02’FHSKEYSETLL文獻記錄格式名44當文獻中有相應記錄時,EQ指示器打開,即*IN44=’1’當文獻中無相應記錄時,EQ指示器關閉,即*IN44=’0’(與CHAIN正好相反,要注意)而在這種用法中,SETLL與CHAIN的區(qū)別在于,CHAIN是定位讀取了記錄,而SETLL僅僅只是判斷該記錄是否存在。所以用SETLL操作,不能修改記錄,也無法取出記錄的值。只能判斷記錄是否存在。假如要修改記錄,或取出記錄的值,還需要有一個讀取定位的操作,如READ,或READE、READP等(最常用的,應當就是READ操作)SETOFF(SetIndicat(yī)orOff)關閉指示器Factory1OperationFactory2ResultHILOEQSETOFF101112等價于EVAL*IN10=’0’EVAL*IN11=’0’EVAL*IN12=’0’在SETOFF這個操作碼中,指示器填在HI、LO、EQ哪里都沒關系,都是表達要被關閉的指示器SETON(SetIndicatorOn)打開指示器Factory1OperationFactory2ResultHILOEQSETOFF101112等價于EVAL*IN10=’1’EVAL*IN11=’1’EVAL*IN12=’1’在SETON這個操作碼中,指示器填在HI、LO、EQ哪里都沒關系,都是表達要被關閉的指示器SHTDN(ShutDown)沒用過SORTA(SortanArray)沒用過SQRT{(H)}(SquareRoot)開方Factory1OperationFactory2ResultHILOEQ9SQRT3N這時,N=3(由于3的平方為9)9、3都可以是數字型變量,或者直接是數字SUB{(H)}(Subtract)減法操作Factory1OperationFactory2ResultHILOEQFLD01SUBFLD02FLD03SUBFLD02FLD03看過前面的ADD、MULT操作碼,這里不用解釋也應當明白是什么意思了吧。那就不多說了。SUBDUR{(E)}(SubtractDurat(yī)ion)日期相減1.減日期Factory1OperationFactory2ResultHILOEQFLD01SUBDURN:*YFLD02表達將日期型變量FLD01減去N年,賦值到日期型變量FLD02中;N可以是一個數字型變量,也可以就是一個數字,N允許為負數*Y,*M,*D(尚有其它的參數值,可見ADDDUR,其中有具體解釋)2.判斷兩個日期型變量之間的天/月/年數Factory1O(jiān)perationFactory2ResultHILOEQFLD01SUBDURFLD02N:*D這時,N做為一結果變量,表達日期型變量FLD01與FLD02之間的天數SUBST{(P|E)}(Substring)取字符/字符串Factory1OperationFactory2ResultHILOEQ2SUBSTFLD01:3FLD02表達從字段FLD01的第3位開始,取2位,左對齊賦值到字段FLD02中。規(guī)定字段FLD01的長度必須大于或等于3+2位,否則程序會報錯??梢試L試用%SUBST語句,也是等價的,如下EVALFLD02=%SUBST(FLD01:3:2)表達的是同樣的意思。起始位數3,取的長度2,在兩種寫法之下,都可以使用數字型變量來表達。相比較之下,%SUBST尚有一種用法,就是對字符的指定位置賦值,這個就厲害了:EVAL%SUBST(FLD02:3:2)=’01’看到了吧,這句話就是說,使字段FLD02的第3、4位(即從第三位開始,兩位長)等于“01”TAG(Tag)定義標簽,與GOTO同用Factory1Operat(yī)ionFactory2ResultHILOEQFHSTAGTAGTEST{(D|T|Z|E)}(TestDat(yī)e/Time/Timestamp)沒用過TESTB(TestBit)沒用過TESTN(TestNumeric)沒用過TESTZ(TestZone)沒用過TIME(TimeofDay)--取當前系統(tǒng)時間Factory1Operat(yī)ionFactory2ResultHILOEQTIMEFLD01FLD01可以是時間型或數字型變量UNLOCK{(E)}(UnlockaDataAreaorReleaseaRecord)解鎖Factory1O(jiān)perationFactory2ResultHILOEQUNLOCK文獻記錄格式名UNLOCK是解鎖操作,在某種限度上,可以將UNLOCK視為ROLBK,將UPDATE視為COMMIT。即假如鎖定某條記錄,并對其字段進行賦值之后,使用UPDATE語句,將會把修改后的結果保存下來,即修改文獻,而UNLOCK語句則不會修改文獻,即否認了之前對文獻字段做的賦值修改。從程序的執(zhí)行效率上來講,UNLOCK的執(zhí)行效率是高于UPDATE的,由于UPDATE操作時,系統(tǒng)需要對文獻的每一個字段進行確認解決(DEBUG時可以看到),而UNLOCK就是簡樸的解鎖而已。UPDATE(ModifyExistingRecord)修改記錄語法與UNLOCK同樣。這里需要說明一下,在執(zhí)行UPDATE的時候,必須先使用READ、CHAIN等操作碼鎖定一條記錄。假如未鎖住記錄,UPDATE操作碼將會報錯。當執(zhí)行了UNLOCK、UPDATE、以及ROLBK語句時,等于是解鎖,此時再執(zhí)行UPDATE操作碼之前,必須再次鎖住記錄操作;WHEN{(M|R)}(When)分支判斷語句中的條件判斷在操作碼“OTHER”,“SELECT”中都講過,仍列出簡樸語法如下:Factory1O(jiān)perationFactory2ResultHILOEQSELECTWHEN條件判斷1解決語句1WHEN條件判斷2解決語句2OTHER解決語句3ENDSLWHENxx(WhenTrueThenSelect)上面的語法,是RPGLE的語法,WHENxx是RPG的語法,也就是SELECTFLD01WHENEQFLD02解決語句1……..這樣的語法,在表達復雜的邏輯關系時,必須與ANDxx,ORxx一起使用,所以我不使用WHENxx這個操作碼。WRITE(CreateNewRecords)寫記錄常用的方式:Factory1OperationFactory2ResultHILOEQCLEAR文獻記錄格式名EVAL文獻字段1=xxxxEVAL文獻字段2=xxxxWRITE文獻記錄格式名表達在文獻中寫入一條新記錄。文獻需要聲明為可寫的。通常會在給文獻字段賦值之前,作一次CLEAR操作來進行初始化,以避免不必要的麻煩。XFOOT{(H)}(SumtheElementsofanArray)沒用過,看幫助,是表達對數組字段的累加記錄。假設DIMDATA定義為一個數字型的數組變量,FHS01為一個足夠大的數字型變量Factory1OperationFactory2ResultHILOEQXFOOTDIMDATAFHS01就表達將數組DIMDATA中的所有記錄的值都取出來,匯總相加,賦值到數字變量FHS01中XLATE{(P|E)}(Translate)將一個字符串中指定的字符,更換成此外的字符。舉例:如MYCHAR1,MYCHAR2都是兩個20位長的字符型變量CMOVEL'ABCAAAC123'MYCHAR1C'A':'9'XLATEMYCHAR1MYCHAR2執(zhí)行過這個語句之后,MYCHAR2就等于”9BC999C123’,即將字符串MYCHAR1中所有的“A”都變成了“9”;XLATE也也許指定起始位置。如上句更改為:C'A':'9'XLATEMYCHAR1:4MYCHAR2則MYCHAR2等于“ABC999C123”,指從第4位開始(含第4位),將“A”變成“9”賦值。Z-ADD{(H)}(ZeroandAdd)向數字型變量賦值Factory1OperationFactory2ResultHILOEQZ-ADDFLD01FLD02將數字型變量FLD01,賦值到數字型變量FLD02中。Z-ADD、MOVE雖然同是賦值操作碼,但Z-ADD的用法就遠沒有MOVE那么變化多端,只能在數字型變量之間賦值。所以也沒有什么可說的了。zero

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論