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 não estiver no MDI e não for o Configurador, encerra
If ! LjIsMDI() .And. nModulo != 99
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.
bom dia, nesse caso, tem alguma forma de não sumir o “FILTRAR” que fica junta a busca?
Bom dia Heber, tudo joia?
Para esse caso, tanto usando DbSetFilter como Set Filter To, o botão Filtrar dos browses sumirá.
Para que o botão continue exibindo, ai tem que usar outros pontos de entrada, cada um de cada tela para poder aplicar o filtro dos dados.
Tenha uma ótima e abençoada quinta feira.
Um forte abraço.