Я создаю приложение, которое обращается к базе данных со многими таблицами. Чтобы сделать кодирование проще и короче, я планирую сделать одну процедуру, которая либо получает/устанавливает данные динамически, либо выполняет процедуру для конкретных манипуляций с данными.OpenEdge Dynamic 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.
Заранее спасибо!
Какая версия прогресса? –
10.2B, но мы можем перейти на последнюю версию –
В этом случае вам может потребоваться переосмыслить этот подход и создать класс для реализации вашей логики. Таким образом, вам не нужно будет проходить параметры temp-table и беспокоиться о INPUT vs INPUT-OUTPUT и т. Д. –