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 1.1 1.2 1.3 1.4 1.5 1.6 2 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 Conceitos Bsicos................................................................................................................... 5 Objetivos Instrucionais........................................................................................................... 5 Conceitos ............................................................................................................................... 5 Componentes ........................................................................................................................ 5 Model .................................................................................................................................... 6 View ...................................................................................................................................... 6 Controller .............................................................................................................................. 6 Aplicao ............................................................................................................................... 7 Principais Funes.................................................................................................................. 7 Benefcios .............................................................................................................................. 7 Estrutura ................................................................................................................................ 7 ModelDef............................................................................................................................... 7 ViewDef ................................................................................................................................. 8 MenuDef ............................................................................................................................... 9 Novo comportamento na interface ........................................................................................ 10 Aplicaes com Browse.......................................................................................................... 10 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

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

TOTVS - Microsiga Protheus MVC (Model View Controller)

3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9

Objetivos Instrucionais........................................................................................................... 15 Descrio ............................................................................................................................... 15 Mensagens exibidas na interface ........................................................................................... 15 Obtendo um componente do Modelo de Dados..................................................................... 16 Validaes ............................................................................................................................. 16 Ps-validao do Modelo ....................................................................................................... 16 Ps-validao de Linha ........................................................................................................... 16 Validao de linha duplicada .................................................................................................. 17 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 4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8 4.9 5 5.1 5.2 Tratamentos de Interface....................................................................................................... 25 Objetivos Instrucionais........................................................................................................... 25 Descrio ............................................................................................................................... 25 Campo Incremental ............................................................................................................... 25 Criar um boto na barra de botes ........................................................................................ 25 Ttulo do componente............................................................................................................ 25 Edio dos campos do componente de Grid ........................................................................... 26 Criao de pastas ................................................................................................................... 26 Agrupamentos de campos ..................................................................................................... 27 Ao de interface ................................................................................................................... 27 Tratamentos estrutura de dados ............................................................................................ 28 Objetivos Instrucionais........................................................................................................... 28 Descrio ............................................................................................................................... 28
TOTVS - Microsiga Protheus MVC (Model View Controller) Verso 1.0 3

TOTVS - Microsiga Protheus MVC (Model View Controller)

5.3 5.4 5.5 5.6 5.7 5.8 5.9

Selecionar campos para a estrutura ....................................................................................... 28 Remover um campo da Estrutura ........................................................................................... 28 Alterar propriedade do campo ............................................................................................... 29 Criar campos adicionais - Model............................................................................................. 30 Criar campos adicionais - View ............................................................................................... 31 Formatar bloco de cdigo para a estrutura ............................................................................ 31 Campos do tipo MEMO virtuais.............................................................................................. 31

5.10 Criar um gatilho manualmente............................................................................................... 32 6 6.1 6.2 6.3 6.4 6.5 6.6 7 7.1 7.2 7.3 8 8.1 8.2 8.3 8.4 8.5 8.6 9 9.1 9.2 9.3 9.4 10 Rotinas automticas............................................................................................................... 33 Objetivos Instrucionais........................................................................................................... 33 Descrio ............................................................................................................................... 33 Modelos de uso ..................................................................................................................... 33 FWMVCRotAuto..................................................................................................................... 33 Novo modelo de atualizao .................................................................................................. 34 Novo modelo de atualizao .................................................................................................. 35 Ponto de entrada ................................................................................................................... 37 Objetivos Instrucionais........................................................................................................... 37 Descrio ............................................................................................................................... 37 Conceito ................................................................................................................................ 37 WebService............................................................................................................................ 39 Objetivos Instrucionais........................................................................................................... 39 Descrio ............................................................................................................................... 39 Instanciando o Client do WebService ..................................................................................... 39 Criando o XML com os dados ................................................................................................. 39 Validando e salvando as informaes..................................................................................... 40 Mtodos disponveis .............................................................................................................. 40 Reutilizao do Modelo Dados e Interface ............................................................................. 42 Objetivos Instrucionais........................................................................................................... 42 Descrio ............................................................................................................................... 42 Apenas reutilizando os componentes ..................................................................................... 42 Reutilizando e complementando os componentes ................................................................. 43 Concluso .............................................................................................................................. 45

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

TOTVS - Microsiga Protheus MVC (Model View Controller)

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) 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.

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

