2017-03-24 2 views
0

Nach dem Lesen der IBM Dokumentation über RTNPARM Schlüsselwort, ist es mir immer noch nicht klar, wie ich damit umgehen muss.
Könnte mir jemand ein kleines Vorgehensbeispiel geben?Beispiel für RTNPARM Schlüsselwort und Anwendungsfall

Wenn es viel schneller ist, warum hat IBM es nicht implizit gemacht?

Antwort

1

RTNPARM für das Verfahren ist s, die einen sehr langen Zeichenwert zurückgeben, der häufig nur teilweise verwendet wird. Der Rückgabewert wird auf den Stapel geschoben, und es dauert länger, ein 64K-Zeichen auf den Stapel zu schieben als ein 10-Byte-Zeichen. Parameter, die per Referenz übergeben werden, setzen nur einen Zeiger auf den Stapel. Wenn Sie das RTNPARM-Schlüsselwort verwenden, behandelt es den Rückgabewert wie einen Parameter, der als Verweis übergeben wird. Intern wird der erste Parameter zum Rückgabewert, der als Referenz übergeben wird. Sie übergeben und erhalten den Rückgabewert auf die gleiche Weise wie normalerweise. Wenn Sie jedoch die Anzahl der Parameter mit %parms() ermitteln möchten, werden die Parameternummern um eins erhöht. IBM hat dazu die integrierte %parmnum()-Lösung eingeführt.

So, hier ist ein einfaches Beispiel:

dcl-proc sample; 
    dcl-pi *n Varchar(65535) RtnParm; 
     parm1 VarChar(256) const options(*nopass); 
    end-pi; 

    dcl-s result   Varchar(65535) Inz(''); 
    dcl-s str1   Varchar(256) Inz(''); 

    if %parms() >= %parmnum(parm1); 
     str1 = parm1; 
    endif; 

    // do some stuff 

    return result; 
    end-proc; 
1

Sie müssen nicht "damit umgehen", das ist das Schöne daran.

D TestProc1  Pr   32000a 

D TestProcV7  Pr   32000a RTNPARM 

myResults = TestProc1(); 
myResults = TesProcV7(); 

Der Aufruf der Prozedur wird unabhängig davon, ob RTNPARM angegeben ist oder nicht, gleich codiert.

Es ist nicht der Standard (dh implizit) wie es bei v7 hinzugefügt wurde. Außerdem ist es nur schneller, wenn der zurückgegebene Wert größer als 16 Bytes ist.

Plus, wenn die aufgerufene Prozedur optionale Parameter hat, müssen Sie sie in der aufgerufenen Prozedur ein wenig anders behandeln.

Gegeben

D MyProc   PI     LikeDS(myResult) 
D Compulsory     20a 
D Optional      10a Options(*NoPass) 

Alte Art und Weise:

If %Parms > 1; 
     DoStuff(); 
    EndIf; 

Neuer Weg

If %ParmNum(Optional) <= %Parms; 
     DoStuff(); 
    EndIf; 

Weitere Details und Beispiele oben von Large Subprocedure Return Values: V7 Brings Relief

1

Ein weiterer Grund, dass RTNPARM nicht implizit sein kann, ist, dass es sich um eine rein RPG Sache. Wenn die Prozedur in einer anderen Programmiersprache geschrieben oder aus einer anderen Sprache aufgerufen wird, kann RTNPARM nicht verwendet werden, weil die andere Sprache annehmen würde, dass der normale Rückgabewertmechanismus verwendet wurde.

0

Wenn Sie Unterprozeduren mit Microsofts VB/VBA vergleichen, ist eine Unterprozedur mit rtnparm eine Funktion und eine Unterprozedur ohne rtnparm ist eine Untereinheit.

Verwandte Themen