Escolar Documentos
Profissional Documentos
Cultura Documentos
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
1 Conceitos Bsicos
Ol!
Seja bem vindo ao treinamento MVC: Conceito.
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".
1.3 Componentes
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.
1.4 Model
Caractersticas do Model:
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:
1.6 Controller
Caractersticas do Controller:
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.
2 Aplicao
Ol!
Ao trmino deste treinamento voc aprender como utilizar a arquitetura MVC no AdvPL.
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:
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
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.
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.
oView:CreateHorizontalBox('TELA' , 100)
// Relaciona o ID da View com o "box" para exibio
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).
Sempre referenciaremos a Viewdef de um fonte, pois ela a funo responsvel pela a interface da aplicao.
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.
Return aRotina
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.
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.
Filtro configurvel.
Configurao de colunas e aparncia.
Impresso.
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')
Ativa-se a classe:
oBrowse:Activate()
Para o uso de legendas no Browse utilizamos o mtodo AddLegend, que possui a seguinte sintaxe:
Por exemplo:
oBrowse:AddLegend( "ZA0_TIPO=='1'", "YELLOW", "Autor" )
oBrowse:AddLegend( "ZA0_TIPO=='2'", "BLUE" , "Interprete" )
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
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.
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).
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.
Por exemplo:
oBrowse:SetFilterDefault( "ZA0_TIPO=='1'" )
Ou
oBrowse:SetFilterDefault( "Empty(ZA0_DTAFAL)" )
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()
Iremos criar agora uma aplicao utilizando a arquitetura MVC. Seguindo o modelo MVC veremos como construir as funes:
ModelDef.
ViewDef.
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
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.
Exemplo:
Ol!
Seja bem vindos ao treinamento MVC (Model-View-Controller): Modelo de Dados.
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.
Validaes.
Comportamentos.
Manipulao da Grids.
Obteno e atribuio de valores ao modelo de dados (Model) .
Gravao manual de dados.
Regras de preenchimento.
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.
Por exemplo:
If nPrcUnit == 0 // Preco unitario
Help( ,, 'Help',, 'Preco unitario nao informado.', 1, 0 )
EndIf
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).
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.
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.
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.
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.
ZA2_AUTOR ZA2_DATA
001 01/01/11 Ok
001 02/01/11 Ok
002 02/01/11 Ok
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.
Return lRet
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.
For nI := 1 To oModelZA2:Length()
// Segue a funcao ...
Next nI
nLinhas := oModelZA2:Length( .T. ) // Quantidade linhas no apagadas
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.
For nI := 1 To oModelZA2:Length()
oModelZA2:GoLine( nI )
// Segue a funo ...
Next nI
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.
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.
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..
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.
If !oModelZA2:IsDeleted()
oModelZA2:DeleteLine()
EndIf
Next
// Para recuperar use oModelZA2:UnDeleteLine()
Se quisermos limitar que em uma linha Grid possa ser inserida, alterada ou apagada, para fazermos uma consulta, por exemplo,
utilizamos os seguintes mtodos:
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.
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.
For nI := 1 To oModelZA2:Length()
oModelZA2:GoLine( nI )
// Segue a funo
Next
FWRestRows( aSaveLine )
As operaes mais comuns que faremos em um Modelo de Dados (Model) obter e atribuir valores.
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 )
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
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.
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.
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.
Para sabermos a operao com que um Modelo de Dados (Model) est trabalhando, usamos o mtodo GetOperation.
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()
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'
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.
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.
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.
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.
4 Tratamentos de Interface
Ol!
Seja bem vindo ao treinamento MVC (Model-View-Controller): Tratamentos de Interface.
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.
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.
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.
Para a criao de botes adicionais, na barra de botes da interface, utilizamos o mtodo AddUserButton.
No MVC podemos atribuir um ttulo para identificar cada componente da interface, por meio do mtodo EnableTitleView.
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.
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.
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:
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:
// Agrupando os campos
oStruZA0:SetProperty( '*' , MVC_VIEW_GROUP_NUMBER, 'GRUPO01' )
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.
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.
Ol!
Seja bem vindo ao treinamento sobre MVC: Tratamentos estrutura de dados.
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.
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:
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.
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.
Se houver a necessidade de mudar alguma propriedade do campo na estrutura, o mtodo SetProperty dever ser utilizado.
Exemplo:
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.
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
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
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).
Importante: Os campos do tipo lgico sero exibidos atravs de um componente do tipo Seleo (checkbox), na View.
Exemplo:
Algumas propriedades dos campos da estrutura pedem uma construo especifica de bloco de cdigo, fazemos isso atravs da
funo FwBuildFeature.
Exemplo:
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.
Importante: Tanto o campo MEMO quanto o campo que armazenar seu cdigo devem fazer parte da estrutura.
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:
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
6 Rotinas automticas
Ol!
Seja bem vindo ao treinamento sobre MVC - Rotinas automticas.
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.
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.
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:
Apresentamos um exemplo para criar uma rotina que utilizar a Regra de Negcio j definida no Model.
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
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.
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:
7 Ponto de entrada
Ol!
Seja bem vindo ao treinamento sobre MVC - Ponto de Entrada.
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.
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'
...
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.
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.
8 WebService
Ol!
Seja bem vindo ao treinamento de MVC - WebService.
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.
A idia bsica que iremos instanciar o WS, informar qual a aplicao que ser utilizada e informar os dados em um formato
XML.
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.
<ID do Model>
<ID de Componente>
<ID de Campo>
contedo....
</ID de Campo
</ID de Componente>
</ID do Model>
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.
Exemplo:
...
oMVCWS:GetXMLData()
cXMLEstrut := oMVCWS:cGetXMLDataResult
<ZA0_CODIGO order="2"><value></value></ZA0_CODIGO>
<ZA0_NOME order="3"><value></value></ZA0_NOME>
</ZA0MASTER>
</COMP011M>
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
Ol!
Seja bem vindo ao treinamento sobre Reutilizao do Modelo Dados e Interface.
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.
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.
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.
Note que, em nossa nova aplicao, no usamos o MPFormModel, pois estamos apenas acrescentando entidade. O
MPFormModel foi usado na aplicao original.
Desta forma, criamos um modelo a partir de outro e acrescentamos um novo componente de formulrio.
Return oModel
Veremos agora como reutilizar a interface (View), tambm acrescentando um novo componente.
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.
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.
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.
// 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.
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.
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.