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 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.

Dan (Daniel Atilio)
Cristão de ramificação protestante. Especialista em Engenharia de Software pela FIB, graduado em Banco de Dados pela FATEC Bauru e técnico em informática pelo CTI da Unesp. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor e mantenedor do portal Terminal de Informação.

Deixe uma resposta

Terminal de Informação