【问题标题】:OpenEdge Dynamic TempTableOpenEdge 动态临时表
【发布时间】:2014-10-03 13:21:29
【问题描述】:

我正在创建一个访问包含许多表的数据库的应用程序。 为了使编码更容易和更短,我计划制作一个过程,可以动态获取/设置数据或执行特定数据操作的过程。

到目前为止我有一些东西,但我现在有点卡住了。

到目前为止,我所做的是确保我可以动态地构建一个与要从中检索数据的数据库表具有相同架构的临时表。然后我查询一条记录并将其添加到动态临时表中。然后这个临时表作为输出参数传递。

我现在要做的是,当用户更改记录时,动态保存该记录。因此,我必须动态查询表并找到用户想要更改的记录。实际上与检索记录相同。但是保存所做的更改需要我通过输入动态临时表。这是怎么做到的?

正常的动作方式是这样的: - 通过传递表名和键获取记录。然后将记录提供给输出参数。 - 通过获取动态临时表作为输入参数更新记录,然后将更改从正确记录保存到正确记录。第二部分是我失败的地方。

这里提供的代码只做第一部分,但第二部分应该包含在这个代码中。

代码:

DEF VAR G-TableBuf              AS HANDLE NO-UNDO.
DEF VAR G-TableBuf-Handle       AS HANDLE NO-UNDO.
DEF VAR G-Query                 AS HANDLE NO-UNDO.
DEF VAR G-Table-FirNr           AS INT    NO-UNDO.
DEF VAR G-Qstring               AS CHAR   NO-UNDO.
DEF VAR G-Heeft-FirNr           AS LOG    NO-UNDO.
DEF VAR G-TempTable             AS HANDLE NO-UNDO.
DEF VAR G-tt-Buffer             AS HANDLE NO-UNDO.
DEF VAR G-MatchZone             AS CHAR   NO-UNDO.
DEF VAR G-prime-field           AS CHAR   NO-UNDO.
DEF VAR G-Zones-Buffer          AS HANDLE NO-UNDO.

{lib/def_tt_ds_Errors.i}

DEF INPUT PARAMETER p_iFirnr    AS INT  NO-UNDO.
DEF INPUT PARAMETER p_iApplNr   AS INT  NO-UNDO.
DEF INPUT PARAMETER p_cUsrCd    AS CHAR NO-UNDO.
DEF INPUT PARAMETER p_cAction   AS CHAR NO-UNDO.
DEF INPUT PARAMETER p_cKeyCd    AS CHAR NO-UNDO. /* Record key */
DEF INPUT PARAMETER p_cTable    AS CHAR NO-UNDO. /* Table name */

DEF INPUT-OUTPUT PARAMETER TABLE-HANDLE hTT. /* INPUT-OUTPUT dynamic temp-table */
DEF OUTPUT PARAMETER DATASET            FOR dsErrors.

    RUN FindRecord.

    RETURN.        

PROCEDURE FindRecord :
/*------------------------------------------------------------------------------------------------*/
/*------------------------------------------------------------------------------------------------*/
DEF VAR i AS INT NO-UNDO.

    CREATE TEMP-TABLE G-TempTable.
    CREATE BUFFER     G-TableBuf FOR TABLE p_cTable.
    CREATE QUERY      G-Query.

    ASSIGN G-Table-FirNr  = Get-Fir (p_cTable)
           G-MatchZone    = "kolom,Waarde"
           G-heeft-firnr  = FALSE
           G-Zones-Buffer = BUFFER zones:HANDLE
           G-TableBuf-Handle = G-TableBuf:HANDLE.

    /* SCHEMA BUILDING CODE GOES HERE */

    G-TempTable:TEMP-TABLE-PREPARE("tt" + p_cTable).

    G-tt-Buffer = G-TempTable:DEFAULT-BUFFER-HANDLE.
    G-tt-Buffer:EMPTY-TEMP-TABLE().

    hTT = G-TempTable.

    G-Qstring = "FOR EACH " + p_cTable.

    G-Query:SET-BUFFERS(G-TableBuf).
    G-Query:QUERY-PREPARE(G-Qstring).
    G-Query:QUERY-OPEN().
    G-Query:GET-NEXT().   

    REPEAT:
        IF G-query:QUERY-OFF-END THEN
            LEAVE.

        G-tt-Buffer:BUFFER-CREATE.
        G-tt-Buffer:BUFFER-COPY (G-TableBuf-Handle). 

        G-Query:GET-NEXT(). 
    END.

END PROCEDURE.

提前致谢!

【问题讨论】:

  • 什么版本的进度?
  • 10.2B 但我们可以升级到最新版本
  • 在这种情况下,您可能需要考虑重新考虑这种方法并构建一个类来实现您的逻辑。这样您就不需要传递临时表参数并担心 INPUT 与 INPUT-OUTPUT 等。
  • 好吧,我会这样做的!谢谢
  • 但是我不明白上课会有什么好处?我希望这一过程适用于数据库中 90% 的表。

标签: progress-4gl openedge


【解决方案1】:

您需要研究 ProDataset 功能,它将使加载 TT 并将其更改的记录保存回数据库变得更容易很多

要创建像 db 表一样的动态 TT(在高级别),获取表的缓冲区句柄,然后使用 b-handle:buffer-field(field-number):name 遍历它以获取字段列表, 然后使用 add-fields-from 根据 db 表在 TT 中创建字段。

完成后,使用 Prodataset“填充”功能将数据加载到其中,然后将 PDS 传递回调用程序以供其使用。

当您准备好保存数据时,使用 PDS 功能(保存行更改)将更改的记录保存回数据库。

加载和保存 TT 记录的过程大部分记录在 Prodatset 文档集中。我强烈推荐 11.3 文档,因为它们比以前版本的 PDS 文档有了很大改进。

本知识库还将为您提供一些关于如何构建动态 TT(如 db 表)的想法。 http://knowledgebase.progress.com/articles/Article/000045189?q=how+to+create+dynamic+temp-table&l=en_US&c=Product_Group%3AOpenEdge&type=Article__kav&fs=Search&pn=1

【讨论】:

    【解决方案2】:

    我为动态临时表使用了 2 个不同的参数,一个用于输入,一个用于输出。其余的我自己想通了。谢谢你们的帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-24
      • 1970-01-01
      • 2011-02-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多