[RESOLVIDO] For eachs demorados

Discussão em 'EMS , HCM e Totvs 11' iniciado por bootstrapmaster, Outubro 29, 2015.

Status do Tópico:
Não esta aberto para novas mensagens.
  1. bootstrapmaster

    bootstrapmaster Moderator Moderador Equipe de Suporte

    Pessoal, percebi uma coisa em um desenvolvimento hoje, estou pensando em adotar como padrão, vejam se vcs concordam comigo:


    eu precisei achar todos os ACAs de um item em um periodo e depois descobrir se o mesmo foi VENDIDO, então eu fiz .....
    Código:
        for each movto-estoq no-lock
            where movto-estoq.cod-estabel   = '202'
              and movto-estoq.nr-ord-produ <> 0
              and movto-estoq.dt-trans     >= 08/01/2015
            ,
            first ord-prod no-lock
            where ord-prod.nr-ord-produ = movto-estoq.nr-ord-produ:
    
            if {ininc/i03in218.i 4 movto-estoq.esp-docto} = 'ACA' then do:
                    for each  fat-ser-lote use-index item no-lock
                        where fat-ser-lote.it-codigo       = movto-estoq.it-codigo
                          and fat-ser-lote.log-disp-planej = fat-ser-lote.log-disp-planej
                          and fat-ser-lote.nr-serlote      = movto-estoq.lote:
    
                        /* mostrar os dados da nota fiscal */
    
                    end.
            end.
        end.
    
    Percebi que quando tem dados na fat-ser-lote vai rapidão, mas se não tem, o programa fica pensando ......

    dai eu fiz ......

    Código:
        for each movto-estoq no-lock
            where movto-estoq.cod-estabel   = '202'
              and movto-estoq.nr-ord-produ <> 0
              and movto-estoq.dt-trans     >= 08/01/2015
            ,
            first ord-prod no-lock
            where ord-prod.nr-ord-produ = movto-estoq.nr-ord-produ:
    
            if {ininc/i03in218.i 4 movto-estoq.esp-docto} = 'ACA' then do:
                if can-find(first fat-ser-lote where fat-ser-lote.it-codigo = movto-estoq.it-codigo and fat-ser-lote.nr-serlote = movto-estoq.lote) then do:
                    for each  fat-ser-lote use-index item no-lock
                        where fat-ser-lote.it-codigo       = movto-estoq.it-codigo
                          and fat-ser-lote.log-disp-planej = fat-ser-lote.log-disp-planej
                          and fat-ser-lote.nr-serlote      = movto-estoq.lote:
    
                        /* mostrar os dados da nota fiscal */
    
                    end.
                end.
            end.
        end.
    
    Ou seja, coloquei um can-find antes de ler a tabela efetivamente, deu uma diferença gritante na performance, o que vcs acha sobre isso ?
    reissobr e rhemati curtiram isso.
  2. rafael.andrade

    rafael.andrade Membro Master Moderador Equipe de Suporte

    Achei últil e mantem a integridade, ou seja, os registros trazidos serão os mesmos.

    A pergunta que não quer calar é, se o índice está correto, porque demora para processar se não tem registro??

    Talvez fazer o rebuild dos índices para reorganizar os dados seja necessário, não sei dizer com certeza.
    rhemati curtiu isso.
  3. bootstrapmaster

    bootstrapmaster Moderator Moderador Equipe de Suporte

    Entendo o que vc quer dizer, mas sempre foi assim nesses casos, faz uma experiencia, faz um for each na tabela nota fiscal para um cod-emitente que existe, vai rapidão, faz pra um codigo que não existe, ele demora pra caramba.
  4. rafael.andrade

    rafael.andrade Membro Master Moderador Equipe de Suporte

    Vou fazer o teste e depois posto aqui
  5. rhemati

    rhemati Membro Participativo

    Bom dia. Muito Bom. Parabéns pelo código.

    Eu também já tinha percebido que quando colocamos can-find fica mais rápido, e colocar também a cláusula fields no for each e especificar os campos dar certo também no tunning.

    Abs.
  6. rhemati

    rhemati Membro Participativo

    Testei aqui. Muito rápido mesmo.
Status do Tópico:
Não esta aberto para novas mensagens.

Compartilhe esta Página