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.