RPG開發(fā)入門手冊_第1頁
RPG開發(fā)入門手冊_第2頁
RPG開發(fā)入門手冊_第3頁
RPG開發(fā)入門手冊_第4頁
RPG開發(fā)入門手冊_第5頁
已閱讀5頁,還剩74頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、1簡單說明32程序代碼行的編寫32.1最簡單的RPGLE程序32.2舉例準(zhǔn)備32.3簡單的程序流程42.4常見的程序流程52.5F行說明5內(nèi)容說明5常用例子9補(bǔ)充說明92.6D行說明9內(nèi)容說明10常用例子13補(bǔ)充說明132.7入口參數(shù)142.8C行說明16寫在前面16內(nèi)容說明16ILE操作碼分類:18ILE操作碼19A-C19D-E27F-N32O-R38S-Z423和程序相關(guān)的數(shù)據(jù)庫知識483.1LF(邏輯文件)48邏輯文件概念48有關(guān)編譯的問題48邏輯文件對效率的影響503.2MEMBER503.3游標(biāo)51游標(biāo)的概念51不同操作碼對應(yīng)的游標(biāo)的處理51“有且僅有”的游標(biāo)51LOVAL、HIV

2、AL對應(yīng)的游標(biāo)操作523.4事務(wù)處理 - COMMIT53概念描述53使用方法53注意事項(xiàng)543.5關(guān)于鎖表的問題 LCKW544DEBUG調(diào)試以及常見出錯信息554.1寫在前面554.2常規(guī)用法56程序編譯56執(zhí)行DEBUG命令56運(yùn)行程序56在DEBUG模式中進(jìn)行調(diào)試56跟蹤被當(dāng)前程序調(diào)用的程序57一定要退出DEBUG模式58補(bǔ)充584.3跟蹤批處理程序( From qingzhou)584.4常見的出錯信息59編譯程序時的出錯信息59運(yùn)行時的出錯信息615CL、CMD615.1CL程序61基本認(rèn)識61CL程序的常用語法及命令:62不常用的語法645.2CMD656屏幕文件及使用667其它

3、667.1報表打印667.2SAVF,備份與恢復(fù)717.3菜單-MENU727.4開發(fā)時常用的命令737.5一點(diǎn)想法751 簡單說明內(nèi)部交流、或可作培訓(xùn)使用。對用戶作如下假定:1、 能COPY、修改、編譯源代碼(RPGLE、CLP),并能運(yùn)行編譯后的程序2、 能COPY、修改、編譯文件(PF、LF、PRTF、DSPF);3、 對數(shù)據(jù)文件(PF)有簡單的認(rèn)識(FIELD à RECORD à PF),并知道LF與PF的對應(yīng)關(guān)系。2 程序代碼行的編寫2.1 最簡單的RPGLE程序?yàn)楸阌诶斫猓@里寫一個最簡單的RPGLE程序CL0N01Factor1+Opcode&Ext

4、Factor2+Result+Len+D+HiLoEq * Beginning of data *0001.00 C 'HELLO WORLD' DSPLY 0002.00 C RETURN * End of data *這個程序編譯成功,并調(diào)用(CALL 程序名),就是在屏幕上反白顯示“HELLO WORLD”字樣。(其中,綠色字樣,是系統(tǒng)自動顯示的,下同)與自由風(fēng)格的C語言不同,RPGLE中的編碼,是有一定的格式,如果寫錯,將會在當(dāng)前代碼行上高亮反綠顯示。初學(xué)者如果不太清楚從何處開始下手,可以使用“F4”鍵查看(F4鍵只有用2進(jìn)入的編輯狀態(tài)才有效,用5進(jìn)入的查看狀態(tài)是無效的

5、)Level N01 Factor 1 Operation Factor 2 Result 'HELLO WORLD' DSPLY Decimal Length Positions HI LO EQ Comment 關(guān)于每一項(xiàng)所對應(yīng)的內(nèi)容代表什么意思,該如何填寫,即如何寫程序,將會在下面的具體講解。2.2 舉例準(zhǔn)備列出表名,字段,以方便下面的舉例。假設(shè)有PF文件叫PFFHS,文件的記錄格式叫FMTFHS每條記錄,都是由FHS01、FHS02、FHS03三個字段組成,每個字段都是兩位長的字符型變量。邏輯文件PFFHSL1的鍵值為FHS01邏輯文件PFFHSL2的鍵值為FHS02邏

6、輯文件PFFHSL3的鍵值為FHS01、FHS02注:文件的記錄格式,可以理解為給這個文件整條記錄起的一個名字;或者是說將每條記錄視都視做一個類型相同大變量,然后給這個大變量起的名字。所以文件的記錄格式信息中,包含有一條記錄由多少個字段組成,總計長度是多少這樣的信息。文件的記錄格式,與各個字段同時定義。(寫文件的源碼時)文件的記錄格式在RPGLE的程序中,不能與文件名相同。2.3 簡單的程序流程為方便起見,系統(tǒng)自動顯示的就不再貼出來了,只貼代碼段。FPFFHS UF E DISK CREADFMTFHSCEVALFHS01=”01”CUPDATEFMTFHSCSETONLRCRETURN這個程

