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.