进展4gl内部程序

时间:2012-04-23 15:46:10

标签: progress-4gl

有没有办法在内部程序(.p文件)中使用过程(.p文件) 的 变量?

3 个答案:

答案 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".

这将为五个程序之一做一件事,对其他四个程序做其他事情。