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 |
---|
|
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() |
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 |
---|
language | cpp |
---|
theme | Eclipse |
---|
firstline | 1 |
---|
title | Exemplo de herança de interface (formulário continuo) |
---|
linenumbers | true |
---|
|
//-------------------------------------------------------------------
/*/{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 |
oStr1oStr2 := FWFormStruct(2, ' |
ZC3Local 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 |
---|
language | cpp |
---|
theme | Eclipse |
---|
firstline | 1 |
---|
title | Exemplo de herança de interface (criando um novo box) |
---|
linenumbers | true |
---|
|
//-------------------------------------------------------------------
/*/{Protheus.doc} ViewDef
Definição do interface
@author alvaro.camillo
@since 05/09/2016
@version 1.0
/*/
//-------------------------------------------------------------------
|
Code Block |
---|
|
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 RemovedFigura 1 - Cadastro de UsuárioImage RemovedFigura 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 RemovedFigura 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 RemovedFigura 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ís | Idioma |
Angola | Espanhol |
Argentina | Espanhol |
Austrália | Inglês |
Bolívia | Espanhol |
Brasil | Português |
Chile | Espanhol |
Colombia | Espanhol |
Costa Rica | Espanhol |
República Dominicana | Espanhol |
Equador | Espanhol |
Estados Unidos | Inglês |
Haiti | Inglês |
México | Espanhol |
Panamá | Espanhol |
Paraguai | Espanhol |
Peru | Espanhol |
Portugal | Português |
Rússia | Russo |
Uruguai | Espanhol |
Venezuela | Espanhol |
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
- Dicionário de campos – SX3
- título, descrição e combobox (lista de opções)
- Cadastro de tabelas genéricas – SX5
- 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
- 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
- Menus do sistema
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:
Campo | Conteúdo |
---|
_CODFLA | TRANSL |
_IDIOM | có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_ORDER | C | 1 | 0 | Ordem | Ordem 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 |
---|
language | cpp |
---|
theme | Eclipse |
---|
firstline | 1 |
---|
title | Exemplo de montagem de uma nova View |
---|
linenumbers | true |
---|
|
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 |