Páginas filhas
  • Métodos de reutilização de interface (View) - MVC.

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).
  • Criando uma nova view.


IMPORTANTE

Para o filtro de campos funcionar corretamente, na definição da view deve ser utilizada a função FwLoadModel para carregar o modelo. Não utilize ModelDef()


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.

Exemplo de herança de interface (formulário continuo)
//-------------------------------------------------------------------
/*/{Protheus.doc} ViewDef
Definição do interface
@author alvaro.camillo
@since 05/09/2016
@version 1.0
/*/
//-------------------------------------------------------------------
Static Function ViewDef()
Local oView	:= FWLoadView("MLOC001")
Local oStr2	:= FWFormStruct(2, 'ZL0')
oStr2: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.
  • 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.


Exemplo de herança de interface (criando um novo box)
//-------------------------------------------------------------------
/*/{Protheus.doc} ViewDef
Definição do interface
@author alvaro.camillo
@since 05/09/2016
@version 1.0
/*/
//-------------------------------------------------------------------
Static Function ViewDef()
// 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	:= FWFormStruct(2, 'ZL0')
// Inicia a View com uma View ja existente
Local oView	:= FWLoadView("MLOC001")
oStr2:RemoveField( 'ZL0_LOJA' )
oStr2:RemoveField( 'ZL0_COD' )
// Altera o Modelo de dados quer será utilizado
oView:SetModel( oModel )
// Adiciona no nosso View um controle do tipo grid
oView:AddGrid('VIEW_ZL0' , oStr2,'ZL0DETAIL')
// É 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 oView



Criando uma nova View


Esse método pode ser utilizado quando existe a necessidade de reposicionamento dos elementos do fonte padrão, nele você irá montar uma nova view com o modelo. 

Para melhorar o reaproveitamento, você pode utilizar o método GetViewStruct para utilizar a estrutura de campos da view do fonte padrão.



Exemplo de montagem de uma nova View
Static Function ViewDef()
  Local oModel      := FWLoadModel( 'POC001' )
  Local oViewPad    := FWLoadView(  'POC001' )
  Local oStruLoc    := FWFormStruct(2, 'XXX',{|cCampo| ALLTRIM(cCampo) $ "XX_FILIAL|XX_NUM|XX_PRODUTO" })
  Local oStruCab    := oViewPad:GetViewStruct('VIEW_CAB') // Busca Estrutura do padrão
  Local oStruItem   := oViewPad:GetViewStruct('VIEW_DETAIL')// Busca Estrutura do padrão
  Local oView       := Nil

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

  oView:AddField('VIEW_CAB'    ,  oStruCab , 'XXMASTER' )
  oView:AddField('VIEW_LOC'  ,  oStruLoc , 'XXLOC' )
  oView:AddGrid( 'VIEW_DETAIL'   ,  oStruItem, 'XXDETAIL' )

  oView:CreateHorizontalBox( 'SUPERIOR', 20 )
  oView:CreateHorizontalBox( 'MEIO'    , 10 )
  oView:CreateHorizontalBox( 'INFERIOR', 70 )
  
  oView:SetOwnerView( 'VIEW_CAB'    , 'SUPERIOR' )
  oView:SetOwnerView( 'VIEW_LOC' , 'MEIO' )
  oView:SetOwnerView( 'VIEW_DETAIL'   , 'INFERIOR' )
  
Return oView


Status do documentoDesenvolvimento
Data
 
Versão1.0
Autores

Alvaro Camillo Neto

Índice