Se você já precisou alterar alguma validação padrão de rotina em MVC, irei mostrar como fazer isso no artigo de hoje.
Supondo que em uma rotina padrão MVC, existe uma validação específica, em que a lógica na empresa que você trabalha precisa alterar alguma coisa, seja sobrepondo a validação ou até adicionando outros testes, como podemos fazer isso?
Em MVC, como o conceito de ponto de entrada é único, primeiramente precisamos descobrir o nome do MPFormModel para a criação do nosso ponto de entrada, nesse exemplo aqui vamos chamar de zTST. Então a partir disso, a lógica será a seguir:
- Antes da criação de tudo na tela, iremos interceptar para poder manipular, então iremos usar o ID BUTTONBAR, que é o da criação do Outras Ações dentro da tela de manipulação
- Iremos buscar o modelo ativo com FWModelActive, iremos definir nosso bloco de código (nesse exemplo, irei enviar apenas .T., mas você pode enviar funções como Positivo(), ExistCPO(), u_zSuaFuncao(), etc), e por último iremos definir se esse bloco de código irá acumular junto com as validações padrões (como .T.), ou se irá sobrepor (como .F.)
- Após a criação das variáveis, iremos ver se o modelo está ativo, se estiver, iremos desativar o modelo
- Por último, iremos acionar o método SetPost passando nosso bloco de código, e se irá acumular ou sobrepor e iremos ativar o modelo novamente. Caso seja necessário alterar de alguma grid, ou outro modelo de campos em tela, basta antes do SetPost, ser acionado o GetModel com o nome, conforme linha comentada no exemplo abaixo
//Bibliotecas #Include "TOTVS.ch" /*/{Protheus.doc} User Function zTST P.E. para tentar sobrepor a validação padrão do sistema @type Function @author Atilio @since 03/06/2021 @version version /*/ User Function zTST() Local aParam := PARAMIXB Local xRet := .T. Local cIdPonto := '' Local oModel Local bValid Local lAcumula //Se tiver paramixb If aParam != Nil //Busca o id do ponto de entrada cIdPonto := aParam[2] //Pega o ponto ao montar a tela de edição dos dados, na parte de adicionar outras ações (para não impactar no processo) If cIdPonto $ 'BUTTONBAR' //Busca o modelo ativo na memória e define o bloco de código que irá sobrepor o bPos e se irá acumular com a antiga validação oModel := FWModelActive() bValid := {|| .T.} lAcumula := .F. //Se o modelo estiver ativo, desativa ele, do contrário não é possível editar o oModel If oModel:IsActive() oModel:DeActivate() EndIf //Define para o modelo padrão (caso alguma grid use, você pode usar o GetModel também) e ativa o modelo novamente oModel:SetPost(bValid, lAcumula) //oModel:GetModel("XXXDETAIL"):SetPost(bValid, lAcumula) oModel:Activate() EndIf EndIf Return xRet
Obs.: Pessoal, esse é um exemplo ilustrativo, e o ideal quando forem modificar algo em ponto de entrada MVC, é testar primeiro em uma base de testes, e evitem sobrepor validações padrão, tentem sempre usar por exemplo, o lAcumula como .T.
Bom pessoal, por hoje é só.
Abraços e até a próxima.