Hoje me perguntaram se era possível validar a senha do usuário Protheus dentro de qualquer rotina do sistema, mesmo se o usuário não estivesse logado. Aí perguntei como assim, o que gostaria de criar? A ideia seria, montar uma rotina para autorizar a liberação de desconto dentro da rotina padrão Pedido de Vendas, mas usando o usuário e senha do Protheus. Se usuário e senha OK, desconto liberado! Para fazer isso, podemos utilizar a função PSWName() A função PSWName() verifica se a senha informada passada como parâmetro confere com a senha do último usuário posicionado pela função PswSeek. Para isso, eu deverei saber quais usuários podem dar o desconto, eu criaria uma tabela para armazenar o usuário e o percentual mínimo e máximo permitido. Depois na tabela SC6 - Itens do Pedido de Vendas, eu criaria uma validação que irá retornar falso ou verdadeiro quando eu informa o percentual do desconto (caso esteja trabalhando com percentual). Abriria uma janela para eu informar o usuário e a senha e ao confirmar validar a senha conforme o que está no cadastro de usuários do sistema. Acho que até aqui é simples fazer, então irei direto ao código:
Static Function fAutoriza() Local cCodigo := Space(6) Local cSenha := Space(30) Local lAutoriza := .F. Local nOpca := 0 DEFINE MSDIALOG oDlgSenha TITLE "Autorização" From 001,001 to 125,300 Pixel STYLE DS_MODALFRAME oSaySenha := tSay():New(012,010,{|| "Usuário:" },oDlgSenha,,,,,,.T.,CLR_BLACK,CLR_WHITE,50,9) oGetSenha := tGet():New(010,050,{|u| if(PCount()>0,cCodigo:=u,cCodigo)}, oDlgSenha,080,9,"@A",{ || },,,,,,.T.,,, { || .T. } ,,,,.F.,,,'cCodigo') oSaySenha := tSay():New(022,010,{|| "Digite a senha:" },oDlgSenha,,,,,,.T.,CLR_BLACK,CLR_WHITE,50,9) oGetSenha := tGet():New(020,050,{|u| if(PCount()>0,cSenha:=u,cSenha)}, oDlgSenha,080,9,"@A",{ || },,,,,,.T.,,, { || .T. } ,,,,.F.,.T.,,'cSenha') oBtnOk := tButton():New(040,035,"Ok" , oDlgSenha, {|| nOpca := 1, ::End() },40,12,,,,.T.,,,, { || },,) oBtnNo := tButton():New(040,080,"Cancelar" , oDlgSenha, {|| ::End() },40,12,,,,.T.,,,, { || },,) ACTIVATE MSDIALOG oDlgSenha CENTERED If nOpca == 1 dbSelectArea("Z99") Z99->(dbSetOrder(1)) Z99->(dbGoTop()) If SRA->(dbSeek(xFilial("Z99")+cCodigo)) PswOrder(1) If PswSeek(SRA->RA_ZUSER) lAutoriza := PswName(cSenha) EndIf EndIf Endif If !lAutoriza .And. nOpca == 1 MsgStop("Usuário e/ou senha inválidos!","SEM PERMISSÃO") EndIf Return lAutorizaSe tudo ok, retorno para a validação do campo verdadeiro e com isso permitindo o desconto. Caso contrário alerta que usuário/senha estão inválidos. Espero que tenha sido útil.