2014-02-19 96 views
3

我開始使用RPGLE,並試圖確定是否有任何方法可以爲我的服務程序中的過程定義一次參數。我知道我可以將原型放在一個拷貝成員(我已經完成)中,但是我仍然必須將相同的代碼放到過程體中(「過程接口」)。原型和過程接口之間的共享定義

我的問題是,是否有某種方式使用原型來定義過程界面中的參數(反之亦然)?

理想的情況下,這樣的:

原型:

D buildForm  PR 
D formType      10A CONST 
D mode       4A CONST 

步驟:

P buildForm  B 
D buildForm  PI 
D formType       LIKE(formType) 
D mode        LIKE(mode) 

好,理想我只能夠說「使用原型'或程序主體中的東西,或者編譯器會發現它自身......


我誤解原型和程序界面需要如何進行設置,或者是他們實際上這種重複的時候做正確:

原型:

D buildForm  PR 
D formType      10A CONST 
D mode       4A CONST 

步驟:

P buildForm  B 
D buildForm  PI 
D formType      10A CONST 
D mode       4A CONST 

感謝您的閱讀。

回答

4

在7.1上,如果您在使用同一個程序中定義子過程,則不需要原型。你只需要原型,如果你正在使用服務程序或綁定模塊中的子程序(不要將模塊綁定到程序!)

我不親自找到創建原型負擔。我複製PI,將其更改爲PR,把它變成一個/複製成員,在許多程序中像這樣使用它:

/copy buck/qprotosrc,buildform 
    ... 
    buildform(form: mode); 

我需要「雙限定」唯一的一次是在服務計劃,使PI位於。一種避免大部分情況的方法是使用條件編譯。這裏有一個例子:

qprotosrc(buildform)

// Build form prototype and start of interface 
    // Service program will complete the interface with P E 
    /if not defined(buildform_proto) 
    /define buildform_proto 
D buildForm  PR 
    /else 
P buildForm  B 
D buildForm  PI 
    /endif 
D formType      10A CONST 
D mode       4A CONST 

QRPGLESRC(mysrvpgm)

/copy buck/qprotosrc,buildform 
    ... 
    /copy buck/qprotosrc,buildform 
    // body of buildform here 
    ... 
    return; 
p     e 

第一次/複製進行處理,將其插入原型 - 這是你想什麼想要所有的消費者計劃。作爲處理的一部分,它定義了buildform_proto。在你的服務計劃中,你會放一秒/複製。由於定義了buildform_proto,編譯器會插入P ... B和D ... PI規格。你必須提供程序主體和P ... E規範。

+0

非常感謝你的回答。我是否正確地認爲在複印本中有多個原型需要嵌套ifs,以便在每個過程中僅獲得PI之後的PI? –

+1

這是一般的想法。每個PR/PI對的一個DEFINE。 –

+0

不錯的解決方案。我想我會適應TR7新的自由格式語法。 B-) – WarrenT

1

許多商店通過將副本放在副本中解決了這個問題。然後,在原型(PR)D規格行和過程接口(PI)行之後立即使用副本。

+0

然後是那個複印書然後插入程序界面嗎?我已經有一本複印本中的原型... –

+1

我的首選是在他們自己的抄本中加入parms。如果您願意,可以在原型副本中嵌入/ COPY或/ INCLUDE。我希望我的原型參數始終與接口中的參數匹配,特別是在界面更改的情況下。我不擔心每個程序都使用相同的原型名稱。 – WarrenT

+0

但是,我想我可能會採用Buck的解決方案:o) – WarrenT

3

恕我直言,這是那些似乎有用的東西之一,但沒有真正的目的,實際上可能會導致其他問題。

它只會節省您不必複製&粘貼parm列表。但它實際上是更多的擊鍵。我是「不要重複自己」的忠實粉絲,但我不認爲這是重複,但冗餘會增加錯誤陷阱。如果PI和PR之間不匹配,編譯器會通知您。

正如我在我對Bucks post的評論中提到的那樣,您可能會遇到問題。假設你的包含源不只是原型輸入其他有用的定義,它可能在某些時候你會發現包含多個地方的包含文件。造成這種情況的解決方法是隻需在每個頂部包括

/if defined(MYPROTO_INC) 
/EOF 
/endif 
/define MYPROTO_INC 

現在不管它是如何多次在編譯器拉到只能看到一次的定義。

鑑於編譯將失敗,如果它多次看到相同的定義,我認爲不是故意包含同一個源是一個好主意。即使通過玩遊戲,我們在技術上也可以不包含相同的符號定義。

此外,考慮你的模板化PARMS ..

d formType_t  S    10a template 
d formMode_t  s    4a template 

D buildForm  PR 
D type        CONST like(formType_t) 
D mode        CONST like(formMode_t) 

P buildForm  B 
D buildForm  PI 
D type        CONST like(formType_t) 
D mode        CONST like(formMode_t) 

這使得呼叫者可以輕鬆地創建一個變量用來傳遞給你的程序。

您可能最終將模板放在其他包含STDTYPES或APPTYPES的整個其他模板中。

+0

模板是一件好事。它允許一個更強大的定義和一個單一的變化點(場擴展任何人?)。 – jgriffin