7、序的意思,是說讀PFFHS這個文件,然后將讀到的第一條記錄中的FHS01這個字段的值修改為“01”?!癝ETONLR”,LR的位置可在HI、LO、EQ中任選一處。意思是指將打開指示器*INLR,即賦值使指示器*INLR的值等于1。等價于“EVAL*INLR=1”,意思是強(qiáng)制將內(nèi)存中的數(shù)據(jù)寫到磁盤中。(基于效率因素,系統(tǒng)在修改文件時,會先將修改的結(jié)果先放在內(nèi)存中,在同一程序中,讀取數(shù)據(jù)也是先從內(nèi)存中查詢。)LR,取自是Last RecordRETURN,表示程序結(jié)束,在后面“操作碼”一節(jié)中,會有講述。如果不太明白,就記住CSETONLRCRETURN或CEVAL*INLR=1CRETURN這兩句

8、話加在一起,表示程序結(jié)束就可以了。從這個程序中,我們可以看到,RPGLE的程序,大致上可以分為兩個部分:1、 聲明、定義部分:聲明程序中使用到的文件(F行),定義程序中使用的變量(D行)2、 程序運(yùn)行部分 :即C行,也就是程序段。在RPGLE程序中,F(xiàn)行必須在D行前面,D行必須在C行前面。程序執(zhí)行的起始順序,將從定義部分之后,第一個C行開始,順序向下執(zhí)行。程序中的F行、D行都不是必須項(xiàng),一個程序可以沒有F行(如僅完成計算功能的公共函數(shù),比如計算利息),也可以沒有D行(沒有需要特別定義的變量,或者所有變量都在C行進(jìn)行定義),但不應(yīng)該沒有C行,因?yàn)镕行與D行都屬于非執(zhí)行行,是起定義作用;C行是執(zhí)行

9、行。沒有C行的程序,是無執(zhí)行意義的。2.4 常見的程序流程FPFFHS UF E DISK /聲明文件PFFHSD LSFLD01S2/定義臨時變量LSFLD01CEVALLSFLD01=01/給變量LSFLD01賦值CEXSRSUB#UPD/執(zhí)行子過程SUB#UPDCEVALLSFLD02=02/給變量LSFLD02賦值CEXSRSUB#UPD/執(zhí)行子過程SUBUPDCSETONLR/數(shù)據(jù)寫入磁盤CRETURN/程序結(jié)束CSUB#UPDBEGSR/子過程SUB#UPD開始CREADFMTFHS/讀PFFHS文件CEVALFLD01=LSFLD01/給字段FLD01賦值CUPDATEFMTFH

10、S/修改文件CENDSR/子過程結(jié)束“/”后面的,只是簡單的解釋,如果自已動手寫,不需要輸入這些內(nèi)容。系統(tǒng)在運(yùn)行這個程序時,是按如下的順序來執(zhí)行:1. 首句EVAL賦值語句,直接執(zhí)行;2. 當(dāng)系統(tǒng)發(fā)現(xiàn)操作碼“EXSR”時,根據(jù)后面的變量名“SUB#UPD”,去查找對應(yīng)的“SUB#UPDBEGSR”語句;3. 然后從“SUB#UPDBEGSR”之后,順序向下執(zhí)行,直至“ENDSR”語句4. 執(zhí)行到“ENDSR”之后,將會再回到當(dāng)初的“EXSRSUB#UPD”處,繼續(xù)向下執(zhí)行,直到RETURN語句為止這里提出一點(diǎn)要注意,如果子過程中,又執(zhí)行了自身,即在SUB#UPD程序中,又出現(xiàn)了“EXSRSUB

11、#UPD”,是可以編譯通過的,但在執(zhí)行過程中,系統(tǒng)會因?yàn)闊o法定位,而出現(xiàn)死循環(huán),直至報錯異常中斷退出。也就是RPGLE的程序中,子過程不允許出現(xiàn)遞歸。2.5 F行說明2.5.1 內(nèi)容說明首位填上F,然后按F4,會出現(xiàn)如下內(nèi)容: File File End of File Filename Type Designation File Addition Sequence File Record Limits Length of Record Format Length Processing Key Field Address Type File Organization Device Keywor

12、ds Comment 各項(xiàng)的含義分別是:Filename:需要聲明的文件名,必須頂格,文件名必須唯一,也就是程序中對同樣的文件名不能聲明兩次。File Type:聲明文件的處理類型。必須填寫。允許的選項(xiàng)有:I:輸入型,即只讀文件,對聲明的文件只取其記錄的值,不對記錄進(jìn)行修改U:修改型,即對聲明的文件進(jìn)行修改操作(刪除記錄屬于修改操作的一種)O:輸出型,即只寫,對聲明的文件只進(jìn)行寫操作。C:混合型,用于對屏幕文件的定義。(混合型,即輸入/輸出型,以屏幕文件為便,也就是讀取屏幕文件的一些輸入字段信息,同時也可以輸出一些字段的值到屏幕文件中,但不能對屏幕文件自身進(jìn)行修改,所以與上面的U是有區(qū)別的)F

