Como alterar a validação padrão de uma rotina em MVC

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:

  1. 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
  2. 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.)
  3. Após a criação das variáveis, iremos ver se o modelo está ativo, se estiver, iremos desativar o modelo
  4. 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.

Dan Atilio (Daniel Atilio)
Especialista em Engenharia de Software pela FIB. Entusiasta de soluções Open Source. E blogueiro nas horas vagas.

Deixe uma resposta