Boa tarde, Gilberto!
Segue exemplos que eu conheço.
Não abrir a tela - Usando MpFormModel
Usando o método SetVldActivate da classe MpFormModel, defina um bloco de código que irá validar se o modelo deve ou não ser ativado. Caso retornar falso, a tela não será aberta. Exemplo:
oModel := MpFormModel():New('FATA20MVC',/*PreVld*/,/*ValidSave*/,/*Save*/)
oModel:AddFields('ModelHead',,oStruHead)
oModel:SetPrimaryKey({'ZF1_FILIAL','ZF1_NUM','ZF1_VEND','ZF1_CODCLI','ZF1_LOJA'})
oModel:SetVldActivate({ |oModel| fPreVld(oModel) })
Static Function fPreVld(oModel)
Local lRet := .T.
Local nOpc := oModel:GetOperation()
If(nOpc == MODEL_OPERATION_UPDATE .and. ZF1->ZF1_STATUS >= 3)
lRet := .F.
Help(,,'Não é permitida a alteração',,,1,0,,,,,,{})
Endif
Return(lRet)
Não abrir a tela - Usando FwExecView
Crie uma User Function no MenuDef de sua rotina, substituindo o VIEWDEF.TESTEXX. nessa User Function, faça as validações necessárias e caso desejar abrir a tela, chame a função FwExecView informando o fonte no qual está a sua ViewDef, no caso do exemplo, TESTEXX.
Static Function MenuDef
Local aRotina := {}
Add Option aRotina Title 'Alterar' Action 'U_TELAMVC' Operation 4 Access 0
Return(aRotina)
User Function TELAMVC
Local aButtons := {{ .F. ,Nil},{ .F. ,Nil},{ .F. ,Nil},{ .F. ,Nil},{ .F. ,Nil},{ .F. ,Nil},{ .T. ,'Confirmar'},{ .T. ,'Cancelar'},{ .F. ,Nil},{ .F. ,Nil},{ .F. ,Nil},{ .F. ,Nil},{ .F. ,Nil},{ .F. ,Nil}}
If(nOpc == MODEL_OPERATION_UPDATE .and. FwFldGet('ZF1_STATUS') >= 3)
MsgAlert('Não é permitida a alteração')
Else
FwExecView('ALTERAR', 'TESTEXX', MODEL_OPERATION_UPDATE, /*oDlg*/, { || .T. } , , , aButtons)
Endif
RestArea(_aArea)
Return
Abrir a tela, mas não permitir a edição
Altere a validação bPre do MpFormModel criando a validação necessária, e caso o retorno seja negativo, não permite a edição.
oModel := MpFormModel():New('FATA20MVC',{ |oModel| fPreVld(oModel) },/*ValidSave*/,/*Save*/)
oModel:AddFields('ModelHead',,oStruHead)
oModel:SetPrimaryKey({'ZF1_FILIAL','ZF1_NUM','ZF1_VEND','ZF1_CODCLI','ZF1_LOJA'})
Static Function fPreVld(oModel)
Local lRet := .T.
Local nOpc := oModel:GetOperation()
If(nOpc == MODEL_OPERATION_UPDATE .and. FwFldGet('ZF1_STATUS') >= 3)
lRet := .F.
Help(,,'Não é permitida a alteração',,,1,0,,,,,,{})
EndIf
Return(lRet)
Boa tarde, já tentou utilizar as validações 'PRE' no ponto de entrada do MVC?
— Daniel Mendes 29 de Aug de 2019