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

Dica Tabela dinamica

Discussão em 'Progress 4GL' iniciado por bootstrapmaster, Abril 7, 2015.

  1. bootstrapmaster

    bootstrapmaster Moderator Moderador Equipe de Suporte

    Meus caros, eu pesquisei essa solução porque eu preciso comparar o que foi alterado campo a campo em uma tabela qualquer, e dai vc ficar criando programa criando tabelas temporarias e depois fazendo IF de campo a campo é complicado, esse exemplo eu só estou lendo dinamicamente uma tabela e mostrando o nome do campo e seus valores, vai que é util pra alguem.
    Código:
        define variable nomeTabela   as character no-undo.
        define variable buffertabela as handle    no-undo.
        define variable queryTabela  as handle    no-undo.
        define variable campoTabela  as handle    no-undo.
        define variable contador     as integer   no-undo.
        define variable contadorExt  as integer   no-undo.
    
        assign nomeTabela = 'it-nota-fisc'.
    
        create buffer bufferTabela for table nomeTabela no-error.
        create query queryTabela.
    
        queryTabela:set-buffers(bufferTabela).
        queryTabela:query-prepare("for each " + nomeTabela).
        queryTabela:query-open().
        queryTabela:get-last().
        assign contador = 1.
        repeat :
            campoTabela = bufferTabela:buffer-field(contador) no-error.
            if not valid-handle(campoTabela) then leave.
    
            if campoTabela:extent = 0 then do:
                message 'Nome: ' campoTabela:name skip
                        'Valor : ' campoTabela:buffer-value skip
                    view-as alert-box info buttons ok.
            end.
            else do:
                repeat contadorExt = 1 to campoTabela:extent:
                    message 'Nome: ' campoTabela:name skip
                            'Valor : ' campoTabela:buffer-value(contadorExt) skip
                        view-as alert-box info buttons ok.
                end.
            end.
            assign contador = contador + 1.
        end.
        queryTabela:query-close().
        bufferTabela:buffer-release().
        delete object bufferTabela.
        delete object queryTabela.
    
    rafael.andrade curtiu isso.
  2. rhemati

    rhemati Membro Participativo

    Richard, boa tarde.
    Muito joiá. Já usei e já tinha visto códigos como este. Parabéns. Ficou 10!!!

    Você me dizer se no código lá cima deveria complementar no-lock ou a query já abre sem travar é somente uma consulta, um query/select mesmo igualmente no delphi, vb, etc...
  3. bootstrapmaster

    bootstrapmaster Moderator Moderador Equipe de Suporte

    isso, query é query, se vc quiser alterar teria que ir direto na tabela, igual quando altera um browser, find current nometabela exclusive-lock, assign do campo e depois um find current nometabela no-lock.

    Muito arriscado alterar registro desse jeito.
  4. Agnaldo

    Agnaldo Membro Ativo

    Ficou bom o uso como tabela dinâmica.

    Especificamente para a necessidade que voce colocou, de verficar "quais" campos foram alterados numa tabela, podes usar o buffer-compare (bastante usado em replicação de dados), pois ele devolve a lista de campos que foram alterados.
    Código:
    DEFINE VARIABLE camposAlterados AS CHARACTER.                        
    
    &SCOPED-DEFINE tabelaOrigem tabcli  
    &SCOPED-DEFINE tabelaAlterada tt
    
    DEFINE TEMP-TABLE {&tabelaAlterada} LIKE {&TabelaOrigem}.
    
    
    FIND FIRST {&TabelaOrigem}.
    BUFFER-COPY {&TabelaOrigem} TO {&TabelaAlterada}.
    
    UPDATE {&TabelaAlterada} WITH 1 COLUMN.
    
    BUFFER-COMPARE {&tabelaAlterada} TO {&tabelaOrigem} SAVE RESULT IN camposAlterados.
    MESSAGE camposAlterados VIEW-AS ALERT-BOX.
    
    Eilleen e rafael.andrade curtiram isso.
  5. rafael.andrade

    rafael.andrade Membro Master Moderador Equipe de Suporte

    Também já conhecia este método, muito bom!
  6. bootstrapmaster

    bootstrapmaster Moderator Moderador Equipe de Suporte

    Guina, devolve os campos alterados e o que mudou também ? porque eu preciso saber que o campo valor mudou de 10 para 15

Compartilhe esta Página