Controle de Alteração de Dados via MVC

Boa noite!

Estou começando a usar o MVC no Protheus atualmente e estou com algumas dúvidas de como posso realizar algumas validações. Por exemplo:


Static Function ModelDef
Local oModel     := Nil
Local oStruHead    := FwFormStruct(1,'ZF1')
Local oStruGrid := FwFormStruct(1,'ZD1')

    //Monta o modelo principal
    oModel    := MpFormModel():New('TRCMVC',/*PreValidacao*/,/*Validação*/,{|oModel| fCommit(oModel)})
    oModel:SetDescription(cCadastro)    

    //Monta os dados do cabeçalho
    oModel:AddFields('ModelHead',,oStruHead)
    oModel:SetPrimaryKey({'ZF1_FILIAL','ZF1_ID'})

    oModel:GetModel('ModelHead'):SetDescription('Cabecalho')

    //Monta os dados dos itens
    oModel:AddGrid('ModelGrid','ModelHead',oStruGrid,,{|oGrid| fLinOK(oGrid)},/*bPreGrid*/,/*bProsGrid*/)
    oModel:SetRelation('ModelGrid',{ {'ZD1_FILIAL','ZF1_FILIAL'},{'ZD1_FK','ZF1_ID'} }, ZD1->(IndexKey(1)) )

    oModel:GetModel('ModelGrid'):SetDescription('Itens')        
    oModel:GetModel('ModelGrid'):SetDelAllLine(.T.)
    oModel:GetModel('ModelGrid'):SetOptional(.F.)    

Return(oModel)

Static Function ViewDef
Local oView        := Nil
Local oModel    := FwLoadModel('ELFATA20') 
Local oStruHead    := FwFormStruct(2,'ZF1')
Local oStruGrid := FwFormStruct(2,'ZD1')

    //Não exibe o folder visual caso algum campo esteja inserido em um
    oStruHead:SetNoFolder()

    oView:= FwFormView():New() 
    oView:SetModel(oModel)              

    //Crio o cabeçalho e os grids de acordo com o modelo
    oView:AddField('ViewHead', oStruHead, 'ModelHead')
    oView:AddGrid ('ViewGrid', oStruGrid, 'ModelGrid')

    //Crio uma layer com 30% da tela e outra com 70% da tela, similar a FwLayer
    oView:CreateHorizontalBox('MAIN',30)
    oView:CreateHorizontalBox('GRID',70)

    //Informo os devidos títulos das telas
    oView:EnableTitleView('ViewHead','Informações do Pedido de Troca')
    oView:EnableTitleView('ViewGrid','Produtos do Pedido de Troca')

    //Informo a porcentagem da tela que cada view deve ocupar
    oView:SetOwnerView('ViewHead','MAIN')
    oView:SetOwnerView('ViewGrid','GRID')

Return(oView)

Na Tabela ZF1, possuo um campo chamado ZF1_STATUS que diz qual é o status do pedido de troca. Caso este campo estiver com o conteúdo maior ou igual a 2, eu não posso permitir a edição nem das informações do cabeçalho e nem das informações do grid. Ou o cadastro deveria abrir como apenas visualização, ou emitir um Help informando que não pode ser alterado. Como posso estar criando esta validação?

Além disso, suponhamos que eu tenha os campos ZF1_CODCLI e ZF1_LOJCLI. Eles devem ser habilitados para uma inclusão, mas não para uma alteração. Como posso realizar esse ajuste?

Perdão se for uma dúvida meio boba, mas é que encontrei poucos conteúdos claros na internet.

Agradeço desde já pela atenção.

Já que os valores que você deseja validar estão na grid e você quer permitir ou negar a edição de outros campos à partir do conteúdo digitado pelo usuário, você pode usar a validação específica da grid.

Vejo que você já está usando uma função de validação a qual você pode inserir esse comportamento: {|oGrid| fLinOK(oGrid)}

Um bom cenário para esta validação pode ser a seguinte:


Static Function FLinOk(oGrid)
    Local lValid := .T.

    If (oGrid:GetValue("ZF1_STATUS") >= 2)
        Help(NIL, NIL, "ZF1_LINEPOS", NIL, "Status maior que 2", 1, 0, NIL, NIL, NIL, NIL, NIL, {"Altere o status para menor que 2"})
        lValid := .F.
    EndIf
Return (lValid)

Quanto para bloquear apenas na alteração, você pode fazer a seguinte validação:


Static Function LockUnlock(oModel, oStruHead)
    If (oModel:GetOperation() == MODEL_OPERATION_UPDATE)
        oStruHead:SetProperty("ZF1_CODCLI", "MODEL_FIELD_WHEN", {|| .F.})
        oStruHead:SetProperty("ZF1_LOJCLI", "MODEL_FIELD_WHEN", {|| .F.})
    EndIf
Return (oStruHead)

Boa tarde, Guilherme! Obrigado pela resposta! Em qual momento eu chamaria a função LockUnlock?