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

下載本文檔

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

文檔簡介

1簡樸闡明錯誤!未定義書簽。

2程序代碼行H勺編寫錯誤!未定義書簽。

2.1最簡樸的RPGLE程序錯誤!未定義書簽。

2.2舉例準(zhǔn)備錯誤!未定義書簽。

2.3簡樸H勺程序流程錯誤!未定義書簽。

2.4常見的程序流程錯誤!未定義書簽。

2.5F行闡明錯誤!未定義書簽。

內(nèi)容闡明錯誤!未定義書簽。

常用例子錯誤!未定義書簽。

補充闡明錯誤!未定義書簽。

2.6D行闡明錯誤!未定義書簽。

內(nèi)容闡明錯誤!未定義書簽。

常用例子錯誤!未定義書簽。

補充闡明錯誤!未定義書簽。

2.7入口參數(shù)錯誤!未定義書簽。

2.8C行闡明錯誤!未定義書簽。

寫在前面錯誤!未定義書簽。

內(nèi)容闡明錯誤!未定義書簽.

ILE操作碼分類:錯誤!未定義書簽。

ILE操作碼錯誤!未定義書簽。

A-C錯誤!未定義書簽。

D-E錯誤!未定義書簽。

F-N錯誤!未定義書簽。

0-R錯誤!未定義書簽。

S-Z錯誤!未定義書簽。

3和程序有關(guān)的數(shù)據(jù)庫知識錯誤!未定義書簽。

3.1LF(邏輯文獻(xiàn))錯誤!未定義書簽。

邏輯文獻(xiàn)概念錯誤!未定義書簽。

有關(guān)編譯的問題錯誤!未定義書簽。

邏輯文獻(xiàn)對效率口勺影響錯誤!未定義書簽。

3.2MEMBER錯誤!未定義書簽。

3.3游標(biāo)錯誤!未定義書簽。

游標(biāo)的概念錯誤!未定義書簽。

不一樣操作碼對應(yīng)的游標(biāo)的處理錯誤!未定義書簽。

“有且僅有”口勺游標(biāo)錯誤!未定義書簽。

LOVAL.HIVAL對應(yīng)的游標(biāo)操作錯誤!未定義書簽。

3.4事務(wù)處理-COMMIT錯誤!未定義書簽。

概念描述錯誤!未定義書簽。

使用措施錯誤!未定義書簽.

注意事項錯誤!未定義書簽。

3.5有關(guān)鎖表的問題LCKW錯誤!未定義書簽。

4DEBUG調(diào)試以及常見出錯信息錯誤!未定義書簽。

4.1寫在前面錯誤!未定義書簽。

4.2常規(guī)使用方法錯誤!未定義書簽。

程序編譯錯誤!未定義書簽。

執(zhí)行DEBUG命令錯誤!未定義書簽。

運行程序錯誤!未定義書簽。

在DEBUG模式中進(jìn)行調(diào)試錯誤!未定義書簽。

跟蹤被目前途序調(diào)用的程序錯誤!未定義書簽。

一定要退出DEBUG模式錯誤!未定義書簽。

補充錯誤!未定義書簽。

4.3跟蹤批處理程序(Fromqingzhou)錯誤!未定義書簽。

4.4常見的出錯信息錯誤!未定義書簽。

編譯程序時的出錯信息錯誤!未定義書簽。

運行時H勺出錯信息錯誤!未定義書簽。

5CL、CMD錯誤!未定義書簽。

5.1CL程序錯誤!未定義書簽。

基本認(rèn)識錯誤!未定義書簽。

CL程序的常用語法及命令:錯誤!未定義書簽。

不常用H勺語法錯誤!未定義書簽.

5.2CMD錯誤!未定義書簽。

6屏幕文獻(xiàn)及使用錯誤!未定義書簽。

7其他錯誤!未定義書簽。

7.1報表打印錯誤!未定義書簽。

7.2SAVF,備份與恢復(fù)錯誤!未定義書簽。

7.3菜單一MENU錯誤!未定義書簽。

7.4開發(fā)時常用口勺命令錯誤!未定義書簽。

7.5一點想法錯誤!未定義書簽。

1簡樸闡明

內(nèi)部交流、或可作培訓(xùn)使用。對顧客作如下假定:

1、能COPY、修改、編譯源代碼(RPGLE、CLP),并能運行編譯后H勺程序

2、能COPY、修改、編譯文獻(xiàn)(PF、LF、PRTF、DSPF);

3、對數(shù)據(jù)文獻(xiàn)(PF)有簡樸的認(rèn)識(FIELD-RECORD9PF),并懂得LF與PFH勺對應(yīng)關(guān)系。

2程序代碼行的編寫

2.1最簡樸的RPGLE程序

為便于理解,這里寫一種最簡樸的RPGLE程序

CL0N01Factorl+++++++Opcodc&ExtFact()r2+++++++Result++++++++Len++D+HiL<)Eq

**與當(dāng)******咨****Beginningofdata*************^*******^***^^*****^****

0001.00CHELLOWORLD,DSPLY

00D2.00CRETURN

******************Endofdata*******************a******g*************

這個程序編譯成功,并調(diào)用(CALL程序名),就是在屏幕上反白顯示“HELLOWORLD”字樣。(其

中,綠色字樣,是系統(tǒng)自動顯示H勺,下同)

與自由風(fēng)格H勺C語言不一樣,RPGLE中的編碼,是有一定的格式,假如寫錯,將會在目前代碼行上高

