2014-10-03 1 views
1

Я создаю приложение, которое обращается к базе данных со многими таблицами. Чтобы сделать кодирование проще и короче, я планирую сделать одну процедуру, которая либо получает/устанавливает данные динамически, либо выполняет процедуру для конкретных манипуляций с данными.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. 

Заранее спасибо!

+0

Какая версия прогресса? –

+0

10.2B, но мы можем перейти на последнюю версию –

+1

В этом случае вам может потребоваться переосмыслить этот подход и создать класс для реализации вашей логики. Таким образом, вам не нужно будет проходить параметры temp-table и беспокоиться о INPUT vs INPUT-OUTPUT и т. Д. –

ответ

3

Вам необходимо изучить функциональность ProDataset, она сделает загрузку TT и сохранит измененные записи обратно в базу данных . проще.

Чтобы создать динамический TT, как таблицу db (на высоком уровне), получите дескриптор буфера таблицы, затем пройдите через него с помощью b-handle: buffer-field (field-number): name, чтобы получить список полей, а затем использовать add-fields-from для создания полей в TT на основе таблицы db.

Как только вы это приобрели, используйте функцию «FILL» Prodataset для загрузки данных в нее, а затем передайте PDS обратно в вызывающую программу для ее использования.

Когда вы готовы сохранить данные, используйте функцию PDS (save-row-changes), чтобы сохранить измененные записи в базу данных.

Процесс загрузки и сохранения записей ТТ в значительной степени задокументирован в наборе документов 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

+1

Я попробую, спасибо! –

0

Я использовал 2 разных параметра для динамической таблицы темп, один для ввода и один для вывода. В остальном я понял себя. Спасибо за помощь ребята!

 Смежные вопросы

  • Нет связанных вопросов^_^