2014-10-03 30 views
1

我正在创建一个访问数据库与许多表的应用程序。 为了使编码更简单,更短,我计划制定一个程序来动态获取/设置数据或执行特定数据操作的过程。OpenEdge动态TempTable

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

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

我现在想要做的是,当用户更改记录时,动态保存该记录。因此,我必须动态查询表并查找用户想要更改的记录。其实和检索记录一样。但保存所做的更改需要我通过输入动态临时表。这是如何完成的?

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

此处提供的代码仅用于第一部分,但第二部分应包含在此代码中。

代码:

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. 

提前感谢!

+0

什么版本的Progress? – 2014-10-03 13:27:42

+0

10.2B但我们可以升级到最新版本 – 2014-10-03 13:52:01

+1

在这种情况下,您可能需要考虑重新考虑这种方法并构建一个类来实现您的逻辑。这样你就不需要传递临时表参数并且担心INPUT和INPUT-OUTPUT等。 – 2014-10-03 14:13:24

回答

3

您需要研究ProDataset功能,它会使加载TT并将其已更改的记录保存到数据库a lot更容易。

要创建一个类似db表(高级别)的动态TT,获取表的缓冲区句柄,然后使用b-handle:buffer-field(field-number):name来获取列表字段,然后使用add-fields-from根据数据库表在TT中创建字段。

一旦得到了,使用Prodataset“FILL”功能将数据加载到其中,然后将PDS传回给调用程序供其使用。

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

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

这个KB也会给你一些关于如何建立一个动态TT像一个数据库表的想法。 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

+1

我会试试看,谢谢! – 2014-10-06 06:40:36

0

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