亮反綠顯示。初學(xué)者假如不太清晰從何處開始下手,可以使用“F4”鍵查看?(F4鍵只有用2進(jìn)入的編輯狀

態(tài)才有效,用5進(jìn)入的查看狀態(tài)是無效的)

LevelN01Factor1OperationFactor2Result

'HELLOWORLDDSPLY

Decimal

LengthPositionsHILOEQComment

有關(guān)每一項所對應(yīng)的內(nèi)容代表什么意思,該怎樣填寫,即怎樣”程序,將會在下面的詳細(xì)講解。

2.2舉例準(zhǔn)備

列出表名,字段,以以便下面的舉例.

假設(shè)有PF文獻(xiàn)叫PFFHS,文獻(xiàn)的記錄格式叫FMTFHS

每條記錄,都是由FHS01、FHS02、FHS03三個字段構(gòu)成,每個字段都是兩位長的字符型變量。

邏輯文獻(xiàn)PFFHSL1的鍵值為FHS01

邏輯文獻(xiàn)PFFHSL2H勺鍵值為FHS02

邏輯文獻(xiàn)PFFHSL3H勺鍵值為FHS01、FHS02

注:

文獻(xiàn)的記錄格式,可以理解為給這個文獻(xiàn)整條記錄起口勺一種名字:或者是說將每條記錄視都視做一種

類型相似大變量,然后給這個大變量起的名字。因此文獻(xiàn)的記錄格式信息中,包具有一條記錄由多少個字

段構(gòu)成,總計長度是多少這樣的信息。

文獻(xiàn)H勺記錄格式,與各個字段同步定義。(寫文獻(xiàn)的源碼時)

文獻(xiàn)H勺記錄格式在RPGLEH勺程序中,不能與文獻(xiàn)名相似。

2.3簡樸的程序流程

為以便起見,系統(tǒng)自動顯示H勺就不再貼出來了,只貼代碼段。

FPFFHSUFEDISK

CREADFMTFHS

CEVALFHSO1=''O1"

CUPDATEFMTFHS

CSETONLR

CRETURN

這個程序的意思,是說讀PFFHS這個文獻(xiàn),然后將讀到口勺笫條記錄中的FHSOI這個字段的值修改為

“01”。

“SETONLR”,LR的位置可在HI、LO、EQ中任選一處。意思是指將打開指示器*INLR,即

賦值使指示器*【NLR口勺值等于1。等價于"EVAL*INLR='I'",意思是強(qiáng)制將內(nèi)存中的數(shù)據(jù)寫到磁

盤中。(基于效率原因,系統(tǒng)在修改文獻(xiàn)時.,會先將修改H勺成果先放在內(nèi)存中,在同一程序中,讀取數(shù)據(jù)也

是先從內(nèi)存中查詢。)LR,取自是LastRecord

RETURN,表達(dá)程序結(jié)束,在背面“操作碼”一節(jié)中,會有講述。

假如不太明白,就記住

CSETONLR

CRETURN

CEVAL*1NLR=T

cRETURN

這兩句話加在一起,表達(dá)程序結(jié)束就可以了。

從這個程序中,我們可以看到,RPGLE的程序,大體上可以分為兩個部分:

1、申明、定義部分:申明程序中使用到的文獻(xiàn)(F行),定義程序中使用的變量(D行)

2、程序運行部分:即C行,也就是程序段。

在RPGLE程序中,F(xiàn)行必須在D行前面,D行必須在C行前面。

程序執(zhí)行的起始次序,將從定義部分之后,第一種C行開始,次序向下執(zhí)行。

程序中的F行、D行都不是必須項,一種程序可以沒有F行(如僅完畢計算功能的公共函數(shù),例如計

算利息),也可以沒有D行(沒有需要尤其定義日勺變量,或者所有變量都在C行進(jìn)行定義),但不應(yīng)當(dāng)沒有

C行,由于F行與D行都屬于非執(zhí)行行,是起定義作用;C行是執(zhí)行行。沒有C行的程序,是無執(zhí)行意義

的,

2.4常見的程序流程

FPFFHSUFEDISK〃申明文獻(xiàn)PFFHS

DLSFLD01S2〃定義臨時變量LSFLD01

CEVALLSFLDOI='O1'〃給變量LSFLD0I賦值

CEXSRSUB#UPD〃執(zhí)吁子過程SUB#UPD

CEVALLSFLDO2='O2'〃給變量LSFLD02賦值

CEXSRSUB#UPD〃執(zhí)吁子過程SUB#UPD

CSETONLR〃數(shù)據(jù)寫入磁盤

CRETURN〃程序結(jié)束

CSUB#UPDBEGSR〃子過程SUB#UPD開始

CREADFMTFHS〃讀PFFHS文獻(xiàn)

CEVALFLDO1=LSFLDOI〃給字段FLD01賦值

CUPDATEFMTFHS〃修改文獻(xiàn)

CENDSR〃子過程結(jié)束

“//”背面的,只是簡樸的解釋,假如自己動手寫,不需要輸入這些內(nèi)容。

系統(tǒng)在運行這個程序時,是按如下的次序來執(zhí)行:

I.首句EVAL賦值語句,直接執(zhí)行;

2.當(dāng)系統(tǒng)發(fā)現(xiàn)操作碼“EXSR”時,根據(jù)背面的變量名"SUB#UPD”,去查找對應(yīng)的“SUB#UPD

BEGSR”語句;

3.然后從"SUB#UPDBEGSR”之后,次序向下執(zhí)行,直至“ENDSR”語句

