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

Varias Classificações no mesmo For Each

Discussão em 'Progress 4GL' iniciado por serigy, Setembro 6, 2018.

  1. serigy

    serigy Sem Pontuação

    Boa tarde Pessoal.
    Me tirem uma duvida, como eu posso colocar vários tipos de classificações no mesmo For Each?
    Tipo, no Break by eu possa inserir uma variável ou campo dinâmico que altere a saída do group de acordo com a parâmetro passado pelo usuário na tela.

    Exemplo:
    FOR EACH controle-apontamento
    WHERE controle-apontamento.nr-ordem-producao >= STRING(INPUT FRAME {&FRAME-NAME} txt_ordem_prod_ini)
    AND controle-apontamento.nr-ordem-producao <= STRING(INPUT FRAME {&FRAME-NAME} txt_ordem_prod_fim)
    NO-LOCK,
    FIRST ord-prod WHERE ord-prod.nr-ord-produ = int(controle-apontamento.nr-ordem-producao)
    NO-LOCK BREAK BY ???)

    Agradeço, valeu.
  2. rafael.andrade

    rafael.andrade Membro Master Moderador Equipe de Suporte

    Só dá pra fazer isso usando query dinâmica.
  3. serigy

    serigy Sem Pontuação

    Teria um exemplo?
  4. bootstrapmaster

    bootstrapmaster Moderator Moderador Equipe de Suporte

    vc pode também criar uma temp-table em que a chave principal seja um campo tipo character, dai vc le via for each as tabelas do banco, populando a temp-table e montando a chave como um string, tem que tomar alguns cuidados, por exemplo, campo data, tem que inverter, por no string ANO/MES/DIA, pra campos numericos, na parte inteira, vc tem que forçar os 0 (zeros) a esquerda, usando uma mascara tipo string(campo,'9999999.999').

    Tenho um programa aqui que eu imaginei que o usuario poderia selecionar até 10 campos como chave, dai a minha temp-table usa 10 campos tipo char, e o usuario ainda pode dizer a ordem dos campos, dai eu consigo fazer um break by ....
    Código:
        define variable chaveListar as character no-undo.
        define variable contador    as integer   no-undo.
    
    
        assign chaveListar = 'EMISSAO,NAT.OPERACAO,ESTABELECIMENTO,CANAL VENDA,SERIE,CLIENTE,PEDIDO,ESTADO'.
       
        define temp-table ttResumo no-undo like nota-fiscal
            field chave1 as character
            field chave2 as character
            field chave3 as character
            field chave4 as character
            field chave5 as character
            field chave6 as character
            field chave7 as character
            field chave8 as character
            index principal chave1 chave2 chave3 chave4 chave5 chave6 chave7 chave8.
    
    
    
        empty temp-table ttResumo.
        for each nota-fiscal no-lock:
            create ttResumo.
            buffer-copy nota-fiscal to ttResumo.
            repeat contador = 1 to num-entries(chaveListar):
                if contador > 8 then leave.
    
                case entry(contador, chaveListar):
                    when 'EMISSAO'         then run gravaChave(contador, string(year(nota-fiscal.dt-emis-nota),'9999') + '/' + string(month(nota-fiscal.dt-emis-nota),'99') + '/' + string(day(nota-fiscal.dt-emis-nota,'99')).
                    when 'NAT.OPERACAO'    then run gravaChave(contador, nota-fiscal.nat-operacao).
                    when 'ESTABELECIMENTO' then run gravaChave(contador, nota-fiscal.cod-estabel).
                    when 'CANAL VENDA'     then run gravaChave(contador, string(nota-fiscal.cod-canal-venda,'999').
                    when 'SERIE'           then run gravaChave(contador, nota-fiscal.serie).
                    when 'CLIENTE'         then run gravaChave(contador, nota-fiscal.nome-ab-cli).
                    when 'PEDIDO'          then run gravaChave(contador, nota-fiscal.nr-pedcli).
                    when 'ESTADO'          then run gravaChave(contador, nota-fiscal.estado).
                end case.
            end.
        end.
    
        for each ttResumo no-lock
            break
            by ttResumo.chave1
            by ttResumo.chave2
            by ttResumo.chave3
            by ttResumo.chave4
            by ttResumo.chave5
            by ttResumo.chave6
            by ttResumo.chave7
            by ttResumo.chave8:
    
    
        end.
    
        procedure gravaChave:
            define input parameter indice as integer   no-undo.
            define input parameter campo  as character no-undo.
    
            case indice:
                when 1 then assign ttResumo.chave1 = campo.
                when 2 then assign ttResumo.chave2 = campo.
                when 3 then assign ttResumo.chave3 = campo.
                when 4 then assign ttResumo.chave4 = campo.
                when 5 then assign ttResumo.chave5 = campo.
                when 6 then assign ttResumo.chave6 = campo.
                when 7 then assign ttResumo.chave7 = campo.
                when 8 then assign ttResumo.chave8 = campo.
            end case.
    
  5. rafael.andrade

    rafael.andrade Membro Master Moderador Equipe de Suporte

    Se quiser um exemplo de query dinâmica, avisa ai.

    A forma de programar é bem diferente e isso pode causar, digamos, estranheza ao programar.
  6. ds201

    ds201 Membro Participativo

    Boa tarde

    Tenta assim:

    Código:
    
    for each tt-erro
       no-lock
       break by if wk-sort = 1 then tt-erro.loader       else ?
             by if wk-sort = 1 then tt-erro.cod-erro     else ?
             by if wk-sort = 2 then tt-erro.nr-embarque  else ?
             by if wk-sort = 2 then tt-erro.cod-erro     else ?
             by if wk-sort = 3 then tt-erro.dt-embarque  else ?
             by if wk-sort = 3 then tt-erro.cod-erro     else ?
             by if wk-sort = 4 then tt-erro.nr-nota-fis  else ?
             by if wk-sort = 4 then tt-erro.serie        else ?
             by if wk-sort = 4 then tt-erro.cod-erro     else ?:
    
       process events.
       assign v-num-reg-lidos = v-num-reg-lidos + 1.
       run pi-acompanhar in h-acomp(input "Fase 13/13  Imprime erros " + string(v-num-reg-lidos)).
    
       assign l-imprime = yes.
      
       display stream str-rp
          tt-erro.loader         
          tt-erro.nr-embarque
          tt-erro.dt-embarque    
          tt-erro.cod-estabel       
          tt-erro.nr-nota-fis       
          tt-erro.serie             
          tt-erro.cod-erro       
          tt-erro.desc-erro      
          tt-erro.campo1         
          tt-erro.campo2         
          with stream-io frame f-relat-1.
       down stream str-rp with frame f-relat-1.
    end.
    
    
    rafael.andrade curtiu isso.

Compartilhe esta Página