Olá pessoal…
Hoje vou mostrar um ponto de entrada para deixar apenas uma linha por pedido de compra no browse de cadastro.
O Pedido de Compras utiliza a tabela SC7, e ela é um cadastro chamado de Modelo 2, quando se tem Pai e Filho (Cabeçalho e Grid) na mesma tabela, diferente da Modelo 3 onde se tem duas tabelas (como a Pedido de Vendas, SC5 e SC6).
Por causa desse motivo, a cada linha incluída na SC7, é uma linha a mais no browse, e com o tempo podem ficar inúmeras linhas visíveis ao usuário.
Foi feito o ponto de entrada MT120QRY, onde é possível fazer uma filtragem do browse, nesse caso o que fiz foi, pegar o último item, e pegar seu recno, assim a lista inteira vai ser filtrada só com os últimos recnos.
Abaixo o código fonte desenvolvido.
#Include "Protheus.ch"
/*--------------------------------------------------------------------------------------------------------------*
| P.E.: MT120QRY |
| Desc: Filtro na tela do pedido de compra (mostrar apenas um item do pedido no mbrowse) |
| Link: http://tdn.totvs.com/pages/releaseview.action?pageId=6787737 |
*--------------------------------------------------------------------------------------------------------------*/
User Function MT120QRY()
Local cRet := ""
Local cQry := ""
//Selecionando os dados
cQry := " SELECT " + CRLF
cQry += " SC7.R_E_C_N_O_ " + CRLF
cQry += " FROM " + CRLF
cQry += " "+RetSQLName('SC7')+" SC7 " + CRLF
cQry += " INNER JOIN ( " + CRLF
cQry += " SELECT DISTINCT " + CRLF
cQry += " SC7_PRIN.C7_NUM AS PEDIDO, " + CRLF
cQry += " ( " + CRLF
cQry += " SELECT TOP 1 " + CRLF
cQry += " SC7_ITE.C7_ITEM " + CRLF
cQry += " FROM " + CRLF
cQry += " "+RetSQLName('SC7')+" SC7_ITE " + CRLF
cQry += " WHERE " + CRLF
cQry += " SC7_ITE.C7_FILIAL = SC7_PRIN.C7_FILIAL " + CRLF
cQry += " AND SC7_ITE.C7_NUM = SC7_PRIN.C7_NUM " + CRLF
cQry += " AND SC7_ITE.D_E_L_E_T_ = ' ' " + CRLF
cQry += " ORDER BY " + CRLF
cQry += " SC7_ITE.C7_ITEM DESC " + CRLF
cQry += " ) AS ULT_ITEM " + CRLF
cQry += " FROM " + CRLF
cQry += " "+RetSQLName('SC7')+" SC7_PRIN " + CRLF
cQry += " WHERE " + CRLF
cQry += " SC7_PRIN.C7_FILIAL = '"+FWxFilial('SC7')+"' " + CRLF
cQry += " AND SC7_PRIN.D_E_L_E_T_ = ' ' " + CRLF
cQry += " ) TAB_AUX ON ( " + CRLF
cQry += " SC7.C7_NUM = TAB_AUX.PEDIDO " + CRLF
cQry += " AND SC7.C7_ITEM = TAB_AUX.ULT_ITEM " + CRLF
cQry += " ) " + CRLF
cQry += " WHERE " + CRLF
cQry += " SC7.C7_FILIAL = '"+FWxFilial('SC7')+"' " + CRLF
cQry += " AND SC7.D_E_L_E_T_ = ' ' " + CRLF
//Montando retorno do ponto de entrada
cRet := " R_E_C_N_O_ IN ("+cQry+") "
Return cRet
Bom pessoal, por hoje é só.
Abraços e até a próxima.


Legal gostei muito será que não vai ficar lento não?
Bom dia José, tudo bem?
Nos testes que realizei não ficou lento, mas faça um teste em uma base de testes com um número elevado de pedidos, e avise se deu certo.
Um grande abraço.
Como que faço isso em um FWMBrowse que posterior utiliza MVC com relacionamento de Pai-Filho de uma mesma tabela.
Se for uma rotina padrão, terá que achar um p.e. igual fizemos com o pedido de compra.
Se for em uma rotina customizada sua, você terá que fazer dentro do método SetFilterDefault.