1. This site uses cookies. By continuing to use this site, you are agreeing to our use of cookies. Learn More.

  2. Anuncie Aqui ! Entre em contato fdantas@4each.com.br

Urgente Conexão ODBC estabelecida mas só consigo ler tabela

Discussão em 'Progress 4GL' iniciado por Felipe Amaral de Souza, Março 2, 2017.

  1. lucasiam

    lucasiam Membro Participativo

    Montei aqui um exemplo com base na ideia do Richard. Acho que é mais ou menos isso:

    Código:
    /* Definição da temp-table com nome de campos iguais aos da tabela no Banco Postgres */
    DEFINE TEMP-TABLE tt-GrupoProduto
        FIELD codGrupoProduto AS CHAR
        FIELD descricao AS CHAR
        FIELD seqListagem As INTEGER.
    
    DEFINE TEMP-TABLE tt-query
        FIELD tipo AS CHAR
        FIELD cQuery AS CHAR.
    
    /* Criação de dados para teste */
    CREATE tt-GrupoProduto.
    ASSIGN tt-GrupoProduto.codGrupoProduto = "01"
           tt-GrupoProduto.descricao = "Grupo 1"
           tt-GrupoProduto.seqListagem = 1.
    
    CREATE tt-GrupoProduto.
    ASSIGN tt-GrupoProduto.codGrupoProduto = "02"
           tt-GrupoProduto.descricao = "Grupo 2"
           tt-GrupoProduto.seqListagem = 2.
    
    /* chamada pra procedure */
    RUN pi-executa-query(INPUT "tt-GrupoProduto",
                         INPUT "GrupoProduto").
    
    
    PROCEDURE pi-executa-query:
    
    DEFINE INPUT  PARAMETER pTempTable AS CHARACTER NO-UNDO.
    DEFINE INPUT  PARAMETER pTabela    AS CHARACTER NO-UNDO.
    
    DEFINE VARIABLE hBufferHandle      AS HANDLE     NO-UNDO.
    DEFINE VARIABLE hQueryHandle       AS HANDLE     NO-UNDO.
    DEFINE VARIABLE hFieldHandle       AS HANDLE     NO-UNDO.
    DEFINE VARIABLE iFieldCounter      AS INTEGER    NO-UNDO.
    DEFINE VARIABLE c-gQuery           AS CHARACTER  NO-UNDO.
    DEFINE VARIABLE c-iQuery           AS CHARACTER  NO-UNDO.
    DEFINE VARIABLE c-Fields           AS CHARACTER  NO-UNDO.
    DEFINE VARIABLE c-Values           AS CHARACTER  NO-UNDO.
    
    ASSIGN c-gQuery = "INSERT INTO """ + pTabela + """ (".
    
    CREATE BUFFER hBufferHandle FOR TABLE pTempTable.
    CREATE QUERY  hQueryHandle.
    
    hQueryHandle:SET-BUFFERS(hBufferHandle).
    hQueryHandle:QUERY-PREPARE("FOR EACH " + pTempTable).
    hQueryHandle:QUERY-OPEN.
    
    REPEAT:
        /* reset das variaves que guardam os campos e conteúdos */
        ASSIGN c-Fields = ""
               c-Values = "".
    
        hQueryHandle:GET-NEXT().
        IF hQueryHandle:QUERY-OFF-END THEN LEAVE.
    
        DO iFieldCounter = 1 TO hBufferHandle:NUM-FIELDS:
           hFieldHandle = hBufferHandle:BUFFER-FIELD(iFieldCounter).
    
            ASSIGN c-Fields = c-Fields + QUOTER(hFieldHandle:NAME) + ",".
    
            /* verifica tipo do campo - caso caracter, é necessário usar o QUOTER */
            IF hFieldHandle:DATA-TYPE = "character" THEN
                c-Values = c-Values + QUOTER(hFieldHandle:BUFFER-VALUE,"'") + ",".
            ELSE
                c-Values = c-Values + STRING(hFieldHandle:BUFFER-VALUE) + ",".
    
        END.
    
        /* Monta Query */
        ASSIGN c-iQuery = "".
        ASSIGN c-iQuery = c-gQuery + c-Fields
                        + ")"
                        + " VALUES("
                        + c-Values
                        + ")".
    
        /* trata virgula */
        ASSIGN c-iQuery = REPLACE(c-iQuery, ",)",")").
        CREATE tt-query.
        ASSIGN tt-query.cQuery = c-iQuery.
    
    END. /* REPEAT */
    
    DELETE OBJECT hBufferHandle.
    DELETE OBJECT hQueryHandle.
    
    FOR EACH tt-query:
        /* nesse ponto, já com uma conexão ODCB pronta, executo as queries */
        MESSAGE tt-query.cQuery
            VIEW-AS ALERT-BOX INFO BUTTONS OK.
    END.
    
    END PROCEDURE.
    
  2. rafael.andrade

    rafael.andrade Membro Master Moderador Equipe de Suporte

  3. bootstrapmaster

    bootstrapmaster Moderator Moderador Equipe de Suporte

    isso ai, agora a procedure pi-executa-query vira um programa .p, e dai vc pode usar ele em qualquer situação.
  4. bootstrapmaster

    bootstrapmaster Moderator Moderador Equipe de Suporte

    no meu caso eu faria uma classe hehehe
  5. lucasiam

    lucasiam Membro Participativo

    Ta aí uma coisa que não faço ideia de como fazer. Se puder mandar um exemplo simples de como usar classe/conceito de orientação a objetos no Progress... seria ótimo! rsrs.

    Isolei a procedure num programa .p e aí surgiu um problema:
    Como ela será usada de forma genérica, coloquei como parâmetro o nome da temp-table, invés de passar a temp-table propriamente dita (visto que as definições das temp-tables são distintas pra cada tabela do Postgres que eu quero popular). Com isso, quando abro a query na temp-table, ela está sempre vazia.
    Pra resolver de imediato, declarei a temp-table como NEW GLOBAL SHARED TEMP-TABLE.
    Vocês tem alguma outra ideia de como contornar isso?
  6. rafael.andrade

    rafael.andrade Membro Master Moderador Equipe de Suporte

    Moleza, envia parâmetro como BUFFER-HANDLE.

    DEF VAR tBuffer AS HANDLE.

    ASSIGN tBuffer = TEMP-TABLE MyTT :DEFAULT-BUFFER-HANDLE.

    RUN MinhaProcedure(INPUT tBuffer).


    Aí dentro da procedure fica:
    DEF INPUT PARAMETER MyTable AS HANDLE.

    Aí dentro do programa você pode varrer as colunas e registro usando Query.

    Analise a parte de queries dinâmicas.

Compartilhe esta Página