从被调用程序返回到 rpgle 的主例程中获取返回值

PoC*_*PoC 4 rpgle ibm-midrange

我正在努力获得 RPGLE 和 IBM i 方面的经验并不断学习。由于大多数野外代码似乎都是经典的位置代码,因此我将坚持使用它以适应它。所以我宁愿不使用 /free \xe2\x80\x94 /end-free 的东西。顺便说一句,我是在一台只有 V4R5 的旧 9401-150 上执行此操作。

\n\n

TL;DR:我如何从它自己的激活组中的外部称为 ILE 程序(具有它自己的 MAIN 部分,即它本身是独立的)获取返回值(*NEWTL;DR:如何从它自己的激活组 ( )被叫者?

\n\n

我已经准备好一个子文件程序并且运行良好。我想调用外部程序来处理子文件中 OPT 值的请求。所以我在被调用者的 D-Specs 中定义了一个 PR:

\n\n
DROEDETPG         PR                  EXTPGM(\'ROEDETPG\')\nDC_MODE                               LIKE(MODE)\nDC_TYP                                LIKE(TYP)         \n
Run Code Online (Sandbox Code Playgroud)\n\n

后来,我调用该程序也运行得很好。

\n\n
C                   SELECT\nC     OPT           WHENEQ    \'2\'\nC                   MOVE      \'CHG\'         MODE\nC                   CALLP     ROEDETPG(MODE:TYP)\nC                   ENDSL\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是被调用程序的入口点:

\n\n
C     *ENTRY        PLIST\nC                   PARM                    C_MODE            3\nC                   PARM                    C_TYP            16\n
Run Code Online (Sandbox Code Playgroud)\n\n

现在,也许我想要更改的记录已经被锁定了。所以,我CHAIN(E)在外部程序中使用并%STATUS在之后从 PF获取CHAIN. 其状态值为 1218,我想将此值返回给调用程序,因此它可以使用消息行告诉用户,记录已锁定且目前不可用。

\n\n

我在网上能找到的只是对调用进行原型设计并定义一个可能仅适用于过程的调用接口(PI)。

\n\n

因此我想到了一个“临时文件”,就像我在 Unix/Linux 上的 Bash 和 C 中所习惯的那样。似乎没有mktemp()等效项,但我可以在 QTEMP 中创建同名的文件。这适用于文件类型*DTAARA。不幸的是(可以预料吗?)该文件仅对调用程序可见。也许可以创建一个全局键控的 *DTAQSENDERID(*YES)但也许这有点矫枉过正?

\n\n

为什么我不把外部程序中的功能放入一堆函数中并使用CALLP?嗯,我还在学习。我决定将子例程中的内容移出主源,以结束子例程执行操作时涉及的状态更改带来的持续麻烦。当 SR 执行 READ 操作时,数据库指针指向另一条记录,这会在继续子文件内容时带来大量不稳定的行为。

\n\n

另外,全局变量(字段内容)会被覆盖,这会添加更多代码来将内容移到一边,保存数据库的键值,调用 SR 并再次恢复变量,然后执行SETLL返回到之前的状态。我希望这会更容易,但也许我对于 ile rpg 来说仍然是一个新手。

\n\n

我愿意接受有关如何正确避免我的根本问题(文件指针和全局变量)的其他建议。

\n

Pla*_*1st 5

我知道你说不/免费或**免费,但我会忽略这一点,因为就我而言,固定格式的东西可能会在它产生的地狱之火中燃烧。欢迎您自行将以下代码翻译回固定格式。为了正确地执行此操作,您应该简单地将一个变量传递给将包含错误的程序。

MYPGM角色扮演游戏

**FREE
/Include MYHDR
Dcl-Pi *N;
    ErrorRet Char(7); // or whatever type you want to return
End-Pi;

ErrorRet = 'RFE1234';
*InLR = *On;
Return;
Run Code Online (Sandbox Code Playgroud)

MYHDR 角色扮演游戏

**FREE
Dcl-Pr MyPgm ExtPgm('MYPGM');
    ErrorRet Char(7); // or whatever type you want to return
End-Pr;
Run Code Online (Sandbox Code Playgroud)

调用PGM.RPGLE

**FREE
/Include MYHDR

Dcl-S Error Char(7) Inz;

MyPgm(Error);
// Error should now contain 'RFE1234'
...
Run Code Online (Sandbox Code Playgroud)