4.執(zhí)行至卜'ENDSR”之后,格會再回到當(dāng)時的"EXSRSUB#UPD”處,繼續(xù)向下執(zhí)行,直到

RETURN語句為止

這里提出一點要注意,假如子過程中,又執(zhí)行了自身,即在SUB#UPD程序中,又出現(xiàn)了“EXSR

SUB#UPD",是可以編譯通過的,但在執(zhí)行過程中,系統(tǒng)會由于無法定位,而出現(xiàn)死循環(huán),直至報錯

異常中斷退出。也就是RPGLEH勺程序中,了?過程不容許出現(xiàn)遞歸。

2.5F行闡明

2.5.1內(nèi)容闡明

首位填上F,然后按F4,會出現(xiàn)如下內(nèi)容:

FileFileEndofFile

FilenameTypeDesignationFileAdditionSequence

FileRecordLimitsLengthofRecord

FormatLengthProcessingKeyFieldAddressType

File

OrganizationDeviceKeywords

Comment

各項的含義分別是:

Filename:

需要申明的文獻(xiàn)名,必須頂格,文獻(xiàn)名必須唯,也就是程序中對同樣的文獻(xiàn)名不能申明兩次。

FileType:

申明文獻(xiàn)的處理類型。必須填寫。容許的選項有:

I:輸入型,即只讀文獻(xiàn),對日明的文獻(xiàn)只取其記錄H勺值,不對記錄進(jìn)行修改

U:修改型,即對申明的文獻(xiàn)進(jìn)行修改操作(刪除記錄屬于修改操作的?種)

O:輸出型,即只寫,對申明的文獻(xiàn)只進(jìn)行寫操作。

C:混合型,用于對屏幕文獻(xiàn)的定義。(混合型,即輸入/輸出型,以屏幕文獻(xiàn)為便,也就是讀取屏幕文

獻(xiàn)口勺某些榆入字段信息,同步也可以輸出某些字段的值到屏幕文獻(xiàn)中,但不能對屏幕文獻(xiàn)自身進(jìn)行修改,

因比與上面H勺U是有區(qū)別的)

FileDesignation:

文獻(xiàn)日勺指定方式,容許的選項有:

不填:表達(dá)這是一種輸出文獻(xiàn),即"FileType"項為"O"時,此項不填

P:表明申明口勺文獻(xiàn)是主文獻(xiàn),這個很少用,cycle行關(guān)

S:表明申明的文獻(xiàn)是次文獻(xiàn),這個沒用過,cycle有關(guān)

R:Recordaddressfile.記錄地址文獻(xiàn)?沒用過

T:數(shù)組或表文獻(xiàn)?不懂,沒用過

F:常用,詳細(xì)含義不懂得該怎樣翻譯(Fullproceduralfile)

簡樸來說,不考慮cycle(循環(huán)控制),這樣理解就夠了:

當(dāng)“FileType”為I,U,C時,這里填“F”

當(dāng)“FileType”為0時,這里不填寫

EndofFile:

程序結(jié)束前.?對記錄的處理方式c可以不填,或填"E:《日從英文解釋卜來看,不敢妄下定論,似乎

不填,表達(dá)在程序結(jié)束前,要處理所有文獻(xiàn)的所有記錄(含LF?);填E,表達(dá)只處理這個文獻(xiàn)口勺所有記錄?

總之,此項一般是不填。

FileAddtion:

與否會增長文獻(xiàn)中的記錄,即與否會對文獻(xiàn)進(jìn)行寫操作。

可以不填,或填“A”

當(dāng)FileType為“O”時,系統(tǒng)自動默認(rèn)此項為“A”,不必填寫;

當(dāng)FileType為“I",或“U”時,這項內(nèi)容可以填“A”,也可以不填。不填,即表達(dá)不會增長文獻(xiàn)中

的記錄,也就是沒有寫操作;填“A”時,即表達(dá)會增長文獻(xiàn)中的記錄,也就是會對文獻(xiàn)進(jìn)行寫操作。

Sequence:

針對cycle使用的,表達(dá)排序次序。(Cycle我沒有用過,估計也許是使用控制起來,程序代碼不那么直

觀,不利于上手和維護(hù),因此目前已經(jīng)不流行使用了。)

當(dāng)定義為非cycle文獻(xiàn)時,即“FileDesignation”項非“P”、"S”時,此項必須為空;

當(dāng)定義為cycle文獻(xiàn)時,即“FileDesignalion”項為“P"、或“S”時,此項可填空、A、D。A表達(dá)升

序,D表達(dá)降序。

由于CYCLE目前已不常用,因此一般不填。

FileFormat

文獻(xiàn)格式,不能為空,容許口勺值有:

E:申明的文獻(xiàn),是外部描述的文獻(xiàn)(即文獻(xiàn)在程序運行之前就已存在?)

F:申明的文獻(xiàn),是一種程序描述文獻(xiàn)?(不懂得什么意思,沒用過)

這里一般填“E”,即為外部描述文獻(xiàn)

RecordLength

“FileFormat”為“F”時,才需要填寫。沒用過

一般不填

LimitProcessing

不懂。

一般不填。

LengthofKeyField

查詢時,索引鍵值的長度

假如“FileFormat”項等于"E”,即外部描述文獻(xiàn)時,此項不填

假如“FileFormat”項等于“可,便不需要按KEY值查詢時,此項也不填

假如“FileFormat”項等于“F”,需要按KEY值查詢時,此項填寫KEY值匹J長度(1—2023)。

由于一般都使用外部描述文獻(xiàn),因此這里一般都不填寫。

RecordAddressType

