數學運算子

由於任一編碼列中僅能使用一個運算子(operator),對於較複亭的數學計算就比較難處理些,類似下列之代數式子即無法使用於RPG中:

A=X*(B/C)

處理此種運算式一次只能有一個運算(如下所示)。

RPG的基本運算子有四個:ADD、SUB、MULT及DIV,其語法如下:

1、代數:A=X-Y

C                X                ADD        Y        A

2、代數:A=X-Y

C                X                SUB        Y        A

3、代數:A=X*Y

C                X                MULT      Y        A

4、代數:A=X/Y

C                X                DIV          Y        A

而前述例子在RPG中之寫法,如下所示:

C                B                DIV         C        A

C                B                MULT     C        A




RPG中提供IF、DO WHILE及GOTO等指引程式流程的基本邏輯運算子,包括:

說明                        IF                               OR                        AND                        DO WHILE

等於                        IFEQ                        OREQ                ANDEQ                        DOWEQ

不等於                    IFNE                        ORNE                ANDNE                        DOWNE

小於                        IFLT                         ORLT                 ANDLT                         DOWLT

大於                        IFGT                        ORGT                 ANDGT                         DOWGT




邏輯運算子的一般語法如下:

1、邏輯:例如A>B或C=1,即回到START常式

C                 A                IFGT                  B

C                C                OREQ                1

C                                   GOTO                START                C

                                      END




注意!邏輯區段之後為END敘述,每一IF或DOWHILE需有一END

2、邏輯:假如X<25,則加1到X

C                X                DOWLT25        

C                                  ADD        1                X                C

                                     END




注意!邏輯區段之後為END敘述,每一IF或DOWHILE需有一END



GOTO敘述可改變程式流程到一標記中,此標記為與TAG OP碼所定義者,如下例所示:

C                *IN99                IFEQ'1'

C                                          GOTO         END

C

C*

.

.

.

C*

C                                          END            TAG

C                                                               SETON                LR



I/O:查詢、讀與寫或更新記錄

在RPG中,資料庫的I/O所使用之OP碼包括:

EXFMT        執行已設計過且已編譯過RPG之螢幕,傳送RPG欄位到螢幕中,例如:

C                EXFMTORDSCR

CHAIN        查詢索引中的名稱值、讀取記錄、及設定未找著之RPG特殊指標(本例為77):

C                CODE                CHAINORDER                77

READ        讀取下一筆記錄,設定檔結束之指標為77:

C                READ        ORDER                                    77

READE     設定所指的下一筆記錄為相同索引值並設定未找著之特殊指標為77:

C                CODE                READORDER                 77

SETGT     設定大於名稱值之數值指到下一筆記錄並設定未找著之指標為77,此OP碼不在讀取記錄;但必需下達READ命令

C                CODE                SETGRORDER              77

UPDAT    更新目前之記錄(需為記錄格式名稱而不是資料庫名稱):

C                UPDATORD

WRITE     新增一記錄到資料庫中(需為記錄格式名稱而非資料庫名稱):

C                CODE                WRITEORDER               77



指標

RPG中提供協助程式邏輯流程與控制用之特殊指標(indicators),這些指標參考之方式有兩種:



第一種,使用*INnn語法,如下例所示:

C                                        EXFMTORDSCR

C*

C                *IN99                IFEQ                '1'

C                                          GOTO              END

C                                          END


此表示,使用EXFMTORDSCR執行一個螢幕畫面,假如指標99是設定當使用者離開畫面後為1,就強迫到END標記下執行

指標99乃定義於螢幕中,SDA,由使用者按下的F3鍵信號而來

RPG允許指標設定為01~99之間,供程式師作為程式之旗標(flag)

這些指標通常使用於告之檔案中的檔結束、確定邏輯條件為真(ture)、使用者傳送於螢幕中的鍵值是什麼…等等

程式師可設定下列敘述之指標為12:

C                        SETON                12

並以相同指標撤除之:

C                        SETOF                 12




第二種,在特殊行中根據用途由RPG來提供之,例如下列N77的意思是表示,假如指標77未傳回,即更新ORD的記錄格式,此種方式通常使用於與CHAIN連結,以決定資料庫中是否記錄早已存在於索引中,假如不存在,即使用UPDAT;否則使用WRITE:

C                        CODE                        CHAINORDER                                                        77

C                        QTY                            MULT        PRICE                TOT

C*                       *IN77                         IFNE        '1'

C                                                            UPDATORD

C                                                            ELSE

C                                                            WRITEORD

C                                                           END


此碼可以為:

C                        N77                                UPDATORD

C                           77                                WRITEORD


這種簡潔的方式比較缺乏明確性,故建議讀者仍以使用IFNE結構為佳

RPG提供一組特殊的指標以用來決定程式流程與分支(branching)但我們僅需考慮LR指標即可,它可用來告之RPG,是否所讀取之記錄為輸入檔的最後一筆記錄

不論由RPG週期(cycle)或程式師來設定LR,RPG皆允許隨時結束程式,在程式中可利用GOTO指示程式流程到END TAG,但這不足以構成結束程式之條件,通常是加一SETON        LR來告之RPG已完成處理,如下所示:

C                        END                        TAG

C                                                        SETON                        LR



RPG週期

RPG中有一自動式週期,除非是程式師將色中斷之外,基本上,此週期與F規格中所定義主要的資料檔之一有密切之關係

首先是RPG從此檔中一次讀取一筆記錄,然後執行主要之輸入檔計算規格的所有邏輯問題,假如,主要輸入檔已結束,最後即設定LR為最後一筆記錄

 



啟動DEBUG

當程式編譯無誤後,可執行DEBUG程式,它會顯示所選擇列號之變數內容,若欲啟動DEBUG,可鍵入如下命令:

STRDBG         pgmname         UPDPROD(*YES)

其中,pgmname為所欲除錯之程式的名稱,UPDPROD(*YES)系指程式中指定所欲執行之已存在資料檔,進行所需改變之資料



設定中斷點

當啟動DEBUG後,可於程式中所欲停止及所欲查看之指定變數設定行號之中斷點(berakpoints),例如:

ADDBKP        STMT(23500)        PGMVAR((X)(NAME))

此敘述會在畫面上將程式停止在第235列,並顯示X及NAME變數之內容

注意!列號之後,有2個0,它們不能省略

中斷點需設定在可執行的列號,不能設定於註解列之列號,例如:

以一般方式呼叫程式:

CALL        PGMNAME

它將會停在表示之列號並顯示其變數之內容

若欲移開中斷點,則需使用下列命令:

RMVBKP        STMT(23500)

若欲結束DEBUG,祇需鍵入如下命令即可:

ENDDBG

每次重編譯時需結束並重啟動DEBUG一次




狼翔月影 發表在 痞客邦 PIXNET 留言(0) 人氣()