Você está na página 1de 45

TOTVS - Microsiga Protheus MVC (Model View Controller)

03/08/2011
TOTVS - Microsiga Protheus MVC (Model View Controller)

Sumrio

Sumrio ........................................................................................................................................... 2
1 Conceitos Bsicos................................................................................................................... 5
1.1 Objetivos Instrucionais........................................................................................................... 5
1.2 Conceitos ............................................................................................................................... 5
1.3 Componentes ........................................................................................................................ 5
1.4 Model .................................................................................................................................... 6
1.5 View ...................................................................................................................................... 6
1.6 Controller .............................................................................................................................. 6
2 Aplicao ............................................................................................................................... 7
2.1 Principais Funes.................................................................................................................. 7
2.2 Benefcios .............................................................................................................................. 7
2.3 Estrutura ................................................................................................................................ 7
2.4 ModelDef............................................................................................................................... 7
2.5 ViewDef ................................................................................................................................. 8
2.6 MenuDef ............................................................................................................................... 9
2.7 Novo comportamento na interface ........................................................................................ 10
2.8 Aplicaes com Browse.......................................................................................................... 10
2.9 Construo bsica de um browse ........................................................................................... 10
2.10 Legendas de um browse ........................................................................................................ 11
2.11 Filtros de um browse ............................................................................................................. 11
2.12 Desabilitando os detalhes do browse ..................................................................................... 12
2.13 Construindo uma aplicao .................................................................................................... 12
2.14 ModelDef com duas ou mais entidades.................................................................................. 12
2.15 ViewDef com duas ou mais entidades .................................................................................... 13
2.16 Criando campos de total ou contadores ................................................................................. 13
2.17 Executando a View com uma determinada operao ............................................................. 13
2.18 Retornando o Model ativo ..................................................................................................... 14
2.19 Retornando a View ativa ........................................................................................................ 14
3 Configuraes 2 - Cadastro de usurios .................................................................................. 15

2 TOTVS - Microsiga Protheus MVC (Model View Controller)


Verso 1.0
TOTVS - Microsiga Protheus MVC (Model View Controller)

3.1 Objetivos Instrucionais........................................................................................................... 15


3.2 Descrio ............................................................................................................................... 15
3.3 Mensagens exibidas na interface ........................................................................................... 15
3.4 Obtendo um componente do Modelo de Dados..................................................................... 16
3.5 Validaes ............................................................................................................................. 16
3.6 Ps-validao do Modelo ....................................................................................................... 16
3.7 Ps-validao de Linha ........................................................................................................... 16
3.8 Validao de linha duplicada .................................................................................................. 17
3.9 Pr-validao de linha ............................................................................................................ 17
3.10 Validao da ativao do modelo ........................................................................................... 17
3.11 Manipulao da componente de Grid .................................................................................... 18
3.12 Ir para uma linha do componente de Grid .............................................................................. 18
3.13 Permisses para uma Grid ..................................................................................................... 20
3.14 Guardando e restaurando o posicionamento da Grid ............................................................. 20
3.15 Obter e atribuir valores ao Modelo de Dados ......................................................................... 21
3.16 Alterao de dados de um componente no Modelo de Dados ................................................ 22
3.17 No gravar dados de um componente do Modelo de Dados .................................................. 22
3.18 Obter operao que est sendo realizada .............................................................................. 22
3.19 Gravao dos dados manualmente ........................................................................................ 23
3.20 Regra de preenchimento........................................................................................................ 24
4 Tratamentos de Interface....................................................................................................... 25
4.1 Objetivos Instrucionais........................................................................................................... 25
4.2 Descrio ............................................................................................................................... 25
4.3 Campo Incremental ............................................................................................................... 25
4.4 Criar um boto na barra de botes ........................................................................................ 25
4.5 Ttulo do componente............................................................................................................ 25
4.6 Edio dos campos do componente de Grid ........................................................................... 26
4.7 Criao de pastas ................................................................................................................... 26
4.8 Agrupamentos de campos ..................................................................................................... 27
4.9 Ao de interface ................................................................................................................... 27
5 Tratamentos estrutura de dados ............................................................................................ 28
5.1 Objetivos Instrucionais........................................................................................................... 28
5.2 Descrio ............................................................................................................................... 28

TOTVS - Microsiga Protheus MVC (Model View Controller) 3


Verso 1.0
TOTVS - Microsiga Protheus MVC (Model View Controller)

5.3 Selecionar campos para a estrutura ....................................................................................... 28


5.4 Remover um campo da Estrutura ........................................................................................... 28
5.5 Alterar propriedade do campo ............................................................................................... 29
5.6 Criar campos adicionais - Model............................................................................................. 30
5.7 Criar campos adicionais - View ............................................................................................... 31
5.8 Formatar bloco de cdigo para a estrutura ............................................................................ 31
5.9 Campos do tipo MEMO virtuais.............................................................................................. 31
5.10 Criar um gatilho manualmente............................................................................................... 32
6 Rotinas automticas............................................................................................................... 33
6.1 Objetivos Instrucionais........................................................................................................... 33
6.2 Descrio ............................................................................................................................... 33
6.3 Modelos de uso ..................................................................................................................... 33
6.4 FWMVCRotAuto..................................................................................................................... 33
6.5 Novo modelo de atualizao .................................................................................................. 34
6.6 Novo modelo de atualizao .................................................................................................. 35
7 Ponto de entrada ................................................................................................................... 37
7.1 Objetivos Instrucionais........................................................................................................... 37
7.2 Descrio ............................................................................................................................... 37
7.3 Conceito ................................................................................................................................ 37
8 WebService............................................................................................................................ 39
8.1 Objetivos Instrucionais........................................................................................................... 39
8.2 Descrio ............................................................................................................................... 39
8.3 Instanciando o Client do WebService ..................................................................................... 39
8.4 Criando o XML com os dados ................................................................................................. 39
8.5 Validando e salvando as informaes..................................................................................... 40
8.6 Mtodos disponveis .............................................................................................................. 40
9 Reutilizao do Modelo Dados e Interface ............................................................................. 42
9.1 Objetivos Instrucionais........................................................................................................... 42
9.2 Descrio ............................................................................................................................... 42
9.3 Apenas reutilizando os componentes ..................................................................................... 42
9.4 Reutilizando e complementando os componentes ................................................................. 43
10 Concluso .............................................................................................................................. 45

4 TOTVS - Microsiga Protheus MVC (Model View Controller)


Verso 1.0
TOTVS - Microsiga Protheus MVC (Model View Controller)

1 Conceitos Bsicos

Ol!
Seja bem vindo ao treinamento MVC: Conceito.

1.1 Objetivos Instrucionais

Ao trmino deste treinamento voc ter aprendido o conceito e os componentes do MVC (Model-View-Controller).

1.2 Conceitos

A arquitetura MVC (Model-View-Controller) um padro de arquitetura de software que visa separar a lgica de negcio da
apresentao (interface), permitindo assim, que o desenvolvimento, a manuteno e o teste sejam executados isoladamente.

Aqueles que j desenvolveram uma aplicao em AdvPL vo perceber que, justamente a diferena mais importante entre a forma
de construir uma aplicao em MVC e a forma tradicional, a separao da regra de negcio da interface de apresentao.

A separao permite o uso da regra de negcio em aplicaes que tenham ou no interfaces, como WebServices e "rotinas
automticas".

A arquitetura MVC traz agilidade e rapidez no desenvolvimento.

1.3 Componentes

A arquitetura MVC possui trs componentes bsicos:

Model: Modelo de dados, representa as informaes do domnio do aplicativo e fornece funes para operar os dados, isto ,
contm as funcionalidades do aplicativo. Nele, definimos as regras de negcio: tabelas, campos, estruturas, relacionamentos etc.
Tambm responsvel por notificar a interface quando os dados forem alterados.

View: Interface, responsvel por renderizar o modelo de dados e possibilitar a interao do usurio, ou seja, o responsvel por
exibir os dados.

Controller: Responde s aes dos usurios, possibilita mudanas no Modelo de dados e seleciona a Interface correspondente.

TOTVS - Microsiga Protheus MVC (Model View Controller) 5


Verso 1.0
TOTVS - Microsiga Protheus MVC (Model View Controller)

1.4 Model

Caractersticas do Model:

Define as regras de negcio da rotina.


Fornece funes para retorno e definio de valores (campos).
Fornece funes para manuteno das estruturas e relacionamentos da rotina.
Notifica o View no decorrer dos eventos. Por exemplo: a alterao de dados de uma tabela, mantendo o usurio da rotina
atualizado quanto ao estado do registro.

Importante: Como o Model independente, possvel utilizar sua estrutura sem depender de uma aplicao nativa do ByYou
Smart Client, utilizando, por exemplo, sua estrutura a partir de uma aplicao WebService.

1.5 View

Caractersticas do View:

Possibilita ao usurio interagir com o Model (Regras de Negcio).


Exibe informaes ao usurio, a partir dos dados enviados pelo Model.
Notifica eventos ao usurio, como por exemplo, a confirmao de alterao de um registro.

1.6 Controller

Caractersticas do Controller:

Responde s aes dos usurios.


Possibilita mudanas no Model.
Seleciona a View correspondente.

Importante: Para facilitar e agilizar o desenvolvimento no Microsiga Protheus, o desenvolvedor trabalhar apenas com as
definies de Model e View, a parte responsvel pelo Controller j est embutida.

6 TOTVS - Microsiga Protheus MVC (Model View Controller)


Verso 1.0
TOTVS - Microsiga Protheus MVC (Model View Controller)

2 Aplicao

Ol!
Ao trmino deste treinamento voc aprender como utilizar a arquitetura MVC no AdvPL.

2.1 Principais Funes

Principais funes do MVC:

ModelDef: contm as regras de negcio da aplicao, definindo a integridade e as validaes referentes ao preenchimento dos
campos.
ViewDef: contm a interface da aplicao (tela). Esta funo a maneira correta de aplicativos escritos em ADVPL interagirem
com o Model.
MenuDef: contm os operadores disponveis para o Model, definindo as rotinas que sero utilizadas. Por exemplo, no momento
de Visualizao, Alterao etc.

Importante: Cada aplicao (cdigo fonte) s pode conter uma funo correspondente s mencionadas.

2.2 Benefcios

Ao se fazer uma aplicao em ADVPL utilizando-se MVC, ao final, esta aplicao ter, automaticamente:

Pontos de Entradas j disponveis.


Um WebService para sua utilizao.
Importao ou exportao de mensagens XML.
Utilizao similar rotina automtica de aplicaes sem MVC.

2.3 Estrutura

Um ponto importante na aplicao em MVC que ela no se baseia, necessariamente, em metadados (dicionrios). Como
veremos mais a frente, ela se baseia em estruturas e, estas, por sua vez, que podem vir do metadados ou serem construdas
manualmente.

2.4 ModelDef

A funo ModelDef define a regra de negcio, isto :

Todas as entidades (tabelas) que faro parte do Model.


Regras de dependncia entre as entidades.
Validaes (de campos e aplicao).
Persistncia dos dados (gravao).

TOTVS - Microsiga Protheus MVC (Model View Controller) 7


Verso 1.0
TOTVS - Microsiga Protheus MVC (Model View Controller)