記錄尋址類型,好象是對文獻(xiàn)鍵值的描述。容許時值如下:

空:不使用KEY值,在程序段中,不會對文獻(xiàn)的查詢定位操作,如“SETLL“、"CHAIN”操作碼都不

會用的時,該項填空。

K:使用KEY值,即表達(dá)會對申明的文獻(xiàn)進(jìn)行查詢定位操作,此時申明H勺文獻(xiàn)必須有鍵值,即必須為

邏輯文獻(xiàn)(LF文獻(xiàn)),或在生成文獻(xiàn)時,已加入了KEY值。

(下面的選項應(yīng)當(dāng)是程序描述文獻(xiàn)才會使用)

A:KEY值為字符型

D:KEY值為日期型

RKEY值為數(shù)字型

G:KEY值為非英文字符

P:KEY值為壓縮型數(shù)字

T:KEY值為時間型

Z:KEY值為timestamp?

總之,假如要按照鍵值對申明的文獻(xiàn)進(jìn)行查詢定位操作(即程序中使用了CHAIN、SETLL操作碼,則

此項需要填寫“K”;如不需要進(jìn)行變詢操作,則不填。),此項填“K”時,申明的文獻(xiàn)必須具有KEY值.

FileOrganization

不懂得,一般不填

Device

申明文獻(xiàn)的寄存位置,必須填寫,容許的值有:

DISK:磁盤文獻(xiàn),即文獻(xiàn)存儲在磁盤上,最常見的;

PRINTER:打印文獻(xiàn),提供打印輸出描述,以及對打印設(shè)備訪問。打印報表用這個:

WORKSTN:workstation,工作站,顯示文獻(xiàn)。屏幕文獻(xiàn)(DSPF)W、J定義用這個值

(下面這兩種我沒用過的)

SEQ:磁帶文獻(xiàn),文獻(xiàn)存儲在磁帶上。

SPECLXL:特殊文獻(xiàn),我目前也不是很清晰詳細(xì)使用方式。據(jù)blogliou說,這種類型,是容許指定

一種不能被RPG直接操作口勺輸入/輸出設(shè)備。例如可以通過SPECIAL文獻(xiàn),在RPGLE程序中實現(xiàn)象讀寫

磁盤同樣,對DTAQ進(jìn)行程序間數(shù)據(jù)互換。

Keyword

可以不填,常用的值有(這里只列出幾種常用的):

COMMIT

該文獻(xiàn)記錄的數(shù)據(jù)操作進(jìn)行日志處理(有關(guān)日志處理,背面會章節(jié)會講到)

RENAME

對文獻(xiàn)記錄格式名進(jìn)行重命名。例如說程序中需要同步申明PFFHSLI,PFFHSL2這兩個邏輯文獻(xiàn)。

這兩個邏輯文獻(xiàn)的記錄格式名都是同樣(一般和PF同樣,即都為FMTFHS:不過也可以定義成不一樣。

假如不一樣,當(dāng)然就不需要使月RENAME鍵字了)。那么,為了能讓系統(tǒng)辨別,就必須對其中一種

的記錄格式名進(jìn)行重命名。RENAME的語法:RENAME(舊記錄格式名:新記錄格名),如下:

FPFFHSL1IFEDISK

FPFFHSL2IFEDISKRENAME(FMTFHS:FMTFHS2

新記錄格式可以自由定義,只要在該程序中無同名的即可。RENAME并不會真正的更改文獻(xiàn)的記

錄格式名,僅是在目前運行程序中進(jìn)行重命名。對同步運行的其他程序無影響

USROPN

對于申明的文獻(xiàn),由顧客自行打開。假如不填寫此關(guān)鍵字,系統(tǒng)將會在程序最最開始(執(zhí)行第一

句C行語句前),自動執(zhí)行“OPEN文獻(xiàn)”H勺操作,在程序結(jié)束后,自動執(zhí)行“CLOSE文獻(xiàn)”的

操作。而填寫此關(guān)鍵字之后,OPEN,CLOSE的操作將由顧客在C行程序段中,自行處理。假為顧客

未執(zhí)行OPEN操作,就執(zhí)行CHAIN、READ、SETLL等語句,在編譯程序時就會報錯。程序在結(jié)束之

前,必須關(guān)閉所有已打開的文獻(xiàn),因此用起來會比較繁瑣。USROPN常作用于對文獻(xiàn)的解鎖,在同一

程序中打開同一文獻(xiàn)口勺不一樣MEMBER等,屬于一種較高級的使用方法,可在實際操作中慢慢體會。

OPEN,CLOSEH勺操作碼,對應(yīng)的是文獻(xiàn)名,不是記錄格式名。即

COPENPFFHSL1

CCLOSEPFFHSL1

而不是

OPENFMTFHS

Comment

注釋闡明。源自RPG,在RPG中是有作用的,可以對程序作簡電H勺闡明,但在RPGLE中,其實已經(jīng)

沒有作用了,此項不用填。(填了也沒用)

2.5.2常用例子

對文獻(xiàn)進(jìn)行只讀的申明:

FPFFHSIFEDISK

對文獻(xiàn)進(jìn)行修改的申明:

FPFFHSUFEDISK

對文獻(xiàn)進(jìn)行只寫H勺申明:

FPFFHSOEDISK

對文獻(xiàn)進(jìn)行修改,以及增長記錄日勺操作:

FPFFHSUFAEDISK

對文獻(xiàn)進(jìn)行查詢,增長記錄的操作,并對文獻(xiàn)進(jìn)行查詢操作:

FPFFHSL1IFAEKDISK

申明兩個記錄格式相似的文獻(xiàn),并對其中之一進(jìn)行重命名

FPFFHSL)IFEKDISK