13、ileDesignation:文件的指定方式,允許的選項(xiàng)有:不填:表示這是一個輸出文件,即“File Type”項(xiàng)為“O”時,此項(xiàng)不填P:表明聲明的文件是主文件,這個很少用,cycle相關(guān)S:表明聲明的文件是次文件,這個沒用過,cycle相關(guān)R:Record address file,記錄地址文件?沒用過T:數(shù)組或表文件?不懂,沒用過F:常用,具體含義不知道該如何翻譯(Full procedural file)簡單來說,不考慮cycle(循環(huán)控制),這樣理解就夠了:當(dāng)“File Type”為I,U,C時,這里填“F”當(dāng)“File Type ”為O時,這里不填寫End of File:程序結(jié)束前

14、,對記錄的處理方式??梢圆惶?,或填“E”。但從英文解釋上來看,不敢妄下定論,似乎不填,表示在程序結(jié)束前,要處理所有文件的所有記錄(含LF?);填E,表示只處理這個文件的所有記錄?總之,此項(xiàng)一般是不填。File Addtion:是否會增加文件中的記錄,即是否會對文件進(jìn)行寫操作。可以不填,或填“A”當(dāng)File Type為“O”時,系統(tǒng)自動默認(rèn)此項(xiàng)為“A”,不必填寫;當(dāng)File Type為“I”,或“U”時,這項(xiàng)內(nèi)容可以填“A”,也可以不填。不填,即表示不會增加文件中的記錄,也就是沒有寫操作;填“A”時,即表示會增加文件中的記錄,也就是會對文件進(jìn)行寫操作。Sequence:針對cycle使用的,表示

15、排序順序。(Cycle我沒有用過,估計可能是使用控制起來,程序代碼不那么直觀,不利于上手和維護(hù),所以現(xiàn)在已經(jīng)不流行使用了。)當(dāng)定義為非cycle文件時,即“File Designation”項(xiàng)非“P”、“S”時,此項(xiàng)必須為空;當(dāng)定義為cycle文件時,即“File Designation”項(xiàng)為“P”、或“S”時,此項(xiàng)可填空、A、D。A表示升序,D表示降序。因?yàn)镃YCLE現(xiàn)在已不常用,所以通常不填。File Format文件格式,不能為空,允許的值有:E:聲明的文件,是外部描述的文件(即文件在程序運(yùn)行之前就已存在?)F: 聲明的文件,是一個程序描述文件?(不知道什么意思,沒用過)這里通常填“E”

16、,即為外部描述文件Record Length“File Format”為“F”時,才需要填寫。沒用過通常不填Limit Processing不懂。通常不填。Length of Key Field查詢時,索引鍵值的長度如果“File Format”項(xiàng)等于“E”,即外部描述文件時,此項(xiàng)不填如果“File Format”項(xiàng)等于“F”,便不需要按KEY值查詢時,此項(xiàng)也不填如果“File Format”項(xiàng)等于“F”,需要按KEY值查詢時,此項(xiàng)填寫KEY值的長度(12000)。因?yàn)橐话愣际褂猛獠棵枋鑫募?,所以這里一般都不填寫。Record Address Type記錄尋址類型,好象是對文件鍵值的描述。允許

17、的值如下:空:不使用KEY值,在程序段中,不會對文件的查詢定位操作,如“SETLL”、“CHAIN”操作碼都不會用的時,該項(xiàng)填空。K: 使用KEY值,即表示會對聲明的文件進(jìn)行查詢定位操作,此時聲明的文件必須有鍵值,即必須為邏輯文件(LF文件),或在生成文件時,已加入了KEY值。(下面的選項(xiàng)應(yīng)該是程序描述文件才會使用)A:KEY值為字符型D:KEY值為日期型F:KEY值為數(shù)字型G:KEY值為非英文字符P:KEY值為壓縮型數(shù)字T:KEY值為時間型Z:KEY值為timestamp?總之,如果要按照鍵值對聲明的文件進(jìn)行查詢定位操作(即程序中使用了CHAIN、SETLL操作碼,則此項(xiàng)需要填寫“K”;如不

18、需要進(jìn)行查詢操作,則不填。),此項(xiàng)填“K”時,聲明的文件必須含有KEY值。File Organization不知道,一般不填Device聲明文件的存放位置,必須填寫,允許的值有:DISK:磁盤文件,即文件存儲在磁盤上,最常見的;PRINTER:打印文件,提供打印輸出描述,以及對打印設(shè)備訪問。打印報表用這個;WORKSTN:workstation,工作站,顯示文件。屏幕文件(DSPF)的定義用這個值(下面這兩種我沒用過的)SEQ:磁帶文件,文件存儲在磁帶上。SPECIAL:特殊文件,我現(xiàn)在也不是很清楚具體使用方式。據(jù)blogliou說,這種類型,是允許指定一種不能被RPG直接操作的輸入/輸出設(shè)備

