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

Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.

Conceito

Utilizando a tecnologia MVC para construir o seu formulário é possível reaproveitar a interface em outros contextos como por exemplo em uma localização para outro país.

Existem os métodos para realizar esse reaproveitamento de interface, dependendo da sua necessidade :

  • Utilizando o formulário contínuo.
  • Criando uma nova box ( horizontal ou vertical).

    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

    Utilizando o formulário contínuo

    Com esse método você pode incluir novos componentes (Grids e Fields) incluindo abaixo dos componentes originais num formulário contínuo como uma página web.

    Para isso é preciso configurar o FwFormView com o método SetContinuousForm (FWFormView). 

    Importante salientar que a definição dessa propriedade deve ser feita somente no novo formulário. Não é preciso configurar o formulário contínuo no fonte original.

    Bloco de código
    languagecpp
    themeEclipse
    firstline1
    titleExemplo de herança de interface (formulário continuo)definição de modelo
    linenumberstrue
    //-------------------------------------------------------------------
    /*/{Protheus.doc} ViewDefModelDef
    Definição do interface modelo de Dados
    
    Data Model definition
    
    @author alvaro.camillo
    
    @since 05/09/2016
    @version 1.0
    /*/
    //-------------------------------------------------------------------
    Static Function ViewDefModelDef()
    Local oView	oModel := FWLoadView("MLOC001"FWLoadModel('MLOC003')
    Local oStr2	 := FWFormStruct(21, 'ZL0ZL4')
    oStr2oModel:RemoveField( 'ZL0_LOJA' )
    oStr2:RemoveField( 'ZL0_COD' )
    //Formulário Continuo 
    oView:SetContinuousForm(.T.)
    oView:AddGrid('FORM3' , oStr2,'ZL0DETAIL') 
    //Criação da box com tamanho 00 pois o formulario continuo irá calcular o tamanho da tela. 
    oView:CreateHorizontalBox( 'BOXFORM3', 00)
    oView:SetOwnerView('FORM3','BOXFORM3')
    oView:AddIncrementField('FORM3' , 'ZL0_ITEM' ) 
    oView:EnableTitleView('FORM3' , 'Endereço Russo' ) 
    Return oView

     

    Criando uma nova box (horizontal ou vertical).

    Esse método pode ser utilizado quando existe a necessidade de personalizar ainda mais a tela, podendo alterar inclusive a disposição dos componentes da tela.

    Porém esse método possui as seguintes desvantagens:

  • O analista precisa conhecer os detalhes da implementação do fonte de origem, pois é preciso saber o nome do painel(box) do fonte original.
  • 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)

     

     

    Caso o mantenedor do fonte de origem resolva mudar a disposição ou refatorar os nomes do elementos, o fonte derivado deverá ser alterado para continuar funcionando.

    Para realizar essa operação, é preciso criar um novo box para o novo componente.É preciso criar sempre um box vertical dentro de um horizontal e vice-versa.

    Nesse ponto é preciso verificar no fonte de origem qual é o ID do box e qual é a sua orientação.

    Bloco de código
    languagecpp
    themeEclipse
    firstline1
    titleExemplo de herança de interface (criando um novo boxformulário continuo)
    linenumberstrue
    //-------------------------------------------------------------------
    /*/{Protheus.doc} ViewDef
    Definição do interface
    
    UI definition
    
    @author alvaro.camillo
    
    @since 0506/09/2016
    @version 1.0
    /*/
    //-------------------------------------------------------------------
    
    Static Function ViewDef()
    Local oView := FWLoadView("MLOC003")
    
    //Formulário Cria um objeto de Modelo de Dados baseado no ModelDef do fonte informado
    Local oModel := FWLoadModel( 'MLOC001View' )
    // Cria a estrutura a ser acrescentada na View
    Local oStr2	Continuo 
    oView:SetContinuousForm(.T.)
    oView:AddUserButton("Rateio","FILTRO",{|oModel,oView| ML03Rat(oModel,oView)})//"Condição Filtro"
    
    Return oView
    
    //-------------------------------------------------------------------
    /*/{Protheus.doc} ML03Rat
    Tela modal com os dados do Rateio
    
    @author alvaro.camillo
    
    @since 06/09/2016
    @version 1.0
    /*/
    //-------------------------------------------------------------------
    Static Function ML03Rat(oViewPai)
    Local oStr2 := FWFormStruct(2, 'ZL0ZL4')
    //Local IniciaoView a View com uma View ja existente
    Local oView	:= FWLoadView("MLOC001"):= Nil
    Local oExecView := FWViewExec():New()
    Local oModel:= oViewPai:GetModel()
    Local lRet := .T.
    
    oStr2:RemoveField( 'ZL0ZL4_LOJACOD' )
    oStr2:RemoveField( 'ZL0ZL4_CODITEM' )
    // Altera o Modelo de dados quer será utilizado
    oView := FWFormView():New(oViewPai)
    oView:SetModel( oModel )
    // Adiciona no nosso View um controle do tipo gridoModel)
    oView:SetOperation(oViewPai:GetOperation())
    
    oView:AddGrid('VIEWFORM_ZL0ZL4' , oStr2,'ZL0DETAILZL4DETAIL')
    // É preciso criar sempre um box vertical dentro de um horizontal e vice-versa
    // como na MLOC001 o box é horizontal, cria-se um vertical primeiro
    // Box existente na interface original
    oView:CreateVerticallBox( 'TELANOVA' , 100, 'BOXFORM1' )
    // Novos Boxes
    oView:CreateHorizontalBox( 'SUPERIOR' , 50, 'TELANOVA' )
    oView:CreateHorizontalBox( 'INFERIOR' , 50, 'TELANOVA' )
    // Relaciona o identificador (ID) da View com o "box" para exibicao
    oView:SetOwnerView( 'FORM1', 'SUPERIOR' )
    oView:SetOwnerView( 'VIEW_ZL0', 'INFERIOR' )
     
    Return oViewoView: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

     



    Status do documentoDesenvolvimento
    Data 
    Versão1.0
    Autores

    Alvaro Camillo Neto

    Índice
    Índice
    outlinetrue
    indent10px