TOTVS - Microsiga Protheus MVC (Model View Controller)

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) 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( aAdd( aAdd( aAdd( aAdd( aAdd( aRotina, aRotina, aRotina, aRotina, aRotina, aRotina, { { { { { { 'Visualizar', 'Incluir' , 'Alterar' , 'Excluir' , 'Imprimir' , 'Copiar' , 'VIEWDEF.COMP021_MVC', 'VIEWDEF.COMP021_MVC', 'VIEWDEF.COMP021_MVC', 'VIEWDEF.COMP021_MVC', 'VIEWDEF.COMP021_MVC', 'VIEWDEF.COMP021_MVC', 0, 0, 0, 0, 0, 0, 2, 3, 4, 5, 8, 9, 0, 0, 0, 0, 0, 0, NIL NIL NIL NIL NIL 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) 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) Verso 1.0

11

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') 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

// Cria a estrutura a ser usada no Modelo de

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 Local Local Local oModel := FWLoadModel('COMP021_MVC') // Retorna objeto com estrutura do Model oStruZA1 := FWFormStruct(2, 'ZA1') // Cria a estruturas a serem usada na View oStruZA2 := FWFormStruct(2, 'ZA2') 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: 13

TOTVS - Microsiga Protheus MVC (Model View Controller) 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)

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) Verso 1.0

15

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 Psvalidao 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 001 002 001

01/01/11 02/01/11 02/01/11 01/01/11

Ok Ok Ok 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) Verso 1.0

17

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) Verso 1.0 19

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 Local Local Local oModel oModelZA2 nI aSaveLines := := := := FWModelActive() oModel:GetModel( 'ZA2DETAIL' ) 0 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) Verso 1.0 21

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) Verso 1.0 23

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)

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) Verso 1.0 25

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) Verso 1.0

27

TOTVS - Microsiga Protheus MVC (Model View Controller)

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 MODEL_FIELD_IDFIELD MODEL_FIELD_INIT MODEL_FIELD_KEY MODEL_FIELD_NOUPD Tipo: N Descrio: Decimais Tipo: C Descrio: Nome (ID) Tipo: B Descrio: Inicializador padro Tipo: L Descrio: Indica se o campo chave Tipo: L Descrio: Indica se o campo pode receber valor em uma operao de update Tipo: L Descrio: Indica se o campo tem preenchimento obrigatrio Tipo: N Descrio: Tamanho Tipo: C Descrio: Tipo Tipo: C Descrio: Ttulo Tipo: C Descrio: Descrio completa do campo Tipo: B Descrio: Validao Tipo: A Descrio: Lista de valores permitidos do campo (combo) Tipo: L Descrio: Indica se o campo virtual Tipo: B Descrio: Modo de edio

MODEL_FIELD_OBRIGAT

MODEL_FIELD_TAMANHO MODEL_FIELD_TIPO MODEL_FIELD_TITULO MODEL_FIELD_TOOLTIP MODEL_FIELD_VALID MODEL_FIELD_VALUES

MODEL_FIELD_VIRTUAL MODEL_FIELD_WHEN

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

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

29

TOTVS - Microsiga Protheus MVC (Model View Controller)

MVC_VIEW_CANCHANGE MVC_VIEW_COMBOBOX

MVC_VIEW_DESCR MVC_VIEW_FOLDER_NUMBER MVC_VIEW_GROUP_NUMBER MVC_VIEW_HELP MVC_VIEW_IDFIELD MVC_VIEW_INIBROW MVC_VIEW_LOOKUP MVC_VIEW_MAXTAMCMB

MVC_VIEW_ORDEM MVC_VIEW_PICT MVC_VIEW_PICTVAR MVC_VIEW_PVAR MVC_VIEW_TITULO MVC_VIEW_VIRTUAL

Tipo: L Descrio: Indica se o campo editvel Tipo: A Descrio: Lista de valores permitido do campo (Combo) Tipo: C Descrio: Descrio do campo Tipo: C Descrio: Pasta do campo Tipo: C Descrio: Agrupamento do campo Tipo: A Descrio: Array com Help Tipo: C Descrio: Nome do Campo Tipo: C Descrio: Inicializador de Browse Tipo: C Descrio: Consulta F3 Tipo: N Descrio: Tamanho Maximo da maior opo do combo Tipo: C Descrio: Ordem Tipo: C Descrio: Picture Tipo: C Descrio: Picture Varivel Tipo: B Descrio: Bloco de Picture Variavel Tipo: C Descrio: Titulo do campo 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) Verso 1.0

31

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)

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) Verso 1.0

33

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 MVC_VIEW_COMBOBOX Tipo: L Descrio: Indica se o campo editvel Tipo: A Descrio: Lista de valores permitido do campo (Combo) Tipo: C Descrio: Descrio do campo

MVC_VIEW_DESCR

34

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

TOTVS - Microsiga Protheus MVC (Model View Controller)

MVC_VIEW_FOLDER_NUMBER MVC_VIEW_GROUP_NUMBER MVC_VIEW_HELP MVC_VIEW_IDFIELD MVC_VIEW_INIBROW MVC_VIEW_LOOKUP MVC_VIEW_MAXTAMCMB

MVC_VIEW_ORDEM MVC_VIEW_PICT MVC_VIEW_PICTVAR MVC_VIEW_PVAR MVC_VIEW_TITULO MVC_VIEW_VIRTUAL

Tipo: C Descrio: Pasta do campo Tipo: C Descrio: Agrupamento do campo Tipo: A Descrio: Array com Help Tipo: C Descrio: Nome do Campo Tipo: C Descrio: Inicializador de Browse Tipo: C Descrio: Consulta F3 Tipo: N Descrio: Tamanho Maximo da maior opo do combo Tipo: C Descrio: Ordem Tipo: C Descrio: Picture Tipo: C Descrio: Picture Varivel Tipo: B Descrio: Bloco de Picture Variavel Tipo: C Descrio: Titulo do campo 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) Verso 1.0

35

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)

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) Verso 1.0 37

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. 1 2 3 TIPO O C C DESCRIO Objeto do formulrio ou do modelo, conforme o caso ID do local de execuo do ponto de entrada 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)

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) Verso 1.0 39

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' EndIf

+ CRLF + WSError() )

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) Verso 1.0

41

TOTVS - Microsiga Protheus MVC (Model View Controller)

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) Verso 1.0

43

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) Verso 1.0

45

Você também pode gostar