FPFFHSL2IFEKDISKRENAME(FMTFHS:FMTFHS2)

注:在申明時,兩個文獻(xiàn)不?定要上下緊接著:隨便改哪?種文獻(xiàn)對應(yīng)的記錄格式都可以;新舊

記錄格式名用冒號隔開,新記錄格式名可自行定義,無規(guī)則。

對文獻(xiàn)的修改操作進(jìn)行日志處理:

FPFFHSL2UFKDISKCOMMIT

cycle類文獻(xiàn)的申明:

FPFFHSL2IPEKD1SK

這樣文獻(xiàn)申明為P之后,程序中不需要寫循環(huán)讀文獻(xiàn),也不需要寫RETURN,設(shè)指示器INLR,也就是

FPFFHSL2IPEKDISK

CREAD記錄格式名

等價于

FPFFHSL2IFEKDISK

CDOW1=1

CREAD記錄格式名EQ指示器

CIFEQ指示器=T

CLEAVE

CENDIF

CENDDO

CRETURN

2.5.3補充闡明

申明H勺文獻(xiàn),可以同步使用多種keyword關(guān)鍵字,并可以不在同一行(但必須緊接在申明的文獻(xiàn)的下

而),如下:

FPFFHSL2IFEDISKRENAME(FMTFHS:FMTFHS2)

FCOMMIT

即表達(dá)文獻(xiàn)PFFHSL2,同步使用「RENAME、COMMIT兩個關(guān)鍵字。

假如寫得下,也可以寫在同一行,以空格鍵分開,如下

FPFFHSL2IFEDISKCOMMITRENAME(FMTFHS:FMTFHS2)

2.6D行闡明

首行填“D”,然后按F4,會出現(xiàn)如下內(nèi)容:

DeclarationTo/

NameES/UTypeFromLength

InternalDecimal

DataTypePositionsKeywords

Comment

2.6.1內(nèi)容闡明

Name:

定義口勺變量口勺名字,該名字可以不頂格寫。(即容許有縮進(jìn))

標(biāo)識定義的變量與否源自外部數(shù)據(jù)構(gòu)造??梢圆惶睿蛱睢癊”

上而打勺解釋也許有點饒口,其實這個地方的意思,就是說:

假如是程序內(nèi)部自行定義一種臨時變量,此處不填;

假如是引用的?種外部文獻(xiàn)作為數(shù)據(jù)構(gòu)造,那么這里就要填“E”;同步“DeclarationType”處,就

要填“DS”,即定義為一種構(gòu)造:“Keywords”處要使用EXTNAME關(guān)鍵字

所謂“引用一種外部文獻(xiàn)作為數(shù)據(jù)構(gòu)造”,也就是說定義一種構(gòu)造,整個構(gòu)造中的變量,參照外部文獻(xiàn)

來定義。

所謂構(gòu)造,可以理解為一種“曰多種變量組合而成H勺大變量”。

舉例而言:

DMYDSEDSEXTNAME(PFFHS)

DMYDSDS

DFHS01I2(1在From項:2在To/lenglh項)

DFHS0234

DFHS0356

是等價的,都是定義一種構(gòu)造變量MYDS(名字可以自行定義),這個構(gòu)造變量是由三個字符型變量

FHSOI,FHS02,FHS03拼成的。

第一種定義措施,就是引用外部文獻(xiàn)“PFFHS”作為數(shù)據(jù)構(gòu)造的定義,注意使用到了“EXTNAME”

關(guān)健字,并且“E”項的值為“E”。

而第二種定義措施,就是直接足義一種構(gòu)造“MYDS”。注意沒有使用外部文獻(xiàn)時,“E”項打勺值為空。

S/lIz

不懂得,?般都填空。

DeclarationType:

定義變量的類型,容許時值如工:

不填:非如下內(nèi)容:數(shù)據(jù)構(gòu)造、常量、獨立變量、數(shù)組、表。此項為空時,好象只能用來表達(dá)目前

定義的變量是屬于構(gòu)造的一種變量。在下面會舉例

DS:數(shù)據(jù)構(gòu)造,即定義一種構(gòu)造變量,這個之前已講過

C:常量

常量只能使用字符,不需要定義常量的長度、類型。常量的內(nèi)容寫在“Keywords”處,并使

用CONST關(guān)鍵字,在程序段中,不能對常量進(jìn)行賦值操作。

