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)
compartilhar
  • 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!

    marcosstartek   21 de Aug de 2020
  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do TOTVS DevForum!

2 respostas

Não é a resposta que estava procurando? Procure outras perguntas com as tags mvc advpl viewdef modeldef ou faça a sua própria pergunta.