oModel:GetOperation está retornando 1

Boa noite!

Estou realizando umas alterações em um fonte e estou com uma dúvida referente ao uso do oModel:GetOperation.


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

    //Monta o modelo principal
    oModel := MpFormModel():New('FATA20MVC',{ |oModel| fPreVld(oModel) },/*Validação*/,{ |oModel| fCommit(oModel) })

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

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

    If(!lRotAuto)

        If(ALTERA .and. ZF1->ZF1_STATUS >= 2)

            oStruHead:SetProperty('ZF1_VEND'    , MODEL_FIELD_WHEN, {|| .F. })
            oStruHead:SetProperty('ZF1_CODCLI'    , MODEL_FIELD_WHEN, {|| .F. })
            oStruHead:SetProperty('ZF1_LOJA'    , MODEL_FIELD_WHEN, {|| .F. })
            oStruHead:SetProperty('ZF1_LACRE'    , MODEL_FIELD_WHEN, {|| .F. })
            oStruHead:SetProperty('ZF1_DATA'    , MODEL_FIELD_WHEN, {|| .F. })
            oStruHead:SetProperty('ZF1_OBSERV'    , MODEL_FIELD_WHEN, {|| .F. })

        Endif

    Endif

    //Monta os dados dos itens
    oModel:AddGrid('ModelGrid','ModelHead',oStruGrid,,{ |oGrid| fLinOK(oGrid) },/*bPreGrid*/,/*bProsGrid*/)
    oModel:SetRelation('ModelGrid',{{'ZD1_FILIAL','ZF1_FILIAL'},{'ZD1_NUM','ZF1_NUM'},{'ZD1_VEND','ZF1_VEND'},{'ZD1_CODCLI','ZF1_CODCLI'},{'ZD1_LOJA','ZF1_LOJA'}}, ZD1->(IndexKey(2)))

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

    //Seta o nome da rotina na enchoice
    oModel:SetDescription('Pedidos de Troca')

Return(oModel)

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

    If(ZF1->ZF1_STATUS < 5)

        oStruHead:RemoveField('ZF1_MOTCAN')

    Endif

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

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

    oView:AddUserButton('Enviar e-mail','',{|oView| U_ELFATA01() },,,{MODEL_OPERATION_VIEW, MODEL_OPERATION_UPDATE},.F.)            

    //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 40% da tela e outra com 60% da tela, similar a FwLayer
    oView:CreateHorizontalBox('MAIN',40)
    oView:CreateHorizontalBox('GRID',60)

    //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)

Estou pensando em remover a parte do bloco de código onde altero o When do campo do ModelDef e passando o mesmo para a ViewDef.

No ModelDef, utilizei a variável Altera para verificar se o usuário está alterando o formulário. Ela também me serviria para a ViewDef, mas além de gerar warning ao compilar, acho que não seria o ideal para este caso. Estava pensando em utilizar a GetOperation, mas quando utilizo a chamada da função oModel:GetOperation(), sempre é retornado 1, independente da operação realizada (seja inclusão ou alteração).

Além disso, quando realizo a chamada do oModel:GetValue('ZF1_STATUS') ou oModel:GetValue('ModelHead','ZF1_STATUS') dentro da ViewDef, sempre é retornado como nulo.

Como posso realizar essas tratativas? É recomendável fazer diretamente na ViewDef ou devo deixar no ModelDef?

--EDITADO

Segue como está o meu MenuDef:


Static Function MenuDef
Local aRotina := {}

    Add Option aRotina Title 'Pesquisar'                 Action 'AxPesqui'               Operation 1 Access 0
    Add Option aRotina Title 'Visualizar'                 Action 'VIEWDEF.ELFATA20'     Operation 2 Access 0
    Add Option aRotina Title 'Incluir'                     Action 'VIEWDEF.ELFATA20'     Operation 3 Access 0
    Add Option aRotina Title 'Alterar'                     Action 'VIEWDEF.ELFATA20'     Operation 4 Access 0
    Add Option aRotina Title 'Imprimir'                 Action 'VIEWDEF.ELFATA20'    Operation 8 Access 0

    Add Option aRotina Title 'Liberar Recolhimento'     Action 'U_FATA20LB'            Operation 6 Access 0
    Add Option aRotina Title 'Efetuar Recolhimento'     Action 'U_FATA20EF'         Operation 6 Access 0
    Add Option aRotina Title 'Cancelar Recolhimento'     Action 'U_FATA20CR'             Operation 6 Access 0
    Add Option aRotina Title 'Cancelar Pedido'            Action 'U_FATA20CP'         Operation 6 Access 0
    Add Option aRotina Title 'Finalizar Pedido'            Action 'U_FATA20FP'         Operation 6 Access 0
    Add Option aRotina Title 'Gerar Pré-Nota'             Action 'U_ELCOMA05'            Operation 6 Access 0    
    Add Option aRotina Title 'Observações do Pedido'    Action 'U_ELCOMA06'         Operation 6 Access 0

Return(aRotina)

Fala Giordano beleza? Cara se você está chamando em algum lugar o when do campo (por exemplo direto no x3) e dentro da função você está fazendo um omodel := fwloadmodel(‘nome_do_fonte’). Neste momento você estará não estará utilizando a instancia que de fato é a que você gostaria para analisar o Getoperation(). Para resolver isso, ao invés de utilizar o FWLoadModel() utilize o oModel := FWModelActive() e finish.
Abs!

Giordano, bom dia.

Na minha opinião se é uma regra de negócio deve ficar dentro do MODELDEF, visto que é onde todas as regras do negócio devem estar. Outra opção de fazer isso também seria via dicionário de dados.

Att,

No momento da abertura do modelo de dados, os valores ainda não estão configurados no modelo, porém, a linha da tabela no browser está posicionada para você realizar as suas validações.

Quanto a regra de negócios na função ViewDef(): Siga o conselho do Felipe Caiado Almeida, mantenha as regras de negócios dentro da ModelDef().

Sobre o método GetOperation() retornar sempre 1, talvez seja o modo como você criou a função MenuDef(), assim sendo, tente fazer um teste com a função FwMVCMenu() para gerar as operações contidas no vetor aRotina.


Talvez esse exemplo ajude: MP - ADVPL - ESTRUTURA MVC: PAI + FILHO + NETO

Coloquei como está o meu MenuDef na pergunta.

Na verdade dentro da função Viewdef o modelo ainda não foi ativado, Logo , ele está com a operação padrão (1 - MODEL_OPERATION_VIEW). A sua view e modelo não devem ser condicionados a operação do usuário, pois não é garantido que você consiga recuperar a mesma.