Estou com uma dúvida que acho ser possível fazer com o MVC. Estou precisando validar quando um campo é alterado no formulário, porém para funcionar corretamente eu preciso saber o valor anterior do campo (antes de ser alterado), seria possível recuperar o valor anterior dentro da função de validação ?
Eu poderia ficar armazenando o valor anterior e verificar, porém isso gera um retrabalho e exige alguns controles a mais.
Também poderia verificar pela tabela salva, mas isso tem a limitação de só funcionar na primeira vez que o valor é alterado, na segunda vez o valor fica defasado.
Acho que é possível recuperar o valor, só não encontrei como fazer. Uma vez que se a validação retornar falso o valor é recuperado para o anterior.
Então como posso dentro da validação saber o valor anterior e atual para validar a alteração ?
Em um gatilho também seria possível ?
1 curtida
Uma opção que precisei usar uma vez foi colocar uma validação no momento do MODELPOS (acredito que funciona também em outros momentos como FORMCOMMITTTSPRE) dentro do PE do MVC.
Eu recupero a informação que está no banco via query (um tcQuery simples) e comparava com o campo por fwFldGet.
Conforme a minha necessidade, eu retornava true/false, fazia validações, etc.
Mas, isso eu fazia para poucos campos, se forem muitos, acredito que não valha a pena. Acho que é válido o teste para a sua necessidade de qualquer forma.
Depois de um tempo encontrei a solução para essa situação, basta usar o bloco de código na pré-validação do componente (seja ele do tipo Field ou Grid) vai funcionar nos dois. No caso do Field o valor anterior não vem, mas é facilmente recuperado usando FWfldGet() ou oMod:GetValue()
Bacana que também vai funcionar com o objeto observador FWModelEvent()
https://tdn.totvs.com/pages/releaseview.action?pageId=269552294
FWModelEvent():GridLinePreVld(oSubModel, cModelID, nLine, cAction, cId, xValue, xCurrentValue) → lOK
FWModelEvent():FieldPreVld(oSubModel, cModelID, cAction, cId, xValue) → lOK
Também funciona no ponto de entrada o mesmo conceito, quando o ParamIXB vem com 6 argumentos, os três últimos são cOper, cIdField, xNewValue
2 curtidas