Páginas filhas
  • Utilização de submodelo em tela separada da View ( Tela Modal )

Conceito

Utilizando a tecnologia MVC para construir o seu formulário é possível separa um submodelo e exibi-lo em uma tela separada (Tela Modal) do formulário.

Exemplo

Em um formulário de pedido de compras localizado, o analista quer implementar uma função de rateio por item do pedido. Esse rateio deve aparecer quando o usuário selecionar a linha e clicar no botão rateio.

O rateio deve ser gravado na base junto com o formulário, ou seja no mesmo commit.

Definição do Modelo

O modelo que irá aparecer na tela separada deve ser submodelo do formulário, para que o commit seja feito corretamente.

Exemplo definição de modelo
//-------------------------------------------------------------------
/*/{Protheus.doc} ModelDef
Definição do modelo de Dados

Data Model definition

@author alvaro.camillo

@since 05/09/2016
@version 1.0
/*/
//-------------------------------------------------------------------
Static Function ModelDef()
Local oModel := FWLoadModel('MLOC003')
Local oStr2 := FWFormStruct(1,'ZL4')oModel:addGrid('ZL4DETAIL','ZC4DETAIL',oStr2)
oModel:SetRelation('ZL4DETAIL', { { 'ZL4_FILIAL', 'xFilial("ZL4")' }, { 'ZL4_COD', 'ZC3_COD' }, { 'ZL4_ITEM', 'ZC4_ITEM' } }, ZL4->(IndexKey(1)) )
oModel:getModel('ZL4DETAIL'):SetDescription('Rateio do Item Russo')
oModel:getModel('ZL4DETAIL'):SetOptional(.T.)

Return oModel

 

Definição da Tela (ViewDef)

Na definição da interface principal, o analista devem criar o botão, passando no bloco de execução a view original.

No exemplo, a função ML03Rat cria a tela modal, instanciando um novo objeto de FwFormView, passando como parâmetro a view original.

Com isso ao clicar no botão "Rateio" 

Ao confirmar o formulário, o sistema irá gravar os itens do pedido e o rateio.

 

Exemplo de herança de interface (formulário continuo)
//-------------------------------------------------------------------
/*/{Protheus.doc} ViewDef
Definição do interface

UI definition

@author alvaro.camillo

@since 06/09/2016
@version 1.0
/*/
//-------------------------------------------------------------------

Static Function ViewDef()
Local oView := FWLoadView("MLOC003")

//Formulário Continuo 
oView:AddUserButton("Rateio","FILTRO",{|oView| ML03Rat(oView)})//"Condição Filtro"

Return oView

//-------------------------------------------------------------------
/*/{Protheus.doc} ML03Rat

@author alvaro.camillo
@since 06/09/2016
@version 1.0
/*/
//-------------------------------------------------------------------
Static Function ML03Rat(oViewPai)
Local oStr2 := FWFormStruct(2,'ZL4')
Local oView := Nil
Local oExecView := FWViewExec():New()
Local oModel:= oViewPai:GetModel()
Local lRet := .T.

oStr2:RemoveField( 'ZL4_COD' )
oStr2:RemoveField( 'ZL4_ITEM' )

oView := FWFormView():New(oViewPai)
oView:SetModel(oModel)
oView:SetOperation(oViewPai:GetOperation())

oView:AddGrid('FORM_ZL4' , oStr2,'ZL4DETAIL')
oView:CreateHorizontalBox( 'BOXFORM_ZL4', 100)
oView:SetOwnerView('FORM_ZL4','BOXFORM_ZL4')

oView:AddIncrementField('FORM_ZL4' , 'ZL4_ITRAT' ) 
oView:EnableTitleView('FORM_ZL4' , 'Rateio do Item Russo' ) 

//Proteção para execução com View ativa.
If oModel != Nil .And. oModel:isActive()
  oExecView:setModel(oModel)
  oExecView:setView(oView)
  oExecView:setTitle('Rateio do Item Russo')
  oExecView:setOperation(oViewPai:GetOperation())
  oExecView:setReduction(50)
  oExecView:SetCloseOnOk({|| .t.})
  oExecView:openView(.F.)
  If oExecView:getButtonPress() == VIEW_BUTTON_OK
    lRet := .T.
  Endif
EndIf


Return lRet

 

Referências

FWViewExec

FWFormView

Interceptação do Commit e Validação MVC - FWModelEvent

 

 

Status do documentoDesenvolvimento
Data 
Versão1.0
Autores

Alvaro Camillo Neto

Índice