Validação do Model ANTES de abrir a tela

Pessoal, boa tarde.

Por favor, alguem poderia me dizer qual a correta validação para uma "pré-validação" do ModelDef, ou seja, antes de abrir a tela. Por exemplo, eu quero verificar se o usuário satisfaz uma condição no momento de alterar o registro, senão satisfazer, nem abre a tela para alterar. Permitiria apenas VISUALIZAR.

Eu consegui fazer a validação posterior, onde a tela abre, e quando clica em confirma verifica se TUDOOK.Mas impedir a abertura da interface eu não consegui....

Alguém pode me mandar um exemplo ?

Abraços,

Gilberto

Boa tarde, já tentou utilizar as validações ‘PRE’ no ponto de entrada do MVC?

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)

Giordano, boa noite. Muito obrigado ! Eu utilizei o primeiro metodo e através do SetVldActivate consegui resolver a questão ! Agradeço demais a ajuda.

Boa Noite Gilberto,

Você também pode utilizar o evento MODELVLDACTIVE para efetuar essa validação, só criar uma user function com o nome que você deu para o modelo na


Static Function ModelDef()
    Local oModel := Nil

    Local oStSZ7 := FWFormStruct(1, "SZ7") // ( 1-Model | 2-View )

    oModel := MPFormModel():New("ZMVC001",Nil, Nil,Nil,Nil) 

    oModel:AddFields("FORMSZ7",/*cOwner*/,oStSZ7)

    oModel:SetPrimaryKey({'Z7_FILIAL','Z7_CODIGO'})

    oModel:SetDescription("Cadastro A")

Return oModel


User Function ZMVC001()
    Local aDescr
    Local aParam    := PARAMIXB
    Local xRet      := .T.
    Local oObj      := ''
    Local cIdPonto  := ''
    Local cIdModel    := ''
    Local cMsg        := "Alteracao nao Permitida"

    If aParam <> NIL
        oObj       := aParam[1]
        cIdPonto   := aParam[2]
        cIdModel   := aParam[3]
        If  cIdPonto == 'MODELVLDACTIVE'
            If (oObj:GetOperation() = 4 .OR. oObj:GetOperation() = 5) .AND. dDataBase < Date()
                aDescr := {"Não é permitido efetuar alterações em datas retroativas"}
                Help(NIL, NIL, "ZMVC01VLD", NIL, cMsg, 1, 0, NIL, NIL, NIL, NIL, .F., aDescr)
                xRet := .F.
            EndIf
        EndIf
    EndIf

Return xRet

Interessante, não sabia que dava pra fazer dessa forma.

Agradeço à todos que generosamente enviaram alguma solução. Principalmente agradeço a paciencia de colaborar comigo, que estou aprendendo muito através desse fórum. Giordano, obrigado, funcionou perfeitamente.