19、。比如可以通過SPECIAL文件,在RPGLE程序中實(shí)現(xiàn)象讀寫磁盤一樣,對DTAQ進(jìn)行程序間數(shù)據(jù)交換。Keyword可以不填,常用的值有(這里只列出幾個常用的):COMMIT該文件記錄的數(shù)據(jù)操作進(jìn)行日志處理(關(guān)于日志處理,后面會章節(jié)會講到)RENAME對文件記錄格式名進(jìn)行重命名。比如說程序中需要同時聲明PFFHSL1,PFFHSL2這兩個邏輯文件。這兩個邏輯文件的記錄格式名都是一樣(通常和PF一樣,即都為FMTFHS;不過也可以定義成不同。如果不同,當(dāng)然就不需要使用RENAME鍵字了)。那么,為了能讓系統(tǒng)區(qū)分,就必須對其中一個的記錄格式名進(jìn)行重命名。RENAME的語法:RENAME(舊記錄格式

20、名:新記錄格名),如下:FPFFHSL1IFE DISKFPFFHSL2IFEDISKRENAME(FMTFHS:FMTFHS2新記錄格式可以自由定義,只要在該程序中無同名的即可。RENAME并不會真正的更改文件的記錄格式名,僅是在當(dāng)前運(yùn)行程序中進(jìn)行重命名。對同時運(yùn)行的其它程序無影響USROPN對于聲明的文件,由用戶自行打開。如果不填寫此關(guān)鍵字,系統(tǒng)將會在程序最最開始(執(zhí)行第一句C行語句前),自動執(zhí)行“OPEN文件” 的操作,在程序結(jié)束后,自動執(zhí)行“CLOSE文件”的操作。而填寫此關(guān)鍵字之后,OPEN,CLOSE的操作將由用戶在C行程序段中,自行處理。如果用戶未執(zhí)行OPEN操作,就執(zhí)行CHAI

21、N、READ、SETLL等語句,在編譯程序時就會報錯。程序在結(jié)束之前,必須關(guān)閉所有已打開的文件,所以用起來會比較繁瑣。USROPN常作用于對文件的解鎖,在同一程序中打開同一文件的不同MEMBER等,屬于一個較高級的用法,可在實(shí)際操作中慢慢體會。OPEN,CLOSE的操作碼,對應(yīng)的是文件名,不是記錄格式名。即COPENPFFHSL1CCLOSEPFFHSL1而不是COPENFMTFHSComment注釋說明。源自RPG,在RPG中是有作用的,可以對程序作簡短的說明,但在RPGLE中,其實(shí)已經(jīng)沒有作用了,此項(xiàng)不用填。(填了也沒用)2.5.2 常用例子對文件進(jìn)行只讀的聲明:FPFFHS IF E D

22、ISK 對文件進(jìn)行修改的聲明:FPFFHS UF E DISK 對文件進(jìn)行只寫的聲明:FPFFHS O E DISK 對文件進(jìn)行修改,以及增加記錄的操作:FPFFHSUF A EDISK對文件進(jìn)行查詢,增加記錄的操作,并對文件進(jìn)行查詢操作:FPFFHSL1IF AE KDISK聲明兩個記錄格式相同的文件,并對其中之一進(jìn)行重命名FPFFHSL1IFE K DISKFPFFHSL2IFE K DISKRENAME(FMTFHS:FMTFHS2)注:在聲明時,兩個文件不一定要上下緊接著;隨便改哪一個文件對應(yīng)的記錄格式都可以;新舊記錄格式名用冒號隔開,新記錄格式名可自行定義,無規(guī)則。對文件的修改操作進(jìn)

23、行日志處理:FPFFHSL2UFE KDISKCOMMITcycle類文件的聲明:FPFFHSL2 IP E K DISK這樣文件聲明為P之后,程序中不需要寫循環(huán)讀文件,也不需要寫RETURN,設(shè)指示器INLR,也就是FPFFHSL2 IP E K DISKC READ 記錄格式名等價于FPFFHSL2 IF E K DISKC DOW 1 = 1C READ 記錄格式名 EQ指示器C IF EQ指示器=1C LEAVEC ENDIFC ENDDOC RETURN2.5.3 補(bǔ)充說明聲明的文件,可以同時使用多個keyword關(guān)鍵字,并可以不在同一行(但必須緊接在聲明的文件的下面),如下:FPF

24、FHSL2IFEDISKRENAME(FMTFHS:FMTFHS2)FCOMMIT即表示文件PFFHSL2,同時使用了RENAME、COMMIT兩個關(guān)鍵字。如果寫得下,也可以寫在同一行,以空格鍵分開,如下FPFFHSL2IFEDISKCOMMIT RENAME(FMTFHS:FMTFHS2)2.6 D行說明首行填“D”,然后按F4,會出現(xiàn)如下內(nèi)容: Declaration To / Name E S/U Type From Length Internal Decimal Data Type Positions Keywords Comment2.6.1 內(nèi)容說明 Name:定義的變量的名字,該

25、名字可以不頂格寫。(即允許有縮進(jìn))E:標(biāo)識定義的變量是否源自外部數(shù)據(jù)結(jié)構(gòu)??梢圆惶睿蛱睢癊”上面的解釋可能有點(diǎn)饒口,其實(shí)這個地方的意思,就是說:如果是程序內(nèi)部自行定義一個臨時變量,此處不填;如果是引用的一個外部文件作為數(shù)據(jù)結(jié)構(gòu),那么這里就要填“E” ;同時“Declaration Type”處,就要填“DS”,即定義為一個結(jié)構(gòu);“Keywords”處要使用EXTNAME關(guān)鍵字所謂“引用一個外部文件作為數(shù)據(jù)結(jié)構(gòu)”,也就是說定義一個結(jié)構(gòu),整個結(jié)構(gòu)中的變量,參照外部文件來定義。所謂結(jié)構(gòu),可以理解為一個“由多個變量組合而成的大變量”。舉例而言:D MYDS E DS EXTNAME(PFFHS)和D

26、 MYDS DSD FHS01 12(1在From項(xiàng);2在To / length 項(xiàng))D FHS0234DFHS0356是等價的,都是定義一個結(jié)構(gòu)變量MYDS(名字可以自行定義),這個結(jié)構(gòu)變量是由三個字符型變量FHS01,F(xiàn)HS02,F(xiàn)HS03拼成的。第一種定義方法,就是引用外部文件“PFFHS”作為數(shù)據(jù)結(jié)構(gòu)的定義,注意使用到了“EXTNAME”關(guān)鍵字,而且“E”項(xiàng)的值為“E”。而第二種定義方法,就是直接定義一個結(jié)構(gòu)“MYDS”。注意沒有使用外部文件時,“E”項(xiàng)的值為空。S/U:不知道,一般都填空。Declaration Type:定義變量的類型,允許的值如下:不填:非以下內(nèi)容:數(shù)據(jù)結(jié)構(gòu)、常量

27、、獨(dú)立變量、數(shù)組、表。此項(xiàng)為空時,好象只能用來表示當(dāng)前定義的變量是屬于結(jié)構(gòu)的一個變量。在下面會舉例DS:數(shù)據(jù)結(jié)構(gòu),即定義一個結(jié)構(gòu)變量,這個之前已講過C:常量常量只能使用字符,不需要定義常量的長度、類型。常量的內(nèi)容寫在“Keywords”處,并使用CONST關(guān)鍵字,在程序段中,不能對常量進(jìn)行賦值操作。D MYNUM C CONST('abcdefghijklmn')就是定義一個叫做MYNUM的常量,這個常量包含字母a-n。PI:不知道,沒有用過PR:不知道,沒用過S:定義以下內(nèi)容:獨(dú)立變量、數(shù)組、表定義一個叫MYFIELD1的變量,變量為1位長的字符型DMYFIELD1S1/1在

28、“To/length”項(xiàng)定義一個叫MYARRAY的數(shù)組,共含3條記錄,每條記錄為1位字符型D MYARRAYS1DIM(3)/DIM在“Keywords”項(xiàng)表的定義沒有用過總之,這一項(xiàng),最常用的,就是“DS”、“S”與空。即結(jié)構(gòu)體與獨(dú)立變量,其它選項(xiàng)較少用到。From:當(dāng)“Declaration Type”項(xiàng)為“S”時,表示獨(dú)立變量、數(shù)組,此項(xiàng)不填當(dāng)“Declaration Type”項(xiàng)為“DS”時,表示結(jié)構(gòu),此項(xiàng)仍然不填當(dāng)“Declaration Type”項(xiàng)為空時,表示當(dāng)前定義的變量,屬于上面定義的結(jié)構(gòu),此時,此項(xiàng)可以填寫,也可以不填寫。當(dāng)填寫時,“From”項(xiàng)表示變量在結(jié)構(gòu)中的起始位置,

29、右對齊;“To/length”表示變量在結(jié)構(gòu)中的結(jié)束位置,也是右對齊。當(dāng)不填寫時,“To/length”表示直接定義為變量長度。舉例:D MYDSDSDDSFLD0112/1在“From”項(xiàng),2在“To/length”項(xiàng)DDSFLD0234與D MYDSDSDDSFLD012/2在“To/length”項(xiàng)DDSFLD022其實(shí)是等價的,都是定義一個結(jié)構(gòu)變量MYDS,這個結(jié)構(gòu)變量中,包含了兩個變量DSFLD01,DSFLD02,這兩個變量都是兩位長字符。所不同的是,第一種定義方法,是指定了變量在結(jié)構(gòu)中的位置;而第二種方法,是直接指定變量的長度和類型注意到上面的定義中,DSFLD01、DSFLD0

30、2的Declaration Type為空,也就是表示這兩個字段是屬于上面定義的結(jié)構(gòu)MYDS。如果此項(xiàng)為“S”,即表示這個變量與結(jié)構(gòu)無關(guān)D MYDSDSDDSFLD012/2在“To/length”項(xiàng)DDSFLD02S2在這個定義中,變量DSFLD02就是一個獨(dú)立的變量,與結(jié)構(gòu)MYDS無關(guān)。Length:上面已講述在定義結(jié)構(gòu)時的使用方法。在定義非結(jié)構(gòu)時,此項(xiàng)的內(nèi)容即為定義變量的長度。右對齊Internal Data Type:定義變量的類型,允許的值有:空:變量定義為字符型、壓縮型數(shù)字A:變量定義為字符型B:二進(jìn)制?不知道D:變量定義為日期型F:變量定義為浮點(diǎn)型?G:變量定義為圖型?(非英文?漢

31、字?)I:變量定義為帶符號的整數(shù)N:變量定義為指示器變量?(沒用過)P:變量定義為壓縮型數(shù)字S:變量定義為普通的數(shù)型T:變量定義為時間型U:變量定義為無符號的整數(shù)Z:變量定義為日期+時間型(格式:年-月-日-時.分.秒.微秒)*:變量定義為指針型其實(shí)我最常用,就是不填,因?yàn)橐话愕某绦?,有字符和?shù)字這兩種類型變量,就足夠了。Decimal Positions:當(dāng)變量定義為數(shù)字型時,用來標(biāo)志小數(shù)的位數(shù)。當(dāng)“To/Length”項(xiàng)為3,“Internal Data Type”項(xiàng)為空時此項(xiàng)為空,表示定義的變量為3位長的字符型DMYFLD01S3/定義為3位字符型此項(xiàng)不為空(右對齊),表示定義的變量為數(shù)