No MVC a regra de negcio totalmente separada da interface, ento podemos utilizar a ModelDef em qualquer outra aplicao,
ou at utilizarmos uma determinada ModelDef como base para outra mais complexa.

As entidades da ModelDef no se baseiam necessariamente, em metadados (dicionrios).

A ModelDef deve ser uma Static Function dentro da aplicao.

Este um exemplo da funo ModelDef.

Static Function ModelDef()


Local oStruZA0 := FWFormStruct(1,'ZA0) // Cria a estrutura a ser usada no Modelo de
Dados
Local oModel // Modelo de dados construdo

oModel := MPFormModel():New('COMP011M) // Cria o objeto do Modelo de Dados


oModel:AddFields('ZA0MASTER,,oStruZA0) // Adiciona ao modelo um componente de
formulrio
oModel:SetDescription('Modelo/Autor) // Adiciona a descrio do Modelo de Dados

oModel:GetModel('ZA0MASTER):SetDescription('Dados de Autor/Interprete) // Adiciona a


descrio

Return oModel // Retorna o Modelo de dados

2.5 ViewDef

A funo ViewDef define como ser a interface e como o usurio ir interagir com o modelo de dados (Model) recebendo os
dados fornecidos pelo modelo e apresentando o resultado.

A interface pode ser baseada, totalmente ou parcialmente, em um metadado (dicionrio), permitindo assim:

Reaproveitamento do cdigo da interface, pois uma interface bsica pode ser acrescida de novos componentes.
Simplicidade no desenvolvimento de interfaces complexas: Um exemplo disso so aquelas aplicaes onde uma GRID depende de
outra. No MVC a construo de aplicaes que tem GRID s dependentes extremamente fcil.
Agilidade no desenvolvimento; a criao e a manuteno se tornam muito mais geis.
Mais de uma interface por Bussiness Object; poderemos ter interfaces diferentes para cada variao de um segmento de
mercado, como o varejo, por exemplo.

A ViewDef deve ser uma Static Function dentro da aplicao.

Este um exemplo da funo ViewDef.

Static Function ViewDef()

Local oModel := FWLoadModel('COMP011_MVC') // Retorna objeto com estrutura do Model


Local oStruZA0 := FWFormStruct(2, 'ZA0') // Cria a estrutura a ser usada na View
Local oView := FWFormView():New() // Cria o objeto de View

oView:SetModel(oModel) // Define Modelo utilizado pelo View


// Adiciona "controle" do tipo Formulario na Interface (tela)

oView:AddField('VIEW_ZA0', oStruZA0, 'ZA0MASTER')


// Criar um objeto "box horizontal" para receber algum elemento da view

oView:CreateHorizontalBox('TELA' , 100)
// Relaciona o ID da View com o "box" para exibio

8 TOTVS - Microsiga Protheus MVC (Model View Controller)


Verso 1.0
TOTVS - Microsiga Protheus MVC (Model View Controller)

oView:SetOwnerView('VIEW_ZA0', 'TELA')
Return oView // Retorna o objeto de View criado

2.6 MenuDef

Ela define as operaes que sero realizadas pela aplicao como incluso, alterao, excluso etc. Deve retornar um array em
um formato especfico com as seguintes informaes:

1. Ttulo.
2. Nome da aplicao associada.
3. Reservado.
4. Tipo de Transao a ser efetuada:
1 Pesquisar.
Visualizar.
Incluir.
Alterar.
Excluir.
Imprimir.
Copiar.
5. Nvel de acesso.
6. Habilita Menu Funcional.

Por Exemplo:

Note que o 2 parmetro utiliza a chamada direta de uma aplicao, ela faz referncia a uma ViewDef de um determinado fonte
(PRW).

A estrutura deste 2 parmetro tem o formato ViewDef.<nome do fonte>.

Sempre referenciaremos a Viewdef de um fonte, pois ela a funo responsvel pela a interface da aplicao.

Static Function MenuDef()


Local aRotina := {}

aAdd( aRotina, { 'Visualizar', 'VIEWDEF.COMP021_MVC', 0, 2, 0, NIL } )


aAdd( aRotina, { 'Incluir' , 'VIEWDEF.COMP021_MVC', 0, 3, 0, NIL } )
aAdd( aRotina, { 'Alterar' , 'VIEWDEF.COMP021_MVC', 0, 4, 0, NIL } )
aAdd( aRotina, { 'Excluir' , 'VIEWDEF.COMP021_MVC', 0, 5, 0, NIL } )
aAdd( aRotina, { 'Imprimir' , 'VIEWDEF.COMP021_MVC', 0, 8, 0, NIL } )
aAdd( aRotina, { 'Copiar' , 'VIEWDEF.COMP021_MVC', 0, 9, 0, NIL } )

Return aRotina

Continuando o exemplo:

Neste exemplo temos uma outra forma de criar a funo MenuDef, onde ao invs de utilizarmos diretamente um vetor,
utilizamos o comando ADD OPTION. As 2 formas so vlidas, mas devemos dar preferencia a esta segunda forma.

Static Function MenuDef()


Local aRotina := {}

ADD OPTION aRotina Title 'Visualizar Action 'VIEWDEF.COMP021_MVC' OPERATION 2 ACCESS 0


ADD OPTION aRotina Title 'Incluir' Action 'VIEWDEF.COMP021_MVC' OPERATION 3 ACCESS 0
ADD OPTION aRotina Title 'Alterar' Action 'VIEWDEF.COMP021_MVC' OPERATION 4 ACCESS 0

TOTVS - Microsiga Protheus MVC (Model View Controller) 9


Verso 1.0
TOTVS - Microsiga Protheus MVC (Model View Controller)

ADD OPTION aRotina Title 'Excluir' Action 'VIEWDEF.COMP021_MVC' OPERATION 5 ACCESS 0


ADD OPTION aRotina Title 'Imprimir' Action 'VIEWDEF.COMP021_MVC' OPERATION 8 ACCESS 0
ADD OPTION aRotina Title 'Copiar' Action 'VIEWDEF.COMP021_MVC' OPERATION 9 ACCESS 0

Return aRotina

2.7 Novo comportamento na interface

Nas aplicaes desenvolvidas em ADVPL tradicional, aps a concluso de uma operao de alterao, a interface era fechada e
retornava-se ao Browse.

Nas aplicaes em MVC, aps as operaes de incluso e alterao, a interface permanece ativa e, exibida a mensagem (no
rodap), de que a operao foi bem sucedida.

2.8 Aplicaes com Browse

Para a construo de uma aplicao que possui um Browse o MVC utiliza a classe FWMBrowse.

Esta classe exibe um objeto Browse que construdo a partir de metadados (dicionrios) ou no.

Esta classe no foi desenvolvida exclusivamente para o MVC, aplicaes que no so em MVC, tambm podem utiliz-la.

As caractersticas das aplicaes com Browse so:

Substituir componentes de Browse.


Reduzir o tempo de manuteno, em caso de adio de um novo requisito.
Ser independente do ambiente Microsiga Protheus.

Principais melhorias das aplicaes com Browse:

Padronizao de legenda de cores.


Melhor usabilidade no tratamento de filtros.
Padro de cores, fontes e legenda definidas pelo usurio (deficiente visual).
Reduo do nmero de operao no SGBD (no mnimo 3 vezes mais rpido).
Novo padro visual.

2.9 Construo bsica de um browse

Este um exemplo de aplicao com Browse, apresentada com a estrutura bsica.

O Browse, automaticamente, apresentar:


Pesquisa de registro.

Filtro configurvel.
Configurao de colunas e aparncia.

10 TOTVS - Microsiga Protheus MVC (Model View Controller)


Verso 1.0
TOTVS - Microsiga Protheus MVC (Model View Controller)

Impresso.

Primeiramente, deve-se criar um objeto Browse:


oBrowse := FWMBrowse():New()

Define-se a tabela que ser exibida na Browse atravs do mtodo SetAlias. As colunas, ordens etc. para a exibio, sero obtidos
atravs do metadados (dicionrios).
oBrowse:SetAlias('ZA0')

Define-se o ttulo como mtodo SetDescription:


oBrowse:SetDescription('Cadastro de Autor/Interprete')

Ativa-se a classe:
oBrowse:Activate()

2.10 Legendas de um browse

Para o uso de legendas no Browse utilizamos o mtodo AddLegend, que possui a seguinte sintaxe:

AddLegend( <cRegra>, <cCor>, <cDescrio> )

Por exemplo:
oBrowse:AddLegend( "ZA0_TIPO=='1'", "YELLOW", "Autor" )
oBrowse:AddLegend( "ZA0_TIPO=='2'", "BLUE" , "Interprete" )

cRegra a expresso em ADVPL para definir a legenda.

cCor o parmetro que define a cor de cada item da legenda. So possveis os seguintes valores:
GREEN - Verde
RED - Vermelha
YELLOW - Amarela
ORANGE - Laranja
BLUE - Azul
GRAY - Cinza
BROWN - Marrom
BLACK - Preta
PINK - Rosa
WHITE - Branca

cDescrio a descrio que ser exibida para cada item da legenda.

Observao: Cada uma das legendas se tornar uma opo de filtro automaticamente. Cuidado ao montar as regras da legenda.
Se houverem regras conflitantes, ser exibida a legenda correspondente 1 regra que for satisfeita.

2.11 Filtros de um browse

Se quisermos definir um filtro para o Browse utilizamos o mtodo SetFilterDefault. A expresso de filtro em ADVPL.

O filtro definido na aplicao no anula a possibilidade do usurio fazer seus prprios filtros. Os filtros feitos pelo usurio sero
aplicados em conjunto com o definido na aplicao (condio de AND).

TOTVS - Microsiga Protheus MVC (Model View Controller) 11


Verso 1.0
TOTVS - Microsiga Protheus MVC (Model View Controller)

Por exemplo, na aplicao foi definido que s sero exibidos clientes (pessoas jurdicas), se usurio fizer um filtro para exibir
apenas clientes do estado de So Paulo, sero exibidos os clientes, pessoa jurdica, do estado de So Paulo. Foi executado o filtro do
usurio e ainda respeitado o filtro original da aplicao.

Observao: O filtro da aplicao no poder ser desabilitado pelo usurio.

Por exemplo:
oBrowse:SetFilterDefault( "ZA0_TIPO=='1'" )

Ou
oBrowse:SetFilterDefault( "Empty(ZA0_DTAFAL)" )

2.12 Desabilitando os detalhes do browse

Automaticamente, para o Browse, so exibidos em detalhes, os dados da linha posicionada. Para desabilitar esta caracterstica
utilizamos o mtodo DisableDetails.

Por exemplo:
oBrowse:DisableDetails()

2.13 Construindo uma aplicao

Iremos criar agora uma aplicao utilizando a arquitetura MVC. Seguindo o modelo MVC veremos como construir as funes:

ModelDef.
ViewDef.

2.14 ModelDef com duas ou mais entidades

Este um exemplo da funo ModelDef para duas ou mais entidades (tabelas).

Static Function ModelDef()


Local oStruZA1 := FWFormStruct(1, 'ZA1') // Cria a estrutura a ser usada no Modelo de
Dados

Local oStruZA2 := FWFormStruct(1, 'ZA2')


Local oModel // Modelo de dados construdo
oModel := MPFormModel():New('COMP021M') // Cria o objeto do Modelo de Dados
oModel:AddFields('ZA1MASTER',,oStruZA1) // Adiciona ao modelo um componente de
formulrio

oModel:AddGrid( 'ZA2DETAIL','ZA1MASTER',oStruZA2) // Adiciona uma Grid ao modelo


// Faz relacionamento entre os componentes do model

oModel:SetRelation( 'ZA2DETAIL', {{'ZA2_FILIAL','xFilial("ZA2")'},;


{'ZA2_MUSICA','ZA1_MUSICA'}}, ZA2->(IndexKey( 1 )) )
oModel:SetDescription('Modelo de Musicas') // Adiciona a descrio do Modelo de Dados

12 TOTVS - Microsiga Protheus MVC (Model View Controller)


Verso 1.0
TOTVS - Microsiga Protheus MVC (Model View Controller)

oModel:GetModel('ZA1MASTER'):SetDescription('Dados da Musica') // Descrio dos


Componentes

oModel:GetModel('ZA2DETAIL'):SetDescription('Dados do Autor Da Musica')

Return oModel // Retorna o Modelo de dados

2.15 ViewDef com duas ou mais entidades

Este um exemplo da funo ViewDef para duas ou mais entidades (tabelas).

Static Function ViewDef()

Local oModel := FWLoadModel('COMP021_MVC') // Retorna objeto com estrutura do Model


Local oStruZA1 := FWFormStruct(2, 'ZA1') // Cria a estruturas a serem usada na View
Local oStruZA2 := FWFormStruct(2, 'ZA2')
Local oView := FWFormView():New() // Cria o objeto de View

oView:SetModel(oModel) // Define Modelo utilizado pelo View


oView:AddField('VIEW_ZA0', oStruZA0, 'ZA0MASTER') // Adiciona formulrio da interface
(tela)

oView:AddGrid( 'VIEW_ZA2', oStruZA2, 'ZA2DETAIL) // Adiciona Grid na interface


// Cria um "boxes" horizontais para receber o Formulario e a Grid

oView:CreateHorizontalBox( 'SUPERIOR', 15 )
oView:CreateHorizontalBox( 'INFERIOR', 85 )
// Relaciona o ID da View com os "boxes" para exibio

oView:SetOwnerView('VIEW_ZA1', 'SUPERIOR')
oView:SetOwnerView('VIEW_ZA2', 'INFERIOR')
Return oView // Retorna o objeto de View criado

2.16 Criando campos de total ou contadores

Com o MVC possvel criar componentes de totalizadores ou contadores. Estes campos so baseados em componentes de Grid
do modelo, sendo atualizados automaticamente durante a digitao. Criamos estes componentes atravs do mtodo AddCalc.

Importante: Para as operaes de SUM e AVG o campo do componente de Grid tem que ser do tipo numrico.

2.17 Executando a View com uma determinada operao

A funo FWExecView instancia um View com o tipo de operao definido.

Exemplo:

TOTVS - Microsiga Protheus MVC (Model View Controller) 13


Verso 1.0
TOTVS - Microsiga Protheus MVC (Model View Controller)

FWExecView( cTitulo, cPrograma, nOperation, oDlg, bCloseOnOk, bOk, nPercReducao,


aEnableButtons, bCancel)

2.18 Retornando o Model ativo

Em uma aplicao podemos trabalhar com mais de um modelo de dados (Model).

Definimos o modelo ativo atravs da funo FWModelActive.


Tambm podemos obter o modelo que est ativo atravs desta mesma funo.

Definindo o Model Ativo:


FWModelActive( oModelZA0 )

Obtendo o Model Ativo:


oModelBkp := FWModelActive()

2.19 Retornando a View ativa

Em uma aplicao podemos trabalhar com duas Views ativas.

Definimos a View ativa atravs da funo FWViewActive.


Tambm podemos obter a view que est ativa atravs desta mesma funo.

Definindo o View Ativo:


FWViewActive( oModelZA0 )

Obtendo View Ativo:


oViewBkp := FWViewActive()

14 TOTVS - Microsiga Protheus MVC (Model View Controller)


Verso 1.0
TOTVS - Microsiga Protheus MVC (Model View Controller)

3 Configuraes 2 - Cadastro de usurios

Ol!
Seja bem vindos ao treinamento MVC (Model-View-Controller): Modelo de Dados.

3.1 Objetivos Instrucionais

Ao trmino deste treinamento voc aprender como utilizar os Tratamentos para o Modelo de Dados MVC.

3.2 Descrio

Veremos alguns tratamentos que podem ser feitos no Modelo de Dados (Model) para atender algumas necessidades durante a
construo de uma aplicao.

Veremos os seguintes tratamentos:

Validaes.
Comportamentos.
Manipulao da Grids.
Obteno e atribuio de valores ao modelo de dados (Model) .
Gravao manual de dados.
Regras de preenchimento.

3.3 Mensagens exibidas na interface

Um ponto importante e que deve ser observado com relao s mensagens que sero dadas ao usurio, principalmente durante
as validaes.

A validao um processo executado dentro da regra de negocio e, uma eventual mensagem de erro que ser exibida ao usurio,
um processo executado na interface, ou seja, no pode ser executado dentro da regra de negcio.

Para trabalhar essa situao foi feito um tratamento para a funo Help.
A funo Help poder ser utilizada nas funes dentro do Model, porm o MVC ir "guardar" essa mensagem e, ela s ser
exibida ao usurio, quando o controle voltar para a interface.

No exemplo, supondo que a mensagem de erro foi acionada porque um preo unitrio igual a 0 (zero), neste momento no
seria exibido nada ao usurio. Isso pode ser bem observado se voc estiver "debugando" o fonte, voc ver que ao passar pela funo
Help nada acontece. Porm, quando o controle interno volta para a interface, a mensagem exibida.

Esse tratamento foi feito apenas para a funo Help e somente ela poder ser utilizada.

TOTVS - Microsiga Protheus MVC (Model View Controller) 15


Verso 1.0
TOTVS - Microsiga Protheus MVC (Model View Controller)

Por exemplo:
If nPrcUnit == 0 // Preco unitario
Help( ,, 'Help',, 'Preco unitario nao informado.', 1, 0 )
EndIf

3.4 Obtendo um componente do Modelo de Dados

Durante o desenvolvimento, vrias vezes teremos que manipular o Modelo de Dados (Model). Para facilitar essa manipulao
podemos trabalhar com uma parte especfica dele (um componente apenas).

Para isso utilizamos o mtodo GetModel.

GetModel: Obtm um componente do model.

Local oModelZA2 := oModel:GetModel( 'ZA2DETAIL' )


Local oModel := oModelZA2:GetModel()

3.5 Validaes

Dentro do modelo de dados existem vrios pontos onde podem ser inseridas as validaes necessrias regra de negocio.
O Modelo de Dados (Model) como um todo, tem seus pontos e, cada componente do Modelo tambm.

3.6 Ps-validao do Modelo

a validao realizada aps o preenchimento do Modelo de Dados (Model) e sua confirmao. Seria o equivalente ao antigo
processo de TudoOk.

O Modelo de Dados j faz a validao se os campos obrigatrios de todos os componentes do Modelo foram preenchidos. A Ps-
validao do Modelo executada depois disso.

oModel := MPFormModel():New( 'COMP011M', ,{ |oModel| COMP011POS( oModel ) } )


Static Function COMP011POS( oModel )
Local lRet := .T.
Local nOperation := oModel:GetOperation
// Segue a funo ...
Return lRet

3.7 Ps-validao de Linha

Em um Modelo de Dados onde existam componentes de Grid pode ser definido uma validao que ser executada na troca das
linhas do mesmo. Seria o equivalente ao antigo processo de LinhaOk.

oModel:AddGrid( 'ZA2DETAIL', 'ZA1MASTER', oStruZA2, , { |oModelGrid|


COMP021LPOS(oModelGrid) }

16 TOTVS - Microsiga Protheus MVC (Model View Controller)


Verso 1.0
TOTVS - Microsiga Protheus MVC (Model View Controller)

3.8 Validao de linha duplicada

Em um Modelo de Dados onde existam componentes de Grid pode ser definido quais os campos que no podem se repetir.

Por exemplo, imaginemos o Pedido de Vendas onde no se permite que o cdigo do produto se repita. Podemos definir no
modelo este comportamento sem precisar escrever uma funo especfica para isso.

O mtodo do Modelo de Dados (Model) que dever ser usado o SetUniqueLine.

ZA2_AUTOR ZA2_DATA

001 01/01/11 Ok

001 02/01/11 Ok

002 02/01/11 Ok

001 01/01/11 No permitido

3.9 Pr-validao de linha

Em um Modelo de Dados onde existam componentes de Grid, pode ser definida uma validao que ser executada nas aes das
linhas do Grid. Podemos entender por essas aes, a atribuio de valores, apagar ou recuperar uma linha.

oModel:AddGrid( 'ZA2DETAIL', 'ZA1MASTER', oStruZA2, { |oModelGrid, nLine, cAction,


cField| COMP021LPRE(oModelGrid, nLine, cAction, cField) }
Static Function COMP023LPRE( oModelGrid, nLinha, cAcao, cCampo )

Local lRet := .T.


Local oModel := oModelGrid:GetModel()
Local nOperation := oModel:GetOperation()

// Valida se pode ou no apagar uma linha do Grid


If cAcao == 'DELETE' .AND. nOperation == MODEL_OPERATION_UPDATE
lRet := .F.
Help( ,, 'Help',, 'No permitido apagar linhas na alterao.' + CRLF + ;
'Voc esta na linha ' + Alltrim( Str( nLinha ) ), 1, 0 )
EndIf

Return lRet

3.10 Validao da ativao do modelo

TOTVS - Microsiga Protheus MVC (Model View Controller) 17


Verso 1.0
TOTVS - Microsiga Protheus MVC (Model View Controller)

a validao realizada no momento da ativao do modelo, permitindo ou no, a sua ativao.

Definimos a validao da ativao usando o mtodo SetVldActive.

SetVldActivate: Valida se o modelo de dados pode ser ativado.


oModel:SetVldActivate( { |oModel| COMP011ACT( oModel ) } )

3.11 Manipulao da componente de Grid

Veremos alguns tratamentos que podem ser feitos nos componentes de Grid de um Modelo de Dados (Model).

Em um componente de Grid do Modelo de Dados, para se obter a quantidade de linhas do Grid, devemos utilizar o mtodo
Length. As linhas apagadas tambm so consideradas no total.

Se for passado um parmetro no mtodo Length,o retorno ser apenas a quantidade de linhas no apagadas da Grid.

Length: Retorna o Quantidade de linhas do componente de grid


Static Function COMP021POS( oModel )
Local lRet := .T.
Local oModelZA2 := oModel:GetModel( 'ZA2DETAIL' )
Local nI := 0

For nI := 1 To oModelZA2:Length()
// Segue a funcao ...
Next nI
nLinhas := oModelZA2:Length( .T. ) // Quantidade linhas no apagadas

3.12 Ir para uma linha do componente de Grid

Para movimentarmos o Grid, ou seja, mudarmos a linha onde o Grid est posicionado, utilizamos o mtodo GoLine, passando
como parmetro o nmero da linha onde se deseja posicionar.

GoLine: Ir para uma linha do componente de grid


Static Function COMP021POS( oModel )
Local lRet := .T.
Local oModelZA2 := oModel:GetModel( 'ZA2DETAIL' )
Local nI := 0

For nI := 1 To oModelZA2:Length()
oModelZA2:GoLine( nI )
// Segue a funo ...
Next nI

Status da linha de um componente de Grid

H trs operaes bsicas referentes ao Modelo de Dados (Model): Incluso, Alterao e Excluso.

Quando a operao de Incluso, todos os componentes do Modelo de Dados (Model) esto incluindo.

Esse raciocnio tambm se aplica Excluso. Se a operao de excluso, todos os componentes tero seus dados excludos.

18 TOTVS - Microsiga Protheus MVC (Model View Controller)


Verso 1.0
TOTVS - Microsiga Protheus MVC (Model View Controller)

Porm, quando falamos da operao de alterao, no bem assim.

Em um Modelo de Dados onde existam componentes de Grid, na operao de alterao, a Grid pode ter linhas includas,
alteradas ou excludas. Ou seja, o Modelo de Dados (Model) est em alterao, mas uma Grid pode ter tido as trs operaes em suas
linhas.

Em MVC possvel saber quais operaes, uma linha sofreu, atravs dos mtodos de status:
IsDeleted: Informa se uma linha foi apagada. Retornando .T., a linha foi apagada.
IsUpdated: Informa se uma linha foi alterada. Retornando .T., a linha foi alterada.
IsInserted: Informa se uma linha foi inserida, ou seja, se uma linha nova na Grid. Retornando .T., a linha foi inserida.

Mais de um mtodo de status pode retornar .T. para a mesma linha.

Se uma linha foi includa, o IsInserted retornar .T.; se foi alterada, o IsUpdated retornar .T. tambm; se a mesma linha foi
apagada, IsDeleted tambm retornar .T..

Static Function COMP23ACAO()

Local oModel := FWModelActive()


Local oModelZA2 := oModel:GetModel( 'ZA2DETAIL' )
Local nI := 0
Local nCtInc := 0
Local nCtAlt := 0
Local nCtDel := 0
Local aSaveLines := FWSaveRows()
For nI := 1 To oModelZA2:Length()
oModelZA2:GoLine( nI )
If oModelZA2:IsDeleted()
nCtDel++
ElseIf oModelZA2:IsInserted()
nCtInc++
ElseIf oModelZA2:IsUpdated()
nCtAlt++
EndIf
Next

Adicionando uma linha a Grid

Para adicionarmos uma linha a um componente de Grid do Modelo de Dados (Model) utilizamos o mtodo AddLine.

Addline retorna a quantidade de linhas atualmente no Grid. Se o insero foi bem sucedida, esta quantidade j inclui a linha nova.

Os motivos para a insero no ser bem sucedida podem ser: algum campo obrigatrio no informado, a Ps-validao da linha
retornar .F. ou atingir a quantidade mxima de linhas para a Grid, por exemplo.

Addline: Adiciona uma linha ao componente de Grid.


nLinha++
If oModelZA2:AddLine() == nLinha
// Segue a funo
EndIf

Apagando e recuperando uma linha da Grid

DeleteLine: Apaga uma linha da grid


UnDeleteLine: Recupera uma linha da grid
Local oModel := FWModelActive()
Local oModelZA2 := oModel:GetModel( 'ZA2DETAIL' )
Local nI := 0
For nI := 1 To oModelZA2:Length()
oModelZA2:GoLine( nI )

TOTVS - Microsiga Protheus MVC (Model View Controller) 19


Verso 1.0
TOTVS - Microsiga Protheus MVC (Model View Controller)

If !oModelZA2:IsDeleted()
oModelZA2:DeleteLine()
EndIf
Next
// Para recuperar use oModelZA2:UnDeleteLine()

3.13 Permisses para uma Grid

Se quisermos limitar que em uma linha Grid possa ser inserida, alterada ou apagada, para fazermos uma consulta, por exemplo,
utilizamos os seguintes mtodos:

SetNoInsertLine: No permite inserir linhas na Grid.


SetNoUpdateLine: No permite alterar as linhas da Grid.
SetNoDeleteLine: No permite apagar as linhas da Grid.

Esses mtodos podem ser informados no momento da definio do Model.

SetNoInsertLine: No permitir serem inseridas linhas na grid


SetNoUpdateLine: No permitir serem alteradas as linhas da grid
SetNoDeleteLine: No permitir serem apagadas linhas da grid

// No permite inserir linhas na grid


oModel:GetModel( 'ZA2DETAIL' ):SetNoInsertLine( .T. )

// No permite alterar as linhas da grid


oModel:GetModel( 'ZA2DETAIL' ):SetNoUpdateLine( .T. )

// No permite apagar as linhas da grid


oModel:GetModel( 'ZA2DETAIL' ):SetNoDeleteLine( .T. )

Por padro, quando temos um Modelo de Dados (Model) onde h um componente de Grid, deve ser informada pelo menos uma
linha nesta Grid.

Vamos imaginar um modelo onde temos um cadastro de produtos e seus acessrios. um modelo Master-Detail, teremos para
cada produto n acessrios, mas tambm teremos produtos que no tm acessrios. Esta regra, de que deve haver pelo menos uma linha
informada na Grid, no pode ser aplicada.

Neste caso, utilizamos o mtodo SetOptional para permitir que a Grid tenha ou no, pelo menos uma linha digitada, ou seja, para
dizer que a digitao de dados da Grid opcional.

Esse mtodo deve ser informado no momento da definio do Model.

SetOptional: Permite Grid sem dados.


// Permitir grid sem dados
oModel:GetModel( 'ZA2DETAIL' ):SetOptional( .T. )

3.14 Guardando e restaurando o posicionamento da Grid

20 TOTVS - Microsiga Protheus MVC (Model View Controller)


Verso 1.0
TOTVS - Microsiga Protheus MVC (Model View Controller)

Um cuidado que devemos ter quando escrevemos uma funo, mesmo que no seja para uso em MVC, restaurarmos as reas
das tabelas que foram desposicionadas.

Analogamente, devemos ter o mesmo cuidado, para os componentes de Grid que desposicionamos em uma funo, com o uso
do mtodo GoLine, por exemplo.

Para fazer isso podemos usar as funcoes FWSAVEROWS e FWRESTROWS

FWSaveRows: Guarda a posicao (linha) de todos os componentes de grid do model


FWRestRows: Restaura a posicao (linha) de todos os componentes de grid do model
Static Function COMP23ACAO()

Local oModel := FWModelActive()


Local oModelZA2 := oModel:GetModel( 'ZA2DETAIL' )
Local nI := 0
Local aSaveLines := FWSaveRows()

For nI := 1 To oModelZA2:Length()
oModelZA2:GoLine( nI )
// Segue a funo
Next

FWRestRows( aSaveLine )

3.15 Obter e atribuir valores ao Modelo de Dados

As operaes mais comuns que faremos em um Modelo de Dados (Model) obter e atribuir valores.

Para isso utilizamos um dos mtodos:

GetValue: Obtm um dado do Model. Podemos obter o dado a partir do Modelo de Dados (Model) completo ou a partir de uma
componente dele.

GetValue: Obtm um dado do model. Podemos obter o dado a partir do modelo de dados
(Model) completo ou a partir de um componente dele
// A partir do modelo de dados (Model) completo
Local cMusica := oModel:GetValue( 'ZA1MASTER', 'ZA1_MUSICA )

// A partir de um componente do modelo de dados (Model)


Local oModelZA2 := oModel:GetModel( 'ZA1MASTER' )

Local cMusica := oModelZA2:GetValue('ZA1_MUSICA )

SetValue: Atribui um dado ao Model. Podemos atribuir o dado a partir do Modelo de Dados (Model) completo ou a partir de uma
parte dele.

Quando utilizamos o SetValue para atribuir um dado a um campo as validaes deste campo so executadas, e tambm so
disparados os seus gatilhos.

O SetValue retorna .T. se a atribuio foi bem sucedida, os motivos para que no seja, podem ser que o dado no satisfez a
validao, modo de edio (WHEN) no foi satisfeito etc.

SetValue: Atribui um dado ao model. Podemos atribuir o dado a partir do modelo de dados
(Model) completo ou a partir de uma parte dele
// A partir do modelo de dados (Model) completo

TOTVS - Microsiga Protheus MVC (Model View Controller) 21


Verso 1.0
TOTVS - Microsiga Protheus MVC (Model View Controller)

oModel:SetValue( 'ZA1MASTER', 'ZA1_MUSICA', '000001' )

// A partir de um componente do modelo de dados (Model) completo


Local oModelZA2 := oModel:GetModel( 'ZA1MASTER' )
oModelZA2:SetValue('ZA1_MUSICA', '000001' )

LoadValue: Atribui um dado ao Model. Podemos atribuir o dado a partir do Modelo de Dados (Model) completo ou a partir de
uma parte dele.

Importante: Utilize sempre o SetValue para atribuir um dado, evite o LoadValue, exceto quando for extremamente necessrio.

LoadValue Atribui um dado ao model. Podemos atribuir o dado a partir do modelo de dados
(Model) completo ou a partir de uma parte dele.

// A partir do modelo de dados (Model) completo

oModel:LoadValue( 'ZA1MASTER', 'ZA1_MUSICA', '000001' )

// A partir de um componente do modelo de dados (Model)


Local oModelZA2 := oModel:GetModel( 'ZA1MASTER' )
oModelZA2:LoadValue('ZA1_MUSICA', '000001' )

3.16 Alterao de dados de um componente no Modelo de Dados

Se quisermos que um determinado componente do Modelo de Dados (Model) no permita alterao em seus dados, que seja
apenas para visualizao, utilizamos o mtodo SetOnlyView.

Esse mtodo deve ser informado no momento da definio do Model.

oModel:GetModel( 'ZA2DETAIL' ):SetOnlyView ( .T. )

3.17 No gravar dados de um componente do Modelo de Dados

A persistncia dos dados (gravao) feita automaticamente pelo Modelo de Dados (Model).

Se quisermos que um determinado componente do Modelo de Dados (Model) permita incluso e/ou alterao em seus dados,
porm que estes dados no sejam gravados, utilizamos o mtodo SetOnlyQuery.

Esse mtodo deve ser informado no momento da definio do Model.

SetOnlyQuery: Os dados de um componente no sero gravados


oModel:GetModel( 'ZA2DETAIL' ):SetOnlyQuery ( .T. )

3.18 Obter operao que est sendo realizada

Para sabermos a operao com que um Modelo de Dados (Model) est trabalhando, usamos o mtodo GetOperation.

Esse mtodo retorna o valor:

22 TOTVS - Microsiga Protheus MVC (Model View Controller)


Verso 1.0
TOTVS - Microsiga Protheus MVC (Model View Controller)

3 quando uma Incluso.


4 quando uma Alterao.
5 quando uma Excluso.

GetOperation: Obtm a operao com que um modelo de dados (Model) esta trabalhando
-3 quando uma incluso
-4 quando uma alterao
-5 quando uma excluso
Static Function COMP023LPRE( oModelGrid, nLinha, cAcao, cCampo )
Local lRet := .T.
Local oModel := oModelGrid:GetModel()
Local nOperation := oModel:GetOperation()

// Valida se pode ou no apagar uma linha do Grid


If cAcao == 'DELETE' .AND. nOperation == 3
lRet := .F.
Help( ,, 'Help',, 'No permitido apagar linhas na alterao.' + CRLF + ;
'Voc esta na linha ' + Alltrim( Str( nLinha ) ), 1, 0 )
EndIf

Return lRet

No MVC foram criadas vrias diretivas de compilao #DEFINE para facilitar o desenvolvimento e tornar a leitura de uma
aplicao mais fcil.

#INCLUDE 'FWMVCDEF.CH'

Para as operaes do modelo de dados (Model) podem ser utilizados

MODEL_OPERATION_INSERT para incluso


MODEL_OPERATION_UPDATE para alterao
MODEL_OPERATION_DELETE para excluso

If cAcao == 'DELETE' .AND. nOperation == MODEL_OPERATION_INSERT

3.19 Gravao dos dados manualmente

A gravao dos dados do Modelo de Dados (Model) (persistncia) realizada pelo MVC onde so gravados todos os dados das
entidades do Model.

Porm, pode haver a necessidade de se efetuar gravaes em outras entidades que no participam do modelo. Por exemplo,
quando inclumos um Pedido de Vendas preciso atualizar o valor de pedidos em aberto do Cadastro de Clientes. O cabealho e itens do
pedido fazem parte do modelo e sero gravados, o cadastro de Cliente no faz parte, mas precisa ser atualizado tambm.

Para este tipo de situao possvel intervir no momento da gravao dos dados.

O bloco de cdigo recebe como parmetro um objeto que o modelo e que pode ser passado funo que far a gravao.
Diferentemente dos blocos de cdigo definidos no Modelo de Dados (Model), para as validaes, onde estes complementam as
validaes feitas pelo MVC, o bloco de cdigo para gravao, substitui a gravao dos dados. Ento, ao ser definido um bloco de cdigo
para gravao, passa ser responsabilidade do desenvolvedor a gravao de todos os dados, inclusive os dados do Model.

oModel := MPFormModel():New( 'COMP011M', , , { |oModel| COMP011GRV( oModel ) } )


Static Function COMP011GRV ( oModel )

FWFormCommit( oModel ) // Grava dados do Model

TOTVS - Microsiga Protheus MVC (Model View Controller) 23


Verso 1.0
TOTVS - Microsiga Protheus MVC (Model View Controller)

// Efetuar a gravao de outros dados em entidade que


// no so do model

Importante: No devem ser feitas atribuies de dados no Modelo de Dados (Model) dentro da funo de gravao.
Conceitualmente, ao se iniciar a gravao o Modelo de Dados (Model) j passou por toda a validao, ao tentar atribuir um valor, esse
valor pode no satisfazer a validao do campo tornando o modelo de dados (Model) invlido novamente e o que ocorrer a gravao
de dados inconsistentes.

3.20 Regra de preenchimento

Uma nova caracterstica que foi implementada no MVC so as regras de preenchimento, onde o preenchimento de um campo
depende do preenchimento de outro.

Por exemplo: podemos definir que o campo Cdigo da Loja de uma entidade s pode ser preenchido, aps o preenchimento do
campo Cdigo do Cliente.

As regras de preenchimento podem ser de trs tipos:

Tipo 1 - Pr-Validao:
Adiciona uma relao de dependncia entre campos do formulrio, impedindo a atribuio de valor, caso os campos de
dependncia no tenham valor atribudo. Por exemplo: o preenchimento do campo Cdigo da Loja s pode ser preenchido aps o
preenchimento do campo Cdigo do Cliente.

Tipo 2 - Ps-Validao:
Adiciona uma relao de dependncia entre a referncia de origem e destino, provocando uma reavaliao do destino, em caso
de atualizao da origem. Por exemplo: aps o preenchimento do campo Cdigo da Loja, a validao reavaliada caso o Cdigo do
Cliente seja alterado.

Tipo 3 - Pr e Ps-Validao:
So os tipos 1 e 2 simultaneamente.

AddRules: Cria uma regra de preenchimento de campos.


Parmetros para preenchimento do mtodo AddRules:

Modelo do campo destino.


Campo destino.
Modelo do campo origem.
Campo origem.
Tipo da regra a ser aplicada: 1,2, ou 3.

24 TOTVS - Microsiga Protheus MVC (Model View Controller)


Verso 1.0
TOTVS - Microsiga Protheus MVC (Model View Controller)

4 Tratamentos de Interface

Ol!
Seja bem vindo ao treinamento MVC (Model-View-Controller): Tratamentos de Interface.

4.1 Objetivos Instrucionais

Ao trmino deste treinamento voc aprender como utilizar os Tratamentos de Interface do MVC.

4.2 Descrio

Apresentaremos as tcnicas de construo da Interface (View), possibilitando a montagem de telas para o MVC.

4.3 Campo Incremental

Podemos fazer com que um campo do Model que faa parte de um componente de Grid possa ser incrementado unitariamente
a cada nova linha.

Por exemplo: Imaginemos o Pedido de Vendas, nos itens, o nmero do item pode ser um campo incremental.

Para isso utilizamos o mtodo AddIncrementField.

Importante: Esse comportamento s ocorre na utilizao de telas a partir da View, caso o Model seja utilizado a partir de outro
tipo de aplicao, como um WebService por exemplo, essa regra no ser aplicada.

4.4 Criar um boto na barra de botes

Para a criao de botes adicionais, na barra de botes da interface, utilizamos o mtodo AddUserButton.

Importante: O boto do usurio ser exibido a partir do boto Aes Relacionadas.

AddUserButton: Cria botes adicionais na barra de superior da interface


oView:AddUserButton( 'Inclui Autor', 'CLIPS', { |oView| COMP021BUT() } )

4.5 Ttulo do componente

No MVC podemos atribuir um ttulo para identificar cada componente da interface, por meio do mtodo EnableTitleView.

No Exemplo 1, definimos manualmente o titulo:

TOTVS - Microsiga Protheus MVC (Model View Controller) 25


Verso 1.0
TOTVS - Microsiga Protheus MVC (Model View Controller)

VIEW_ZA2 o ID do componente da View, e 'MUSICAS' o titulo que ser apresentado para o cliente.

No Exemplo 2, o titulo exibido ser o que foi definido atravs do mtodo SetDescription preenchido no Model para o
componente.

4.6 Edio dos campos do componente de Grid

Uma nova caracterstica que o MVC possui para o uso da interface permitir a edio simultnea dos campos de uma Grid ou em
uma tela no layout de formulrio.

Para isso utilizamos o mtodo SetViewProperty. Esse mtodo habilita alguns comportamentos especficos ao componente da
interface (View) conforme a diretiva recebida.

Veja o Exemplo:
VIEW_ZA2 o ID do componente da interface (View) onde se encontra o campo, e ENABLEDGRIDDETAIL a diretiva que habilita
o comportamento e { 60 } o percentual que o formulrio de edio ocupar, do tamanho que o componente de Grid ocupa atualmente.

Exemplificando numericamente, se para o componente de Grid foi defino que ele utilizar 50% da tela, ao se colocar 60 (60%) no
parmetro, quer se indicar que dos 50% destinados ao componente de Grid, 60% ser usado para o formulrio de edio.

4.7 Criao de pastas

No View a criao de pastas feita a partir do mtodo CreateFolder permitindo ao desenvolvedor disponibilizar os campos de
forma organizada.

Importante: Quando as pastas esto definidas no metadados (dicionrios), automaticamente a interface (View) cria estas pastas.
Se o componente colocado em umas das abas criadas manualmente, possuir pastas definidas no metadados (dicionrios), estas pastas
sero criadas dentro da aba onde ele se encontra.

Exemplo:

oView:CreateFolder( 'PASTAS' ) // Cria conjunto de pastas


oView:AddSheet( 'PASTAS', 'ABA01', 'Cabealho' ) // Cria Abas da pasta
oView:AddSheet( 'PASTAS', 'ABA02', 'Item' )
oView:CreateHorizontalBox( 'SUPERIOR', 100,,, 'PASTAS', 'ABA01' ) // Cria um painel por
Aba
oView:CreateHorizontalBox( 'INFERIOR', 100,,, 'PASTAS', 'ABA02' )
oView:SetOwnerView( 'VIEW_ZA1' , 'SUPERIOR' ) // Relaciona o formulrio a Aba
oView:SetOwnerView( 'VIEW_ZA2' , 'INFERIOR' )

26 TOTVS - Microsiga Protheus MVC (Model View Controller)


Verso 1.0
TOTVS - Microsiga Protheus MVC (Model View Controller)

4.8 Agrupamentos de campos

O agrupamento de campos uma nova caracterstica do MVC.

Por exemplo, em um cadastro de clientes podemos ter campos para o endereo de entrega, correspondncia e faturamento,
sendo necessrio agrup-los para uma melhor visualizao. Para tanto, utilizamos o mtodo AddGroup.

Exemplo:

oStruZA0:AddGroup( 'GRUPO01', 'Alguns Dados', '', 1 )


oStruZA0:AddGroup( 'GRUPO02', 'Outros Dados', '', 2 )

// Agrupando os campos
oStruZA0:SetProperty( '*' , MVC_VIEW_GROUP_NUMBER, 'GRUPO01' )

// Trocando o agrupamentos de alguns campos


oStruZA0:SetProperty( 'ZA0_QTDMUS', MVC_VIEW_GROUP_NUMBER, 'GRUPO02' )
oStruZA0:SetProperty( 'ZA0_TIPO' , MVC_VIEW_GROUP_NUMBER, 'GRUPO02' )

4.9 Ao de interface

No MVC possvel executar uma funo em algumas aes da interface (View). Esse recurso pode ser usado quando queremos
executar algo na interface, sem que haja reflexo no Modelo de Dados (Model), como um Refresh de tela, por exemplo.

Para isso, usamos o mtodo SetViewAction.

Importante: Essas aes so executadas apenas quando existe uma interface (View). O que no ocorre quando temos o
instanciamento direto do modelo, como em rotina automtica ou WebServices. Deve-se evitar colocar nestas funes, aes que possam
influenciar a regra de negcio, pois na execuo da aplicao sem interface, essas aes no sero executadas.

Ao de interface do campo

possvel tambm disparar um evento que ser executado aps a validao de um determinado campo da View sem que ele
tenha reflexo no Model, por meio do mtodo SetFieldAction.

Importante: Essas aes so executadas aps a validao do campo. Essas aes so executadas apenas quando existe uma
interface (View). O que no ocorre quando temos o instanciamento direto do modelo, como em rotina automticas ou WebServices. por
exemplo.

Deve-se evitar colocar nestas funes, aes que possam influenciar a regra de negcio, pois na execuo da aplicao sem
interface, essas aes no sero executadas.

TOTVS - Microsiga Protheus MVC (Model View Controller) 27


Verso 1.0
TOTVS - Microsiga Protheus MVC (Model View Controller)

5 Tratamentos estrutura de dados

Ol!
Seja bem vindo ao treinamento sobre MVC: Tratamentos estrutura de dados.

5.1 Objetivos Instrucionais

Ao trmino deste treinamento, voc aprender como utilizar os Tratamentos de Estrutura de Dados do MVC.

5.2 Descrio

O MVC no trabalha vinculado aos metadados do sistema (dicionrios) ele trabalha vinculado as estruturas. Essas estruturas,
por sua vez, que podem ser construdas a partir dos metadados.

5.3 Selecionar campos para a estrutura

Ao criarmos uma estrutura baseada no metadados (dicionrios), utilizando a funo FWFormStruct, ela leva em considerao
todos os campos da entidade, respeitando nvel, mdulo, uso etc.

Por exemplo:

Local oStruZA0 := FWFormStruct( 2, 'ZA0', { |cCampo| COMP11STRU(cCampo) } )


// Funo executada para validar os campos exibidos

Static Function COMP11STRU( cCampo )


Local lRet := .T.

If cCampo == 'ZA0_QTD'
lRet := .F.
EndIf

Return lRet

Importante: Se for removido da estrutura da interface (View) um campo obrigatrio, mesmo no sendo exibido para o usurio, o
Modelo de Dados (Model) far a sua validao dizendo que um campo obrigatrio no foi preenchido.

5.4 Remover um campo da Estrutura

Uma forma de retirar um campo da estrutura da View utilizando o mtodo RemoveField.

28 TOTVS - Microsiga Protheus MVC (Model View Controller)


Verso 1.0
TOTVS - Microsiga Protheus MVC (Model View Controller)

Importante: Esse tratamento pode ser feito tanto para as estruturas que sero usadas no Modelo de Dados (Model) quanto na
interface (View), mas tome o seguinte cuidado: se for removido da estrutura da interface (View) um campo obrigatrio, mesmo no
sendo exibido para o usurio, o Modelo de Dados (Model) far a sua validao dizendo que um campo obrigatrio no foi preenchido.

5.5 Alterar propriedade do campo

Se houver a necessidade de mudar alguma propriedade do campo na estrutura, o mtodo SetProperty dever ser utilizado.

Exemplo:

oStruZA0:SetProperty( 'ZA0_QTDMUS, MODEL_FIELD_WHEN,'INCLUI')


oStruZA0:SetProperty( '*' , MODEL_FIELD_WHEN,'INCLUI')

possvel atribuir uma propriedade para todos os campos da estrutura, utilizando no nome do campo um asterisco "*. Os
#DEFINE com nomes de propriedades esto contidos no Include 'FWMVCDEF.CH.

Essa a relao das propriedades possveis de serem alteradas no Model.

MODEL_FIELD_DECIMAL Tipo: N
Descrio: Decimais
MODEL_FIELD_IDFIELD Tipo: C
Descrio: Nome (ID)
MODEL_FIELD_INIT Tipo: B
Descrio: Inicializador padro
MODEL_FIELD_KEY Tipo: L
Descrio: Indica se o campo chave
MODEL_FIELD_NOUPD Tipo: L
Descrio: Indica se o campo pode receber
valor em uma operao de update
MODEL_FIELD_OBRIGAT Tipo: L
Descrio: Indica se o campo tem
preenchimento obrigatrio
MODEL_FIELD_TAMANHO Tipo: N
Descrio: Tamanho
MODEL_FIELD_TIPO Tipo: C
Descrio: Tipo
MODEL_FIELD_TITULO Tipo: C
Descrio: Ttulo
MODEL_FIELD_TOOLTIP Tipo: C
Descrio: Descrio completa do campo
MODEL_FIELD_VALID Tipo: B
Descrio: Validao
MODEL_FIELD_VALUES Tipo: A
Descrio: Lista de valores permitidos do
campo (combo)
MODEL_FIELD_VIRTUAL Tipo: L
Descrio: Indica se o campo virtual
MODEL_FIELD_WHEN Tipo: B
Descrio: Modo de edio

Essa a relao das propriedades possveis de serem alteradas no View.

TOTVS - Microsiga Protheus MVC (Model View Controller) 29


Verso 1.0
TOTVS - Microsiga Protheus MVC (Model View Controller)

MVC_VIEW_CANCHANGE Tipo: L
Descrio: Indica se o campo editvel
MVC_VIEW_COMBOBOX Tipo: A
Descrio: Lista de valores permitido do
campo (Combo)
MVC_VIEW_DESCR Tipo: C
Descrio: Descrio do campo
MVC_VIEW_FOLDER_NUMBER Tipo: C
Descrio: Pasta do campo
MVC_VIEW_GROUP_NUMBER Tipo: C
Descrio: Agrupamento do campo
MVC_VIEW_HELP Tipo: A
Descrio: Array com Help
MVC_VIEW_IDFIELD Tipo: C
Descrio: Nome do Campo
MVC_VIEW_INIBROW Tipo: C
Descrio: Inicializador de Browse
MVC_VIEW_LOOKUP Tipo: C
Descrio: Consulta F3
MVC_VIEW_MAXTAMCMB Tipo: N
Descrio: Tamanho Maximo da maior
opo do combo
MVC_VIEW_ORDEM Tipo: C
Descrio: Ordem
MVC_VIEW_PICT Tipo: C
Descrio: Picture
MVC_VIEW_PICTVAR Tipo: C
Descrio: Picture Varivel
MVC_VIEW_PVAR Tipo: B
Descrio: Bloco de Picture Variavel
MVC_VIEW_TITULO Tipo: C
Descrio: Titulo do campo
MVC_VIEW_VIRTUAL Tipo: L
Descrio: Indica se o campo virtual

5.6 Criar campos adicionais - Model

Para criar um novo campo em uma estrutura j existente, utiliza-se o mtodo Addfied.

H diferenas na sequncia de parmetros deste mtodo para adicionar campos para a estrutura do Modelo de Dados (Model) ou
para a estrutura da interface (View).

Exemplo para o Model:

Local oStruZA0 := FWFormStruct( 1, 'ZA0' ) // Retorna estrutura do Model


oStruZA0:AddField( cTitulo, cTooltip, cIdField, cTipo , nTamanho, nDecimal, bValid,
bWhen, aValues, lObrigat, bInit, lKey, lNoUpd, lVirtual,cValid)

30 TOTVS - Microsiga Protheus MVC (Model View Controller)


Verso 1.0
TOTVS - Microsiga Protheus MVC (Model View Controller)

5.7 Criar campos adicionais - View

O mtodo AddField, na View, tem uma estrutura diferente.

Importante: Os campos do tipo lgico sero exibidos atravs de um componente do tipo Seleo (checkbox), na View.

Exemplo:

Local oStruZA0 := FWFormStruct( 2, 'ZA0' ) // Retorna estrutura do View


oStruZA0:AddField( cIdField, cOrdem, cTitulo, cDescric, aHelp, cType, cPicture,
bPictVar, cLookUp, lCanChange, cFolder, cGroup, aComboValues, nMaxLenCombo, cIniBrow,
lVirtual, cPictVar, lInsertLine )

5.8 Formatar bloco de cdigo para a estrutura

Algumas propriedades dos campos da estrutura pedem uma construo especifica de bloco de cdigo, fazemos isso atravs da
funo FwBuildFeature.

Importante: Os nomes das propriedades esto contidos no arquivo de include 'FWMVCDEF.CH.

Exemplo:

FwBuildFeature( STRUCT_FEATURE_VALID, "Pertence('12' )" )


Propriedades do FwBuildFeature :
STRUCT_FEATURE_VALID - Para a validao.
STRUCT_FEATURE_WHEN - Para o modo de edio.
STRUCT_FEATURE_INIPAD - Para o inicializador padro.
STRUCT_FEATURE_PICTVAR - Para PictureVar.

5.9 Campos do tipo MEMO virtuais

Alguns campos do tipo MEMO utilizam-se de tabelas para a gravao de seus valores, esses campos devem ser informados na
estrutura para que o MVC consiga fazer seu tratamento corretamente, atravs da funo FWMemoVirtual.

Exemplo utilizando a tabela de campos Memo padro (SYP):


FWMemoVirtual(oStruZA1, { { 'ZA0_CDSYP1' , 'ZA0_MMSYP1' } , { 'ZA0_CDSYP2' ,
'ZA0_MMSYP2' } })

Exemplo utilizando uma tabela customizada:


FWMemoVirtual( oStruZA1, { { 'ZA0_CDSYP1' , 'ZA0_MMSYP1', 'ZZ1' } , { 'ZA0_CDSYP2' ,
'ZA0_MMSYP2' , 'ZZ1'} } )

Importante: Tanto o campo MEMO quanto o campo que armazenar seu cdigo devem fazer parte da estrutura.

TOTVS - Microsiga Protheus MVC (Model View Controller) 31


Verso 1.0
TOTVS - Microsiga Protheus MVC (Model View Controller)

5.10 Criar um gatilho manualmente

possvel adicionar um gatilho a uma estrutura j existente, atravs do mtodo AddTrigger.

Os blocos de cdigo deste mtodo pendem uma construo especifica. Ao se atribuir ou manipular essas propriedades deve-se
informar no padro que o MVC espera.

Exemplo:

AddTrigger( cIdField , cTargetIdField, bPre, bSetValue )


cIdField - Nome (Id) do campo de origem
cTargetIdField - Nome (Id) do campo de destino
bPre - Bloco de cdigo de validao da execuo do gatilho
bSetValue - Bloco de cdigo de execuo do gatilho

Para facilitar a construo do gatilho foi criada a funo FwStruTrigger, que retorna um array com 4 elementos j formatados
para uso no AddTrigger.

Exemplo:

FwStruTrigger( cDom, cCDom, cRegra, lSeek, cAlias, nOrdem, cChave, cCondic, cSequen )

Exemplificando o cdigo:
Local oStruZA2 := FWFormStruct( 2, 'ZA2' ) // Retorna estrutura do View
aAux := FwStruTrigger('ZA2_AUTOR,'ZA2_NOME,'ZA0->ZA0_NOME,...) // Retorna gatilho
formatado

// Aplica gatilho na estrutura


oStruct:AddTrigger( ;
aAux[1] , ; // [01] Id do campo de origem
aAux[2] , ; // [02] Id do campo de destino
aAux[3] , ; // [03] Bloco de cdigo de validao da execuo do gatilho
aAux[4] ) // [04] Bloco de cdigo de execuo do gatilho

32 TOTVS - Microsiga Protheus MVC (Model View Controller)


Verso 1.0
TOTVS - Microsiga Protheus MVC (Model View Controller)

6 Rotinas automticas

Ol!
Seja bem vindo ao treinamento sobre MVC - Rotinas automticas.

6.1 Objetivos Instrucionais

Ao trmino deste treinamento voc aprender como utilizar Rotinas Automticas no MVC.

6.2 Descrio

A Rotina Automtica uma ferramenta que permite utilizar a estrutura de uma aplicao onde a Regra de Negcio j est
definida.

Desta forma, uma rotina customizada pode utilizar a estrutura de uma rotina j existente, economizando tempo e evitando erros
inerentes ao preenchimento incorreto de dados.

6.3 Modelos de uso

Durante o curso explicaremos duas formas de utilizar a estrutura do MVC para atualizar dados.

Atravs da funo FWMVCRotAuto, onde por motivos de legado, sero mantidas prticas de atualizao de dados j existentes,
evitando impactos a rotinas customizadas j escritas.

E, atravs do novo modelo de atualizao, padro este, que dever ser seguido por novas rotinas, utilizando a estrutura do Model
j definida em uma rotina.

6.4 FWMVCRotAuto

A funo FWMVCRotAuto foi desenvolvida para respeitar o legado da Rotina Automtica presente em rotinas antigas. E ser
usado principalmente na converso de aplicaes j existentes e que possuem o uso da rotina automtica.

No exemplo, a rotina MATA030_MVC recebe os parmetros xRotAuto, nOpcAuto, exatamente como a rotina MATA030 original.
Desta forma, as customizaes j escritas no sofrero impacto.

Caso estes parmetros tenham sido preenchidos, sero processados pela funo FWMVCRotAuto.

TOTVS - Microsiga Protheus MVC (Model View Controller) 33


Verso 1.0
TOTVS - Microsiga Protheus MVC (Model View Controller)

Exemplo:

Function MATA030_MVC(xRotAuto,nOpcAuto)
Local oMBrowse
If xRotAuto == NIL
oBrowse := FWMBrowse():New()
oBrowse:SetAlias('SA1')
oBrowse:SetDescription("Cadastro de Clientes")
oBrowse:Activate()
Else
aRotina := MenuDef()
FWMVCRotAuto(ModelDef(),"SA1",nOpcAuto,{{"MATA030_SA1",xRotAuto}})
Endif

A funo FWMVCRotAuto permite processar a atualizao de dados da mesma forma que a rotina MSEXECAUTO, utilizada em
verses anteriores.

Exemplo:

FWMVCRotAuto( oModel, cAlias, nOpcAuto, aAuto, lSeek, lPos )

6.5 Novo modelo de atualizao

Apresentamos um exemplo para criar uma rotina que utilizar a Regra de Negcio j definida no Model.

Preenchendo o array de Dados

// Array contendo dados do cabealho


aAdd(aCposCab,{'ZA1_TITULO, Titulo}) // Array bidimensional com nome e valor do campo
aAdd(aCposCab,{'ZA1_DATA', Date()})
// Array contendo dados dos itens
aAux := {} // primeiro item
aAdd(aAux, {'ZA2_ITEM' , '01})
aAdd(aAux, {'ZA2_AUTOR', '000100})
aAdd(aCposDet, aAux )
aAux := {} // segundo item
aAdd(aAux, {'ZA2_ITEM, '02})
aAdd(aAux, {'ZA2_AUTOR', '000104})
aAdd(aCposDet, aAux )

Essa a relao das propriedades possveis de serem alteradas no View.

MVC_VIEW_CANCHANGE Tipo: L
Descrio: Indica se o campo editvel
MVC_VIEW_COMBOBOX Tipo: A
Descrio: Lista de valores permitido do
campo (Combo)
MVC_VIEW_DESCR Tipo: C
Descrio: Descrio do campo

34 TOTVS - Microsiga Protheus MVC (Model View Controller)


Verso 1.0
TOTVS - Microsiga Protheus MVC (Model View Controller)

MVC_VIEW_FOLDER_NUMBER Tipo: C
Descrio: Pasta do campo
MVC_VIEW_GROUP_NUMBER Tipo: C
Descrio: Agrupamento do campo
MVC_VIEW_HELP Tipo: A
Descrio: Array com Help
MVC_VIEW_IDFIELD Tipo: C
Descrio: Nome do Campo
MVC_VIEW_INIBROW Tipo: C
Descrio: Inicializador de Browse
MVC_VIEW_LOOKUP Tipo: C
Descrio: Consulta F3
MVC_VIEW_MAXTAMCMB Tipo: N
Descrio: Tamanho Maximo da maior
opo do combo
MVC_VIEW_ORDEM Tipo: C
Descrio: Ordem
MVC_VIEW_PICT Tipo: C
Descrio: Picture
MVC_VIEW_PICTVAR Tipo: C
Descrio: Picture Varivel
MVC_VIEW_PVAR Tipo: B
Descrio: Bloco de Picture Variavel
MVC_VIEW_TITULO Tipo: C
Descrio: Titulo do campo
MVC_VIEW_VIRTUAL Tipo: L
Descrio: Indica se o campo virtual

6.6 Novo modelo de atualizao

Neste exemplo, apresentamos o novo modelo de atualizao.

Atribuindo valores aos itens no Model.


// Retorna estrutura dos Itens
oAux := oModel:GetModel('ZA2MASTER')
oStruct := oAux:GetStruct()
// Retorna campos da estrutura para validar sua existencia
aAux := oStruct:GetFields()
// Percorre array de Itens
For n := 1 To Len(aCposDet)
// A primeira linha dos itens, mesmo na incluso, sempre vem preenchida
// na FormGrid, necessrio verificar se estamos inserindo o primeiro item
If n > 1
// O mtodo AddLine, se bem sucedido, retorna a quantidade de linhas da Grid
// caso contrrio, retorna o cdigo erro referente a insero da linha.
If (nItErro := oAux:AddLine()) <> n
Alert(nItErro) // Exibe cdigo do erro e aborta rotina
Return
Endif
Endif

TOTVS - Microsiga Protheus MVC (Model View Controller) 35


Verso 1.0
TOTVS - Microsiga Protheus MVC (Model View Controller)

Continuando a insero de itens, percorremos o array que contm os dados. Lembrando que, a quantidade de itens, ir variar de
acordo com a rotina.

Veja no exemplo. Validamos a existncia do campo na estrutura e atribumos seu valor atravs do mtodo SetValue.
Se houver erro durante a execuo do mtodo SetValue, ser retornado falso.

Continuando a insero de itens.


...
// Percorre campos da linha do array de Itens
For nJ := 1 To Len( aCpoDetail[nI] )
// Verifica existencia do campo na estrutura dos itens
If aScan(aAux,{|x|AllTrim(x[3])==AllTrim(aCposDet[n,1])}) > 0
// Atribui valor ao campo
If !(oModel:SetValue( 'ZA2MASTER', aCposDet[n,nJ,1], aCposDet[n,nJ,2]))
// ERRO NA ATUALIZAO ABORTAR
EndIf
EndIf
Next nJ
Next n

No fechamento da rotina, validamos a insero de dados, atravs do mtodo VldData, que se retornar verdadeiro dar
sequncia gravao de dados por meio do mtodo CommitData.

Caso ocorram erros durante a validao, o mtodo GetErrorMessage retornar um vetor, contendo as informaes necessrias
para o tratamento do erro, sendo:

Cdigo do formulrio de origem.


Cdigo do campo de origem.
Cdigo do formulrio de erro.
Cdigo do campo de erro.
Cdigo do erro.
Mensagem do erro.
Mensagem da soluo.
Valor atribudo.

Valor anterior, caso estejamos em uma operao de alterao.

Validando a insero de dados e retornando possveis erros.


// Valida informaes preenchidas
If oModel:VldData()
// Se o dados foram validados efetiva a gravao
oModel:CommitData()
Else
// Retorna Erro
aErro := oModel:GetErrorMessage()
...
EndIf

36 TOTVS - Microsiga Protheus MVC (Model View Controller)


Verso 1.0
TOTVS - Microsiga Protheus MVC (Model View Controller)

7 Ponto de entrada

Ol!
Seja bem vindo ao treinamento sobre MVC - Ponto de Entrada.

7.1 Objetivos Instrucionais

Ao trmino deste treinamento voc aprender como utilizar Pontos de Entrada no MVC.

7.2 Descrio

Os Pontos de Entrada so desvios controlados executados no decorrer das aplicaes padro do sistema.

Ao se escrever uma aplicao utilizando o MVC, automaticamente j estaro disponveis pontos de entrada pr-definidos.

A idia de ponto de entrada, para fontes desenvolvidos utilizando-se o conceito de MVC e suas classes, um pouco diferente dos
fontes desenvolvidos de maneira convencional.

Nos fontes convencionais temos um "nome" para cada ponto de entrada criado.
Por exemplo, na rotina MATA010 Cadastro de Produtos, temos os pontos de entrada: MT010BRW, MTA010OK, MT010CAN etc.

Em MVC, no desta forma, criamos um nico ponto de entrada e este chamado em vrios momentos dentro do fonte
desenvolvido.

7.3 Conceito

Este Ponto de Entrada nico, deve ser uma User Function e ter como nome o ID do modelo de dados (Model) do fonte.

Por exemplo, um fonte do Mdulo Jurdico, JURA001. Neste fonte, o ID do modelo de dados (definido na funo ModelDef() )
tambm JURA001. Portanto, ao se escrever o ponto de entrada desta rotina, faramos como mostra o exemplo.

A Varivel Global PARAMIXB um array com informaes do Model. Ela pode variar dependendo do Ponto de Entrada disparado.

Importante: O segundo elemento do PARAMIXB o Id (nome) do Ponto de Entrada e o terceiro o Id do componente do


formulrio, atravs do Id do componente que disparou o Ponto de Entrada possvel diferenciar o tratamento das informaes.

A rotina customizada, utilizada como Ponto de Entrada, deve ser um User Function com o
Id (nome) do Model.
User Function JURA001()
Local aParam := PARAMIXB
Local xRet := .T.
// Ponto de entrada antes da alterao de qualquer campo do modelo
If aParam[2] == 'MODELPRE'
...
// Ponto de entrada na validao total do modelo
ElseIf aParam[2] == 'MODELPOS'

TOTVS - Microsiga Protheus MVC (Model View Controller) 37


Verso 1.0
TOTVS - Microsiga Protheus MVC (Model View Controller)

...
Endif
Return xRet

O Ponto de Entrada criado recebe, via parmetro (PARAMIXB), um vetor com informaes referentes ao fonte. Estes parmetros
variam para cada situao. Em comum, todos eles tem os 3 primeiros elementos.

POS. TIPO DESCRIO

1 O Objeto do formulrio ou do modelo, conforme o caso

2 C ID do local de execuo do ponto de entrada

3 C ID do formulrio

Como j foi dito, o Ponto de Entrada chamado em vrios momentos, dentro do fonte, na 2 posio da estrutura do vetor
passado um ID que identifica qual este momento.

38 TOTVS - Microsiga Protheus MVC (Model View Controller)


Verso 1.0
TOTVS - Microsiga Protheus MVC (Model View Controller)

8 WebService

Ol!
Seja bem vindo ao treinamento de MVC - WebService.

8.1 Objetivos Instrucionais

Ao trmino deste treinamento, voc aprender a construir uma rotina em ADVPL que utiliza o Webservice do MVC.

8.2 Descrio

Ao se desenvolver uma aplicao utilizando MVC, j estar disponvel um WebService para ser utilizado para o recebimento de
dados.

Todas as aplicaes em MVC utilizaro o mesmo WebService, independentemente de sua estrutura ou de quantas entidades ele
possua.

O WebService que est disponvel para o MVC o FWWSMODEL.

A idia bsica que iremos instanciar o WS, informar qual a aplicao que ser utilizada e informar os dados em um formato
XML.

8.3 Instanciando o Client do WebService

No incio do exemplo, instanciamos o Client do WebService que o WsFwWsModel.

Definimos a URL do WebService, para mais detalhes sobre WebServices consulte o TDN

Definimos o Model que ser utilizado a partir da propriedade cModelId, neste caso usaremos o COMP011_MVC.

// Instancia o WebService Genrico para Rotinas em MVC


oMVCWS := WsFwWsModel():New()
// URL onde esta o WebService FWWSModel do Protheus
oMVCWS:_URL := http://127.0.0.1:8080/ws/FWWSMODEL.apw
// Seta Atributos do WebService
oMVCWS:cModelId := 'COMP011_MVC' // Fonte de onde se usar o Model

8.4 Criando o XML com os dados

O XML com as informaes enviadas ir variar dependendo do Model utilizado.

<ID do Model>
<ID de Componente>

TOTVS - Microsiga Protheus MVC (Model View Controller) 39


Verso 1.0
TOTVS - Microsiga Protheus MVC (Model View Controller)

<ID de Campo>
contedo....
</ID de Campo
</ID de Componente>
</ID do Model>

Apresentamos um exemplo de XML para uma aplicao com uma entidade.

Exemplo de XML para uma aplicao com um entidade:


// Cria o XML com as informaes
cXML := '<?xml version="1.0" encoding="UTF-8"?>
cXML += '<COMP011M Operation= "3" version="1.01">
cXML += ' <ZA0MASTER modeltype="FIELDS" >
cXML += ' <ZA0_FILIAL order="1"><value>01</value></ZA0_FILIAL>
cXML += ' <ZA0_CODIGO order="2"><value>000100</value></ZA0_CODIGO>
cXML += ' <ZA0_NOME order="3"><value>Tom Jobim</value></ZA0_NOME>
cXML += ' </ZA0MASTER>
cXML += '</COMP011M>
oMVCWS:cModelXML := cXML

8.5 Validando e salvando as informaes

Esse trecho do fonte valida a informao preenchida no XML atravs do mtodo PutXMLData.

Caso haja algum erro, ele exibido atravs da propriedade cVldXMLDataResult e da funo WSError. Esta ltima, detalhar o erro
para correes necessrias.

// Valida e Grava os dados


If oMVCWS:PutXMLData()
If oMVCWS:lPutXMLDataResult
MsgInfo( 'Informao Importada com sucesso.')
Else
MsgStop( 'No importado' + CRLF + WSError() )
EndIf
Else
// Exibe mensagem de erro
MsgStop(oMVCWS:cVldXMLDataResult + CRLF + WSError())
EndIf

8.6 Mtodos disponveis

O mtodo GetXmlData retorna a estrutura XML necessria a uma aplicao MVC.

Exemplo:
...
oMVCWS:GetXMLData()
cXMLEstrut := oMVCWS:cGetXMLDataResult

Onde cXMLEstrut ser:


<?xml version="1.0" encoding="UTF-8"?>
<COMP011M Operation="1"
<ZA0MASTER modeltype="FIELDS" >
<ZA0_FILIAL order="1"><value></value></ZA0_FILIAL>

40 TOTVS - Microsiga Protheus MVC (Model View Controller)


Verso 1.0
TOTVS - Microsiga Protheus MVC (Model View Controller)

<ZA0_CODIGO order="2"><value></value></ZA0_CODIGO>
<ZA0_NOME order="3"><value></value></ZA0_NOME>
</ZA0MASTER>
</COMP011M>

O mtodo VldXMLData valida o XML construdo para o Model.

O mtodo VldXMLData valida as informaes contidas no XML construdo para o Model.

Exemplo:

If !oMVCWS:VldXMLData()
MsgStop( 'Problemas na validao dos dados' + CRLF + WSError() )
EndIf

O mtodo PutXMLData valida e grava as informaes contidas no XML construdo para o Model.

Exemplo:

If oMVCWS:PutXMLData()
If oMVCWS:lPutXMLDataResult
MsgInfo( 'Informao gravada com sucesso.' )
Else
MsgStop( 'Informao no gravada ' + CRLF + WSError() )
EndIf
Else
MsgStop( AllTrim( oMVCWS:cVldXMLDataResult ) + CRLF + WSError() )
EndIf

O mtodo GetSchema retorna a estrutura XSD para validao da estrutura do arquivo XML.
Veja o exemplo, onde a estrutura de validao XSD retornada a partir da propriedade cGetSchemaResult.

Exemplo:

If oMVCWS:GetSchema()
cXMLEsquema := oMVCWS:cGetSchemaResult
EndIf

TOTVS - Microsiga Protheus MVC (Model View Controller) 41


Verso 1.0
TOTVS - Microsiga Protheus MVC (Model View Controller)

9 Reutilizao do Modelo Dados e Interface

Ol!
Seja bem vindo ao treinamento sobre Reutilizao do Modelo Dados e Interface.

9.1 Objetivos Instrucionais

Ao trmino deste treinamento voc aprender como reutilizar modelo de dados e interfaces em aplicaes construdas em MVC.

9.2 Descrio

Uma das grandes vantagens na construo de aplicaes em MVC a possibilidade de reutilizao do Modelo de Dados (Model)
ou da Interface (View) em outras aplicaes, utilizando o conceito de herana.

Tanto podemos reutilizar os componentes que esto definidos, como tambm acrescentar novas entidades aos mesmos.

Para isso, precisamos instanciar o modelo de dados (Model) ou a interface (View) dentro da nova aplicao.

9.3 Apenas reutilizando os componentes

No exemplo, reutilizaremos o Modelo de Dados (Model) e a Interface (View) j existentes em uma aplicao, para a construo de
uma nova.

Usaremos as funes:

FWLoadModel.
FWLoadView.

Nos exemplos, a nova aplicao usar os mesmos componentes da aplicao j existente, no caso, o que est definido na
ModelDef do fonte COMP011_MVC.

Static Function ViewDef()


Local oModel := FWLoadModel( "COMP011_MVC" )
Return oModel

Na MenuDef da aplicao instanciamos a interface (View) de outra aplicao:


Static Function ViewDef()
Local oModel := FWViewModel( "COMP011_MVC" )
Return oModel

42 TOTVS - Microsiga Protheus MVC (Model View Controller)


Verso 1.0
TOTVS - Microsiga Protheus MVC (Model View Controller)

9.4 Reutilizando e complementando os componentes

Mostraremos agora como reutilizar um componente de MVC onde acrescentaremos novas entidades. S possvel acrescentar
novas entidades e no, retirar, pois se retirssemos alguma entidade estaramos quebrando a regra de negcios criada no modelo
original.

O ideal para este tipo de uso criarmos um modelo bsico e o incrementarmos conforme a necessidade.

Na reutilizao e complementao dos componentes, o primeiro passo criar a estrutura da nova entidade. Em seguida,
instanciamos o modelo j existente.

// Cria a estrutura a ser acrescentada no Modelo de Dados


Local oStruZA6 := FWFormStruct( 1, 'ZA6', /*bAvalCampo*/, /*lViewUsado*/ )

Instanciamos o modelo j existente.

// Inicia o Model com um Model j existente


Local oModel := FWLoadModel( 'COMP011_MVC' )

No nosso exemplo, acrescentaremos um novo formulrio.

Note que, em nossa nova aplicao, no usamos o MPFormModel, pois estamos apenas acrescentando entidade. O
MPFormModel foi usado na aplicao original.

Fazemos tambem o relacionamento do novo formulrio.

// Adiciona a nova FORMFIELD


oModel:AddFields( 'ZA6MASTER', 'ZA0MASTER', oStruZA6 )

Fazemos o relacionamento do novo formulrio.

// Faz relacionamento entre os compomentes do model


oModel:SetRelation( 'ZA6MASTER', { { 'ZA6_FILIAL', 'xFilial( "ZA6" )' }, { 'ZA6_CODIGO',
'ZA0_CODIGO' } }, ZA6->( IndexKey( 1 ) ) )

Adicionamos a descrio do novo formulrio.

E, ao final, retornamos o novo modelo.

Desta forma, criamos um modelo a partir de outro e acrescentamos um novo componente de formulrio.

// Adiciona a descricao do novo componente


oModel:GetModel( 'ZA6MASTER' ):SetDescription( 'Complemento dos Dados de
Autor/Interprete' )

E, ao final, retornamos o novo modelo.

Return oModel

Veremos agora como reutilizar a interface (View), tambm acrescentando um novo componente.

O primeiro passo criar a estrutura da nova entidade.

TOTVS - Microsiga Protheus MVC (Model View Controller) 43


Verso 1.0
TOTVS - Microsiga Protheus MVC (Model View Controller)

Instanciaremos o modelo utilizado, pela interface. Note que, no instanciaremos o modelo original, mas o modelo da nova
aplicao que j tem o novo componente acrescido em seu modelo de dados.

O primeiro passo criar a estrutura da nova entidade:


// Cria a estrutura a ser acrescentada na View
Local oStruZA6 := FWFormStruct( 2, 'ZA6' )

Instanciaremos o modelo utilizado pela interface. Note, que no instanciaremos o modelo original e, sim, o modelo da nova
aplicao que j tem o novo componente acrescido em seu modelo de dados.

// Cria um objeto de Modelo de Dados baseado no ModelDef do fonte informado


Local oModel := FWLoadModel( 'COMP015_MVC' )

Instanciamos a interface original:

Adicionamos o novo componente da View e associamos ao definido no modelo.

// Inicia a View com uma View ja existente


Local oView := FWLoadView( 'COMP011_MVC' )

Adicionamos o novo componente da view e associamos ao definido no modelo.

// Adiciona no nosso View um controle do tipo FormFields(antiga enchoice)


oView:AddField( 'VIEW_ZA6', oStruZA6, 'ZA6MASTER' )

Temos que criar um box para o novo componente. preciso criar sempre um box vertical dentro de um horizontal e vice-versa.
Como na COMP011_MVC o box j existente horizontal, cria-se um vertical primeiro.

// 'TELANOVA' o box existente na interface original


oView:CreateVerticallBox( 'TELANOVA' , 100, 'TELA' )

// Novos Boxes
oView:CreateHorizontalBox( 'SUPERIOR' , 50, 'TELANOVA' )
oView:CreateHorizontalBox( 'INFERIOR' , 50, 'TELANOVA' )

Relacionado os componente com os box de exibio e, ao final, retornamos o novo objeto de interface.

oView:SetOwnerView( 'VIEW_ZA0', 'SUPERIOR' )


oView:SetOwnerView( 'VIEW_ZA6', 'INFERIOR' )

E, ao final, retornamos o novo objeto de interface.

Return oView

Com isso, criamos uma interface a partir de outra e acrescentamos um novo componente.

Um exemplo de aplicao para este conceito seria a internacionalizao, onde poderamos ter um modelo bsico e o
incrementaramos conforme a localizao.

44 TOTVS - Microsiga Protheus MVC (Model View Controller)


Verso 1.0
TOTVS - Microsiga Protheus MVC (Model View Controller)

10 Concluso

Com isso, criamos uma interface a partir de outra e acrescentamos um novo componente.

Um exemplo de aplicao para este conceito seria a internacionalizao, onde poderamos ter um modelo bsico e o
incrementaramos conforme a localizao.

TOTVS - Microsiga Protheus MVC (Model View Controller) 45


Verso 1.0

Você também pode gostar