【问题标题】:Constructor that takes a static temp table as input (Progress ABL)将静态临时表作为输入的构造函数(Progress ABL)
【发布时间】:2016-04-18 22:08:00
【问题描述】:

我有一个主要目的是围绕临时表的课程。我想创建一个将相同的临时表作为输入的构造函数。

到目前为止,编译器会阻止任何将临时表作为输入参数传递的尝试。如果我改用桌子把手,它就可以工作。但我宁愿不要从动态表复制到静态表。

Progress 希望这些表在编译时匹配,但我知道它们会是相同的——它们是在 .i 文件中定义的。

有没有一种简单的方法来排列表格,还是我一次只能解析一个字段?

【问题讨论】:

  • 很可能您更改了 .i 并且编译器的缓存使用该 .i 的两个不同版本用于类与调用程序,这就是您收到编译器错误的原因。
  • 你能贴一些代码吗?你的想法似乎很可行。你是什​​么意思你知道他们会是一样的?如果它们是静态的,那么它们在任何时候都是相同的。还是我误会了什么?

标签: progress-4gl openedge


【解决方案1】:

对我来说就像一种魅力。

CLASS Test.TTOO.TempTableWrapper:

    {Test/TTOO/ttCustomer.i}

    CONSTRUCTOR PUBLIC TempTableWrapper (TABLE ttCustomer):

        FOR EACH ttCustomer:
            DISPLAY ttCustomer.CustNum ttCustomer.Name .
        END.

    END CONSTRUCTOR. 
END CLASS.

和调用者:

ROUTINE-LEVEL ON ERROR UNDO, THROW.

USING Test.TTOO.* FROM PROPATH.

DEFINE VARIABLE oWrapper AS TempTableWrapper NO-UNDO .

{Test/TTOO/ttCustomer.i}

/* ***************************  Main Block  *************************** */

CREATE ttCustomer.
ASSIGN ttCustomer.CustNum = 42
       ttCustomer.Name    = "It works" .

oWrapper = NEW TempTableWrapper(TABLE ttCustomer )  .

您也可以通过引用传递临时表:

oWrapper = NEW TempTableWrapper(TABLE ttCustomer BY-REFERENCE)  .

但是,临时表数据仅在构造函数期间可用,因为 BY-REFERENCE 调用仅在该调用期间“重叠”被调用者内的临时表。

对于永久“BY-REFERENCE”,在调用和参数上使用 BIND 关键字 - 在这种情况下,被调用者必须将临时表定义为 REFERENCE-ONLY。

注意,不需要(尽管至少我推荐)在包含文件中定义临时表。在运行时和编译时,模式只需要匹配。

当编译器不喜欢你的调用时,删除类 r-code 并重新编译。

【讨论】:

  • 这里的诀窍是我需要将输入表复制到内部临时表。我不断收到“未知或不明确的表”错误
  • 所以这将是 BY-VALUE(与 BY-REFERENCE 相反)。上面的前两个代码示例块完全相同。该过程创建了一个新的 ttCustomer 实例,并且该类保留了它的私有副本。介意分享一些代码吗?
  • 等等,真的这么简单吗?我不必从 this:table 复制到 that:table?它只是自动发生吗?我在文档中的任何地方都没有找到这个事实。
  • 是 - 临时表和 ProDatasets 的默认参数模式是 BY-VALUE,即被调用者收到临时表的完整副本。
  • 我知道,但我不认为表会在对象中持久存在。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-16
  • 2011-03-01
  • 1970-01-01
  • 2020-02-15
  • 2011-04-19
  • 2012-03-13
  • 1970-01-01
相关资源
最近更新 更多