我正在创建一个访问包含许多表的数据库的应用程序。为了使编码更简单、更简短,我计划创建一个过程,它可以动态地获取/设置数据,也可以执行特定数据操作的过程。
到目前为止我得到了一些东西,但我现在有点卡住了。
到目前为止,我所做的是确保我可以动态地构建一个临时表,该表与我想要从中检索数据的数据库表具有相同的模式。然后,我查询一条记录并将其添加到动态临时表中。然后将该临时表作为输出参数传递。
我现在要做的是,当用户更改记录时,动态保存该记录。因此,我必须动态查询表并找到用户想要更改的记录。实际上和检索记录是一样的。但是保存所做的更改需要我遍历输入的动态临时表。这是怎么做的?
正常的操作方式是这样的:-通过传递表名和键来获取记录。然后将记录提供给输出参数。-通过获取动态临时表作为输入参数来更新记录,然后保存从正确记录到正确记录的更改。第二部分是我失败的地方。
这里提供的代码只执行第一部分,但第二部分应该包含在此代码中。
代码:
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.提前感谢!
发布于 2014-10-04 10:26:42
您需要研究ProDataset功能,它将使加载TT并将其更改的记录保存回DB变得容易得多。
要创建像db表这样的动态TT (在较高级别),请获取表的缓冲区句柄,然后使用b- handle : buffer -field(field-number):name遍历它以获取字段列表,然后使用add-field-from根据db表在TT中创建字段。
完成后,使用Prodataset "FILL“功能将数据加载到其中,然后将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
发布于 2014-10-16 16:13:26
我对动态临时表使用了两个不同的参数,一个用于输入,另一个用于输出。剩下的我自己想明白了。谢谢你们的帮助!
https://stackoverflow.com/questions/26179763
复制相似问题