32、字型DMYFLD01S3 2/定義數(shù)字型變量,1位整數(shù),2位小數(shù)(總長為3位)Keywords:關(guān)鍵字,可以不填,常用的值如下:(同樣,這里我也只列出幾個常用的,這里先不做詳細(xì)說明,僅供參考,在后面的例子,看看就知道用法了)CONST:定義常量的值DIM:定義數(shù)組EXTNAME:引用外部文件作為數(shù)據(jù)結(jié)構(gòu)變量EXTFLD:對引用了外部文件作為數(shù)據(jù)結(jié)構(gòu)的某個變量,進(jìn)行重命名LIKE:定義變量時,參照已存在的變量定義OCCURS:定義結(jié)構(gòu)體變量時,指定的結(jié)構(gòu)體變量的記錄條數(shù)INZ:定義變量時,賦值初始值DATFMT:定義日期變量時,指定日期格式*MDY (mm/dd/yy) *DMY (dd/mm/

33、yy) *YMD (yy/mm/dd) *JUL (yy/ddd) *ISO (yyyy-mm-dd)*USA (mm/dd/yyyy)*EUR (dd.mm.yyyy)*JIS (yyyy-mm-dd)Comment注釋項(xiàng),源自RPG,不用填,因?yàn)樘盍艘矝]用。2.6.2 常用例子定義一個10位長的字符型變量:D MYFLDS10定義一個10位長,其中含2位小數(shù)的字符型變量,并使其初始值為1D MYFLDS10 2INZ(1)定義一個每條記錄為5位長字符型變量,共10條記錄的數(shù)組D MYFLDS 5DIM(10)定義一個10位長的字符型變量,再定義一個變量,參照前一變量定義D MYFLD01S

