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

Duvida FOR EACH "complexo"

Discussão em 'Progress 4GL' iniciado por jc01, Março 9, 2015.

  1. jc01

    jc01 Membro Participativo

    Tenho a seguinte situação em uma temp-table:

    GRUPO.....SUBGRUPO.....VALOR
    A................Q......................1
    A................B......................3
    A................W.....................2
    A................R......................1
    A................T......................3
    B.................P.....................1
    B.................L.....................2
    B.................M...................4
    B.................O....................2
    B.................H....................4

    Os registros em vermelho são os que eu preciso retornar. Ou seja: preciso agrupar por GRUPO e retornar todos os registros que tiverem o maior valor na coluna VALOR.

    Creio que eu preciso de um FOR EACH que agrupe a coluna GRUPO, depois outro que retorne o maior valor para cada grupo e outro que retorne todos registros do determinado grupo e valor.

    Se alguém puder me ajudar, agradeço.
  2. bootstrapmaster

    bootstrapmaster Moderator Moderador Equipe de Suporte

    desse jeito vc lista tudo, mas juntando os grupo e os valores maiores no começo da lista, mas se vc quer filtrar, teria que ler a tabela antes, jogar pra temp-table e lá dar um delete nos registros que não interessa.
    Código:
    for each tabela no-lock
        break
              by tabela.grupo
              by tabela.valor descending:
    end.
  3. jc01

    jc01 Membro Participativo

    Eu gostaria de fazer algo mais simples... tipo assim...

    No primeiro FOR EACH eu traira apenas o nome de cada grupo uma única vez, ou seja: A e B. Este FOR EACH teria 2 registros. Se fosse por SQL, eu faria assim:

    SELECT grupo FROM tabela GROUP BY grupo

    No segundo FOR EACH eu traria qual o valor máximo de cada grupo, ou seja: A --> 3 e B --> 4. Se fosse por SQL, eu faria assim:

    SELECT MAX(valor) FROM tabela WHERE grupo = :grupo_primeiro_foreach

    No terceiro FOR EACH eu filtraria no WHERE o nome do grupo e o valor. Se fosse por SQL, eu faria assim:

    SELECT * FROM tabela WHERE grupo = :grupo_primeiro_foreach AND valor = :valor_segundo_foreach

    Pensei em fazer isso de forma encadeada, usando 3 buffers para a mesma temp-table. O meu problema está com as funções de GROUP BY, MAX, etc, que facilmente eu usaria com SQL.
  4. jc01

    jc01 Membro Participativo

    Não sei porque diabos o pessoal da Progress achou melhor comandos como FOREACH, FIND, etc, do que usar SQL. =/
  5. bootstrapmaster

    bootstrapmaster Moderator Moderador Equipe de Suporte

    Código:
    define temp-table tabela no-undo
        field grupo as character
        field valor as decimal
        index principal as grupo.
    
    define temp-tale tabelaFinal no-undo like tabela.
    
    for each tabela no-lock:
    
        find first tabelaFinal
             where tabelaFinal.grupo = tabela.grupo
                   no-error.
    
        if not avail tabelaFinal then do:
            create tabelaFinal.
            assign tabelaFinal.grupo = tabela.grupo
                   tabelaFinal.valor = 0.
        end.
    
        assign tabelaFinal.valor = maximum(tabelaFinal.valor, tabela.valor).
    end.
    
    for each tabelaFinal no-lock:
        disp tabelaFinal.
    end.
    
  6. jc01

    jc01 Membro Participativo

    Eu ainda vou testar, mas de primeira vista provavelmente é isso que eu preciso. Valeu!

Compartilhe esta Página