有没有办法在内部程序(.p文件)中使用过程(.p文件) 的 变量?
答案 0 :(得分:0)
喜欢这个吗?
define variable i as integer no-undo. /* a variable in the main procedure */
procedure internalProcedure:
message "Internal Procedure (a):" i.
i = 13.
message "Internal Procedure (b):" i.
end.
/* main block
*/
i = 1.
message "Main procedure (a):" i.
run internalProcedure.
message "Main procedure (b):" i.
更难的问题可能是:“无论如何阻止全局范围的变量在内部程序中使用”?
答案 1 :(得分:0)
实际问题似乎是:“我有许多程序调用一个通用程序。在一个特殊情况下,我需要让通用程序在调用程序中设置一个特殊值,但我不能修改所有其他程序。”
简单但在架构上令人厌恶的解决方案是使用全局共享变量。
很多人会告诉你这是一种糟糕的编码技巧。他们是对的。但是你不是在寻求有关最佳实践的建议。
只需在调用者和被调用者中创建这样的变量即可。不需要它的程序不会错过它。
您的“正常”计划之一:
/* p1.p */
message "p1, I'm normal.".
run common.p.
您的“特殊”计划:
/* p2.p */
define new global shared variable special as character no-undo.
message "p2, I'm special!".
run common.p.
message "special = " special.
共同计划:
/* common.p */
define new global shared variable special as character no-undo.
message "common stuff...".
if program-name(2) = "p2.p" then special = "special value".
return.
您可以根据需要多次定义NEW GLOBAL SHARED变量,只获得一份副本。 “new”不会覆盖任何现有变量(如果省略GLOBAL,它的行为会有所不同)。
你没有要求它,也许你不需要它,但程序名(2)检查窥视调用堆栈,看看是否p2.p调用了common.p。
还有其他更复杂的方法可以做到这一点,但它们都归结为同样的问题 - 你正在为你的“特殊”程序和现在不再通用的“常见”程序之间的一些非常难看的耦合创建基础程序。
答案 2 :(得分:0)
这是你的意思吗?
这里我们有一个名为ShowTime.p的常见.p文件,其他.p文件将运行。您希望它对某个.p文件以某种方式运行,而对其他文件采用不同的方式。因此我们定义一个参数。在此示例中,它是LOGICAL参数,因此值可以是YES或NO。如您所见,如果lShowDate参数为NO,ShowTime过程将显示TIME,如果lShowDate参数为YES,它将显示DATE。
/* ShowTime.p */
DEFINE INPUT PARAMETER lShowDate AS LOGICAL.
IF lShowDate = NO THEN
MESSAGE STRING(TIME,"HH:MM:SS").
ELSE
MESSAGE STRING(TODAY,"9999/99/99").
这是您的五个不相关的.p文件之一。它运行ShowTime.p过程,向其传递一个NO参数,因此ShowTime将显示TIME。
/* p1.p */
MESSAGE "P File 1".
RUN ShowTime(INPUT NO) NO-ERROR.
另一个,为什么不呢?
/* p2.p */
MESSAGE "P File 2".
RUN ShowTime(INPUT NO) NO-ERROR.
这个.p文件正在运行ShowTime,并且lShowDate参数为YES,这意味着ShowTime过程对于这个过程的行为会有所不同,方法是显示DATE而不是TIME。
/* p5.p */
MESSAGE "P File 5".
RUN ShowTime(INPUT YES) NO-ERROR.
所以基本上你所拥有的是一个可以做两件事之一的程序ShowTime。运行这一个过程的无关过程可以通过传递参数来告诉它它想要什么。
根据你的问题来说:有五个程序(p1.p,p2.p ... p5.p)彼此无关,共享一个程序(ShowTime.p文件)。使用参数修改共享过程,以便它只对一个调用过程(具有YES参数的过程)而不是其他四个(具有NO参数的过程)产生影响。
但是如果你不能改变五个不相关的程序运行共享程序的方式,如果你只能改变共享程序,你必须做出除参数之外的决定。那怎么样:
/* DoThing.p */
IF SOURCE-PROCEDURE:NAME = "p5.p" THEN
MESSAGE "Do one thing".
ELSE
MESSAGE "Do something else".
这将为五个程序之一做一件事,对其他四个程序做其他事情。