DMYNUMCCONST(abcdefghijklmn')

就是定義一種叫做MYNUMH勺常量,這個常量包括字母a-n0

PI:不懂得,沒有用過

PR:不懂得,沒用過

S:定義如下內(nèi)容:獨立變量、數(shù)組、表

定義一種叫MYFIELD1的變量,變量為1位長的字符型

DMYFIELD1S1在“To/lengih”項

定義?種叫MYARRAYH勺數(shù)組,共含3條記錄,每條記錄為1位字符型

DMYARRAYS1DIM⑶〃DIM在“Keywords”項

表的定義沒有用過

總之,這一項,最常用的,就是“DS”、“S”與空。即構(gòu)造體與獨立變量,其他選項較少用到。

From:

當(dāng)“DeclarationType”項為“S”時,表達(dá)獨立變量、數(shù)組,此項不填

當(dāng)“DeclarationType”項為“DS”時,表達(dá)構(gòu)造,此項仍然不填

當(dāng)“DcclaraiionTypc”項為空時,表達(dá)目前定義的變量,屬于上面定義的構(gòu)造,此時,此項可以填寫,

也可以不填寫。

當(dāng)填寫時,“From”項表達(dá)變星在構(gòu)造中日勺起始位置,右對齊:“To/lenglh”表達(dá)變量在構(gòu)造中的結(jié)束

位置,也是右對齊。

當(dāng)不填寫時,“To/length”表達(dá)直接定義為變量長度。

舉例:

DMYDSDS

DDSFLD0112//I在“From”項,2在“To/length"項

DDSFLD0234

DMYDSDS

DDSFLD012〃2在“To/length”項

DDSFLD022

其實是等價的,都是定義一種構(gòu)造變量MYDS,這個構(gòu)造變量中,包括了兩個變量DSFLD01,DSFLD02,

這兩個變量都是兩位長字符。所不一樣的是,第一種定義措施,是指定了變量在構(gòu)造中的位置:向第二種

措施,是直接指定變量的長度和類型

注意到上面的定義中,DSFLD0I>DSFLD02H'、JDeclarationType為空,也就是表達(dá)這兩個字段是屬于

上而定義口勺構(gòu)造MYDS。假如此項為“S”,即表達(dá)這個變量與構(gòu)造無關(guān)

DMYDSDS

DDSFLD0I2〃2在“To/length”項

DDSFLD02S2

在這個定義中,變量DSFLD02就是一種獨立的變量,與構(gòu)造MYDS無關(guān)。

Length:

上面已講述在定義構(gòu)造時的使月措施。

在定義非構(gòu)造時,此項R勺內(nèi)容即為定義變量口勺長度。右對齊

InternalDataType:

定義變量的類型,容許的值有:

空:變量定義為字符型、壓縮型數(shù)字

A:變量定義為字符型

B:二進(jìn)制?不懂得

D:變量定義為日期型

F:變量定義為浮點型?

G:變量定義為圖型?(非英父?中文?)

I:變量定義為帶符號的整數(shù)

N:變量定義為指示器變量?(沒用過)

P:變量定義為壓縮型數(shù)字

S:變量定義為一般的數(shù)型

T:變量定義為時間型

U:變量定義為無符號的整數(shù)

Z:變量定義為日期+時間型(格式:年-月-日-時.分.秒.微秒)

*:變量定義為指針型

其實我最常用,就是不填,由二一般口勺程序,有字符和數(shù)字這兩種類型變量,就足夠了。

DecimalPositions:

當(dāng)變量定義為數(shù)字型時,用來標(biāo)志小數(shù)的位數(shù).

當(dāng)"To/Lenglh”項為3,**InternalDataTypeM項為空時

此項為空,表達(dá)定義的變晝?yōu)?位長的字符型

DMYFLD01S3〃定義為3位字符型

此項不為空(右對齊),表達(dá)定義的變量為數(shù)字型

DMYFLD01S32〃定義數(shù)字型變量,I位整數(shù),2位小數(shù)(總長為3

位)

Keywords:

關(guān)鍵字,可以不填,常用時值如下:(同樣,這里我也只列出幾種常用的,這里先不做詳細(xì)闡明,僅供

參照,在背面的例子,看看就懂得使用方法了)

CONST:定義常量的值

DIM:定義數(shù)組

EXTNAME:引用外部文獻(xiàn)作為數(shù)據(jù)構(gòu)造變量

EXTFLD:對引用了外部文獻(xiàn)作為數(shù)據(jù)構(gòu)造的某個變量,進(jìn)行重命名

LIKE:定義變量時,參照已存在的變量定義

OCCURS:定義構(gòu)造體變量時,指定的構(gòu)造體變量H勺記錄條數(shù)

INZ:定義變量時,賦值初始值

DATFMT:定義R期變量時,指定R期格式

*MDY(mm/dd/yy)

*DMY(dd/mm/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

注釋項,源自RPG,不用填,由于填了也沒用。

2.6.2常用例子

定義一種io位長日勺字符型變量:

DMYFLDS10

定義?種10位長,其中含2位小數(shù)的字符型變量,并使其初始值為1

DMYFLDS102INZ(l)

定義一種每條記錄為5位長字符型變量,共10條記錄的數(shù)組

DMYFLDS5DIM(10)

定義一種10位長H勺字符型變量,再定義一種變量,參照前一變量定義

DMYFLD01S10

DMYFLD02SLIKE(MYFLDOl)

定義一種構(gòu)造,由一種3位長的字符變量,和一種10位長,其中2位小數(shù)的數(shù)字變量構(gòu)成

DMYDSDS

DMYDS013

DMYDSO2102

定義一種構(gòu)造變量,構(gòu)造內(nèi)容參照外部文獻(xiàn)PFFHS

DMYDSEDSEXTNAME(PFFHS)

定義一種構(gòu)造變量,構(gòu)造內(nèi)容參照外部文獻(xiàn)PFFHS,并且將第二個字段重命名為FHS999

DMYDSEDSEXTNAME(PFFHS)

DFHS999EDSEXTFLD(FHS02)

定義一種日期型變量,格式為yyyy-mni-dd

DMYDATESDDATFMT(*ISO)

2.6.3補充闡明

變量H勺定義,除了在D行定義之外,還可以在C行通過賦值語句直接定義

DFLD01S2INZ('Ol')

CMOVE'01FLD()12〃2在length處,右對齊

是等價的

定義構(gòu)造之后,可以將構(gòu)造變量視為一種一般的變量進(jìn)行賦值來變化構(gòu)造變量的值,也可以通過對構(gòu)

成構(gòu)造變量的變量進(jìn)行賦值,來到達(dá)修改構(gòu)造變量的值的目的。

如:

DMYDSDS

DMYFLDOI2

DMYFLD022

在C行中,這兩句是等價日勺

CEVAL%SUBST(MYDS:3:2)='O「

CEVALMYFLD02=,01,

第一句是直接改構(gòu)造變量MYDS的后兩位的值(當(dāng)然,此時MYFLDO2的值也變化了)

第二句是對MYFLDO2進(jìn)行賦值,同樣,賦完值之后,MYDS的后兩位也變?yōu)椋?1,

