Olá, estou começando a desenvolver com o progress, e estou fazendo um programa que pega o preço unitário da ultima nota de entrada que gera duplicata. Como neste caso não consigo utilizar a função FIND LAST, pesquisei um pouco e vi a função FOR LAST. Mas quando utilizo este comando, alguns itens não aparece o ultimo preço. Com isso estudei mais um pouco e vi que dava pra fazer com o comando GET LAST, porem este comando faz com que o relatório fique lento. Fiz conforme exemplo abaixo: DEFINE VARIABLE d-vl-item AS DECIMAL NO-UNDO. FOR EACH item NO-LOCK WHERE item.it-codigo BEGINS "MP" AND item.cod-obsoleto = 1 BREAK BY item.it-codigo: ASSIGN d-vl-item = 0. FOR LAST item-doc-est NO-LOCK WHERE item-doc-est.it-codigo = item.it-codigo AND item-doc-est.quantidade >= 1, EACH docum-est OF item-doc-est, EACH natur-oper OF docum-est WHERE natur-oper.emite-duplic = YES. ASSIGN d-vl-item = item-doc-est.preco-unit[1]. END. DISPLAY item.it-codigo d-vl-item WITH WIDTH 300 COL 1. END. //ULTIMA ENTRADA VIA QUERY DEFINE QUERY qyItemDocEst FOR item-doc-est, docum-est, natur-oper. FOR EACH item NO-LOCK WHERE item.it-codigo BEGINS "MP" AND item.cod-obsoleto = 1 BREAK BY item.it-codigo: ASSIGN d-vl-item = 0. OPEN QUERY qyItemDocEst FOR EACH item-doc-est WHERE item-doc-est.it-cod = item.it-codigo AND item-doc-est.quantidade >= 1, EACH docum-est OF item-doc-est, EACH natur-oper OF docum-est WHERE natur-oper.emite-duplic = YES NO-LOCK. GET LAST qyItemDocEst. IF AVAIL item-doc-est THEN DO: ASSIGN d-vl-item = item-doc-est.preco-unit[1]. END. CLOSE QUERY qyItemDocEst. DISPLAY item.it-codigo d-vl-item WITH WIDTH 300 COL 1. END. Poderia me ajudar a corrigir a performance, por favor.
Tu só conseguiria fazer find last forçando um índice que tem os campos da sua clausula WHERE, se não tem índice, então tudo que você fizer, vai ficar lento, porque 99% da performance vem de índice. Então recomendo fazer uma busca nos índices, ou aceitar a lerdeza