[RESOLVIDO] for each na tabela da nota fiscal muito lento

Discussão em 'EMS , HCM e Totvs 11' iniciado por magidigor, Janeiro 28, 2013.

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

    magidigor Membro Participativo

    Bom dia.
    Preciso fazer uma pesquisa para filtra meus faturamentos de seis meses por item , mas o for each esta muito lento.

    Alguém pode me dizer o que existe alguma coisa de errado com o meu select, ou se esse tipo de pequisa é lento mesmo.


    Código:
        FOR each mgmov.it-nota-fisc no-lock
                 where mgmov.it-nota-fisc.it-codigo = p-it-codigo,
            each mgmov.nota-fiscal OF mgmov.it-nota-fisc no-lock
                 where mgmov.nota-fiscal.dt-cancela    = ? and
                       mgmov.nota-fiscal.dt-emis-nota >= (TODAY - 180) AND
                       ((mgmov.nota-fiscal.nat-operacao  >= "510101" AND mgmov.nota-fiscal.nat-operacao  <= "510111") or
                        (mgmov.nota-fiscal.nat-operacao  >= "510201" AND mgmov.nota-fiscal.nat-operacao  <= "510204") or
                        (mgmov.nota-fiscal.nat-operacao  >= "511601" AND mgmov.nota-fiscal.nat-operacao  <= "511602") or
                        (mgmov.nota-fiscal.nat-operacao   = "511801") OR
                        (mgmov.nota-fiscal.nat-operacao  >= "512201" AND mgmov.nota-fiscal.nat-operacao  <= "512202") or
                        (mgmov.nota-fiscal.nat-operacao  >= "512301" AND mgmov.nota-fiscal.nat-operacao  <= "512302") or
                        (mgmov.nota-fiscal.nat-operacao   = "594901") or
                        (mgmov.nota-fiscal.nat-operacao  >= "610101" AND mgmov.nota-fiscal.nat-operacao  <= "610111") or
                        (mgmov.nota-fiscal.nat-operacao  >= "610201" AND mgmov.nota-fiscal.nat-operacao  <= "610204") or
                        (mgmov.nota-fiscal.nat-operacao  >= "611601" AND mgmov.nota-fiscal.nat-operacao  <= "611602") or
                        (mgmov.nota-fiscal.nat-operacao   = "611801") or
                        (mgmov.nota-fiscal.nat-operacao  >= "612201" AND mgmov.nota-fiscal.nat-operacao  <= "612202") or
                        (mgmov.nota-fiscal.nat-operacao  >= "612301" AND mgmov.nota-fiscal.nat-operacao  <= "612302") or
                        (mgmov.nota-fiscal.nat-operacao   = "694901")),
            each mgmov.sit-nf-eletro no-lock
             where mgmov.sit-nf-eletro.cod-nota-fisc        = mgmov.nota-fiscal.nr-nota-fis and
                   mgmov.sit-nf-eletro.cod-estabel          = mgmov.nota-fiscal.cod-estabel and
                   mgmov.sit-nf-eletro.cod-serie            = mgmov.nota-fiscal.serie AND
                   mgmov.sit-nf-eletro.idi-sit-nf-eletro    = 03:
    
            display mgmov.it-nota-fisc.it-codigo mgmov.it-nota-fisc.peso-bruto.
        end.
    
  2. lima

    lima Membro Participativo

    Boa tarde amigo,

    Esse se for each está mto lendo, pois, está muito mau escrito.

    Dicas:
    1 - utilizar indices para busca de informações
    2 - evitar utilizar o operado "OR" na clausula where
    3 - ler as tabelas de menor tamanho primeiro

    Segue abaixo novo código proposta, favor fazer um teste e ver se melhorou a sua performance.

    OBS: Só troque onde está "codigo do item" pelo item que vc precisa.

    Código:
    FOR EACH nota-fiscal
        WHERE nota-fiscal.dt-emis-nota >= (TODAY - 180)
          AND nota-fiscal.dt-cancela    = ? NO-LOCK:
    
        IF NOT ((nota-fiscal.nat-operacao  >= "510101" AND nota-fiscal.nat-operacao  <= "510111") or
        (nota-fiscal.nat-operacao  >= "510201"  AND nota-fiscal.nat-operacao  <= "510204") or
        (nota-fiscal.nat-operacao  >= "511601"  AND nota-fiscal.nat-operacao  <= "511602") or
        (nota-fiscal.nat-operacao   = "511801") OR
        (nota-fiscal.nat-operacao  >= "512201"  AND nota-fiscal.nat-operacao  <= "512202") or
        (nota-fiscal.nat-operacao  >= "512301"  AND nota-fiscal.nat-operacao  <= "512302") or
        (nota-fiscal.nat-operacao   = "594901") or
        (nota-fiscal.nat-operacao  >= "610101"  AND nota-fiscal.nat-operacao  <= "610111") or
        (nota-fiscal.nat-operacao  >= "610201"  AND nota-fiscal.nat-operacao  <= "610204") or
        (nota-fiscal.nat-operacao  >= "611601"  AND nota-fiscal.nat-operacao  <= "611602") or
        (nota-fiscal.nat-operacao   = "611801") or
        (nota-fiscal.nat-operacao  >= "612201"  AND nota-fiscal.nat-operacao  <= "612202") or
        (nota-fiscal.nat-operacao  >= "612301"  AND nota-fiscal.nat-operacao  <= "612302") or
        (nota-fiscal.nat-operacao   = "694901")) THEN 
            NEXT.
    
        FIND FIRST sit-nf-eletro 
             where sit-nf-eletro.idi-sit-nf-eletro    = 03
               AND sit-nf-eletro.dt-emis-nota         = nota-fiscal.dt-emis-nota
               AND sit-nf-eletro.cod-estabel          = nota-fiscal.cod-estabel 
               and sit-nf-eletro.cod-serie            = nota-fiscal.serie
               AND sit-nf-eletro.cod-nota-fisc        = nota-fiscal.nr-nota-fis NO-LOCK NO-ERROR.
        IF AVAIL sit-nf-eletro THEN DO:
            FOR EACH it-nota-fisc OF nota-fiscal NO-LOCK
               WHERE it-nota-fisc.it-codigo = "codigo do item":
                display it-nota-fisc.it-codigo 
                        it-nota-fisc.peso-bruto.
            END.
        END.
    END.
    
    
    Espero ter ajudado.

    Abraços.
  3. magidigor

    magidigor Membro Participativo

    Bom dia
    Lima.

    Ja fiz os teste e realmente melhorou a performance.

    mto obrigado.
Status do Tópico:
Não esta aberto para novas mensagens.

Compartilhe esta Página