在需要頻繁進(jìn)行數(shù)字與字符之間轉(zhuǎn)換時,偷懶的人會通過定義這樣的構(gòu)造來到達(dá)目的:

DMYDSDS

DMYFLDOI18

DMYFLD02I80

例如說,給MYFLDOI賦值為'20230208'之后,MYFLD02也就自動等于20230208;然后給

MYFLD02加I之后,MYFLD02等于20230209,MYFLDOI的值.也自動等于'20230209'??梢哉J(rèn)為構(gòu)

造變量MYDS是字符型(即一直等于MYPLDO1的J值)

這種措施,當(dāng)需要字符型變量時,就使用MYFLDOI;當(dāng)需要數(shù)字變量時,就使用MYFLD02,不

過我總覺得有點類似于作弊,一般沒用。

有關(guān)數(shù)組、構(gòu)造體口勺內(nèi)容,由干要說起來內(nèi)容還頗多,而也屬于略為高級某些的使用方法,因此將在

背而專設(shè)章節(jié)講述。

2.7人口參數(shù)

程序可以通過“*ENTRY”定義入口參數(shù),或稱之為接口參數(shù),來傳遞數(shù)據(jù)。

假設(shè)有程序FHS01ILE,其中入口參數(shù)的定義如下:

C*ENTRYPLIST

CPARMFLDOI3

CPARMFLD024

其中:

/ENTRY在4<Factor1"項;

PLIST在“Operation”項;

PARM在“Operation”項:

FLD01、FLD02都在“Result”項

上述定義,表達(dá)這個程序通過兩個字段與其他外部程序溝通。那么別口勺程序(如FHS02ILE)在調(diào)用

程序FHS0ULE時,就要帶上兩個字符型變量,如

CCALL,F(xiàn)HS0IILE,

CPARMFHSFLD013

CPARMFHSFLD024

在兩個程序里,這兩個變量名可以不?樣(例如說一邊叫FHSFLD01,FHSFLD02;?邊叫FLD01,

FLD02),但長度,類型必須匹配。

假如在FHS02ILE中,F(xiàn)HSFLD01等于‘123',FHSFLD02等于‘a(chǎn)bed',那么系統(tǒng)在運行CALL語句,

執(zhí)行程序FHS0IILE時,將會對字段FLDOI初始化賦值,使其一開始就等于'123',字段FLD02等

于'abed'。

假如FHS0IILE程序中,對FLDOI、FLD02進(jìn)行了改動,例如FLDOI最終等于,789',FLD02最

終等于‘efgh',那么程序FHS02ILE在調(diào)用完FHS0IILE之后,F(xiàn)HSFLDOKFHSFLD02這兩個字段也

同樣會變化,成為‘789',和,efgh,

也就是人口參數(shù)的變化是可以傳遞的,其實應(yīng)當(dāng)很好理解吧。

入口參數(shù)口勺定義,可以寫在程序口勺任何一處,而程序的執(zhí)行,一直是從C行的次序第一行開始執(zhí)

行,與入口參數(shù)所在的位置無關(guān)。