34、10D MYFLD02SLIKE(MYFLD01)定義一個結(jié)構(gòu),由一個3位長的字符變量,和一個10位長,其中2位小數(shù)的數(shù)字變量組成D MYDSDSD MYDS01 3DMYDS0210 2定義一個結(jié)構(gòu)變量,結(jié)構(gòu)內(nèi)容參照外部文件PFFHSD MYDSEDSEXTNAME(PFFHS)定義一個結(jié)構(gòu)變量,結(jié)構(gòu)內(nèi)容參照外部文件PFFHS,并且將第二個字段重命名為FHS999D MYDSEDSEXTNAME(PFFHS)D FHS999EDSEXTFLD(FHS02)定義一個日期型變量,格式為yyyy-mm-ddD MYDATESDDATFMT(*ISO)2.6.3 補(bǔ)充說明變量的定義,除了在D行定義之

35、外,還可以在C行通過賦值語句直接定義如DFLD01S2INZ(01)與CMOVE01FLD012/2在length處,右對齊是等價的定義結(jié)構(gòu)之后,可以將結(jié)構(gòu)變量視為一個普通的變量進(jìn)行賦值來改變結(jié)構(gòu)變量的值,也可以通過對組成結(jié)構(gòu)變量的變量進(jìn)行賦值,來達(dá)到修改結(jié)構(gòu)變量的值的目的。如:D MYDSDSDMYFLD012DMYFLD022在C行中,這兩句是等價的CEVAL%SUBST(MYDS:3:2)=01CEVALMYFLD02=01第一句是直接改結(jié)構(gòu)變量MYDS的后兩位的值(當(dāng)然,此時MYFLD02的值也變化了)第二句是對MYFLD02進(jìn)行賦值,同樣,賦完值之后,MYDS的后兩位也變?yōu)?1在需要

