Como filtrar cadastros antes do usuário abrir a tela

No artigo de hoje, vou mostrar como filtrar registros logo ao realizar login no Protheus.

Imagina o seguinte cenário, na empresa em que você trabalha, existem vários vendedores, mas quando eles realizam o login no sistema, você não quer que eles vejam clientes, vendas, nfs de outros vendedores.

Pensando nisso, montei um exemplo, que ao ser chamado pelo AfterLogin usando SIGAMDI, é realizado esse filtro.

//Bibliotecas
#Include 'TOTVS.ch'

/*/{Protheus.doc} AfterLogin
Ponto de entrada logo ao fazer login no sistema, ou se for SIGAMDI ao abrir uma nova aba
@author Atilio
@since 11/02/2015
@version 1.0
@type function
/*/

User Function AfterLogin()
	Local aArea := GetArea()
	
	fFiltra()
	
	RestArea(aArea)
Return

Static Function fFiltra()
	Local cIdUsr    	:= RetCodUsr()
	Public __cCodVend	:= ""

	//Se tiver a variável pública oApp e não for MDI
	If Type("oApp") == "O" .And. ! oApp:lMDI
		Final("SIGAADV Detectado", "Você se logou ao sistema pelo modo SIGAADV. Por favor, altere para SIGAMDI e entre novamente.")
	EndIf

	//Se conseguir posicionar no vendedor pelo código do usuário
	DbSelectArea("SA3")
	SA3->(DbSetOrder(7)) // A3_FILIAL + A3_CODUSR
	If SA3->(DBSeek(FWxFilial("SA3") + cIdUsr))
		__cCodVend := SA3->A3_COD
		
		//Filtrando a tabela de vendedores, trazendo apenas o vendedor que fez login
		DbSelectArea("SA3")
		SA3->(DbSetFilter({|| A3_COD == __cCodVend }, "A3_COD == '" + __cCodVend + "'"))
		SA3->(DbGoTop())

		//Filtrando a tabela de clientes, trazendo os clientes que são da carteira do vendedor que fez login
		DbSelectArea("SA1")
		SA1->(DbSetFilter({|| A1_VEND == __cCodVend }, "A1_VEND == '" + __cCodVend + "'"))
		SA1->(DbGoTop())
		
		//Filtrando a tabela de pedidos de venda, trazendo somente os pedidos feitos pelo vendedor que fez login
		DbSelectArea("SC5")
		SC5->(DbSetFilter({|| C5_VEND1 == __cCodVend }, "C5_VEND1 == '" + __cCodVend + "'"))
		SC5->(DbGoTop())
		
		//Filtrando a tabela de notas fiscais, trazendo somente as notas que foram emitidas pelo vendedor que fez login
		DbSelectArea("SF2")
		SF2->(DbSetFilter({|| F2_VEND1 == __cCodVend }, "F2_VEND1 == '" + __cCodVend + "'"))
		SF2->(DbGoTop())
		
		/*
			Caso você queira ou esteja mais habituado, ao invés de usar DbSetFilter:
			SF2->(DbSetFilter({|| F2_VEND1 == __cCodVend }, "F2_VEND1 == '" + __cCodVend + "'"))
			
			Você pode usar o Set Filter To:
			SET FILTER TO F2_VEND1 == __cCodVend 
		*/
	
		//Aqui você pode aplicar filtro em outras tabelas também
	EndIf
Return

Obs.: Se eu não me engano, no módulo GPE tem isso de forma nativa, cadastrando os filtros por usuário

Obs. 2: Para relatórios, como geralmente é feito via query SQL, você precisaria alterar o fonte do relatório, congelando ele, tutorial – Como baixar fontes padrão de relatórios e transformá-los em User Function?

Obs. 3: Foi criado a variável como Pública, pois caso você precise usar em algum ponto de entrada ou em outra parte do sistema, basta usar a variável criada no exemplo (lembre-se, evite ao máximo usar variáveis de escopo Public)

Bom pessoal, por hoje é só.

Abraços e até a próxima.

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

Deixe uma resposta