FHS02ILE也可以使用一種大變量來調(diào)用FHS01ILE,只要總長相等即可(這種措施僅限于被調(diào)用

的程序FHS01ILE的入口參數(shù)所有為字符型才可使用,僅僅只是不會錯,不提議這樣使用。

CCALL'FHS01ILE'

PARMFHSFLD017

其實從上面H勺例子可以看出,入口參數(shù)可以使用構(gòu)造的形式來體現(xiàn),所如下面這種寫法也不會有

錯。(假如被調(diào)用程序有數(shù)字型變量,只要在定義構(gòu)造時也定義為數(shù)字型即可)

DMYDSDS

DDS013

DDS024

CCAL1*FHSOiILE,

CPARMMYDS

不過要注意,假如RPG程序調(diào)用C程序,那么入口參數(shù)必須嚴(yán)格按照C程序中的來,例如C程

序中帶了兩個字符型參數(shù),那么RPG程序中也必須是兩個字段入口參數(shù),不能使用由兩個字符變量構(gòu)

成的構(gòu)造。原理可以自行想想。

既然可以使用構(gòu)造做為入I」參數(shù),當(dāng)然,也可以參照外部文獻(xiàn)來定義構(gòu)造做為入I」參數(shù)

DMYDSEDSEXTNAME(PFFHS)

CCALL'FHSOIILE'

CPARMMYDS

CCALL4FHSOIILE'

CPARMFHSO12

CPARMFHSO22

CPARMFHSO32

是等價的。

可以看到,參照外部文獻(xiàn)定義構(gòu)造做為入口參數(shù)時,可以有效的節(jié)省代碼行,并且不會出現(xiàn)遺漏。

因此在實際使用中,常會看到,將某些公共程序日勺入口參數(shù)定義成一種PF文獻(xiàn)。而調(diào)用它口勺程序,就

參照這個PF文獻(xiàn),定義構(gòu)造做為調(diào)用的接口參數(shù)。

當(dāng)接口參數(shù)不一致時,如FHS02ILE中漏了第二個參數(shù)時:

CCALLTI1SO1ILE,

CPARMFHS013

此時,并不是?開始運行FHSOIILE程序,系統(tǒng)判斷入口參數(shù)不符就報錯:實際上,此時,F(xiàn)LD0I

時值還是對H勺口勺,但FLDO2的值就處在一種未初始化的狀態(tài)。于是,現(xiàn)代碼執(zhí)行到與FLD02有關(guān)的操

作碼時,才會報錯;假如FHSOIILE在運行的過程中,由于邏輯判斷(如IF條件判斷)的關(guān)系,而未

執(zhí)行任何與FLDO2有關(guān)的操作碼,那么程序會正常運行完畢,不會有報錯。

這時,,F(xiàn)HSO2ILE調(diào)用了程序FHSOIILE之后,程序中原有的接口參數(shù)的數(shù)據(jù)就也許由于這次調(diào)用

程序而發(fā)生錯位,從而導(dǎo)致數(shù)據(jù)的錯誤、混亂。數(shù)據(jù)的錯誤、混亂其實還不是最大的問題,更大的問

題在于“這時我們不懂得數(shù)據(jù)已經(jīng)出錯了“。處理之道,也是如上所說,對于調(diào)用頻繁,且入口參數(shù)較

多的公共程序,考慮將其入口參數(shù)寫成?種PF文獻(xiàn)。這樣調(diào)整人口參數(shù)時,只要修改PF文獻(xiàn)并重新

編譯,再編譯有關(guān)程序即可(至少發(fā)生遺漏時,程序會報錯異常中斷,不會出現(xiàn)錯誤的數(shù)據(jù)而不自知)

2.8C行闡明

2.8.1寫在前面

終于說到程序的執(zhí)行部分,也是我們寫程序H勺平時接觸的最多的一部分:“C”行了。在這里,我

想先說一下我個人的見解:

400系統(tǒng),提供了某些語法,可以大大減少程序代碼行數(shù)。不過假如這個使用方法并不普遍,那么

并不提議使用(當(dāng)然自己用來練習(xí)無妨),否則會給其他讀代碼的人帶來困難,同步也會給自己帶來麻

煩(例如出了問題,他人看不懂,自然會打來問原作者)

基于這樣口勺道理,同樣,我認(rèn)為FREE格式口勺程序,雖然可以自由書寫,有縮進(jìn)等優(yōu)勢,不過除

非整個項目組所有組員都已純熟掌握FREE格式的程序,或已進(jìn)行過完善、系統(tǒng)的FREE格式的培訓(xùn)I,

才能正式使用。假如只是懂得幾種與RPG,RPGLE對應(yīng)的語法就用來進(jìn)行實際處理,也許會導(dǎo)致的維

護(hù)的不便,尤其是在出現(xiàn)某些天那么明顯的錯誤之后。

至于cycle,不懂得是不是基于這個原因,目前用得也比較少了。感覺RPGLE中,至少有二分之

一『'J內(nèi)容是與cycle有關(guān)o

2.8.2內(nèi)容闡明

LevelN01Factor1OperationFactor2Result

Decimal

LengthPositionsHILOEQComment

Level:

和cycle有關(guān),沒研究過,一般不填

N01:

這個含義比較豐富,我只用過其中一種:

首位不帶N,背面填寫01—99的數(shù)字時,表達(dá)對應(yīng)的指示器打開時,執(zhí)行背面H勺操作,如:

C12EVALFHS01='0r

等價于

IF*INI2=,I,

EVALFHS01='()l'

ENDIF

首位帶N,背面填寫01—99的數(shù)字,表達(dá)對應(yīng)的指示器關(guān)閉時,執(zhí)行背面的操作

要注意,該項內(nèi)容僅作用于該行操作碼。假如指示器打開后,需要執(zhí)行多條語句,那么每條語句前面,

該項都要賦值。

cIF*IN12=T

cEVALFHSO1='O1'

CEVALFHS02=,02,

cENDIF

假如用這種方式來體現(xiàn),就要寫作

C12EVALFHSO1='O1'

C12EVALFHS02=,02,

因此說,根據(jù)指示器狀態(tài)來執(zhí)行的語句,在執(zhí)行少許操作碼時,可以使用這種措施;假如語句較多,

修改起來不以便,還是直接用IF—ENDIFH勺判斷語句比較合適。

該項尚有針對其他指示器的使月方法,看上去似乎又是與CYCLE有關(guān),暫不簡介了。

Factor1:

操作內(nèi)容一,將在背面與操作碼一起講

Operation:

操作碼,背面有專門章節(jié).講解操作碼

Factor2:

操作內(nèi)容二,同上

Result:

操作成果,同上

Length:

長度。

變量口勺定義,除了在D行定義之外,還可以在C行通過賦值語句直接定義

DFLDOIS2INZ('Ol')

cMOVE'01'FLDOI2〃2在lengih處,右對齊

是等價H勺

一種變量,在整個程序中,只要定義一次就可以了,對定義打勺次序沒有強(qiáng)制規(guī)定。

DecimalPositions:

與length相呼應(yīng),當(dāng)此項有值時,表達(dá)定義口勺是一種數(shù)字型變量,該項表達(dá)小數(shù)位長度。

CZ-ADD2FLD0232

即是說,將FLD02定義為一種3位長,其中1位整數(shù),2位小數(shù)的數(shù)字變

溫馨提示

  • 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

提交評論