我正在创建一个访问数据库与许多表的应用程序。 为了使编码更简单,更短,我计划制定一个程序来动态获取/设置数据或执行特定数据操作的过程。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.
提前感谢!
什么版本的Progress? – 2014-10-03 13:27:42
10.2B但我们可以升级到最新版本 – 2014-10-03 13:52:01
在这种情况下,您可能需要考虑重新考虑这种方法并构建一个类来实现您的逻辑。这样你就不需要传递临时表参数并且担心INPUT和INPUT-OUTPUT等。 – 2014-10-03 14:13:24