我正在使用一个窗口(.w),该窗口具有一个将变量传递给过程(.p)的按钮,发挥其魔力,然后需要将临时表中的结果返回到该窗口以进行显示。
。w文件
定义
DEFINE TEMP-TABLE Return_Results
FIELD tt_var1Return AS CHARACTER FORMAT "x(20)"
FIELD tt_var2Return AS CHARACTER FORMAT "x(30)"
FIELD tt_var3Return AS CHARACTER FORMAT "x(30)"
FIELD tt_var4Return AS CHARACTER FORMAT "x(30)"
.
按钮代码
ON CHOOSE OF RecordFinder IN FRAME Dialog-Frame
DO:
DEFINE VARIABLE varInput AS CHARACTER NO-UNDO
DEFINE VARIABLE Return_Results REFERENCE-ONLY. /* <--- I'm pretty sure this is the problem */
varInput = Fill-In:SCREEN-VALUE.
RUN RecordFinder.p(INPUT varInput, OUTPUT Return_Results).
FOR EACH Return_Results:
Display Return_Results.
END.
END.
。p文件
我省略了一些我认为不必要的东西,但它基本上接受了输入变量,将其匹配并根据结果生成一个临时表,并将这些记录分配给一个新的临时表,该表将被传回。
定义
DEFINE INPUT PARAMETER windowInput AS CHARACTER NO-UNDO.
DEFINE OUTPUT PARAMETER Results_Output
DEFINE TEMP-TABLE Original_tt
FIELD tt_var1Original AS CHARACTER FORMAT "x(20)"
FIELD tt_var2Origianl AS CHARACTER FORMAT "x(30)"
FIELD tt_var3Original AS CHARACTER FORMAT "x(30)"
FIELD tt_var4Original AS CHARACTER FORMAT "x(30)"
.
DEFINE TEMP-TABLE Return_tt
FIELD tt_var1Return AS CHARACTER FORMAT "x(20)"
FIELD tt_var2Return AS CHARACTER FORMAT "x(30)"
FIELD tt_var3Return AS CHARACTER FORMAT "x(30)"
FIELD tt_var4Return AS CHARACTER FORMAT "x(30)"
.
*additional code that works*
代码的下一部分用于对与输入变量匹配的临时表的结果进行排序
FOR EACH Original_tt WHERE Original_tt.Var1 = windowInput:
CREATE Return_tt.
BUFFER-COPY Original_tt TO Results_tt
Return_tt.tt_var1Return = Original_tt.tt_var1Original.
Return_tt.tt_var2Return = Original_tt.tt_var2Original.
Return_tt.tt_var3Return = Original_tt.tt_var3Original.
Return_tt.tt_var4Return = Original_tt.tt_var4Original.
/* This is where I know I'm wrong */
/* I figured you could assign the Return_tt to the output variable */
Results_Output = Return_tt.
END.
我希望这不要太令人费解。
https://docs.progress.com/bundle/abl-reference/page/Parameter-passing-syntax.html处的文档详细介绍了参数传递语法(尽管没有不错的示例)。>>
在被调用程序(.p)中,您需要定义参数
DEFINE INPUT PARAMETER windowInput AS CHARACTER NO-UNDO. DEFINE OUTPUT PARAMETER TABLE FOR Return_tt.
在呼叫者(.w)中,您说以下
RUN RecordFinder.p(INPUT varInput, OUTPUT TABLE Return_Results).
现在您的呼叫者中有了数据。
这是一个深层副本(因此.W在内存中获得了自己的副本)。这可能会导致性能问题(因为必须进行复制),尽管也有进行深层复制的原因。
您可以很容易地将深(按值)调用转换为浅(按引用)调用。
RUN RecordFinder.p(INPUT varInput, OUTPUT TABLE Return_Results BY-REFERENCE).
https://docs.progress.com/bundle/develop-abl/page/Passing-a-temp-table-by-reference.html的其他文档。您无需在调用方中将临时表定义为
REFERENCE-ONLY
。