36、頻繁進(jìn)行數(shù)字與字符之間轉(zhuǎn)換時,偷懶的人會通過定義這樣的結(jié)構(gòu)來達(dá)到目的:D MYDSDSDMYFLD0118DMYFLD0218 0比如說,給MYFLD01賦值為20070208之后,MYFLD02也就自動等于20070208;然后給MYFLD02加1之后,MYFLD02等于20070209,MYFLD01的值也自動等于20070209??梢哉J(rèn)為結(jié)構(gòu)變量MYDS是字符型(即一直等于MYFLD01的值)這種方法,當(dāng)需要字符型變量時,就使用MYFLD01;當(dāng)需要數(shù)字變量時,就使用MYFLD02,不過我總覺得有點(diǎn)類似于作弊,一般沒用。關(guān)于數(shù)組、結(jié)構(gòu)體的內(nèi)容,因?yàn)橐f起來內(nèi)容還頗多,而也屬于略為高級一些

37、的用法,所以將在后面專設(shè)章節(jié)講述。2.7 入口參數(shù)程序可以通過“*ENTRY”定義入口參數(shù),或稱之為接口參數(shù),來傳遞數(shù)據(jù)。假設(shè)有程序FHS01ILE,其中入口參數(shù)的定義如下:C*ENTRYPLISTCPARMFLD013CPARMFLD024其中:*ENTRY在“Factor 1”項(xiàng);PLIST在“Operation”項(xiàng);PARM在“Operation”項(xiàng);FLD01、FLD02都在“Result”項(xiàng)上述定義,表示這個程序通過兩個字段與其它外部程序溝通。那么別的程序(如FHS02ILE)在調(diào)用程序FHS01ILE時,就要帶上兩個字符型變量,如CCALLFHS01ILECPARMFHSFLD01

38、3CPARMFHSFLD024在兩個程序里,這兩個變量名可以不同(比如說一邊叫FHSFLD01,F(xiàn)HSFLD02;一邊叫FLD01,F(xiàn)LD02),但長度,類型必須匹配。如果在FHS02ILE中,F(xiàn)HSFLD01等于123,F(xiàn)HSFLD02等于abcd,那么系統(tǒng)在運(yùn)行CALL語句,執(zhí)行程序FHS01ILE時,將會對字段FLD01初始化賦值,使其一開始就等于123,字段FLD02等于abcd。如果FHS01ILE程序中,對FLD01、FLD02進(jìn)行了改動,比如FLD01最后等于789,F(xiàn)LD02最后等于efgh,那么程序FHS02ILE在調(diào)用完FHS01ILE之后,F(xiàn)HSFLD01、FHSFLD0

39、2這兩個字段也同樣會改變,成為789,和efgh也就是入口參數(shù)的變化是可以傳遞的,其實(shí)應(yīng)該很好理解吧。入口參數(shù)的定義,可以寫在程序的任何一處,而程序的執(zhí)行,始終是從C行的順序第一行開始執(zhí)行,與入口參數(shù)所在的位置無關(guān)。FHS02ILE也可以使用一個大變量來調(diào)用FHS01ILE,只要總長相等即可(這種方法僅限于被調(diào)用的程序FHS01ILE的入口參數(shù)全部為字符型才可使用,僅僅只是不會錯,不建議這樣使用。CCALLFHS01ILEPARMFHSFLD017其實(shí)從上面的例子可以看出,入口參數(shù)可以使用結(jié)構(gòu)的形式來表達(dá),所以下面這種寫法也不會有錯。(如果被調(diào)用程序有數(shù)字型變量,只要在定義結(jié)構(gòu)時也定義為數(shù)字型

40、即可)DMYDSDSDDS013DDS024CCALlFHS01ILECPARMMYDS不過要注意,如果RPG程序調(diào)用C程序,那么入口參數(shù)必須嚴(yán)格按照C程序中的來,比如C程序中帶了兩個字符型參數(shù),那么RPG程序中也必須是兩個字段入口參數(shù),不能使用由兩個字符變量組成的結(jié)構(gòu)。原理可以自行想想。既然可以使用結(jié)構(gòu)做為入口參數(shù),當(dāng)然,也可以參照外部文件來定義結(jié)構(gòu)做為入口參數(shù)D MYDSEDSEXTNAME(PFFHS)CCALLFHS01ILECPARMMYDS與CCALLFHS01ILECPARMFHS012CPARMFHS022CPARMFHS032是等價的??梢钥吹?,參照外部文件定義結(jié)構(gòu)做為入口參

41、數(shù)時,可以有效的節(jié)省代碼行,而且不會出現(xiàn)遺漏。所以在實(shí)際使用中,常會看到,將一些公共程序的入口參數(shù)定義成一個PF文件。而調(diào)用它的程序,就參照這個PF文件,定義結(jié)構(gòu)做為調(diào)用的接口參數(shù)。當(dāng)接口參數(shù)不一致時,如FHS02ILE中漏了第二個參數(shù)時:CCALLFHS01ILECPARMFHS013此時,并不是一開始運(yùn)行FHS01ILE程序,系統(tǒng)判斷入口參數(shù)不符就報錯;實(shí)際上,此時,F(xiàn)LD01的值還是正確的,但FLD02的值就處于一個未初始化的狀態(tài)。于是,當(dāng)代碼執(zhí)行到與FLD02有關(guān)的操作碼時,才會報錯;如果FHS01ILE在運(yùn)行的過程中,因?yàn)檫壿嬇袛啵ㄈ鏘F條件判斷)的關(guān)系,而未執(zhí)行任何與FLD02有關(guān)

