Como deixar apenas uma linha por pedido no browse do Pedido de Compras

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.

2  Pedidos com 4 Itens, 4 linhas no browse

2 Pedidos com 4 Itens, 4 linhas no browse

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.

2 pedidos, apenas 2 linhas no browse

2 pedidos, apenas 2 linhas no browse

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.

Dan Atilio (Daniel Atilio)
Especialista em Engenharia de Software pela FIB. Entusiasta de soluções Open Source. E blogueiro nas horas vagas.

4 Responses

  1. Jose Aguiar disse:

    Legal gostei muito será que não vai ficar lento não?

    • Dan_Atilio disse:

      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.

  2. ciro bizelli disse:

    Como que faço isso em um FWMBrowse que posterior utiliza MVC com relacionamento de Pai-Filho de uma mesma tabela.

    • Dan_Atilio disse:

      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.

Deixe uma resposta