Child pages
  • Métodos de reutilização de interface (View) - MVC.

Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Conceito

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

Existem três 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.


Info
titleIMPORTANTE

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.

Code Block
languagecpp
themeEclipse
firstline1
titleExemplo de herança de interface (formulário continuo)
linenumberstrue
//-------------------------------------------------------------------
/*/{Protheus.doc} ViewDef
Definição do interface
@author alvaro.camillo
@since 05/09/2016
@version 1.0
/*/
//-------------------------------------------------------------------
Static Function ViewDef()
Local oView
Local oModel
	:= 
FWLoadModel('MLOC003Old'
FWLoadView("MLOC001")
Local 
oStr1
oStr2	:= FWFormStruct(2, '
ZC3
ZL0')
Local oStr2:= FWFormStruct(2, 'ZC4') Local oStr3:= FWCalcStruct( oModel:GetModel('Totalizador') ) Return
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.


Code Block
languagecpp
themeEclipse
firstline1
titleExemplo de herança de interface (criando um novo box)
linenumberstrue
//-------------------------------------------------------------------
/*/{Protheus.doc} ViewDef
Definição do interface
@author alvaro.camillo
@since 05/09/2016
@version 1.0
/*/
//-------------------------------------------------------------------
Code Block
languagejs
titleTEste
Static Function ViewDef()
Local oView// Cria um objeto de Modelo de Dados baseado no ModelDef do fonte informado
Local oModel := FWLoadModel( 'MLOC003OldMLOC001View' )
// Cria a estrutura a ser acrescentada na View
Local oStr1oStr2	:= FWFormStruct(2, 'ZC3ZL0')
// Inicia a View com uma View ja existente
Local oStr2oView	:= FWFormStruct(2, 'ZC4')
Local oStr3:= FWCalcStruct( oModel:GetModel('Totalizador') )

 

Static Function ViewDef()
Local oView
Local oModel := FWLoadModel('MLOC003Old')
Local oStr1:= FWFormStruct(2, 'ZC3')
Local oStr2:= FWFormStruct(2, 'ZC4')
Local oStr3:= FWCalcStruct( oModel:GetModel('Totalizador') )

 

Definição de idioma pelo cadastro de usuário

Para realizar essa definição acesse o módulo Configurador (SIGACFG) e no menu acesse Usuário/Senhas/Usuários(CFGA510)

Na tela de cadastro de usuário altere o idioma no campo Idioma do Sistema no grupo Parâmetros:

Image Removed
Figura 1 - Cadastro de UsuárioImage Removed

Figura 2 - Consulta de idiomas

Definição de idioma pelo cadastro de grupo de usuário

Para realizar essa definição acesse o módulo Configurador (SIGACFG) e no menu acesse Usuário/Senhas/Grupos(CFGA520)

Na tela de cadastro de grupo altere o idioma no campo Idioma do Sistema no grupo Parâmetros:

Image Removed
 

Figura 3 - Cadastro de Grupo

Caso o usuário esteja relacionado com mais de um grupo, o idioma será definido pelo grupo que está  com o campo "Prioriza" como "Sim"

Image Removed
Figura  4 - Cadastro de Usuários

É possível aqui verificar se o Agent está em execução ou não e em caso de execução, qual a rotina que está sendo executada no momento e a sua última data de utilização. Isto ajuda a medir sua utilização, sendo possível diminuir o número de threads ou aumentaer de acordo com o uso deste Agent.

Definição de idioma pelo cadastro Política

Para realizar essa definição acesse o módulo Configurador (SIGACFG) e no menu acesse Usuário/Senhas/Política (CFGA500)

Na tela de política na aba Outros altere o idioma no campo Idioma do Sistema no grupo Genérico:

Image Removed
Figura 4 - Cadastro de Política

 

Definição de idioma pelo país do sistema

 

Se o idioma não for configurado por nenhum dos métodos anteriores, o sistema irá respeitar o idioma do país do ambiente conforme a seguinte tabela:

PaísIdiomaAngola   Espanhol                                          ArgentinaEspanhol                                          AustráliaInglês                                               BolíviaEspanhol                                          BrasilPortuguês                                    ChileEspanhol                                          ColombiaEspanhol                                          Costa RicaEspanhol                                          República DominicanaEspanhol                                          EquadorEspanhol                                          Estados UnidosInglês                                               HaitiInglês                                               MéxicoEspanhol                                          Panamá   Espanhol                                          ParaguaiEspanhol                                          PeruEspanhol                                          PortugalPortuguês                                    RússiaRussoUruguaiEspanhol                                          VenezuelaEspanhol                                          

 

Definições técnicas:

Campos passíveis de idioma alternativo, por entidades

 

  • Dicionário de perguntas – SX1
    • Pergunta, definição 1, definição 2, definição 3, definição 4, definição 5
  • Dicionário de tabelas  – SX2
    • Nome da tabela
  • Dicionário de campos  – SX3
    • título, descrição e combobox (lista de opções)
  • Cadastro de tabelas genéricas – SX5  
    • Descrição do item
  • Dicionário de Parâmetros – SX6
    • Descrição 1, 2 e 3 do parâmetro.
  • Dicionário de Pastas e agrupamentos – SXA
    • nome da pasta e do agrupamento
  • Dicionário de consultas padrões – SXB
    • Descrição da consulta, descrição das ordens, título dos campos da ordem
  • Dicionário de regras de dependência – XXA
    • Descrição da regra
  • Dicionário de grupo de campos – SXG
    • Descrição do grupo de campos
  • Help e help de campos  
    • Texto do help e da solução
  • Tabela de strings de tradução de programas – arquivos .CH
    • Texto da string
  • Menus do sistema
    • Texto do item de menu

 

Dicionários de dados - metadado

 

Abaixo estão as tabelas onde os termos no idioma alternativo são gravados.

Para o idioma alternativo é utilizada a infraestrutura do flavour, porém os seguinte campos são preenchidos da seguinte maneira:

 

CampoConteúdo
_CODFLATRANSL
_IDIOMcódigo do idioma ISO ( Exemplo pt-br, ru)

Tabela:

XXG

Descrição

Dicionário - Flavour das perguntas

 

Campo

Tipo

Tamanho

Descrição

Int.

Dec.

Resumida

Completa

XXG_CODFLA

C

6

0

Cód Flavour

Código do Flavour

XXG_GRUPO

C

10

0

Grupo

Grupo da pergunta

XXG_IDFIL

C

6

 

Id. Filtro

Id. Do Filtro genérico

XXG_ORDEM

C

2

0

Ordem

Ordem da Pergunta

XXG_ATTRIB

C

10

0

Atributo

Campo atributo

XXG_IDIOM

C

5

0

idioma

Idioma

XXG_TEXT

C

60

0

Texto

Texto

 

Tabela:

XXI

Descrição

 Dicionário - Flavour das tabelas

Campo

Tipo

Tamanho

Descrição

Int.

Dec.

Resumida

Completa

XXI_CODFLA

C

6

0

Cód Flavour

Código do Flavour

XXI_ALIAS

C

3

0

Alias

Alias da tabela 

XXI_ATTRIB

C

10

0

Atributo

Campo atributo

XXI_IDIOM

C

5

0

idioma

Idioma

XXI_TEXT

C

30

0

Texto

Texto

Tabela:

XXK

Descrição

 Dicionário - Flavour dos campos

 

Campo

Tipo

Tamanho

Descrição

Int.

Dec.

Resumida

Completa

XXK_CODFLA

C

6

0

Cód Flavour

Código do Flavour

XXK_CAMPO

C

10

0

Campo

Campo

XXK_ATTRIB

C

10

0

Atributo

Campo atributo

XXK_IDIOM

C

5

0

idioma

Idioma

XXK_TEXT

C

128

0

Texto

Texto

Tabela:

XXL

Descrição

 Dicionário - Flavour das tabelas genéricas

Campo

Tipo

Tamanho

Descrição

Int.

Dec.

Resumida

Completa

XXL_CODFLA

C

6

0

Cód Flavour

Código do Flavour

XXL_TABELA

C

2

0

Tabela

Tabela

XXL_CHAVE

C

6

0

Chave

Chave

XXL_ATTRIB

C

10

0

Atributo

Campo atributo

XXK_IDIOM

C

5

0

idioma

Idioma

XXK_TEXT

C

55

0

Texto

Texto

Tabela:

XXM

Descrição

 Dicionário - Flavour dos parâmetros

Campo

Tipo

Tamanho

Descrição

Int.

Dec.

Resumida

Completa

XXM_VAR

C

10

0

Parâmetro

Parâmetro

XXM_CODFLA

C

6

0

Cód Flavour

Código do Flavour

XXM_ATTRIB

C

10

0

Atributo

Campo atributo

XXM_IDIOM

C

5

0

idioma

Idioma

XXM_TEXT

C

55

0

Texto

Texto

Tabela:

XXN

Descrição

Dicionário -  Flavour das pastas e agrupamentos 

Campo

Tipo

Tamanho

Descrição

Int.

Dec.

Resumida

Completa

XXN_CODFLA

C

6

0

Cód Flavour

Código do Flavour

XXN_ALIAS

C

3

0

Alias

Alias

XXN_ATTRIB

C

10

0

Atributo

Campo atributo

XXN_AGRUP

C

3

0

Agrupamento

Agrupamento

XXN_ORDEM

C

1

0

Ordem

Ordem

XXN_IDIOM

C

5

0

idioma

Idioma

XXN_TEXT

C

30

0

Texto

Texto

Tabela:

XXO

Descrição

 Dicionário - Flavour das consultas padrões

 

Campo

Tipo

Tamanho

Descrição

Int.

Dec.

Resumida

Completa

XXO_CODFLA

C

6

0

Cód Flavour

Código do Flavour

XXO_CODSXB

C

6

0

Alias

Alias

XXO_TIPO

C

1

0

Tipo

Tipo

XXO_SEQ

C

2

0

Sequência

Sequência

XXO_COLUNA

C

2

0

Coluna

Coluna

XXO_ATTRIB

C

10

0

Atributo

Campo atributo

XXO_IDIOM

C

5

0

idioma

Idioma

XXO_TEXT

C

20

0

Texto

Texto

Tabela:

XXQ

Descrição

Dicionário -  Flavour dos grupos de campos

Campo

Tipo

Tamanho

Descrição

Int.

Dec.

Resumida

Completa

XXQ_CODFLA

C

6

0

Cód Flavour

Código do Flavour

XXQ_GRUPO

C

3

0

Grupo

Grupo

XXQ_ATTRIB

C

10

0

Atributo

Campo atributo

XXQ_IDIOM

C

5

0

idioma

Idioma

XXQ_TEXT

C

30

0

Texto

Texto

Tabela:

XXR

Descrição

Dicionário -  Flavour das strings de programas

Campo

Tipo

Tamanho

Descrição

Int.

Dec.

Resumida

Completa

XXR_CODFLA

C

6

0

Cód Flavour

Código do Flavour

XXR_PROGRA

C

255

0

Programa

Programa

XXR_ATTRIB

C

10

0

Atributo

Campo atributo

XXR_IDIOM

C

5

0

idioma

Idioma

XXR_TEXT

C

500

0

Texto

Texto

Tabela:

XXS

Descrição

 Dicionário - Flavour dos itens de Menu

 

Campo

Tipo

Tamanho

Descrição

Int.

Dec.

Resumida

Completa

XXS_CODFLA

C

6

0

Cód Flavour

Código do Flavour

XXS_CODIGO

C

10

0

Código

Código do item

XXS_ATTRIB

C

10

0

Atributo

Campo atributo

XXS_IDIOM

C

5

0

idioma

Idioma

XXS_TEXT

C

380

0

Texto

Texto

Tabela:

XAB

Descrição

 Dicionário - Flavour do help de campo e validação

  

Campo

Tipo

Tamanho

Descrição

Int.

Dec.

Resumida

Completa

XAB_CODFLA

C

6

0

Cód Flavour

Código do Flavour

XAB_CODHLS

C

30

0

Código

Código do help

XAB_ATTRIB

C

10

0

Atributo

Campo atributo

XAB_IDIOM

C

5

0

idioma

Idioma

XAB_TEXT

M

10

0

Texto

Texto(Campo Memo)

Tabela:

XXW

Descrição

 Dicionário - Flavour de Índice

Campo

Tipo

Tamanho

Descrição

Int.

Dec.

Resumida

Completa

XXW_CODFLA

C

6

0

Cód Flavour

Código do Flavour

XXW_TABLE

C

30

0

Tabela

Tabela do Indice

XXW_ORDERC10OrdemOrdem do ìndice

XXW_ATTRIB

C

10

0

Atributo

Campo atributo

XXW_IDIOM

C

5

0

idioma

Idioma

XXW_TEXT

C

160

0

Texto

Texto

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.



Code Block
languagecpp
themeEclipse
firstline1
titleExemplo de montagem de uma nova View
linenumberstrue
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
Status do documentoDesenvolvimentoData06 Oct
 
Versão1.0
Autores

Alvaro Camillo Neto

Índice
Table of Contents
outlinetrue
indent10px