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.
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.
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.