Demora para gerar reltório

Discussão em 'Progress 4GL' iniciado por AndersonApdo, Agosto 9, 2013.

  1. AndersonApdo

    AndersonApdo Membro Participativo

    Boa tarde pessoal, gostaria de pedir uma ajuda pra vocês.
    Estou com um problema sério na geração de um relatório cujo código irei postar abaixo. Ele está demorando mais ou menos 20 minutos para trazer as informações na minha tela.
    Como possuo pouco tempo de experiência com Progress gostaria que vocês me descem algumas dicas do que eu posso estar melhorando.

    Desde já agradeço a atenção de todos vocês,
    forte abraço.

    Código:
    /*
    DEFINE INPUT    PARAMETER   pii_emp_codigo           LIKE sial_estocagem.emp_codigo.
    DEFINE INPUT    PARAMETER   pidt_est_data_inicio     LIKE sial_estocagem.est_data.
    DEFINE INPUT    PARAMETER   pidt_est_data_fim        LIKE sial_estocagem.est_data.
    DEFINE INPUT    PARAMETER   pii_tloc_codigo_inicial  LIKE sial_estocagem_local.tloc_codigo.
    DEFINE INPUT    PARAMETER   pii_tloc_codigo_final    LIKE sial_estocagem_local.tloc_codigo.
    DEFINE INPUT    PARAMETER   pii_loc_codigo_inicial   LIKE sial_estocagem_local.loc_codigo.
    DEFINE INPUT    PARAMETER   pii_loc_codigo_final     LIKE sial_estocagem_local.loc_codigo.
    DEFINE INPUT    PARAMETER   pii_test_codigo          LIKE sial_local.test_codigo.
    */
    
    
    
    DEFINE VAR   pii_emp_codigo          LIKE sial_estocagem.emp_codigo INITIAL 1.
    DEFINE VAR   pidt_est_data_inicio    LIKE sial_estocagem.est_data   INITIAL 08/08/2013 .
    DEFINE VAR   pidt_est_data_fim       LIKE sial_estocagem.est_data   INITIAL 08/08/2013 .
    DEFINE VAR   pii_tloc_codigo         LIKE sial_estocagem_local.tloc_codigo INITIAL 0.
    DEFINE VAR   pii_tloc_codigo_inicial AS INTEGER INITIAL 2.
    DEFINE VAR   pii_tloc_codigo_final   AS INTEGER INITIAL 7.
    DEFINE VAR   pii_loc_codigo_inicial  AS INTEGER INITIAL 1.
    DEFINE VAR   pii_loc_codigo_final    AS INTEGER INITIAL 999.
    DEFINE VAR   pii_test_codigo         AS INTEGER INITIAL 3.
    
    
    
    
    DEFINE VAR poc_erro                AS CHAR FORMAT "X(40)" INITIAL "OK".
    
    
    
    DEFINE TEMP-TABLE tt_estocagem_local
        
        FIELD emp_codigo            LIKE sial_estocagem.emp_codigo
        FIELD est_codigo            LIKE sial_estocagem.est_codigo
        FIELD est_data              LIKE sial_estocagem.est_data
        FIELD est_dataS             as char format "x(20)"    
        FIELD est_hora              as char format "x(20)"
        FIELD est_qtde              LIKE sial_estocagem.est_qtde
        
        FIELD ope_codigo            LIKE sial_estocagem.ope_codigo
        FIELD ope_DESCRICAO         LIKE sial_operacao.ope_descricao
        
        FIELD loc_codigo            LIKE sial_estocagem_local.loc_codigo
        FIELD tloc_codigo           LIKE sial_estocagem_local.tloc_codigo
        FIELD loc_ciclo             LIKE sial_estocagem_local.loc_ciclo
        
        FIELD test_codigo           LIKE sial_estocagem_local.test_codigo
        
        FIELD tpa_codigo            LIKE sial_estocagem_local.tpa_codigo
        FIELD tpa_descricao         LIKE sial_class_visual.tpa_descricao
        
        FIELD tpe_codigo            LIKE sial_local.tpe_codigo
        FIELD tpe_descricao         LIKE sial_tipo_embalagem.tpe_descricao
        FIELD loc_data_inicio_ciclo as char format "x(8)" 
        FIELD prod_descricao        LIKE sial_produto.prod_descricao
        FIELD prod_unidade          LIKE sial_produto.prod_unidade
        
        FIELD EST_SALDO             AS DECIMAL format "->>,>>9.99"
        
        FIELD emb_numero_ems        LIKE SIAL_EMBARQUE.EMB_NUMERO_EMS.  
            
    
    FOR EACH SIAL_ESTOCAGEM
       WHERE SIAL_ESTOCAGEM.EST_DATA > pidt_est_data_inicio - 1
         AND SIAL_ESTOCAGEM.EST_DATA < pidt_est_data_fim    + 1,
        EACH SIAL_ESTOCAGEM_LOCAL    
       WHERE SIAL_ESTOCAGEM_LOCAL.EMP_CODIGO  = SIAL_ESTOCAGEM.EMP_CODIGO
         AND SIAL_ESTOCAGEM_LOCAL.EST_CODIGO  = SIAL_ESTOCAGEM.EST_CODIGO
         AND SIAL_ESTOCAGEM_LOCAL.TLOC_CODIGO > (if pii_tloc_codigo_inicial = 0 then SIAL_ESTOCAGEM_LOCAL.TLOC_CODIGO else pii_tloc_codigo_inicial) - 1
         AND SIAL_ESTOCAGEM_LOCAL.TLOC_CODIGO < (if pii_tloc_codigo_final   = 0 then SIAL_ESTOCAGEM_LOCAL.TLOC_CODIGO else pii_tloc_codigo_final)   + 1
         AND SIAL_ESTOCAGEM_LOCAL.LOC_CODIGO  > (if pii_loc_codigo_inicial  = 0 then SIAL_ESTOCAGEM_LOCAL.LOC_CODIGO else pii_loc_codigo_inicial) - 1
         AND SIAL_ESTOCAGEM_LOCAL.LOC_CODIGO  < (if pii_loc_codigo_final    = 0 then SIAL_ESTOCAGEM_LOCAL.LOC_CODIGO else pii_loc_codigo_final) + 1
         AND SIAL_ESTOCAGEM_LOCAL.EMP_CODIGO  = pii_emp_codigo :
         
            FIND FIRST sial_operacao 
           WHERE sial_operacao.ope_codigo = sial_estocagem.ope_codigo NO-LOCK NO-ERROR.              
            
            FIND FIRST sial_class_visual 
           WHERE sial_class_visual.tpa_codigo = sial_estocagem_local.tpa_codigo NO-LOCK NO-ERROR.
            
            FIND FIRST sial_local WHERE sial_local.loc_codigo  = sial_estocagem_local.loc_codigo
                                    AND sial_local.tloc_codigo = sial_estocagem_local.tloc_codigo
                                    AND sial_local.test_codigo = sial_estocagem_local.test_codigo
                                    AND sial_local.emp_codigo  = sial_estocagem_local.emp_codigo
                                    AND sial_local.loc_ciclo   = sial_estocagem_local.loc_ciclo 
                                    AND sial_local.test_codigo =  pii_test_codigo NO-LOCK NO-ERROR.
    
            FIND FIRST sial_tipo_embalagem 
           WHERE sial_tipo_embalagem.tpe_codigo = (IF AVAIL sial_local THEN sial_local.tpe_codigo ELSE 0) NO-LOCK NO-ERROR.
    
            FIND FIRST sial_produto WHERE sial_produto.prod_codigo = sial_local.prod_codigo NO-LOCK NO-ERROR.     
             
         CREATE tt_estocagem_local.
         ASSIGN
            tt_estocagem_local.emp_codigo            = sial_estocagem.emp_codigo
            tt_estocagem_local.est_codigo            = sial_estocagem.est_codigo
            tt_estocagem_local.est_data              = sial_estocagem.est_data
            tt_estocagem_local.est_dataS             = string(sial_estocagem.est_data)
            tt_estocagem_local.est_hora              = SUBSTR(string(sial_estocagem.est_hora),11,8)        
            tt_estocagem_local.est_qtde              = sial_estocagem.est_qtde
            
            tt_estocagem_local.ope_codigo            = sial_estocagem.ope_codigo
            tt_estocagem_local.ope_descricao         = sial_operacao.ope_descricao
    
            tt_estocagem_local.loc_codigo            = sial_estocagem_local.loc_codigo
            tt_estocagem_local.tloc_codigo           = sial_estocagem_local.tloc_codigo
            tt_estocagem_local.loc_ciclo             = sial_estocagem_local.loc_ciclo
    
            tt_estocagem_local.test_codigo           = sial_estocagem_local.test_codigo
    
            tt_estocagem_local.tpa_codigo            = (if AVAIL sial_class_visual THEN sial_class_visual.tpa_codigo    ELSE 0)
            tt_estocagem_local.tpa_descricao         = (if AVAIL sial_class_visual THEN sial_class_visual.tpa_descricao ELSE "N/D")
        
            tt_estocagem_local.tpe_codigo            = (IF AVAIL sial_tipo_embalagem THEN sial_tipo_embalagem.tpe_codigo    ELSE 0)   
            tt_estocagem_local.tpe_descricao         = (IF AVAIL sial_tipo_embalagem THEN sial_tipo_embalagem.tpe_descricao ELSE "N/D")
            
            tt_estocagem_local.loc_data_inicio_ciclo = (if avail sial_local   then STRING(year(sial_local.loc_data_inicio_ciclo)) else "N/D")
            tt_estocagem_local.prod_unidade          = (if avail sial_produto then sial_produto.prod_unidade else "N/D")
            tt_estocagem_local.prod_descricao        = (if avail sial_produto then sial_produto.prod_descricao else "N/D").
            
            
          FIND FIRST SIAL_EMBARQUE_LOCAL 
          WHERE SIAL_EMBARQUE_LOCAL.emp_codigo  = sial_estocagem_local.emp_codigo
            AND SIAL_EMBARQUE_LOCAL.est_codigo  = sial_estocagem_local.est_codigo
            AND SIAL_EMBARQUE_LOCAL.loc_codigo  = sial_estocagem_local.loc_codigo
            AND SIAL_EMBARQUE_LOCAL.tloc_codigo = sial_estocagem_local.tloc_codigo
            AND SIAL_EMBARQUE_LOCAL.test_codigo = sial_estocagem_local.test_codigo        
            AND SIAL_EMBARQUE_LOCAL.loc_ciclo   = sial_estocagem_local.loc_ciclo NO-LOCK NO-ERROR.
            
         
          IF AVAIL SIAL_EMBARQUE_LOCAL THEN DO:         
          
             FIND FIRST SIAL_EMBARQUE
            WHERE SIAL_EMBARQUE.emp_codigo  = sial_EMBARQUE_local.emp_codigo
              AND SIAL_EMBARQUE.emb_codigo  = sial_EMBARQUE_local.emb_codigo NO-LOCK NO-ERROR.
            
            ASSIGN tt_estocagem_local.emb_numero_ems  = (IF AVAIL SIAL_EMBARQUE THEN SIAL_EMBARQUE.emb_numero_ems ELSE 0).
            
          END.  
            
    
    END.
    
    
    
    FIND FIRST tt_estocagem_local NO-LOCK NO-ERROR.
    
    DEFINE VAR PID_EST_SALDO LIKE sial_estocagem.est_qtde INITIAL 0.
    
    FOR EACH tt_estocagem_local NO-LOCK :
    
        FOR EACH SIAL_ESTOCAGEM_LOCAL
           WHERE SIAL_ESTOCAGEM_LOCAL.EMP_CODIGO  = tt_estocagem_local.emp_codigo 
             AND SIAL_ESTOCAGEM_LOCAL.EST_CODIGO  < (tt_estocagem_local.EST_codigo + 1)       
             AND SIAL_ESTOCAGEM_LOCAL.LOC_CODIGO  = tt_estocagem_local.LOC_codigo 
             AND SIAL_ESTOCAGEM_LOCAL.TLOC_CODIGO = tt_estocagem_local.TLOC_codigo 
             AND SIAL_ESTOCAGEM_LOCAL.LOC_CICLO   < (tt_estocagem_local.LOC_CICLO + 1)
             AND SIAL_ESTOCAGEM_LOCAL.TEST_CODIGO = tt_estocagem_local.TEST_codigo NO-LOCK,
             
            EACH SIAL_ESTOCAGEM  
           WHERE SIAL_ESTOCAGEM_LOCAL.EMP_CODIGO  = SIAL_ESTOCAGEM.EMP_CODIGO
             AND SIAL_ESTOCAGEM_LOCAL.EST_CODIGO  = SIAL_ESTOCAGEM.EST_CODIGO
                     
             AND SIAL_ESTOCAGEM.EST_DATA > 01/01/2000 
             AND SIAL_ESTOCAGEM.EST_DATA < (tt_estocagem_local.est_data + 1) NO-LOCK :   
             
             ASSIGN PID_EST_SALDO = PID_EST_SALDO + SIAL_ESTOCAGEM.EST_QTDE.
             
        END. 
        
       ASSIGN tt_estocagem_local.EST_SALDO = (PID_EST_SALDO). 
       
       ASSIGN PID_EST_SALDO = 0.  
              
       
    END.
  2. Mokwa

    Mokwa Membro Participativo

    Provavelmente seus FOR EACH's não estão encontrando um índice adequado. Tente criar um Índice com os campos que você utiliza nesse relatório e veja se melhora.
  3. LFBuozi

    LFBuozi Membro Participativo

    Alguns pontos que vi:
    Primeiro você fez este for each:
    Código:
    FOR EACH SIAL_ESTOCAGEM
       WHERE ... ,
        EACH SIAL_ESTOCAGEM_LOCAL   
       WHERE ... :
       /* tarefa 1 */
    END.
    
    Depois fez outro invertendo as tabelas:
    Código:
    FOR EACH SIAL_ESTOCAGEM_LOCAL
       WHERE ... ,
        EACH SIAL_ESTOCAGEM 
       WHERE ... :
       /* tarefa 2 */
    END.
    Se colocar a tarefa 1 e tarefa 2 no mesmo for each já é um grande passo.

Compartilhe esta Página