42、的操作碼,那么程序會正常運(yùn)行完畢,不會有報錯。這時,F(xiàn)HS02ILE調(diào)用了程序FHS01ILE之后,程序中原有的接口參數(shù)的數(shù)據(jù)就可能因?yàn)檫@次調(diào)用程序而發(fā)生錯位,從而導(dǎo)致數(shù)據(jù)的錯誤、混亂。數(shù)據(jù)的錯誤、混亂其實(shí)還不是最大的問題,更大的問題在于“這時我們不知道數(shù)據(jù)已經(jīng)出錯了”。解決之道,也是如上所說,對于調(diào)用頻繁,且入口參數(shù)較多的公共程序,考慮將其入口參數(shù)寫成一個PF文件。這樣調(diào)整入口參數(shù)時,只要修改PF文件并重新編譯,再編譯相關(guān)程序即可(至少發(fā)生遺漏時,程序會報錯異常中斷,不會出現(xiàn)錯誤的數(shù)據(jù)而不自知)2.8 C行說明2.8.1 寫在前面終于說到程序的執(zhí)行部分,也是我們寫程序的平時接觸的最多的一部分

43、:“C”行了。在這里,我想先說一下我個人的看法:400系統(tǒng),提供了一些語法,可以大大減少程序代碼行數(shù)。但是如果這個用法并不普遍,那么并不建議使用(當(dāng)然自己用來練習(xí)無妨),否則會給其它讀代碼的人帶來困難,同時也會給自己帶來麻煩(比如出了問題,別人看不懂,自然會打電話來問原作者)基于這樣的道理,同樣,我認(rèn)為FREE格式的程序,雖然可以自由書寫,有縮進(jìn)等優(yōu)勢,但是除非整個項(xiàng)目組所有成員都已熟練掌握FREE格式的程序,或已進(jìn)行過完善、系統(tǒng)的FREE格式的培訓(xùn),才能正式使用。如果只是知道幾個與RPG,RPGLE對應(yīng)的語法就用來進(jìn)行實(shí)際處理,可能會造成的維護(hù)的不便,尤其是在出現(xiàn)一些不那么明顯的錯誤之后。至

44、于cycle,不知道是不是基于這個原因,現(xiàn)在用得也比較少了。感覺RPGLE中,至少有一半的內(nèi)容是與cycle相關(guān)的。2.8.2 內(nèi)容說明 Level N01 Factor 1 Operation Factor 2 Result Decimal Length Positions HI LO EQ Comment Level:和cycle相關(guān),沒研究過,一般不填N01:這個含義比較豐富,我只用過其中一種:首位不帶N,后面填寫0199的數(shù)字時,表示相應(yīng)的指示器打開時,執(zhí)行后面的操作,如:C 12EVALFHS01=01等價于IF*IN12=1EVALFHS01=01ENDIF首位帶N,后面填寫019

45、9的數(shù)字,表示相應(yīng)的指示器關(guān)閉時,執(zhí)行后面的操作要注意,該項(xiàng)內(nèi)容僅作用于該行操作碼。如果指示器打開后,需要執(zhí)行多條語句,那么每條語句前面,該項(xiàng)都要賦值。即CIF*IN12=1CEVALFHS01=01CEVALFHS02=02CENDIF如果用這種方式來表達(dá),就要寫作C12EVALFHS01=01C12EVALFHS02=02所以說,根據(jù)指示器狀態(tài)來執(zhí)行的語句,在執(zhí)行少量操作碼時,可以使用這種方法;如果語句較多,修改起來不方便,還是直接用IFENDIF的判斷語句比較合適。該項(xiàng)還有針對其它指示器的用法,看上去似乎又是與CYCLE相關(guān),暫不介紹了。Factor 1:操作內(nèi)容一,將在后面與操作碼一起講Operation:操作碼,后面有專門章節(jié)講解操作碼Factor 2:操作內(nèi)容二,同上Result:操作結(jié)果,同上Length:長度。變量的定義,除了在D行定義之外,還可以在C行通過賦值語句直接定義如DFLD01S2INZ(01)與CMOVE01FLD012/2在length處,右對齊是等價的一個變量,在整個程序中,只要定義一次就可以了,對定義的

溫馨提示

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

最新文檔

評論

0/150

提交評論