134
 AdvPl utilizando MVC  1 AdvPl utilizando MVC A arquitetura Model-View-Controller  ou MVC, como é mais conhecida, é um padrão de arquitetura de software que visa separar a lógica de negócio da lógica de apresentação (a interface), permitindo o desenvolvimento, teste e manutenção isolada de ambos. Aqueles que já desenvolveram uma aplicação em AdvPL vão perceber, que justamente a diferença mais importante entre a forma de construir uma aplicação em MVC e a forma tradicional, é essa separação e que vai permitir o uso da regra de negócio em aplicações que tenham ou não interfaces, como Web Services e aplicação automática, bem como seu reuso em outras aplicações.

0102 Apostila de MVC.pdf

Embed Size (px)

Citation preview

  • 5/19/2018 0102 Apostila de MVC.pdf

    1/134

    AdvPl utilizando MVC 1

    AdvPl utilizando MVC

    A arquitetura Model-View-Controller ou MVC, como mais conhecida, um padro dearquitetura de software que visa separar a lgica de negcio da lgica de apresentao (ainterface), permitindo o desenvolvimento, teste e manuteno isolada de ambos.

    Aqueles que j desenvolveram uma aplicao em AdvPL vo perceber, que justamente adiferena mais importante entre a forma de construir uma aplicao em MVC e a formatradicional, essa separao e que vai permitir o uso da regra de negcio em aplicaes quetenham ou no interfaces, como Web Servicese aplicao automtica, bem como seu reuso emoutras aplicaes.

  • 5/19/2018 0102 Apostila de MVC.pdf

    2/134

    2 - AdvPl utilizando MVC

    ndiceAdvPl utilizando MVC ......................................................................................................................................... 1

    ndice .................................................................................................................................................................. 2

    1.Arquitetura MVC ............................................................................................................................................. 62.Principais funes da aplicao emAdvPLutilizando o MVC......................................................................... 7

    2.1 O que a funo ModelDef? .................................................................................................................... 7

    2.2 O que a funo ViewDef? ...................................................................................................................... 8

    2.3 O que a funo MenuDef?..................................................................................................................... 8

    2.4 Novo comportamento na interface ........................................................................................................ 10

    3.Aplicaes com Browses (FWMBrowse) ....................................................................................................... 10

    3.1 Construo de um Browse ..................................................................................................................... 10

    3.2 Construo bsica de um Browse .......................................................................................................... 10

    3.3 Legendas de um Browse (AddLegend) ................................................................................................... 11

    3.4 Filtros de um Browse (SetFilterDefault) ................................................................................................. 12

    3.5 Desabilitao de detalhes do Browse (DisableDetails) .......................................................................... 12

    3.6 Campos virtuais no Browse .................................................................................................................... 12

    3.7 Exemplo completo de Browse ................................................................................................................ 13

    4.Construo de aplicaoAdvPLutilizando MVC ........................................................................................... 13

    5.Construo de aplicao MVCcom uma entidade ....................................................................................... 14

    5.1 Construo de uma estrutura de dados (FWFormStruct) ...................................................................... 14

    5.2 Construo da funo ModelDef............................................................................................................ 15

    5.3 Criao de um componente de formulrios no modelo de dados (AddFields) ..................................... 16

    5.4 Descrio dos componentes do modelo de dados (SetDescription) ..................................................... 16

    5.5 Finalizao de ModelDef ........................................................................................................................ 16

    5.6 Exemplo completo da ModelDef ............................................................................................................ 16

    5.7 Construo da funo ViewDef .............................................................................................................. 17

    5.8 Criao de um componente de formulrios na interface (AddField) ..................................................... 18

    5.9 Exibio dos dados na interface (CreateHorizontalBox / CreateVerticalBox) ........................................ 18

    5.10 Relacionando o componente da interface (SetOwnerView) ................................................................ 18

    5.11 Finalizao da ViewDef ......................................................................................................................... 19

    5.12 Exemplo completo da ViewDef ............................................................................................................ 19

  • 5/19/2018 0102 Apostila de MVC.pdf

    3/134

    AdvPl utilizando MVC 3

    5.13 Finalizao da criao da aplicao com uma entidade ...................................................................... 19

    6.Construo de uma aplicao MVCcom duas ou mais entidades ................................................................ 20

    6.1 Construo de estruturas para uma aplicao MVC com duas ou mais entidades ............................... 20

    6.2 Construo de uma funo ModelDef ................................................................................................... 20

    6.3 Criao de um componente de formulrios no modelo de dados (AddFields) ..................................... 21

    6.4 Criao de um componente de grid no Modelo de dados (AddGrid) .................................................... 21

    6.5 Criao de relao entre as entidades do modelo (SetRelation) ........................................................... 22

    6.6 Definio da chave primria (SetPrimaryKey) ........................................................................................ 22

    6.7 Descrevendo os componentes do modelo de dados (SetDescription) .................................................. 22

    6.8 Finalizao da ModelDef ........................................................................................................................ 23

    6.9 Exemplo completo da ModelDef ............................................................................................................ 23

    6.10 Construo da funo ViewDef ............................................................................................................ 246.11 Criao de um componente de formulrios na interface (AddField) ................................................... 24

    6.12 Criao de um componente de grid na interface (AddGrid) ................................................................ 24

    6.13 Exibio dos dados na interface (CreateHorizontalBox / CreateVerticalBox) ...................................... 25

    6.14 Relacionando o componente da interface (SetOwnerView) ................................................................ 26

    6.15 Finalizao da ViewDef ......................................................................................................................... 26

    6.16 Exemplo completo da ViewDef ............................................................................................................ 26

    6.17 Finalizao da criao da aplicao com duas ou mais entidades ....................................................... 27

    7.Tratamentos para o modelo de dados e para interface................................................................................ 28

    8.Tratamentos para o modelo de dados .......................................................................................................... 28

    8.1 Mensagens exibidas na interface ........................................................................................................... 28

    8.2 Obteno de componente do modelo de dados (GetModel) ................................................................ 29

    8.3 Validaes ............................................................................................................................................... 29

    8.3.3 Validao de linha duplicada (SetUniqueLine) ................................................................................ 30

    8.3.5 Validao da ativao do modelo (SetVldActive) ............................................................................ 32

    8.4 Manipulao da componente de grid .................................................................................................... 32

    8.4.1 Quantidade de linhas do componente de grid (Length) ................................................................. 32

    8.4.2 Ir para uma linha do componente de grid (GoLine) ........................................................................ 33

    8.4.3 Status da linha de um componente de grid .................................................................................... 33

    8.4.4 Adio uma linha a grid (AddLine)................................................................................................... 34

    8.4.5 Apagando e recuperando uma linha da grid (DeleteLine e UnDeleteLine) ..................................... 35

  • 5/19/2018 0102 Apostila de MVC.pdf

    4/134

    4 - AdvPl utilizando MVC

    8.4.6 Permisses para uma grid ............................................................................................................... 35

    8.4.7 Permisso de grid sem dados (SetOptional) ................................................................................... 36

    8.4.8 Guardando e restaurando o posicionamento do grid (FWSaveRows / FWRestRows ) ................... 36

    8.4.9 Definio da quantidade mxima de linhas do grid (SetMaxLine) .................................................. 37

    8.5 Obteno e atribuio de valores ao modelo de dados ......................................................................... 37

    8.6 Comportamento ..................................................................................................................................... 39

    8.6.1 Alterao de dados de um componente no modelo de dados (SetOnlyView) ............................... 39

    8.6.2 No gravar dados de um componente do modelo de dados (SetOnlyQuery) ................................ 39

    8.6.3 Obteno da operao que est sendo realizada (GetOperation) ................................................. 39

    8.6.4 Gravao manual de dados (FWFormCommit) ............................................................................... 40

    8.7 Regras de preenchimento (AddRules) .................................................................................................... 41

    9.Tratamentos de interface .............................................................................................................................. 429.1 Campo Incremental (AddIncrementField) .............................................................................................. 42

    9.2 Criao de botes na barra de botes (AddUserButton) ....................................................................... 43

    9.3 Ttulo do componente (EnableTitleView) ............................................................................................... 44

    9.4 Edio de Campos no componente de grid (SetViewProperty) ............................................................. 45

    9.5 Criao de pastas (CreateFolder) ........................................................................................................... 46

    9.6 Agrupamento de campos (AddGroup) ................................................................................................... 48

    9.7 Ao de interface (SetViewAction) ......................................................................................................... 50

    9.8 Ao de interface do campo (SetFieldAction) ........................................................................................ 51

    9.9 Outros objetos (AddOtherObjects) ........................................................................................................ 51

    10.Tratamentos de estrutura de dados ........................................................................................................... 55

    10.1 Seleo de campos para a estrutura (FWFormStruct) ......................................................................... 55

    10.2 Remoo de campos da estrutura (RemoveField) ............................................................................... 56

    10.3 Alterao de propriedades do campo (SetProperty) ........................................................................... 56

    10.4 Criao de campos adicionais na estrutura (AddField) ........................................................................ 58

    10.5 Formatao de bloco de cdigo para a estrutura (FWBuildFeature) ................................................... 61

    10.6 Campos do tipo MEMO virtuais (FWMemoVirtual) ............................................................................. 62

    10.7 Criao manual de gatilho (AddTrigger / FwStruTrigger) ..................................................................... 63

    10.8 Retirando as pastas de uma estrutura (SetNoFolder) .......................................................................... 64

    10. 9 Retirando os agrupamentos de campos de uma estrutura (SetNoGroups) ........................................ 64

    11.Criao de campos de total ou contadores (AddCalc) ................................................................................ 64

  • 5/19/2018 0102 Apostila de MVC.pdf

    5/134

    AdvPl utilizando MVC 5

    12.Outras funes para MVC ........................................................................................................................... 68

    12.1 Execuo direta da interface (FWExecView) ........................................................................................ 68

    12.2 Modelo de dados ativo (FWModelActive) ........................................................................................... 69

    12.3 Interface ativa (FWViewActive) ............................................................................................................ 69

    12.4 Carregar o modelo de dados de uma aplicao j existente (FWLoadModel) .................................... 69

    12.5 Carregar a interface de uma aplicao j existente (FWLoadView) .................................................... 70

    12.6 Carregar a menu de uma aplicao j existente (FWLoadMenudef) ................................................... 70

    12.7 Obteno de menu padro (FWMVCMenu) ........................................................................................ 70

    13.Browse com coluna de marcao (FWMarkBrowse) .................................................................................. 71

    14.Mltiplos Browses ....................................................................................................................................... 75

    15.Rotina automtica ....................................................................................................................................... 82

    16.Pontos de entrada no MVC ......................................................................................................................... 9417.Web Services para MVC ............................................................................................................................ 101

    17.1 Web Service para modelos de dados que possuem uma entidade ................................................... 101

    17.2 Instnciamento do Client de Web Service ......................................................................................... 101

    17.3 A estrutura do XML utilizada .............................................................................................................. 101

    17.4 Obtendo a estrutura XML de um modelo de dados (GetXMLData) ................................................... 103

    17.5 Informando os dados XML ao Web Service ....................................................................................... 104

    17.6 Validando os dados (VldXMLData) ..................................................................................................... 104

    17.7 Validando e gravando os dados (PutXMLData) .................................................................................. 105

    17.8 Obtendo o esquema XSD de um modelo de dados (GetSchema) ...................................................... 105

    17.9 Exemplo completo de Web Service .................................................................................................... 106

    17.10 Web Services para modelos de dados que possuem duas ou mais entidades ................................ 107

    18.Uso do comando New Model .................................................................................................................... 111

    18.1 Sintaxe da New Model ....................................................................................................................... 111

    19.Reutilizando um modelo de dados ou interfacej existentes .................................................................. 124

    19.1 Apenas reutilizando os componentes ................................................................................................ 124

    19.2 Reutilizando e complementando os componentes............................................................................ 125

    19.3 Exemplo completo de uma aplicao que reutiliza componentes de modelo e interface ................ 129

    Apndice A ..................................................................................................................................................... 131

    ndice Remissivo ............................................................................................................................................. 133

  • 5/19/2018 0102 Apostila de MVC.pdf

    6/134

    6 - AdvPl utilizando MVC

    1.Arquitetura MVC

    Primeiramente vamos entender o que a arquitetura MVC.

    A arquitetura Model-View-Controller ou MVC, como mais conhecida, um padro dearquitetura de software que visa separar a lgica de negcio da lgica de apresentao (ainterface), permitindo o desenvolvimento, teste e manuteno isolados de ambos.

    Aqueles que j desenvolveram uma aplicao em AdvPL vo perceber, que justamente adiferena mais importante entre a forma de construir uma aplicao em MVC e a formatradicional essa separao.

    E ela que vai permitir o uso da regra de negcio em aplicaes que tenham ou no interfaces,como Web Services e aplicao automtica, bem como seu reuso em outras aplicaes.

    A arquitetura MVCpossui trs componentes bsicos:

    Model ou modelo de dados: representa as informaes do domnio do aplicativo e fornece

    funes para operar os dados, isto , ele contm as funcionalidades do aplicativo. Neledefinimos as regras de negcio: tabelas, campos, estruturas, relacionamentos etc.. O modelode dados (Model) tambm responsvel por notificar a interface (View) quando os dadosforem alterados.

    View ou interface: responsvel por renderizar o modelo de dados (Model) e possibilitar ainterao do usurio, ou seja, o responsvel por exibir os dados.

    Controller: responde s aes dos usurios, possibilita mudanas no Modelo de dados (Model)e seleciona a Viewcorrespondente.

    Para facilitar e agilizar o desenvolvimento, na implementao do MVC feita no AdvPL, odesenvolvedor trabalhar com as definies de Modelo de dados (Model) e View, a parteresponsvel pelo Controllerj esta intrnseca.

    Frisando bem, a grande mudana, o grande paradigma a ser quebrado na forma de pensar e sedesenvolver uma aplicao em AdvPL utilizando MVC a separao da regra de negcio dainterface. Para que isso fosse possvel foram desenvolvidas vrias novas classes e mtodos noAdvPL.

  • 5/19/2018 0102 Apostila de MVC.pdf

    7/134

    AdvPl utilizando MVC 7

    2.Principais funes da aplicao emAdvPLutilizando o MVC

    Apresentamos agora o modelo de construo de uma aplicao emAdvPLutilizando o MVC.

    Os desenvolvedores em suas aplicaes sero responsveis por definir as seguintes funes:

    ModelDef: Contem a construo e a definio do Model, lembrando que o Modelo de dados(Model) contm as regras de negcio;

    ViewDef: Contem a construo e definio da View, ou seja, ser a construo da interface;

    MenuDef: Contem a definio das operaes disponveis para o modelo de dados (Model).

    Cada fonte em MVC (PRW) s pode conter uma de cada dessas funes. S pode ter umaModelDef, uma ViewDefe uma MenuDef.

    Ao se fazer uma aplicao em AdvPLutilizando MVC, automaticamente ao final, esta aplicaoj ter disponvel:

    Pontos de Entradasj disponveis;

    Um Web Servicepara sua utilizao;

    Importao ou exportaomensagens XML.

    Poder ser utilizada, similarmente ao que a rotina automtica das aplicaes sem MVC.

    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 essas porsua vez que podem vir do metadados (dicionrios) ou serem construdas manualmente.

    2.1 O que a funo ModelDef?

    A funo ModelDef define a regra de negcios propriamente dita onde so definidas:

    Todas asentidades(tabelas) que faro parte do modelo de dados (Model);

    Regras de dependnciaentre as entidades;

    Validaes(de campos e aplicao);

    Persistnciados dados (gravao).Para uma ModelDef no preciso necessariamente haver uma interface. Como a regra denegcios totalmente separada da interface no MVC, podemos utilizar a ModelDef emqualquer outra aplicao, ou at utilizarmos uma determinada ModelDefcomo base para outramais complexa.

    As entidades da ModelDef no se baseiam necessariamente em metadados (dicionrios).Como veremos mais a frente, ela se baseia em estruturas e essas por sua vez que podem virdo metadados ou serem construdas manualmente.

  • 5/19/2018 0102 Apostila de MVC.pdf

    8/134

    8 - AdvPl utilizando MVC

    A ModelDefdeve ser uma Static Functiondentro da aplicao.

    2.2 O que a funo ViewDef?

    A funo ViewDef define como o ser a interface e portanto como o usurio interage com omodelo de dados (Model) recebendo os dados informados pelo usurio, fornecendo ao modelo

    de dados (definido na ModelDef)e apresentando o resultado.A interface pode ser baseada totalmente ou parcialmente em um metadado (dicionrio),permitindo:

    Reaproveitamento do cdigo da interface, pois uma interface bsica pode seracrescida de novos componentes;

    Simplicidade no desenvolvimento de interfaces complexas. Um exemplo disso soaquelas aplicaes onde uma GRID depende de outra. No MVC a construo deaplicaes que tem GRIDsdependentes extremamente fcil;

    Agilidadeno desenvolvimento, a criao e a manuteno se tornam muito mais geis;

    Mais de uma interfacepor Bussiness Object. Poderemos ter interfacesdiferentes paracada variao de um segmento de mercado, como o varejo.

    A ViewDefdeve ser uma Static Functiondentro da aplicao.

    2.3 O que a funo MenuDef?

    Uma funo MenuDef define as operaes quer sero realizadas pela aplicao, tais comoincluso, alterao, excluso, etc..

    Deve retornar um arrayem um formato especfico com as seguintes informaes:

    1. Ttulo;

    2. Nome da aplicao associada;

    3. Reservado;

    4. Tipo de Transao a ser efetuada.

    E que podem ser:

    - 1 para Pesquisar

    - 2 para Visualizar

    - 3 para Incluir

    - 4 para Alterar

    - 5 para Excluir

    - 6 para Imprimir

  • 5/19/2018 0102 Apostila de MVC.pdf

    9/134

    AdvPl utilizando MVC 9

    - 7 para Copiar

    5. Nvel de acesso;

    6. Habilita Menu Funcional;

    Exemplo:Static Function MenuDef()

    Local aRotina := {}

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

    aAdd( aRotina, { 'Incluir' , 'VIEWDEF.COMP021_MVC', 0, 3, 0, NIL } )

    aAdd( aRotina, { 'Alterar' , 'VIEWDEF.COMP021_MVC', 0, 4, 0, NIL } )

    aAdd( aRotina, { 'Excluir' , 'VIEWDEF.COMP021_MVC', 0, 5, 0, NIL } )

    aAdd( aRotina, { 'Imprimir' , 'VIEWDEF.COMP021_MVC', 0, 8, 0, NIL } )

    aAdd( aRotina, { 'Copiar' , 'VIEWDEF.COMP021_MVC', 0, 9, 0, NIL } )

    Return aRotina

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

    A estrutura deste 2 parmetro tem o formato:

    ViewDef.

    Sempre referenciaremos a ViewDef de um fonte, pois ela a funo responsvel pela ainterfaceda aplicao.

    Para facilitar o desenvolvimento, no MVCa MenuDefescreva-a da seguinte 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

    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

    O resultado final o mesmo, o que difere apenas a forma de construo, mas recomendado a 2 formaque utiliza o formato de comandos e no posies de um vetor,pois uma eventual manuteno se tornar mais fcil.

    A MenuDefdeve ser uma Static Functiondentro da aplicao.

    Utilizando-se a funo FWMVCMenu, obtm-se um menu padro com as opes: Visualizar,Incluir, Alterar, Excluir, Imprimir e Copiar. Deve ser passado como parmetro no nome dofonte.

  • 5/19/2018 0102 Apostila de MVC.pdf

    10/134

    10 - AdvPl utilizando MVC

    Por exemplo:

    Static Function MenuDef()

    Return FWMVCMenu( "COMP021_MVC" )

    Isso criaria um Menudef exatamente como o exemplo anterior. Para mais detalhes veja o

    captulo 12.7 Obter um menu padro (FWMVCMenu).2.4 Novo comportamento na interface

    Nas aplicaes desenvolvidas em AdvPL tradicional, aps a concluso de uma operao dealterao fecha-se a interfacee retorna ao Browse.

    Nas aplicaes em MVC, aps as operaes de incluso e alterao, a interface permaneceativa e no rodap exibe-se a mensagem de que a operao foi bem sucedida.

    3.Aplicaes com Browses (FWMBrowse)

    Para a construo de uma aplicao que possui um Browse, o MVC utiliza a classeFWMBrowse.

    Esta classe exibe um objeto Browseque construdo a partir de metadados (dicionrios).

    Esta classe no foi desenvolvida exclusivamentepara o MVC, aplicaes que no so emMVCtambm podem utiliz-la. No MVCa utilizaremos.

    Suas caractersticasso:

    Substituir componentes de Browse;

    Reduzir o tempo de manuteno, em caso de adio de um novo requisito;

    Ser independente do ambiente Microsiga Protheus.

    E apresenta como principais melhorias:

    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 operaes no SGBD (no mnimo 3 vezes mais rpido);

    Novo padro visual.

    3.1 Construo de um Browse

    Falaremos aqui de principais funes e caractersticas para uso em aplicaes com MVC.

    3.2 Construo bsica de um Browse

    Iniciamos a construo bsica de um Browse.

    Primeiramente crie um objeto Browseda seguinte forma:

    oBrowse := FWMBrowse():New()

    Definimos a tabela que ser exibida na Browse utilizando o mtodo SetAlias. As colunas,ordens, etc..

  • 5/19/2018 0102 Apostila de MVC.pdf

    11/134

    AdvPl utilizando MVC 11

    A exibio obtidos pelo metadados (dicionrios).

    oBrowse:SetAlias('ZA0')

    Definimos o ttulo que ser exibido como mtodo SetDescription.

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

    E ao final ativamos a classe.

    oBrowse:Activate()

    Com esta estrutura bsica construmos uma aplicao com Browse.

    O Browseapresentado automaticamente j ter:

    Pesquisa de registro;

    Filtro configurvel;

    Configurao de colunas e aparncia;

    Impresso.

    3.3 Legendas de um Browse (AddLegend)

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

    AddLegend( , , )

    Exemplo:

    oBrowse:AddLegend( "ZA0_TIPO=='1'", "YELLOW", "Autor" )

    oBrowse:AddLegend( "ZA0_TIPO=='2'", "BLUE" , "Interprete" )

    cRegra a expresso emAdvPLpara definir a legenda.

    cCor o parmetro que define a cor de cada item da legenda.

    So possveis os seguintes valores:

    GREEN Para a cor Verde

    RED Para a cor Vermelha

    YELLOW Para a cor Amarela

    ORANGE Para a cor Laranja

    BLUE Para a cor Azul

    GRAY Para a cor Cinza

    BROWN Para a cor Marrom

    BLACK Para a cor Preta

  • 5/19/2018 0102 Apostila de MVC.pdf

    12/134

    12 - AdvPl utilizando MVC

    PINK Para a cor Rosa

    WHITE Para a cor Branca

    cDescrio a que ser exibida para cada item da legenda

    Observao:

    Cada uma das legendas se tornar automaticamente uma opo de filtro.

    Cuidado ao montar as regras da legenda. Se houverem regras conflitantes ser exibidaa legenda correspondente 1 regra que for satisfeita.

    3.4 Filtros de um Browse (SetFilterDefault)

    Se quisermos definir um filtro para o Browseutilizamos o mtodo SetFilterDefault, que possuia seguinte sintaxe:

    SetFilterDefault( )

    Exemplo:

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

    ou

    oBrowse:SetFilterDefault( "Empty(ZA0_DTAFAL)" )

    A expresso de filtro em AdvPL.

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

    Exemplo:

    Se na aplicao foi definido que s sero exibidos clientes que so pessoas jurdicas, se usuriofizer um filtro para exibir apenas clientes do estado de So Paulo, sero exibidos os clientespessoa jurdica do estado de So Paulo. Foi executado o filtro do usurio e ainda respeitado ofiltro original da aplicao.

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

    3.5 Desabilitao de detalhes do Browse (DisableDetails)

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

    Exemplo:

    oBrowse:DisableDetails()

    3.6 Campos virtuais no Browse

    Normalmente, para se exibir campos virtuais nos Browses, fazemos uso da funo Posicione.

  • 5/19/2018 0102 Apostila de MVC.pdf

    13/134

    AdvPl utilizando MVC 13

    No novo Browse esta prtica se torna ainda mais importante, pois, quando ele encontra afuno Posicione na definio de um campo virtual e a base de dados um SGBD (usa oTOTVSDbAccess), o Browse acrescenta um INNER JOIN na query que ser enviada aoSGBD, melhorando assim o desempenho para a extrao dos dados.

    Portanto, sempre utilize a funo Posicionepara exibir campos virtuais.

    3.7 Exemplo completo de Browse

    User Function COMP011_MVC()

    Local oBrowse

    // Instanciamento da Classe de Browse

    oBrowse := FWMBrowse():New()

    // Definio da tabela do Browse

    oBrowse:SetAlias('ZA0')

    // Definio da legenda

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

    // Definio de filtro

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

    // Titulo da Browse

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

    // Opcionalmente pode ser desligado a exibio dos detalhes

    //oBrowse:DisableDetails()

    // Ativao da ClasseoBrowse:Activate()

    Return NIL

    4.Construo de aplicaoAdvPLutilizando MVC

    Iniciamos agora a construo da parte em MVCda aplicao, que so as funes de ModeDef,que contem as regras de negcio e a ViewDefque contem a interface.

    Um ponto importante que deve ser observado que, assim como a MenuDef, s podehaver uma funo ModelDefe umafuno ViewDefem um fonte.

    Se para uma determinada situao for preciso trabalhar em mais de um modelo de dados(Model), a aplicao deve ser quebrada em vrios fontes (PRW) cada um com apenas umaModelDefe uma ViewDef.

  • 5/19/2018 0102 Apostila de MVC.pdf

    14/134

    14 - AdvPl utilizando MVC

    5.Construo de aplicao MVCcom uma entidade

    Mostramos como criar uma aplicao em MVCcom apenas uma entidade envolvida.

    5.1 Construo de uma estrutura de dados (FWFormStruct)

    A primeira coisa que precisamos fazer criar a estrutura utilizada no modelo de dados (Model).

    As estruturas so objetos que contm as definies dos dados necessrias para uso daModelDefou para a ViewDef.

    Esses objetos contm:

    Estrutura dos Campos;

    ndices;

    Gatilhos;

    Regras de preenchimento (veremos frente); Etc.

    Como dito anteriormente o MVC no trabalha vinculado aos metadados (dicionrios) doMicrosiga Protheus, ele trabalha vinculado a estruturas. Essas estruturas, por sua vez, quepodem ser construdas a partir dos metadados.

    Com a funo FWFormStructa estrutura ser criada a partir do metadado.

    Sua sintaxe :

    FWFormStruct( , )

    Onde:

    nTipo Tipo da construo da estrutura: 1 para Modelo de dados (Model) e 2 parainterface(View);

    cAlias Alias da tabela no metadado;

    Exemplo:

    Local oStruZA0 := FWFormStruct( 1, 'ZA0' )

    No exemplo, o objeto oStruZA0 ser uma estrutura para uso em um modelo de dados

    (Model). O primeiro parmetro (1) indica que a estrutura para uso no modelo e o segundoparmetro indica qual a tabela dos metadados ser usada para a criao da estrutura (ZA0).

    Local oStruZA0 := FWFormStruct( 2, 'ZA0' )

    No exemplo dado, o objeto oStruZA0ser uma estrutura para uso em uma interface(View). Oprimeiro parmetro (2) indica que a estrutura para uso em uma interface e o segundoparmetro indica qual a tabela dos metadados ser usada para a criao da estrutura (ZA0).

    Mais adiante veremos como criar estruturas manualmente e como selecionar os campos que

  • 5/19/2018 0102 Apostila de MVC.pdf

    15/134

    AdvPl utilizando MVC 15

    faro parte das estruturas e outros tratamentos especficos da estrutura.

    Importante: Para modelo de dados (Model), a funo FWFormStruct, traz para aestrutura todos os campos que compem a tabela independentemente do nvel, uso oumdulo. Considera tambm os campos virtuais.

    Para a interface (View) a funo FWFormStruct, traz para a estrutura os camposconforme o nvel, uso ou mdulo.

    5.2 Construo da funo ModelDef

    Como foi dito anteriormente, nesta funo so definidas as regras de negcio ou modelo dedados (Model).

    Ela contm as definies de:

    Entidades envolvidas;

    Validaes;

    Relacionamentos; Persistncia de dados (gravao);

    Etc.

    Iniciamos a funo ModelDef:

    Static Function ModelDef()

    Local oStruZA0 := FWFormStruct( 1, 'ZA0' )

    Local oModel // Modelo de dados que ser construdo

    Construindo o Model

    oModel := MPFormModel():New( 'COMP011M' )

    MPFormModel a classe utilizada para a construo de um objeto de modelo de dados(Model).

    Devemos dar um identificador (ID) para o modelo como um todo e tambm um para cadacomponente.

    Essa uma caracterstica do MVC, todo componente do modelo ou da interfacedevem ter umID, como formulrios, GRIDs, boxes, etc.

    COMP011M o identificador (ID) dado ao Model, importante ressaltar com relao ao

    identificador(ID) do Model:

    Se a aplicao uma Function,oidentificador(ID) do modelo de dados (Model)podeter o mesmo nome da funo principal e esta prtica recomendada para facilitar acodificao. Por exemplo, se estamos escrevendo a funo XPTO, oidentificador(ID) domodelo de dados (Model)poder ser XPTO.

    Se a aplicao uma User Functiono identificador(ID) do modelo de dados (Model)NO pode ter o mesmo nome da funo principal, isso por causa dos pontos de

  • 5/19/2018 0102 Apostila de MVC.pdf

    16/134

    16 - AdvPl utilizando MVC

    entrada que j so criados automaticamente quando desenvolvemos uma aplicao emMVC. Isso ser mais detalhado frente (ver captulo 16.Pontos de entrada no MVC).

    5.3 Criao de um componente de formulrios no modelo dedados (AddFields)

    O mtodoAddFieldsadiciona um componente de formulrio ao modelo.

    A estrutura do modelo de dados (Model)deve iniciar, obrigatoriamente, com um componentede formulrio.

    Exemplo:

    oModel:AddFields( 'ZA0MASTER', /*cOwner*/, oStruZA0 )

    Devemos dar umidentificador(ID) para cada componente do modelo.

    ZA0MASTER oidentificador(ID) dado ao componente de formulrio no modelo, oStruZA0a estrutura que ser usada no formulrio e que foi construda anteriormente utilizandoFWFormStruct, note que o segundo parmetro (owner) no foi informado, isso porque este o 1 componente do modelo, o Pai do modelo de dados (Model) e portanto no tem umcomponente superior ou owner.

    5.4 Descrio dos componentes do modelo de dados(SetDescription)

    Sempre definindo uma descrio para os componentes do modelo.

    Com o mtodo SetDescription adicionamos a descrio ao modelo de dados (Model), essadescrio ser usada em vrios lugares como em Web Services por exemplo.

    Adicionamos a descrio do modelo de dados:oModel:SetDescription( 'Modelo de dados de Autor/Interprete' )

    Adicionamos a descrio dos componentes do modelo de dados:

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

    Para um modelo que s contm um componente parece ser redundante darmos uma descriopara o modelo de dados (Model) como um todo e uma para o componente, mas quandoestudarmos outros modelos onde haver mais de um componente esta ao ficar mais clara.

    5.5 Finalizao de ModelDef

    Ao final da funo ModelDef, deve ser retornado o objeto de modelo de dados (Model)geradona funo.

    Return oModel

    5.6 Exemplo completo da ModelDef

    Static Function ModelDef()

  • 5/19/2018 0102 Apostila de MVC.pdf

    17/134

    AdvPl utilizando MVC 17

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

    Local oStruZA0 := FWFormStruct( 1, 'ZA0' )

    Local oModel // Modelo de dados que ser construdo

    // Cria o objeto do Modelo de Dados

    oModel := MPFormModel():New('COMP011M' )

    // Adiciona ao modelo um componente de formulrio

    oModel:AddFields( 'ZA0MASTER', /*cOwner*/, oStruZA0)

    // Adiciona a descrio do Modelo de Dados

    oModel:SetDescription( 'Modelo de dados de Autor/Interprete' )

    // Adiciona a descrio do Componente do Modelo de Dados

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

    // Retorna o Modelo de dados

    Return oModel

    5.7 Construo da funo ViewDef

    A interface (View) responsvel por renderizar o modelo de dados (Model) e possibilitar ainterao do usurio, ou seja, o responsvel por exibir os dados.

    O ViewDefcontm a definio de toda a parte visual da aplicao.

    Iniciamos a funo:

    Static Function ViewDef()

    A interface(View)sempre trabalha baseada em um modelo de dados (Model). Criaremos umobjeto de modelo de dados baseado no ModelDefque desejamos.

    Com a funo FWLoadModelobtemos o modelo de dados (Model)que est definido em umfonte, no nosso caso o prprio fonte, mas nada impediria que usssemos o modelo dequalquer outro fonte em MVC, com isso podemos reaproveitar um mesmo modelo de dados(Model)em mais de uma interface(View).

    Local oModel := FWLoadModel( 'COMP011_MVC' )

    COMP011_MVC nome do fonte de onde queremos obter o modelo de dados (Model).

    Iniciando a construo da interface(View)

    oView := FWFormView():New()

    FWFormView a classe que dever ser usada para a construo de um objeto de interface(View).

  • 5/19/2018 0102 Apostila de MVC.pdf

    18/134

    18 - AdvPl utilizando MVC

    Definimos qual o modelo de dados (Model)que ser utilizado na interface(View).

    oView:SetModel( oModel )

    5.8 Criao de um componente de formulrios na interface(AddField)

    Adicionamos no nosso interface(View)um controle do tipo formulrio (antiga Enchoice), paraisso usamos o mtodoAddField

    A interface(View)deve iniciar, obrigatoriamente, com um componente do tipo formulrio.

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

    Devemos dar umidentificador(ID) para cada componente do interface(View).

    VIEW_ZA0 o identificador (ID) dado ao componente da interface (View), oStruZA0 aestrutura que ser usada e ZA0MASTER identificador (ID) do componente do modelo dedados (Model)vinculado a este componente da interface(View).

    Cada componente da interface(View)deve ter um componente do modelo de dados (Model)relacionado, isso equivale a dizer que os dados do ZA0MASTER sero exibidos na interface(View)no componente VIEW_ZA0

    5.9 Exibio dos dados na interface (CreateHorizontalBox /CreateVerticalBox)

    Sempre precisamos criar um continer1, um objeto, para receber algum elemento da interface(View). Em MVCcriaremos sempre boxhorizontal ou vertical para isso.

    O mtodo para criao de um boxhorizontal :

    oView:CreateHorizontalBox( 'TELA' , 100 )

    Devemos dar umidentificador(ID) para cada componente da interface(View).

    TELA oidentificador(ID) dado ao boxe o nmero 100representa o percentual da tela queser utilizado pelo Box.

    No MVC no h referncias a coordenadas absolutas de tela, os componentes visuais sosempre All Client, ou seja, ocuparo todo o continer onde for inserido

    5.10 Relacionando o componente da interface (SetOwnerView)

    Precisamos relacionar o componente da interface(View)com umboxpara exibio, para issousamos o mtodo SetOwnerView.

    1 Determinada rea definida pelo desenvolvedor para agrupar componentes visuais, por exemplo, Panel, Dialog,

    Window, etc

  • 5/19/2018 0102 Apostila de MVC.pdf

    19/134

    AdvPl utilizando MVC 19

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

    Desta forma o componente VIEW_ZA0ser exibido na tela utilizando o box TELA.

    5.11 Finalizao da ViewDef

    Ao final da funo ViewDef, deve ser retornado o objeto de interface(View)gerado

    Return oView

    5.12 Exemplo completo da ViewDef

    Static Function ViewDef()

    // Cria um objeto de Modelo de dados baseado no ModelDef() do fonte informado

    Local oModel := FWLoadModel( 'COMP011_MVC' )

    // Cria a estrutura a ser usada na View

    Local oStruZA0 := FWFormStruct( 2, 'ZA0' )

    // Interface de visualizao construda

    Local oView

    // Cria o objeto de View

    oView := FWFormView():New()

    // Define qual o Modelo de dados ser utilizado na View

    oView:SetModel( oModel )

    // Adiciona no nosso View um controle do tipo formulrio

    // (antiga Enchoice)oView:AddField( 'VIEW_ZA0', oStruZA0, 'ZA0MASTER' )

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

    oView:CreateHorizontalBox( 'TELA' , 100 )

    // Relaciona o identificador (ID) da View com o "box" para exibio

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

    // Retorna o objeto de View criado

    Return oView

    5.13 Finalizao da criao da aplicao com uma entidade

    Desta forma criamos uma aplicao de AdvPL utilizando MVC onde h apenas uma entidadeenvolvida.

    Construmos a ModelDef;

  • 5/19/2018 0102 Apostila de MVC.pdf

    20/134

    20 - AdvPl utilizando MVC

    Construmos a ViewDef.

    Esta aplicao seria o equivalente s aplicaes de tipo Modelo1que normalmente so feitas.

    Veremos a seguir a construo de aplicaes utilizando duas ou mais entidades.

    6.Construo de uma aplicao MVC com duas ou maentidades

    Vimos at agora a construo de uma aplicao onde era utilizada apenas uma entidade.Veremos a construo onde duas ou mais entidades iro existir.

    A construo da aplicao seguir os mesmos passos que vimos at agora: Construo daModelDefe da ViewDef. A diferena bsica que agora cada uma delas possuir mais de umcomponente e eles se relacionaro.

    6.1 Construo de estruturas para uma aplicao MVC com duasou mais entidades

    Como descrevemos, a primeira coisa que precisamos fazer criar a estrutura utilizada nomodelo de dados (Model). Temos que criar uma estrutura para cada entidade que participardo modelo. Se forem 2 entidades, 2 estruturas, se forem 3 entidades, 3 estruturas e assim pordiante.

    Mostraremos uma aplicao onde temos 2 entidades em uma relao de dependncia deMaster-Detail(Pai-Filho), como por exemplo um Pedido de Venda, onde temos o cabealhodo pedido seria o Master (Pai) e os itens seriam o Detail(Filho)

    A construo das estruturas seria:

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

    No exemplo anterior o objeto oStruZA1ser uma estrutura para ser utilizada em um Modelode dados (Model)para a entidade Master(Pai) e oStruZA2 para a entidade Detail(Filho).

    O primeiro parmetro (1) indica que a estrutura para ser utilizada em um modelo de dados(Model)e segundo indica qual a tabela ser usada para a criao da estrutura.

    Local oStruZA1 := FWFormStruct( 2, 'ZA1' )

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

    No exemplo acima o objeto oStruZA1ser uma estrutura para ser utilizada em uma interface(View)para a entidade Master(Pai)e oStruZA2 para a entidade Detail(Filho). O primeiroparmetro (2) indica que a estrutura para ser utilizada em uma interface(View)e o segundoindica qual tabela ser usada para a criao da estrutura.

    6.2 Construo de uma funo ModelDef

    Iniciamos a funo ModelDef.

    Static Function ModelDef()

  • 5/19/2018 0102 Apostila de MVC.pdf

    21/134

    AdvPl utilizando MVC 21

    Local oStruZA1 := FWFormStruct( 1, 'ZA1' )

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

    Local oModel // Modelo de dados que ser construdo

    Observe que no cdigo, houve a criao de 2 estruturas uma para cada entidade.

    Comeamos a construo do Model

    oModel := MPFormModel():New( 'COMP021M' )

    Devemos dar um identificador(ID) para o Modelo de dados (Model)e para cada componentedo Model.

    COMP021M oidentificador(ID) dado ao Modelo de dados (Model).

    6.3 Criao de um componente de formulrios no modelo dedados (AddFields)

    O mtodoAddFieldsadiciona ao modelo um componente de formulrio.A estrutura do modelo deve iniciar, obrigatoriamente, com um componente de formulrio.

    oModel:AddFields( 'ZA1MASTER', /*cOwner*/, oStruZA1 )

    Devemos dar umidentificador(ID) para cada componente do Model.

    ZA1MASTER oidentificador(ID) dado ao formulrio no Model, oStruZA1 a estrutura queser usada no formulrio e que foi construda anteriormente utilizando FWFormStruct; noteque o segundo parmetro (Owner) no foi informado, isso porque este o 1 componente doModel, o Paido modelo de dados (Model)e, portanto no tem um componente superior ouowner.

    6.4 Criao de um componente de grid no Modelo de dados(AddGrid)

    A relao de dependncia entre as entidades de Master-Detail, ou seja, h 1 ocorrncia doPaipara nocorrncias do Filho(1-n)

    Quando uma entidade ocorrer n vezes no modelo em relao outra, devemos definir umcomponente de Gridpara esta entidade.

    O mtodoAddGridadiciona ao modelo um componente de grid.

    oModel:AddGrid( 'ZA2DETAIL', 'ZA1MASTER', oStruZA2 )

    Devemos dar umidentificador(ID) para cada componente do Model.

    ZA2DETAIL oidentificador(ID) dado ao componente no Model, oStruZA2 a estrutura queser usada no componente e que foi construda anteriormente utilizando FWFormStruct, noteque o segundo parmetro (Owner) desta vez foi informado, isso porque esta entidade dependeda 1 (Master), portantoZA1MASTER ocomponente superior ou ownerdeZA2DETAIL.

  • 5/19/2018 0102 Apostila de MVC.pdf

    22/134

    22 - AdvPl utilizando MVC

    6.5 Criao de relao entre as entidades do modelo(SetRelation)

    Dentro do modelo devemos relacionar todas as entidades que participam dele. No nossoexemplo temos que relacionar a entidade Detailcom a entidade Master.

    Uma regrinha bem simples para entender isso : Toda entidade do modelo que possui umsuperior (owner) dever ter seu relacionamento para ele definido. Em outras palavras, precisodizer quais as chaves de relacionamento do filho para o pai.

    O mtodo utilizado para esta definio o SetRelation.

    Exemplo:

    oModel:SetRelation( 'ZA2DETAIL', { { 'ZA2_FILIAL', 'xFilial( "ZA2" )' }, { 'ZA2_MUSICA','ZA1_MUSICA' } }, ZA2->( IndexKey( 1 ) ) )

    OZA2DETAIL oidentificador(ID) da entidade Detail, o segundo parmetro um vetor bi-

    dimensional onde so definidos os relacionamentos entre cada campo da entidade filho para aentidade Pai. O terceiro parmetro a ordenao destes dados no componente.

    Estamos dizendo no exemplo acima que o relacionamento da entidade Detail ser porZA2_FILIAL e ZA2_MUSICA, o valor de ZA2_FILIAL ser dado por xFilial() e o deZA2_MUSICAvir deZA1_MUSICA.

    Observao:O relacionamento sempre definido do Detail (Filho) para o Master (Pai),tanto noidentificador(ID) quanto na ordem do vetor bi-dimensional.

    6.6 Definio da chave primria (SetPrimaryKey)

    O modelo de dados precisa que sempre se informe qual a chave primria para a entidade

    principal do modelo de dados (Model).

    Se a estrutura da entidade foi construda utilizando-se o FWFormStruct, a chave primriaser aquela que foi definida no metadados (dicionrios).

    Se a estrutura foi construda manualmente ou se a entidade no possui definio de chavenica no metadados, temos que definir qual ser essa chave com o mtodo S SetPrimaryKey.

    Exemplo:

    oModel: SetPrimaryKey( { "ZA1_FILIAL", "ZA1_MUSICA" } )

    Onde o parmetro passado um vetor com os campos que compem a chave primria. Use

    este mtodo somente se for preciso.Sempre defina a chave primria para o modelo. Se realmente no for possvel criar uma chaveprimria para a entidade principal, informe-o no modelo de dados da seguinte forma:

    oModel: SetPrimaryKey( {} )

    6.7 Descrevendo os componentes do modelo de dados(SetDescription)

    Defina sempre uma descrio para os componentes do modelo. Com o mtodo SetDescription

  • 5/19/2018 0102 Apostila de MVC.pdf

    23/134

    AdvPl utilizando MVC 23

    adicionamos a descrio do Modelo de Dados, essa descrio ser usada em vrios lugarescomo em Web Servicespor exemplo.

    Adicionamos a descrio do modelo de dados.

    oModel:SetDescription( 'Modelo de Musicas' )

    Adicionamos a descrio dos componentes do modelo de dados.oModel:GetModel( 'ZA1MASTER' ):SetDescription( 'Dados da Musica' )

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

    Note que desta vez definimos uma descrio para modelo e uma para cada componente domodelo.

    6.8 Finalizao da ModelDef

    Ao final da funo ModelDef, deve ser retornado o objeto de Modelo de dados (Model)geradona funo.

    Return oModel

    6.9 Exemplo completo da ModelDefStatic Function ModelDef()

    // Cria as estruturas a serem usadas no Modelo de Dados

    Local oStruZA1 := FWFormStruct( 1, 'ZA1' )

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

    Local oModel // Modelo de dados construdo

    // Cria o objeto do Modelo de Dados

    oModel := MPFormModel():New( 'COMP021M' )

    // Adiciona ao modelo um componente de formulrio

    oModel:AddFields( 'ZA1MASTER', /*cOwner*/, oStruZA1 )

    // Adiciona ao modelo uma componente de grid

    oModel:AddGrid( 'ZA2DETAIL', 'ZA1MASTER', oStruZA2 )

    // Faz relacionamento entre os componentes do model

    oModel:SetRelation( 'ZA2DETAIL', { { 'ZA2_FILIAL', 'xFilial( "ZA2" )' }, { 'ZA2_MUSICA','ZA1_MUSICA' } }, ZA2->( IndexKey( 1 ) ) )

    // Adiciona a descrio do Modelo de Dados

    oModel:SetDescription( 'Modelo de Musicas' )

    // Adiciona a descrio dos Componentes do Modelo de Dados

    oModel:GetModel( 'ZA1MASTER' ):SetDescription( 'Dados da Musica' )

  • 5/19/2018 0102 Apostila de MVC.pdf

    24/134

    24 - AdvPl utilizando MVC

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

    // Retorna o Modelo de dados

    Return oModel

    6.10 Construo da funo ViewDef

    Iniciamos a funo.

    Static Function ViewDef()

    A interface(View)sempre trabalhar baseada em um modelo de dados (Model).

    Criamos um objeto de Modelo de dados baseado no ModelDefque desejamos.

    Com a funo FWLoadModelobtemos o modelo de dados (Model)que est definido em umfonte, no nosso caso, o prprio fonte, mas nada impede que usssemos o modelo de dados(Model)de qualquer outro fonte em MVC, com isso podemos reaproveitar um mesmo Modelode dados (Model)em mais de uma interface(View).

    Local oModel := FWLoadModel( 'COMP021_MVC' )

    COMP021_MVC nome do fonte de onde queremos obter o model.

    Comeamos a construo da interface(View)

    oView := FWFormView():New()

    FWFormView a classe que dever ser usada para a construo de um objeto de interface(View).

    Definimos qual o Modelo de dados (Model)que ser utilizado na interface(View).

    oView:SetModel( oModel )

    6.11 Criao de um componente de formulrios na interface(AddField)

    Adicionamos na nossa interface(View)um controle do tipo formulrio (antiga Enchoice), paraisso usamos o mtodoAddField.

    A interface(View)deve iniciar, obrigatoriamente, com um componente do tipo formulrio.

    oView:AddField( 'VIEW_ZA1', oStruZA1, 'ZA1MASTER' )

    Devemos dar umidentificador(ID) para cada componente do interface(View). VIEW_ZA1 oidentificador(ID) dado ao componente da interface(View), oStruZA1 a estrutura que serusada e ZA1MASTER identificador (ID) do componente do Modelo de dados (Model)vinculado a este componente da interface(View).

    Cada componente da interface (View)deve ter um componente do Modelo de dados (Model)relacionado, isso equivale a dizer que os dados do ZA1MASTER sero exibidos na interface(View)no componente VIEW_ZA1.

    6.12 Criao de um componente de grid na interface (AddGrid)

  • 5/19/2018 0102 Apostila de MVC.pdf

    25/134

    AdvPl utilizando MVC 25

    Adicionamos no nosso interface(View)um controle do tipo grid(antiga GetDados), para issousamos o mtodoAddGrid.

    oView:AddGrid( 'VIEW_ZA2', oStruZA2, 'ZA2DETAIL' )

    Devemos dar umidentificador(ID) para cada componente do interface(View).

    VIEW_ZA2 o identificador (ID) dado ao componente da interface (View), oStruZA2 aestrutura que ser usada e ZA2DETAIL identificador (ID) do componente do Modelo dedados (Model)vinculado a este componente da interface(View).

    Cada componente da interface (View)deve ter um componente do Modelo de dados (Model)relacionado, isso equivale a dizer que os dados do ZA2DETAIL sero exibidos na interface(View)no componente VIEW_ZA2.

    Observao:Note que aqui no falamos que entidade superior a qual, isso porque estafuno do modelo de dados. A interface(View)s reflete os dados do modelo.

    6.13 Exibio dos dados na interface (CreateHorizontalBox /

    CreateVerticalBox)

    Sempre precisamos criar um continer, um objeto, para receber algum elemento da interface(View).

    Em MVCcriaremos sempre boxhorizontal ou vertical para isso.

    O mtodo para criao de um box horizontal :

    oView:CreateHorizontalBox( 'SUPERIOR', 15 )

    Devemos dar umidentificador(ID) para cada componente do interface(View). SUPERIOR oidentificador(ID) dado ao boxe nmero 15representa o percentual da tela que ser utilizadopelo box.

    Como teremos dois componentes precisamos definir mais um box para o segundo componente

    oView:CreateHorizontalBox( 'INFERIOR', 85 )

    INFERIOR o identificador(ID) dado ao boxe nmero 85 representa o percentual da telaque ser utilizado por ele.

    Observao:A soma dos percentuais dos boxes de mesmo nvel dever ser sempre 100%.

  • 5/19/2018 0102 Apostila de MVC.pdf

    26/134

    26 - AdvPl utilizando MVC

    6.14 Relacionando o componente da interface (SetOwnerView)

    Precisamos relacionar o componente da interface(View)com umboxpara exibio, para issousamos o mtodo SetOwnerView.

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

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

    Desta forma o componente VIEW_ZA1 ser exibido na tela pelo box SUPERIOR e ocomponente VIEW_ZA2ser exibido na tela pelo boxINFERIOR.

    Obs.: Note que os dados da entidade Paiocuparo 15% da tela e da entidade Filho85%, pois:

    Id do Model Id da View Id do Box

    ZA1MASTER VIEW_ZA1 SUPERIOR (15%)

    ZA2DETAIL VIEW_ZA2 INFERIOR (85%)

    6.15 Finalizao da ViewDef

    Ao final da funo ViewDef, deve ser retornado o objeto de interface(View)gerado.

    Return oView

    6.16 Exemplo completo da ViewDef

    Static Function ViewDef()

    // Cria um objeto de Modelo de dados baseado no ModelDef do fonte informadoLocal oModel := FWLoadModel( 'COMP021_MVC' )

    // Cria as estruturas a serem usadas na View

    Local oStruZA1 := FWFormStruct( 2, 'ZA1' )

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

    // Interface de visualizao construda

    Local oView

    // Cria o objeto de View

    oView := FWFormView():New()

    // Define qual Modelo de dados ser utilizado

    oView:SetModel( oModel )

    // Adiciona no nosso View um controle do tipo formulrio (antiga Enchoice)

  • 5/19/2018 0102 Apostila de MVC.pdf

    27/134

    AdvPl utilizando MVC 27

    oView:AddField( 'VIEW_ZA1', oStruZA1, 'ZA1MASTER' )

    //Adiciona no nosso View um controle do tipo Grid (antiga Getdados)

    oView:AddGrid( 'VIEW_ZA2', oStruZA2, 'ZA2DETAIL' )

    // Cria um "box" horizontal para receber cada elemento da view

    oView:CreateHorizontalBox( 'SUPERIOR', 15 )

    oView:CreateHorizontalBox( 'INFERIOR', 85 )

    // Relaciona o identificador (ID) da View com o "box" para exibio

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

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

    // Retorna o objeto de View criado

    Return oView

    6.17 Finalizao da criao da aplicao com duas ou maisentidades

    Desta forma criamos uma aplicao deAdvPLutilizando MVConde h 2 entidades envolvidas.

    Construmos a ModelDef;

    Construmos a ViewDef.

    Esta aplicao seria o equivalente s aplicaes de tipo Modelo3que normalmente so feitas.

    Se a necessidade for a construo de uma aplicao com mais de 2 entidades o processo ser omesmo que o mostrado para 2. A diferena ser somente a quantidade de cada componente ouobjeto que sero criados.

    Para o modelo de dados (Model)se a aplicao tem 3 entidades, sero precisos 3 estruturas, 3componentes AddFields ou AddGrid e 2 relacionamentos. Se a aplicao tem 4 entidades,sero precisos 4 estruturas, 4 componentes AddFields ou AddGrid e 3 relacionamentos eassim por diante.

    Para a interface (View) se a aplicao tem 3 entidades, sero precisos 3 estruturas, 3componentesAddFieldouAddGride 3 boxes. Se a aplicao tem 4 entidades, sero precisos4 estruturas, 4 componentesAddFieldouAddGride 4 boxes e assim por diante.

    O modelo de dados e a interfacecrescem na medida em que cresce a quantidade de entidadesrelacionadas. Porm a forma bsica de construo sempre a mesma.

  • 5/19/2018 0102 Apostila de MVC.pdf

    28/134

    28 - AdvPl utilizando MVC

    7.Tratamentos para o modelo de dados e para interfac

    Agora que j sabemos como construir uma para aplicao em MVCutilizando nentidades, oque demonstraremos neste captulo so os tratamentos especficos para algumas necessidadesna construo de uma aplicao para a regra de negcio e para interface, pois em termos de

    hierarquia a idia sempre a mesma.

    Exemplo:

    Validaes;

    Permisses;

    Movimentao em linhas;

    Obter e atribuir valores;

    Persistncia dos dados;

    Criar botes;

    Criar folders; etc.

    8.Tratamentos para o modelo de dados

    Veremos alguns tratamentos que podem ser feitos no modelo de dados (Model) conforme anecessidade:

    Validaes;

    Comportamentos;

    Manipulao da Grid.

    Obter e atribuir valores ao modelo de dados (Model);

    Gravao dos dados manualmente;

    Regras de preenchimento.

    8.1 Mensagens exibidas na interface

    As mensagens so usadas principalmente durante as validaes feitas no modelo de dados.

    Vamos analisar: Um ponto bsico do MVC a separao da regra de negcio da interface.

    A validao um processo executado dentro da regra de negcio e uma eventual mensagemde erro que ser exibida ao usurio, um processo que deve ser executado na interface, ouseja, no pode ser executado na regra de negcios.

    Para trabalhar essa situao foi feito um tratamento para a funo Help.

    A funo Helppoder ser utilizada nas funes dentro do modelo de dados (Model), porm oMVC ira guardar essa mensagem e ela s ser exibida quando o controle voltar para ainterface.

  • 5/19/2018 0102 Apostila de MVC.pdf

    29/134

    AdvPl utilizando MVC 29

    Por exemplo, uma determinada funo conter:

    If nPrcUnit == 0 // Preo unitrio

    Help( ,, 'Help',, 'Preo unitrio no informado.', 1, 0 )

    EndIf

    Supondo que a mensagem de erro foi acionada porque o preo unitrio 0 (zero), nestemomento no ser exibido nada ao usurio, isso pode ser observado ao debugaro fonte. Vocver que ao passar pela funo Helpnada acontece, porm, quando o controle interno voltapara a interface, a mensagem exibida.

    Esse tratamento foi feito apenas para a funo Help, funes como MsgStop, MsgInfo,MsgYesNo,Alert, MostraErro,etc. no poderoser utilizadas.

    8.2 Obteno de componente do modelo de dados (GetModel)

    Durante o desenvolvimento vrias vezes teremos que manipular o modelo de dados (Model),para facilitar essa manipulao podemos ao invs de trabalhar como o modelo todo, trabalharcom uma parte especfica (um componente) de cada vez.

    Para isso utilizamos o mtodo GetModel.

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

    oModelZA2 o objeto que contm um componente do modelo de dados (Model) eZA2DETAIL oidentificador(ID) do componente que queremos.

    Se tivermos uma parte do modelo de dados (Model) e quisermos pegar o modelo completotambm podemos usar o GetModel.

    Local oModel := oModelZA2:GetModel()

    oModel o objeto que contm o modelo de dados (Model)completo.

    8.3 Validaes

    Dentro do modelo de dados existentes vrios pontos onde podem ser inseridas as validaesnecessrias regra de negcio. O modelo de dados (Model)como um todo tem seus pontos ecada componente do modelo tambm.

    8.3.1 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 (Model) j faz a validao se os campos obrigatrios de todos oscomponentes do modelo foram preenchidos, essa validao executada aps isso.

    Definimos a pos-validao do modelo de dados (Model) como um bloco de cdigo no 3parmetro da classe de construo do modelo MPFormModel.

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

  • 5/19/2018 0102 Apostila de MVC.pdf

    30/134

    30 - AdvPl utilizando MVC

    O bloco de cdigo recebe como parmetro um objeto que o modelo e que pode ser passado funo que far a validao.

    Static Function COMP011POS( oModel )

    Local lRet := .T.

    Local nOperation := oModel:GetOperation

    // Segue a funo ...

    Return lRet

    A funo chamada pelo bloco de cdigo deve retornar um valor lgico, onde se .T. (verdadeiro)a operao realizada e .F. (falso) no realizada.

    8.3.2 Ps-validao de linha

    Em um modelo de dados (Model) onde existam componentes de grid,pode ser definida umavalidao que ser executada na troca das linhas do grid. Seria o equivalente ao antigo

    processo de LinhaOk.

    Definimos a pos-validao de linha como um bloco de cdigo no 5 parmetros do mtodoAddGrid.

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

    O bloco de cdigo recebe como parmetro um objeto que a parte do modelo correspondenteapenas ao gride que pode ser passado para a funo que far a validao.

    A funo chamada pelo bloco de cdigo deve retornar um valor lgico, onde se .T. (verdadeiro)a troca de linha realizada e .F. (falso) no realizada.

    8.3.3 Validao de linha duplicada (SetUniqueLine)

    Em um modelo de dados onde existam componentes de grid podem ser definidos quais oscampos que no podem se repetir dentro deste grid.

    Por exemplo, imaginemos o Pedido de Vendas e no podemos permitir que o cdigo do produtose repita, podemos definir no modelo este comportamento, sem precisar escrever nenhumafuno especfica para isso.

    O mtodo do modelo de dados (Model)que dever ser usado o SetUniqueLine.

    // Liga o controle de no repetio de linha

    oModel:GetModel( 'ZA2DETAIL' ):SetUniqueLine( { 'ZA2_AUTOR' } )

    No exemplo anterior o campo ZA2_AUTOR no poder ter seu contedo repetido na grid.Tambm pode ser informado mais de um campo, criando assim um controle com chavecomposta.

    oModel:GetModel( 'ZA2DETAIL' ):SetUniqueLine( { 'ZA2_AUTOR', 'ZA2_DATA' } )

    No exemplo anterior a combinao do campo ZA2_AUTORe ZA2_DATAno podem ter seucontedo repetido na grid.

  • 5/19/2018 0102 Apostila de MVC.pdf

    31/134

    AdvPl utilizando MVC 31

    Individualmente a repetio at poder ocorrer, mas em conjunto no.

    ZA2_AUTOR ZA2_DATA

    001 01/01/11 Ok

    001 02/01/11 Ok

    002 02/01/11 Ok

    001 01/01/11 No permitido

    8.3.4 Pr-validao de linha

    Em um modelo de dados onde existam componentes de gridpode ser definida uma validaoque ser executada nas aes das linhas do grid. Podemos entender por essas aes aatribuio de valores, apagar ou recuperar uma linha.

    Definimos a pr-validao de linha como um bloco de cdigo no 4 parmetros do mtodoAddGrid.

    oModel:AddGrid( 'ZA2DETAIL', 'ZA1MASTER', oStruZA2, { |oModelGrid, nLine, cAction,cField| COMP021LPRE(oModelGrid, nLine, cAction, cField) }

    O bloco de cdigo recebe como parmetro:

    Um objeto que a parte do modelo correspondente apenas ao grid;

    O nmero da linha;

    A ao executada:

    o SETVALUEPara a atribuio de valores;

    o DELETEPara deleo e recuperao da linha.

    Campo onde se esta atribundo o valor, para deleo e recuperao da linha no passado.

    Esses parmetros podem ser passados para a funo que far a validao.

    A funo chamada pelo bloco de cdigo deve retornar um valor lgico, onde se .T. (verdadeiro)a troca de linha realizada e .F. (falso) no realizada.

    Um exemplo da utilizao da pr-validao de linha:

    Static Function COMP023LPRE( oModelGrid, nLinha, cAcao, cCampo )

    Local lRet := .T.

    Local oModel := oModelGrid:GetModel()

    Local nOperation := oModel:GetOperation()

  • 5/19/2018 0102 Apostila de MVC.pdf

    32/134

    32 - AdvPl utilizando MVC

    // 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

    No exemplo anterior no ser permitida a deleo da linha na operao de alterao.

    8.3.5 Validao da ativao do modelo (SetVldActivate)

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

    Definimos a validao da ativao usando o mtodo SetVldActivate.

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

    O bloco de cdigo recebe como parmetro um objeto que o do modelo correspondente,porm, o modelo ainda no tem os dados carregados, pois a carga dos dados feita aps a suaativao.

    A funo chamada pelo bloco de cdigo deve retornar um valor lgico, onde se .T. (verdadeiro)a ativao realizada e .F. (falso) no realizada.

    8.4 Manipulao da componente de grid

    Veremos agora alguns tratamentos que podem ser feitos nos componentes de grid de um

    modelo de dados (Model)8.4.1 Quantidade de linhas do componente de grid (Length)

    Para se obter a quantidade de linhas do grid devemos utilizar o mtodo Length.

    As linhas apagadas tambm so consideradas na contagem.

    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

    Se for passado um parmetro no mtodo Length, o retorno ser apenas a quantidade delinhas no apagadas da grid.

    nLinhas := oModelZA2:Length( .T. ) // Quantidade linhas no apagadas

  • 5/19/2018 0102 Apostila de MVC.pdf

    33/134

    AdvPl utilizando MVC 33

    8.4.2 Ir para uma linha do componente de grid (GoLine)

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

    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

    8.4.3 Status da linha de um componente de grid

    Quando estamos falando do modelo de dados (Model)temos 3 operaes bsicas: Incluso,Alterao e Excluso.

    Quando a operao de incluso, todos os componentes do modelo de dados (Model)estoincludos, esse raciocnio tambm se aplica excluso, se esta a operao, todos oscomponentes tero seus dados excludos.

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

    Em um modelo de dados onde existam componentes do grid, na operao de alterao o grid

    pode ter linhas includas, alteradas ou excludas, ou seja, o modelo de dados (Model)esta emalterao mas um gridpode ter tido as 3 operaes em suas linhas.

    Em MVC possvel saber que operaes uma linha sofreu pelos seguintes mtodos de status:

    IsDeleted: Informa se uma linha foi apagada. Retornando .T. (verdadeiro) a linha foiapagada.

    IsUpdated: Informa se uma linha foi alterada. Retornando .T. (verdadeiro) a linha foialterada.

    IsInserted: Informa se uma linha foi inserida, ou seja, se uma linha nova na grid.Retornando .T. (verdadeiro) a linha foi inserida.

    Exemplo:

    Static Function COMP23ACAO()

    Local oModel := FWModelActive()

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

    Local nI := 0

  • 5/19/2018 0102 Apostila de MVC.pdf

    34/134

    34 - AdvPl utilizando MVC

    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

    Help( ,, 'HELP',, 'Existem na grid' + CRLF + ;

    Alltrim( Str( nCtInc ) ) + ' linhas includas' + CRLF + ;

    Alltrim( Str( nCtAlt ) ) + ' linhas alteradas' + CRLF + ;

    Alltrim( Str( nCtDel ) ) + ' linhas apagadas' + CRLF ;

    , 1, 0)

    Mas de um mtodo de status pode retornar .T. (verdadeiro) para a mesma linha. Se uma linhafoi includa, oIsInsertedretornar .T. (verdadeiro), em seguida ela foi alterada, o IsUpdatedretornar .T. (verdadeiro) e em seguida a mesma linha foi apagada, IsDeleted tambmretornar .T. (verdadeiro).

    8.4.4 Adio uma linha a grid (AddLine)

    Para adicionarmos uma linha a um componente do griddo modelo de dados (Model)utilizamoso mtodoAddLine.

    nLinha++

    If oModelZA2:AddLine() == nLinha

    // Segue a funoEndIf

    O mtodo AddLine retorna a quantidade total de linhas da grid. Se a gridj possui 2 linhas etudo correu bem na adio da linha, o AddLine retornara 3, se ocorreu algum problemaretornar 2, pois a nova linha no foi inserida.

    Os motivos para a insero no ser bem sucedida poder ser algum campo obrigatrio noinformado, a ps-validao da linha retornou .F. (falso), atingiu a quantidade mxima de linhas

  • 5/19/2018 0102 Apostila de MVC.pdf

    35/134

    AdvPl utilizando MVC 35

    para o grid, por exemplo.

    8.4.5 Apagando e recuperando uma linha da grid (DeleteLine e UnDeleteLine)

    Para apagarmos uma linha de um componente de griddo modelo de dados (Model)utilizamoso mtodo DeleteLine.

    Local oModel := FWModelActive()

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

    Local nI := 0

    For nI := 1 To oModelZA2:Length()

    oModelZA2:GoLine( nI )

    If !oModelZA2:IsDeleted()

    oModelZA2:DeleteLine()

    EndIf

    Next

    O mtodo DeleteLineretorna .T. (verdadeiro) se a deleo foi bem sucedida. Um motivo paraque no seja a pr-validao da linha retornar .F. (falso).

    Se quisermos recuperar uma linha da grid que est apagada utilizamos o mtodoUnDeleteLine.

    Local oModel := FWModelActive()

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

    Local nI := 0

    For nI := 1 To oModelZA2:Length()

    oModelZA2:GoLine( nI )

    If oModelZA2:IsDeleted()

    oModelZA2:UnDeleteLine()

    EndIf

    Next

    O mtodo UnDeleteLine retorna .T. (verdadeiro) se a recuperao foi bem sucedida. Ummotivo para que no seja a pr-validao da linha retornar .F. (falso).

    8.4.6 Permisses para uma grid

    Se quisermos limitar que uma linha da grid possa ser inserida, alterada ou apagada, parafazermos uma consulta, por exemplo, utilizamos um dos mtodos abaixo:

  • 5/19/2018 0102 Apostila de MVC.pdf

    36/134

    36 - AdvPl utilizando MVC

    SetNoInsertLine:No permitir serem inseridas linhas na grid.

    Exemplo:

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

    SetNoUpdateLine: No permite alterar as linhas do grid.

    Exemplo:

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

    SetNoDeleteLine: No permite apagar linhas do grid.

    Exemplo:

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

    Esses mtodos podem ser informados no momento da definio do modelo de dados (Model).

    8.4.7 Permisso de grid sem dados (SetOptional)

    Por padro, quando temos um modelo de dados (Model)onde h um componente de grid, deveser informada pelo menos uma linha neste grid.

    Mas vamos imaginar um modelo onde tivssemos o cadastro de produtos e seus acessrios. um modelo Master-Detail, teremos para cada produto n acessrios, mas tambm teremosprodutos que no tm acessrio algum. Assim, esta regra de que deve haver pelo menos umalinha informada na gridno pode ser aplicada.

    Neste caso utilizamos o mtodo SetOptional para permitir que o grid tenha ou no pelomenos uma linha digitada, ou seja, para dizer que a digitao de dados do grid opcional.

    Esse mtodo deve ser informado ao definir o modelo de dados (Model).

    Exemplo:

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

    Se um gridfor opcional e na estrutura houver campos obrigatrios, s ser validado se estescampos foram informados e somente se a linha sofrer alguma alterao em qualquer campo.

    O mtodoIsOptionalpode ser utilizado para saber se o componente de gridtem ou no estacaracterstica. Se retornar .T. (verdadeiro) o componente permite que no existam linhas

    digitadas. Este mtodo pode ser til em validaes.8.4.8 Guardando e restaurando o posicionamento do grid (FWSaveRows /FWRestRows )

    Um cuidado que devemos ter quando escrevemos uma funo, mesmo que no seja para usoem MVC, restaurarmos as reas das tabelas que desposicionamos.

    Analogamente, devemos ter o mesmo cuidado para os componentes do grid quedesposicionamos em uma funo, com o uso do mtodo GoLine, por exemplo.

  • 5/19/2018 0102 Apostila de MVC.pdf

    37/134

    AdvPl utilizando MVC 37

    Para isso utilizaremos as funes FWSaveRowspara salvar o posicionamento das linhas dosgrids do modelo de dados (Model)e o FWRestRows para restaurar esses posicionamentos.

    Exemplo:

    Static Function COMP23ACAO()

    Local oModel := FWModelActive()

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

    Local nI := 0

    Local aSaveLines := FWSaveRows()

    For nI := 1 To oModelZA2:Length()

    oModelZA2:GoLine( nI )

    // Segue a funo

    Next

    FWRestRows( aSaveLine )

    Obs.: O FWSaveRows guarda o posicionamento de todos os grids do modelo de dados(Model)e o FWSaveRowsrestaura o posicionamento de todos os grids do model.

    8.4.9 Definio da quantidade mxima de linhas do grid (SetMaxLine)

    Por padro a quantidade mxima de linhas de um componente de grid 990.

    Se for necessrio alterar esta quantidade utiliza-se o mtodoSetMaxLine. Este mtodo deveser usado na definio do modelo de dados (Model), ou seja, na ModelDef.

    Importante: A quantidade se refere sempre ao total de linhas, independentemente se estasesto apagadas ou no.

    8.5 Obteno e atribuio de valores ao modelo de dados

    As operaes mais comuns que faremos em um modelo de dados (Model) obter e atribuirvalores.

    Para isso utilizamos um dos mtodos abaixo:

    GetValue: Obtm um dado do modelo de dados (Model). Podemos obter o dado a partir domodelo completo ou a partir de um componente dele.

    A partir do modelo de dados (Model)completo.

    Local cMusica := oModel:GetValue( 'ZA1MASTER', 'ZA1_MUSICA )

    Onde ZA1MASTER o identificador (ID) do componente e ZA1_MUSICA ocampo do qual se deseja obter o dado.

  • 5/19/2018 0102 Apostila de MVC.pdf

    38/134

    38 - AdvPl utilizando MVC

    Ou 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 modelo de dados (Model). Podemos atribuir o dado a partir

    do modelo completo ou a partir de uma parte dele.

    A partir do modelo de dados (Model)completo

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

    Onde ZA1MASTER o identificador (ID) do componente e ZA1_MUSICA ocampo no qual se deseja atribuir o dado e 000001 o dado que se desejaatribuir.

    Ou a partir de um componente do modelo de dados (Model).

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

    oModelZA2:SetValue('ZA1_MUSICA', '000001' )

    Quando utilizamos o SetValuepara atribuir um dado a um campo as validaesdeste campo so executadas e tambm so disparados os seus gatilhos.

    O SetValueretorna .T. (verdadeiro) se a atribuio foi bem sucedida, os motivospara que no seja podem ser que o dado no satisfez a validao ou o modo deedio (WHEN) no foi satisfeito, etc.

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

    A partir do modelo de dados (Model)completo

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

    Onde ZA1MASTER o identificador (ID) do componente e ZA1_MUSICA ocampo onde se deseja atribuir o dado e 000001 o dado que se deseja atribuir.

    Ou a partir de um componente do modelo de dados (Model).

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

    ...

    oModelZA2:LoadValue('ZA1_MUSICA', '000001' )

    A diferena entre o LoadValuee o SetValue que o LoadValueno executa as validaesnem dispara os gatilhos do campo. Ele fora a atribuio de dado.

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

  • 5/19/2018 0102 Apostila de MVC.pdf

    39/134

    AdvPl utilizando MVC 39

    8.6 Comportamento

    Veremos como alterar alguns dos comportamentos padres do modelo de dados (Model).

    8.6.1 Alterao de dados de um componente no modelo de dados

    (SetOnlyView)Se quisermos que um determinado componente do modelo de dados (Model) no permitaalterao em seus dados, que seja apenas para visualizao, utilizamos o mtodoSetOnlyView.

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

    Exemplo:

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

    8.6.2 No gravar dados de um componente do modelo de dados

    (SetOnlyQuery)

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

    Se quisermos que um determinado componente do modelo de dados (Model)permita inclusoe/ou alterao em seus dados, porm, que estes dados no sejam gravados, utilizamos omtodo SetOnlyQuery.

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

    Exemplo:

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

    8.6.3 Obteno da operao que est sendo realizada (GetOperation)

    Para sabermos a operao com que um modelo de dados (Model)est trabalhando, usamos omtodo GetOperation.

    Esse mtodo retorna:

    O valor 3 quando uma incluso;

    O valor 4 quando uma alterao;

    O valor 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

  • 5/19/2018 0102 Apostila de MVC.pdf

    40/134

    40 - AdvPl utilizando MVC

    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 odesenvolvimento e tornar a leitura de uma aplicao mais fcil.

    Para utilizar este #DEFINE preciso incluir a seguinte diretiva no fonte:

    #

    INCLUDE 'FWMVCDEF.CH'

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

    MODEL_OPERATION_INSERTpara incluso;

    MODEL_OPERATION_UPDATEpara alterao;

    MODEL_OPERATION_DELETEpara excluso.

    Assim no exemplo dado acima podemos escrever:

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

    8.6.4 Gravao manual de dados (FWFormCommit)

    A gravao dos dados do modelo de dados (Model) (persistncia) realizada pelo MVCondeso gravados todos os dados das entidades do model.

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

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

    Para isso definimos um bloco de cdigo no 4. parmetro da classe de construo do modelode dados (Model)MPFormModel.

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

    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 validao quecomplementam a validaes feitas pelo MVC, o bloco de cdigo para gravao substitui agravao dos dados. Ento ao ser definido um bloco de cdigo para gravao, passa serresponsabilidade da funo criada, a gravao de todos os dados inclusive os dados do modelode dados em uso.

  • 5/19/2018 0102 Apostila de MVC.pdf

    41/134

    AdvPl utilizando MVC 41

    Para facilitar o desenvolvimento foi criada a funo FWFormCommitque far a gravao dosdados do objeto de modelo de dados (Model)informado.

    Static Function COMP011GRV ( oModel )

    FWFormCommit( oModel )

    // Efetuar a gravao de outros dados em entidade que

    // no so do model

    Importante: No devem ser feitas atribuies de dados no modelo (Model)dentro da funode gravao. Conceitualmente ao se iniciar a gravao, o modelo de dados (Model)j passoupor toda a validao, ao tentar atribuir um valor, esse valor pode no satisfazer a validao docampo tornando o modelo de dados (Model) invalidado novamente e o que ocorrer agravao de dados inconsistentes.

    8.7 Regras de preenchimento (AddRules)

    Uma nova caracterstica que foi implementada no MVCso as regras de preenchimento, onde opreenchimento de um campo depende do preenchimento de outro.

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

    As regras de preenchimento podem ser de 3 tipos:

    Tipo 1 Pr-Validao

    Adiciona uma relao de dependncia entre campos do formulrio, impedindo aatribuio 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 opreenchimento do campo Cdigo do Cliente.

    Tipo 2 Pos-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 reavaliado caso o Cdigodo Cliente. seja alterado.

    Tipo 3 Pr e Ps-Validao

    So os tipos 1 e 2 simultaneamente

    Exemplo:

    oModel:AddRules( 'ZA3MASTER', 'ZA3_LOJA', 'ZA3MASTER', 'ZA3_DATA', 1 )

    OZA3MASTER oidentificador(ID) do componente do modelo de dados (Model)onde esta ocampo de destino, ZA3_LOJA o campo destino, o segundo ZA3MASTER do componentedo modelo de dados (Model)onde est o campo de origem,ZA3_DATA o campo de origem.

  • 5/19/2018 0102 Apostila de MVC.pdf

    42/134

    42 - AdvPl utilizando MVC

    9.Tratamentos de interface

    Veremos alguns tratamentos que podem ser feitos na interface(View)conforme a necessidade.

    Criao de botes;

    Criao de pastas; Agrupamento de campos;

    Incremento de campos;

    Etc.

    9.1 Campo Incremental (AddIncrementField)

    Podemos fazer com que um campo do modelo de dados (Model) que faa parte de umcomponente de grid,possa ser incrementado unitariamente a cada nova linha inserida.

    Por exemplo, imaginemos o Pedido de Vendas, nos itens, o nmero do item pode ser umcampo incremental.

    Para isso utilizamos o mtodoAddIncrementField.

    Exemplo:

    oView:AddIncrementField( 'VIEW_ZA2', 'ZA2_ITEM' )

    Onde VIEW_ZA2 oidentificador(ID) do componente da interface(View), onde se encontra ocampo eZA2_ITEMo nome do campo que ser incrementado.

  • 5/19/2018 0102 Apostila de MVC.pdf

    43/134

    AdvPl utilizando MVC 43

    Visualmente temos :

    Importante: Esse comportamento s acontece quando a aplicao est sendo usada por suainterface (View). Quando o modelo de dados usado diretamente (Web Services, rotinasautomtica, etc.) o campo incremental tem que ser informado normalmente.

    9.2 Criao de botes na barra de botes (AddUserButton)

    Para a criao de botes adicionais na barra de botes da interface utilizamos o mtodoAddUserButton.

    Exemplo:

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

    Onde o Inclui Autor, o texto que ser apresentado no boto, CLIPS o nome da imagemdo RPO2que ser usada para o boto e o 3 parmetro o bloco de cdigo que ser executadoao acionar o boto.

    2RPORepositrio do Microsiga Protheus para aplicaes e imagens

  • 5/19/2018 0102 Apostila de MVC.pdf

    44/134

    44 - AdvPl utilizando MVC

    Visualmente temos:

    9.3 Ttulo do componente (EnableTitleView)No MVC podemos atribuir um ttulo para identificar cada componente da interface, para issousamos o mtodo EnableTitleView.

    Exemplo:

    oView:EnableTitleView('VIEW_ZA2','Musicas')

    Onde VIEW_ZA2 o identificador(ID) do componente da interface (View), e 'MUSICAS' otitulo que deseja para o componente

    Podemos ainda usar:

    oView:EnableTitleView('VIEW_ZA2')

    Onde o titulo que ser exibido o que foi definido no mtodo SetDescriptiondo modelo dedados (Model) para o componente.

  • 5/19/2018 0102 Apostila de MVC.pdf

    45/134

    AdvPl utilizando MVC 45

    Visualmente temos:

    9.4 Edio de Campos no componente de grid (SetViewProperty)

    Uma nova caracterstica que o MVCpossui no uso da interface, para um componente de grid,fazer a