Proibida a reproduo total ou parcial, bem como a armazenagem em sistema de recuperao e a transmisso, de qualquer
modo ou por qualquer outro meio, seja este eletrnico, mecnico, de fotocpia, de gravao, ou outros, sem prvia autorizao
por escrito da proprietria.
O desrespeito a essa proibio configura em apropriao indevida dos direitos autorais e patrimoniais da TOTVS.
Conforme artigos 122 e 130 da LEI no. 5.988 de 14 de Dezembro de 1973.
MVC
Protheus Verso 12
Nome do Treinamento
Sumrio
1. Objetivo......................................................................................................................................... 4
1.1. Introduo .................................................................................................................................. 4
2. Arquitetura MVC ........................................................................................................................... 4
2.1. Principais funes da aplicao em AdvPL utilizando o MVC ................................................... 5
2.2. O que a funo ModelDef? ..................................................................................................... 6
1.1. O que a funo ViewDef? .................................................................................................. 6
2.3. O que a funo MenuDef? ...................................................................................................... 7
3. Novo comportamento na interface ................................................................................................ 7
3.1. Aplicaes com Browses (FWMBrowse) ................................................................................... 7
3.2. Construo bsica de um Browse ............................................................................................. 8
3.3. Exemplo completo de Browse ................................................................................................... 10
4. Construo de aplicao ADVPL utilizando MVC ......................................................................... 11
4.1. Criando o MenuDef .................................................................................................................... 11
4.2. Construo da funo ModelDef ............................................................................................... 12
4.3. Exemplo completo da ModelDef ................................................................................................ 15
5. Construo da funo ViewDef .................................................................................................... 16
5.1. Exibio dos dados na interface (CreateHorizontalBox / CreateVerticalBox) ............................ 16
5.2. Relacionando o componente da interface (SetOwnerView) ....................................................... 17
5.3. Removendo campos da tela ...................................................................................................... 17
5.4. Finalizao da ViewDef ............................................................................................................. 17
5.5. Exemplo completo da ViewDef .................................................................................................. 18
6. Carregar o modelo de dados de uma aplicao j existente (FWLoadModel) .............................. 18
7. Carregar a interface de uma aplicao j existente (FWLoadView) ............................................. 18
8. Intalao do Desenhador MVC ..................................................................................................... 19
8.1. Criao de um novo fonte Desenhador MVC ............................................................................ 23
9. Tratamentos para o modelo de dados .......................................................................................... 34
9.1. Mensagens exibidas na interface............................................................................................... 34
9.2. Ao de interface (SetViewAction)............................................................................................. 35
9.3. Ao de interface do campo (SetFieldAction) ............................................................................ 36
9.4. Obteno da operao que est sendo realizada (GetOperation) ............................................. 36
9.5. Obteno de componente do modelo de dados (GetModel) ..................................................... 37
9.6. Obteno e atribuio de valores ao modelo de dados ............................................................. 37
9.7. Adicionando boto na tela ......................................................................................................... 38
10. Manipulao da componente FormGrid ..................................................................................... 38
10.1. Criao de relao entre as entidades do modelo (SetRelation) ............................................. 38
10.2. Campo Incremental (AddIncrementField) ................................................................................ 38
10.3. Quantidade de linhas do componente de grid (Length) ........................................................... 39
2 Verso 12
Nome do Treinamento
Verso 12 3
Nome do Treinamento
1. Objetivo
Ao final do treinamento dever ter desenvolvido os seguintes conceitos:
1.1. Introduo
A arquitetura Model-View-Controller ou MVC, como mais conhecida, um padro de arquitetura de software que visa
separar a lgica de negcio da lgica de apresentao (a interface), permitindo o desenvolvimento, teste e manuteno
isolada de ambos.
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, essa separao e 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.
2. Arquitetura MVC
A arquitetura MVC, um padro de arquitetura de software que visa separar a lgica de negcio da lgica de
apresentao (a interface), permitindo o desenvolvimento, teste e manuteno isolados de ambos.
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 essa separao. E ela que vai permitir o uso
da regra de negcio em aplicaes que tenham ou no interfaces.
4 Verso 12
Nome do Treinamento
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. Nele definimos as regras de negcio: tabelas, campos,
estruturas, relacionamentos etc. O modelo de dados (Model) tambm responsvel por notificar a interface (View)
quando os dados forem alterados.
View ou interface: responsvel por renderizar o modelo de dados (Model) 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 (Model) e seleciona a View
correspondente.
Para facilitar e agilizar o desenvolvimento, na implementao do MVC feita no AdvPL, o desenvolvedor trabalhar com
as definies de Modelo de dados (Model) e View, a parte responsvel pelo Controller j est intrnseca.
Frisando bem, a grande mudana, o grande paradigma a ser quebrado na forma de pensar e se desenvolver uma
aplicao em AdvPL utilizando MVC a separao da regra de negcio da interface. Para que isso fosse possvel
foram desenvolvidas vrias novas classes e mtodos no AdvPL.
ModelDef: Contm a construo e a definio do Model, lembrando que o Modelo de dados (Model) contm as regras
de negcio;
ViewDef: Contm a construo e definio da View, ou seja, ser a construo da interface;
MenuDef: Contm 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 uma ModelDef, uma ViewDef e
uma MenuDef. Ao se fazer uma aplicao em AdvPL utilizando MVC, automaticamente ao final, est aplicao j ter
disponvel.
Verso 12 5
Nome do Treinamento
Para uma ModelDef no preciso necessariamente possuir uma interface. Como a regra de negcios totalmente
separada da interface no MVC, podemos utilizar a ModelDef em qualquer outra aplicao, ou at utilizarmos uma
determinada ModelDef como base para outra mais complexa.
A funo ViewDef define como o ser a interface e portanto como o usurio interage com o modelo 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 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 GRIDs dependentes extremamente fcil;
6 Verso 12
Nome do Treinamento
Ttulo
Nome da aplicao associada
Reservado;
Tipo de Transao a ser efetuada.
1 para Pesquisar
2 para Visualizar
3 para Incluir
4 para Alterar
5 para Excluir
6 para Imprimir
7 para Copiar
5. Nvel de acesso;
6. Habilita Menu Funcional;
Nas aplicaes desenvolvidas em AdvPL tradicional, aps a concluso de uma operao de alterao fecha-se a
interface e retorna ao Browse.
Nas aplicaes em MVC, aps as operaes de incluso e alterao, a interface permanece ativa e no rodap exibe-se
a mensagem de que a operao foi bem sucedida.
Verso 12 7
Nome do Treinamento
oBrowse := FWMBrowse():New()
Definimos a tabela que ser exibida na Browse utilizando o mtodo SetAlias. As colunas, ordens, etc. A exibio obtida pelo
metadados (dicionrios).
oBrowse:SetAlias('SA1')
oBrowse:SetDescription('Cadastro de Cliente')
oBrowse:Activate()
Pesquisa de registro;
Filtro configurvel;
Configurao de colunas e aparncia;
Impresso.
8 Verso 12
Nome do Treinamento
Exemplo:
Exemplo:
Verso 12 9
Nome do Treinamento
oBrowse:SetFilterDefault("A1_TIPO=='F'")
ou
oBrowse:SetFilterDefault( "Empty(A1_ULTCOM)" )
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).
Exemplo :
oBrowse:DisableDetails()
Local oBrowse
// Definio da legenda
oBrowse:AddLegend("A1_TIPO='F'","YELLOW","Cons.Final")
oBrowse:AddLegend("A1_TIPO='L'","BLUE" ,"Produtor Rural")
// Definio de filtro
oBrowse:SetFilterDefault( "A1_TIPO=='F'" )
// Titulo da Browse
oBrowse:SetDescription('Cadastro de Clientes')
10 Verso 12
Nome do Treinamento
//oBrowse:DisableDetails()
// Ativao da Classe
oBrowse:Activate()
Return NIL
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
Sempre referenciaremos a ViewDef de um fonte, pois ela a funo responsvel pela a interface da aplicao.
Para facilitar o desenvolvimento, no MVC a MenuDef escreva-a da seguinte forma:
Return aRotina
Verso 12 11
Nome do Treinamento
Podemos criar um menu com opes padro para o MVC utilizando a funo FWMVCMENU
Ser criado um menu padro com as opes: Visualizar, Incluir, Alterar, Excluir, Imprimir e Copiar.
Entidades envolvidas;
Validaes;
Relacionamentos;
Persistncia de dados (gravao);
Construindo o Model
Devemos dar um identificador (ID) para o modelo como um todo e tambm um para cada componente. Essa uma
caracterstica do MVC, todo componente do modelo ou da interface devem ter um ID, como formulrios, GRIDs, boxes,
etc.
COMP011M o identificador (ID) dado ao Model, importante ressaltar com relao ao identificador (ID) do Model:
12 Verso 12
Nome do Treinamento
O MVC no trabalha vinculado aos metadados (dicionrios) do Microsiga Protheus, ele trabalha vinculado a estruturas.
Essas estruturas, por sua vez, que podem ser construdas a partir dos metadados. Com a funo FWFormStruct a
estrutura ser criada a partir do metadado.
Sua sintaxe:
nTipo: Tipo da construo da estrutura: 1 para Modelo de dados (Model) e 2 para interface (View);
cAlias: Alias da tabela no metadado;
Exemplo:
No exemplo, o objeto oStruSA1 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 segundo parmetro indica qual a tabela dos metadados ser usada
para a criao da estrutura (SA1).
Para modelo de dados (Model), a funo FWFormStruct, traz para a estrutura todos os
campos que compem a tabela independentemente do nvel, uso ou mdulo.
Considera ambm os campos virtuais.
Para a interface (View) a funo FWFormStruct, traz para a estrutura os campos
conforme o nvel, uso ou mdulo.
Exemplo:
Verso 12 13
Nome do Treinamento
VIEW_SA1 o identificador (ID) dado ao componente da interface (View), oStruSA1 a estrutura que ser usada e
SA1MASTER 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 SA1MASTER sero exibidos na interface (View) no componente VIEW_SA1
Sempre definindo uma descrio para os componentes do modelo. Com o mtodo SetDescription adicionamos a
descrio ao modelo de dados (Model), essa descrio ser usada em vrios lugares como em Web Services por
exemplo.
Para um modelo que s contm um componente parece ser redundante darmos uma descrio para o modelo de
dados (Model) como um todo e uma para o componente, mas quando estudarmos outros modelos onde haver mais de
um componente esta ao ficar mais clara.
14 Verso 12
Nome do Treinamento
Return oModel
Verso 12 15
Nome do Treinamento
Iniciamos a funo:
A interface (View) sempre trabalha baseada em um modelo de dados (Model). Criaremos um objeto de modelo de
dados baseado no ModelDef que desejamos.
Com a funo FWLoadModel obtemos o modelo de dados (Model) que est definido em um fonte, no nosso caso o
prprio fonte, mas nada impediria o acesso do modelo de qualquer outro fonte em MVC, com isso podemos reaproveitar
o modelo de dados (Model) em mais de uma 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 )
16 Verso 12
Nome do Treinamento
TELA: o identificador (ID) dado ao box e o nmero 100 representa o percentual da tela que ser utilizado pelo Box.
No MVC no h referncias a coordenadas absolutas de tela, os componentes visuais so sempre All Client, ou seja,
ocuparo todo o continer onde for inserido
Desta forma o componente VIEW_SA1 ser exibido na tela utilizando o box TELA.
5.3. Removendo campos da tela
Remoo de campos, so tratados na viso ViewDef com o metodo RemoveField No exemplo, coloco condio para
no mostrar determinados campos
Return oView
Verso 12 17
Nome do Treinamento
Exemplo:
18 Verso 12
Nome do Treinamento
Exemplo:
Iremos fazer a instao do Plugin MVC. Ao acessar o TDS ir na opo Ajuda->Install New Software
Aps acessar preencher Work With com endereo do instador do desenhador MVC:
http://ds.totvs.com/updates/desenhador/
Verso 12 19
Nome do Treinamento
Desenhador MVC
20 Verso 12
Nome do Treinamento
Selecionar o boto concluir, aps esses processo a desenhador sera instalado,para confirmar a instalao do
desenhador acessar Ajuda selecionar a opo Sobre Totvs | Developer Studio.
Verso 12 21
Nome do Treinamento
Ira listar todos os plug-ins indatado no TDS, localizar o Desenhador MVC, caso no esteja na lista refazer o processo
novamente caso ocorer algum erro na instalao contate o suporte da Totvs.
TDS atualizado
Ambiente com LIB atualizada (Portal do Cliente)
22 Verso 12
Nome do Treinamento
Para criar um fonte novo, clique em Arquivos->Novo->Outras, escolha o item Nova Funo MVC ADVPL do Totvs SDK
AdvPL.
Verso 12 23
Nome do Treinamento
O Fonte aberto com o Desenhador MVC possui trs abas Source, View e Model.
Com novo plugin MVC possui novas validaes do compilador facilitando o desenvolvimento.
Para criar uma estrutura MVC necessrio criar Model onde iremos defir qual estrutura iremos trabalhar, selecionar a aba
Model Design
24 Verso 12
Nome do Treinamento
Componentes:
Field Adiciona no Model um sub-Modelo de campos Entoiche
Grid - Adiciona no Model um sub-Modelo de grid GetDados
Calc Adiciona no grid campos totalizadores
Propriedades:
Editable: Se o modelo for carregado usando a funo FWloadModel no possvel alterar as propriedades
Identifier: Identificador do Modelo
Component: Nome do componente
Description: Atribui ao modelo um texto explicativo sobre o objetivo do Modelo. O objetivo mostrado em diversos
operaes, tais como web services, relatrios e schemas (xsd).
Validations:
bPre: Bloco de cdigo de pr-validao do modelo. O bloco recebe como parametro o objeto de Model e
deve retornar um valor lgico. Quando houver uma tentativa de atualizao de valor de qualquer
Submodelo o bloco de cdigo ser invocado. Caso o retorno seja verdadeiro, a alterao ser permitida,
se retornar falso no ser possvel concluir a alterao e um erro ser atribuido ao model.
bPos: Bloco de cdigo de ps-validao do modelo, equilave ao "TUDOOK". O bloco recebe como
parametro o objeto de Model e deve retornar um valor lgico. O bloco ser invocado antes da persistncia
dos dados para validar o model. Caso o retorno seja verdadeiro e no haja nenhum submodelo invalido,
ser feita a gravao dos dados. Se retornar falso no ser possvel realizar a gravao e um erro ser
atribuido ao model.
bVldActivate:Bloco de cdigo que ser chamado antes do Activate do model. Ele pode ser utilizado para
inibir a inicializao do model. Se o retorno for negativo uma exceo de usurio ser gerada. O code-
block recebe como parametro o objeto model.
bCommit::Bloco de cdigo de persistncia dos dados, ele invocado pelo mtodo CommitData. O bloco recebe
como parametro o objeto do Model e deve realizar a gravao dos dados.
Verso 12 25
Nome do Treinamento
Identifier: Nome do Model, o identificador (ID) do modelo de dados (Model) pode ter o mesmo nome da funo
principal e esta prtica recomendada para facilitar a codificao.
Component: Nome do componente
Description: Adicionamos a descrio ao modelo de dados (Model). O objetivo mostrado em diversos operaes,
tais como web services, relatrios e schemas (xsd).
Aps criar estrutura do modelo de dados (Model), necessario adicionar um componente de formulrio, iremos criar no
exemplo o componente Field.
26 Verso 12
Nome do Treinamento
Para criar o componente selcionar na guia de componentes a opo Field, aps selecionar o componete, ira aparecer
dentro da estrutura do Model.
Definies da Tabela:
Cria a estrutura a ser usada no Modelo de Dados: Lista as tabelas existentes no SX2
Cria uma uma estrutura nova: Criar estrutura de tabela temporria
Verso 12 27
Nome do Treinamento
Na pasta Campos ira lista os campos com as propriedades dele, podemos interagir nos dados, mas no altera a
estruro no SX3.
28 Verso 12
Nome do Treinamento
possvel criar novos campos temporrio selecionando o boto novo necessrio estar
no MODEL e na VIEW.
Verso 12 29
Nome do Treinamento
Ira listar todas as tabelas do SX2 no grid, selecionar a tabela que ir trabalhar, aps informar a tabela selecionar o
boto Proximo
Ao informar a tabela, selecionar o boto Carregar Estrutura, todos os campos, ndices e gatilhos da tabela foram
carregados para a estrutura de dados.
30 Verso 12
Nome do Treinamento
Na Guia de propriedades voc tem todas as opes Model, ao passar o mause sobre as propridedades exemplo:
Identifier, sera aberto uma ajuda com as explicaes do bloco de persistncia dos dados.
Aps criar Model iremos defir as propriedades do View, selecionar no fonte MVC a aba View Design
Na rvore de componentes:
Verso 12 31
Nome do Treinamento
Palette
Box: Caixa de visualizao do Model
HorizontaBox:O Box dever ser utilizado para dividir a tela. O Box Horizontal divide a tela na posio
horizontal e todos os componentes que forem criados dentro dele tambem assumiro essa orientao.
Ateno: Esse box somente pode ser colocado dentro de um box vertical.
VerticalBox: Box um componente utilizado para dividir a tela. O Box Vertical divide a tela na posio
vertical e todos os componentes que forem criados dentro dele tambm assumiro essa orientao.
Ateno: Esse box somente pode ser colocado dentro de um box horizontal.
Formulrios:
FormField : Formulrio que exibe campos no mesmo modelo da antiga enchoice. Para usar esse
componente se faz necessrio criar um submodelo do tipo field no Model e associar o mesmo ao
formulrio.
FormGrid: Formulrio que exibe um grid, ele mostra diversos registros na tela. Para usar esse
componente se faz necessrio criar um submodelo do tipo grid no Model e associar o mesmo ao
formulrio.
FormCalc:Formulrio que exibe campos calculados criados no Model. Para usar esse componente se faz
necessrio criar um submodelo do tipo calc no Model e associar o mesmo ao formulrio.
OtherObject:: Cria um painel onde pode ser colocado qualquer coisa que o desenvolvedor desejar. Para
criar as coisas use o bloco de cdigo de activate do componente. Ateno: Tudo que for criado dentro
desse componente NO ser renderizado nesse plugin.
Pasta:
Folder: Cria um componente de pasta que capaz de armazenar dentro dele diversas abas
Sheet: Cria uma aba dentro de uma Folder. Esse componente permite criar novas divises dentro da
aba, criando diversas opes na tela.
Boto de Usurio:
UserButton: Adiciona botes do desenvolvedor na barra de ferramentas do formulrio.
Para criar a ViewDef necessrio criar um componente de visualizao, selecionar o componente FormField e adicionar
no componte root, em propriedades Model informar a identificador do Model criado.
32 Verso 12
Nome do Treinamento
Verso 12 33
Nome do Treinamento
Tudo que foi desenvolvido nas guias View e Model criou o fonte na guia Source
Validaes;
Comportamentos;
Manipulao da Grid.
Obter e atribuir valores ao modelo de dados (Model);
Gravao dos dados manualmente;
Regras de preenchimento.
34 Verso 12
Nome do Treinamento
Supondo que a mensagem de erro foi acionada porque o preo unitrio 0 (zero), neste momento no ser exibido
nada ao usurio, isso pode ser observado ao debugar o fonte. Voc ver que ao passar pela funo Help nada
acontece, porm, quando o controle interno volta para a interface, a mensagem exibida.
Refresh da interface;
Acionamento do boto confirmar da interface;
Acionamento do boto cancelar da interface;
Deleo da linha da grid;
Restaurao da linha da grid;
A sua sintaxe :
Onde:
Exemplo:
Dica
Essas aes so executadas apenas quando existe uma interface (View). O que no ocorre quando
temos o instnciamento direto do modelo, rotina automtica ou Web Service. Deve-se evitar ento
colocar nestas funes aes que possam influenciar a regra de negcio, pois na execuo da
aplicao sem interface essas aes no sero executadas.
Verso 12 35
Nome do Treinamento
Onde:
Exemplo:
Exemplo:
If oModel:GetOperation() == MODEL_OPERATION_INSERT
Help( ,, 'Help',, 'No permitido incluir.', 1, 0 )
EndIf
36 Verso 12
Nome do Treinamento
GetValue: Obtm um dado do modelo de dados (Model). Podemos obter o dado a partir do modelo completo ou a
partir de um componente dele.
A partir do modelo de dados (Model) consegue acessar as estruturas dos campos podendo capturar ou manupular o
dado no (Model).
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.
Verso 12 37
Nome do Treinamento
Exemplo:
oView:AddUserButton('NomeBoto','CLIPS',;
{|| fValSto()},'NomeBotao',/*nShortCut*/,;
{MODEL_OPERATION_INSERT, MODEL_OPERATION_UPDATE})
Uma regrinha bem simples para entender isso : Toda entidade do modelo que possui um superior (owner) dever ter
seu relacionamento para ele definido. Em outras palavras, preciso dizer quais as chaves de relacionamento do filho
para o pai. O mtodo utilizado para esta definio o SetRelation.
FMRDETAIL: o identificador (ID) da entidade Detail, o segundo parmetro um vetor bidimensional onde so
definidos os relacionamentos entre cada campo da entidade filho para a entidade Pai. O terceiro parmetro a
ordenao destes dados no componente.
O relacionamento sempre definido do Detail (Filho) para o Master (Pai), tanto no identificador (ID) quanto na ordem do
vetor bidimensional.
38 Verso 12
Nome do Treinamento
Onde VIEW_SC6 o identificador (ID) do componente da interface (View), onde se encontra o campo e C6_ITEM o
nome do campo que ser incrementado.
For nI := 1 To oModel:Length()
// Segue a funcao ...
Next nI
Se for passado um parmetro no mtodo Length, o retorno ser apenas a quantidade de linhas no apagadas da grid.
IsDeleted: Informa se uma linha foi apagada. Retornando, .T. (verdadeiro) a linha foi apagada.
IsUpdated: Informa se uma linha foi alterada. Retornando, .T. (verdadeiro) a linha foi alterada.
IsInserted: Informa se uma linha foi inserida, ou seja, se uma linha nova no grid. Retornando, .T. (verdadeiro) a
linha foi inserida.
For nI := 1 To oModel:Length()
oModel:GoLine( nI )
If oModel:IsDeleted()
nCtDel++
Verso 12 39
Nome do Treinamento
nLinha++
If oModel:AddLine() == nLinha
// Segue a funo
EndIf
O mtodo AddLine retorna a quantidade total de linhas da grid. Se a grid j possui 2 linhas e tudo correu bem na adio
da linha, o AddLine retornara 3, se ocorreu algum problema retornar 2, pois a nova linha no foi inserida.
Os motivos para a insero no ser bem sucedida poder ser algum campo obrigatrio no informado, a ps-validao
da linha retornou .F. (falso), atingiu a quantidade mxima de linhas para o grid, por exemplo.
For nI := 1 To oModel:Length()
oModel:GoLine( nI )
If !oModel:IsDeleted()
oModel:DeleteLine()
EndIf
Next
O mtodo DeleteLine retorna .T. (verdadeiro) se a deleo foi bem sucedida. Um motivo para que no seja a pr-
validao da linha retornar .F. (falso).
40 Verso 12
Nome do Treinamento
If oModel:IsDeleted()
oModel:GoLine( nI )
oModel:UnDeleteLine()
EndIf
Next
O mtodo UnDeleteLine retorna .T. (verdadeiro) se a recuperao foi bem sucedida. Um motivo para que no seja a
pr-validao da linha retornar .F. (falso).
FwRestRows( aSaveLines )
oView:CreateFolder( 'PASTAS' )
Devemos dar um identificador (ID) para cada componente da interface (View). PASTAS o identificador (ID) dado s
pastas. Aps a criao da pasta principal, precisamos criar as abas desta pasta. Para isso usado o mtodo AddSheet.
Onde PASTAS o identificador (ID) da pasta, e ABA01 e ABA02 so os IDs dados a cada aba e Cabealho e Item so
os ttulos de cada aba. Para que possamos colocar um componente em uma aba, precisamos criar um box, um objeto,
para receber os elementos da interface (View). A forma para se criar um box em uma aba :
Verso 12 41
Nome do Treinamento
Precisamos relacionar o componente da interface (View) com um box para exibio, para isso usamos o mtodo
SetOwnerView.
AddCalc: (cId, cOwner, cIdForm, cIdField, cIdCalc, cOperation, bCond, bInitValue, cTitle, bFormula, nTamanho,
nDecimal)
Recebe como parmetros: o objeto do modelo, o valor da atual do campo frmula, o contedo do campo do
componente de grid, campo lgico indicando se uma execuo de soma (.T. (verdadeiro)) ou subtrao (.F. (falso)). O
valor retornado ser atribudo ao campo calculado
42 Verso 12
Nome do Treinamento
Ateno:
Para as operaes de SUM e AVG o campo do componente de grid tem de ser do tipo numrico.
Na ViewDef tambm temos que fazer a definio do componente de clculo. Os dados usados em um componente de
clculo so baseados em um componente de grid, porm, a sua exibio se d da mesma forma que um componente
de formulrio, por utilizarmos para o componente de clculo o AddField e para obtermos a estrutura que foi criada na
ModelDef usamos FWCalcStruct.
Verso 12 43
Nome do Treinamento
Exemplo:
Para o boto parecer na camada viewr necessrio associa ao box que ira exibir os outros objetos
oView:SetOwnerView("OTHER_PANEL",'EMBAIXODIR')
Note que o 2 parmetro recebe como parmetro um objeto que o container onde o desenvolvedor deve colocar seus
objetos.
10.12. Validaes
Dentro do modelo de dados existentes vrios pontos onde podem ser inseridas as validaes necessrias regra de
negcio. O modelo de dados (Model) como um todo tem seus pontos e cada componente do modelo tambm.
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
Ps-validao de linha: Em um modelo de dados (Model) onde existam componentes de grid, pode ser definida uma
validao que ser executada na troca das linhas do grid. Seria o equivalente ao antigo processo de LinhaOk.
Ps-validao de linha:Em um modelo de dados (Model) onde existam componentes de grid, pode ser definida uma
validao que ser executada na troca das linhas do grid. Seria o equivalente ao antigo processo de LinhaOk.
44 Verso 12
Nome do Treinamento
No exemplo o campo B1_COD no poder ter seu contedo repetido no grid. Tambm pode ser informado mais de um
campo, criando assim um controle com chave composta.
10.12.2. SetDeActivate
Antes da ativao do Model permite executar funo para validar o modo de operao, ser chamado logo aps o
DeActivate do model. Esse bloco recebe como parametro o proprio model.
oModel:SetDeActivate ( bBloco() )
Exemplo:
oModel:New(<cID >, <bPre >, <bPost >, <bCommit >, <bCancel >)
Exemplo:
If nOperation == MODEL_OPERATION_UPDATE
If Empty( oModel:GetValue( 'SA1MASTER', 'A1_CGC' ) )
Help( ,, 'HELP',, 'Informe o CNPJ', 1, 0)
Verso 12 45
Nome do Treinamento
Return lRet
A validao ps-validao do modelo, equilave ao "TUDOOK". O bloco recebe como parametro o objeto de Model e
deve retornar um valor lgico. O bloco ser invocado antes da persistncia dos dados para validar o model.
Caso o retorno seja verdadeiro e no haja nenhum submodelo invalido, ser feita a gravao dos dados.
Se retornar falso no ser possvel realizar a gravao e um erro ser atribuido ao model, sendo necessrio indicar a
natureza do erro atravs da funo Help.
MPFORMMODEL():New(<cID >, <bPre >, <bPost >, <bCommit >, <bCancel >)
Exemplo:
Static Function ModelDef()
Local oModel := MPFormModel():New('SA1MODEL', , { |oMdl| COMP011POS( oMdl )
})
Return
If nOperation == MODEL_OPERATION_UPDATE
If Empty( oModel:GetValue( 'SA1MASTER', 'A1_COD' ) )
Help( ,, 'HELP',, 'Informe o codigo do cliente', 1, 0)
lRet := .F.
EndIf
EndIf
Return lRet
MPFORMMODEL():New(<cID >, <bPre >, <bPost >, <bCommit >, <bCancel >)
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 que
complementam a validaes feitas pelo MVC, o bloco de cdigo para gravao substitui a gravao dos dados. Ento
46 Verso 12
Nome do Treinamento
ao ser definido um bloco de cdigo para gravao, passa ser responsabilidade da funo criada, a gravao de todos
os dados inclusive os dados do modelo de dados em uso.
Para facilitar o desenvolvimento foi criada a funo FWFormCommit que far a gravao dos dados do objeto de
modelo de dados (Model) informado.
If lGravo
// Efetuar a gravao de outros dados em entidade que
// no so do model
EndIf
No devem ser feitas atribuies de dados no modelo (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) invalidado novamente e o que ocorrer
a gravao de dados inconsistentes.
Essa validao realiza os tratamentos necessrios ao cancelamento dos formulrios de edio.O bloco recebe como
parametro o objeto do Model.
Quando esse bloco passado o tratamento de numerao automatica no mais realizado, a menos que o bloco
chame a funo FWFormCancel.
MPFORMMODEL():New(<cID >, <bPre >, <bPost >, <bCommit >, <bCancel >)
Exemplo:
10.12.7. SetVldActivate
Ser chamado antes do Activate do model. Ele pode Ser utilizado para inibir a inicializao do model. Se o retorno for negativo
uma exceo de usurio ser gerada. O code-block recebe como parmetro o objeto model.
MPFORMMODEL():SetVldActivate(<bBloco >)
Verso 12 47
Nome do Treinamento
Exemplo:
oModel := FWFormModel():New('COMP021')
oModel:addFields('ZA1MASTER',,oStruZA1,bPre,bPos,bLoad)
Return lRet
48 Verso 12
Nome do Treinamento
Exemplo:
If "@" $ Upper(oFieldModel:GetValue("A1_EMAIL"))
Help( ,, 'HELP',, 'Informar um emal valido', 1, 0)
lRet := .F.
EndIf
Return lRet
Este bloco ser invocado durante a execuo do mtodo activate desta classe.
O bloco recebe por parmetro o objeto de model do FormField(FWFormFieldsModel) e um valor lgico indicando se
uma operao de cpia. Espera-se como retorno um array com os dados que sero carregados no objeto, o array deve
ter a estrutura como no exemplo. A ordem dos dados deve seguir exatamente a mesma ordem dos campos da estrutura
de dados
MPFORMMODEL():AddFields(< cId >, < cOwner >, < oModelStruct >, < bPre >, < bPost >, < bLoad >)
Exemplo:
Static Function loadField(oFieldModel, lCopy)
Local aLoad := {}
aAdd(aLoad, 1) //recno
aAdd(aLoad, {xFilial("ZA1"), "000001", "01", Teste, }) //dados
Return aLoad
MPFORMMODEL():AddGrid(< cId >, < cOwner >, < oModelStruct >, < bLinePre >, < bLinePost >, < bPre >, < bPost >, <
bLoad >)
Verso 12 49
Nome do Treinamento
MPFORMMODEL():AddGrid(< cId >, < cOwner >, < oModelStruct >, < bLinePre >, < bLinePost >, < bPre >, < bPost >, <
bLoad >)
Exemplo:
oModel := MPFormModel():New('COMP021')
oModel:AddFields('ZA1MASTER',,oStruZA1)
oModel:AddGrid( 'ZA2DETAIL', 'ZA1MASTER', oStruZA2, bLinePre, , , ,bLoad)
Return oModel
If cAction == "SETVALUE"
If oGridModel:GetValue("ZA2_TIPO") == "AUTOR"
lRet := .F.
Help( ,, 'HELP',, 'No possvel alterar linhas do tipo Autor', 1, 0)
EndIf
EndIf
Return lRet
MPFORMMODEL():AddGrid(< cId >, < cOwner >, < oModelStruct >, < bLinePre >, < bLinePost >, < bPre >, < bPost >, <
bLoad >)
50 Verso 12
Nome do Treinamento
A ps-validao do submodelo, ele equivalente ao "TUDOOK". O bloco de cdigo recebe como parametro o objeto de model
do FormGrid(FWFormGridModel) e deve retornar um valor lgico. Este bloco invocado antes da persistncia(gravao) dos
dados, validando o submodelo . Se o retorno do bloco for verdadeiro a gravao ser realizada se os demais submodelos
tambm estiverem validos, do contrrio um erro ser atribuido no Model, sendo necessrio indicar a natureza do erro atravs
do modelo.
Exemplo:
oModel := FWFormModel():New('COMP021')
oModel:AddFields('ZA1MASTER',,oStruZA1)
oModel:AddGrid( 'ZA2DETAIL', 'ZA1MASTER', oStruZA2, , , , ,bLoad)
Return oModel
Local nI := 0
Local aFields := oModel:GetStruct():GetFields() // Carrega a estruta criada
Local aDados := {}
Local aAux := {}
Local aRet := {}
aAux := Array(Len(aFields))
For ni := 1 to Len(aFields)
If Alltrim( aFields[ni,3] )== "CODIGO"
aAux[ni] := "000001"
ElseIf alltrim(aFields[ni,3]) == "QTD"
aAux[ni] := 10
EndIf
Next nI
aAdd(aRet,{0 ,aAux })
Return aRet
Verso 12 51
Nome do Treinamento
11.1. SetCloseOnOk
Metodo que seta um bloco de cdigo para verificar se a janela deve ou no ser fechada aps a execuo do boto OK
na incluso.
Exemplo:
11.2. SetViewAction
Define uma ao a ser executada em determinados pontos da View.
Exemplo:
oView:SetViewAction( 'BUTTONOK' , { |oView| MsgInfo('Apertei OK') } )
oView:SetViewAction( 'BUTTONCANCEL', { |oView| MsgInfo('Apertei Cancelar) } )
oView:SetViewAction( 'DELETELINE', { |oView,cIdView,nNumLine| MsgInfo('Apertei Deletar') } )
11.3. SetAfterOkButton
Metodo que seta um bloco de cdigo que ser chamado no final da execuo do boto OK. O bloco recebe como
parametro o objeto de View e no precisa retornar nenhum valor.
FWFORMVIEW():SetAfterOkButton(<bBlock >)
Exemplo:
11.4. SetViewCanActivate
Metodo que seta um Code-block para ser avaliado antes de se ativar o View, caso precisamos avaliar, ou questionar o
usuario sobre algo.No momento de chamada desse bloco o Model e o View no esto ativos, portanto no possivel
52 Verso 12
Nome do Treinamento
recuperar dados. O bloco recebe como parametro o objeto oView e deve retornar verdadeiro para permitir a ativao.
Se retornar falso a janela ser fechada.
FWFORMVIEW():SetViewCanActivate(<bBlock >)
Exemplo:
11.5. SetAfterViewActivate
Seta um bloco de cdigo que ser chamado depois do Activate do View. Esse bloco ser apenas executado, o retorno
dele no ser observado.O bloco de cdigo recebe como parametro o objeto View.
Exemplo:
11.6. SetVldFolder
Executa ao quando uma aba selecionada em qualquer folder da View
Exemplo:
Return lRet
Verso 12 53
Nome do Treinamento
Define um timer para a janela do view, o intervalo em milissegundos , para disparar o bloco de cdigo do Timer.
Exemplo:
O ponto de entrada chamado em vrios momentos dentro da aplicao, na 2 posio da estrutura do vetor passado
um identificador (ID) que identifica qual esse momento. Ela pode ter como contedo
54 Verso 12
Nome do Treinamento
Verso 12 55
Nome do Treinamento
56 Verso 12
Nome do Treinamento
4 C ToolTip (Opcional)
Parmetros Recebidos:
1 O Objeto do formulrio ou do modelo, conforme o
caso
2 C ID do local de execuo do ponto de entrada
3 C ID do formulrio
Retorno:
Requer um array de retorno com estrutura pr definida
#Include 'Protheus.ch'
oObj := aParam[1]
cIdPonto := aParam[2]
cIdModel := aParam[3]
lIsGrid := ( Len( aParam ) > 3 )
cClasse := IIf( oObj<> NIL, oObj:ClassName(), '' )
If lIsGrid
nQtdLinhas := oObj:GetQtdLine()
nLinha := oObj:nLine
EndIf
If cIdPonto == 'MODELPOS'
cMsg := 'Chamada na validao total do modelo (MODELPOS).' +
CRLF
cMsg += 'ID ' + cIdModel + CRLF
If cClasse == 'FWFORMGRID'
cMsg += ' um FORMGRID com ' + Alltrim( Str( nQtdLinhas ) )
+ ;
' linha(s).' + CRLF
cMsg += 'Posicionado na linha ' + Alltrim( Str( nLinha
) ) + CRLF
ElseIf cClasse == 'FWFORMFIELD'
cMsg += ' um FORMFIELD' + CRLF
EndIf
Verso 12 57
Nome do Treinamento
58 Verso 12
Nome do Treinamento
EndIf
Return xRet
Verso 12 59
Nome do Treinamento
FWMarkBrowse
// Instanciamento do classe
oMark := FWMarkBrowse():New()
// Ativacao da classe
oMark:Activate()
Return( NIL )
//-----------------------------------------------------------------------
----
dbSelectArea("SA2")
SA2->(dbGotop())
while ! SA2->(EOF())
If oMark:IsMark(cMarca)
msgInfo(SA2->A2_COD + ' ' + SA2->A2_NOME)
EndIf
SA2->( dbSkip() )
EndDo
60 Verso 12
Nome do Treinamento
Return( NIL )
14. Apendice
FWModelActive: Esta funo fornece o ltimo objeto da classe FWFormModel ativo, para ser utilizado nas regras
de validacao do sistema Microsiga Protheus.
Local oModel := FWModelActive()
FWMemoVirtual(): Alguns campos do tipo MEMO utilizam-se de tabelas para a gravao de seus valores (SYP3),
esses campos devem ser informados na estrutura para que o MVC consiga fazer seu
tratamento corretamente. Para estes campos MEMO sempre deve haver outro campo que conter o cdigo com
que o
campo MEMO foi armazenado na tabela auxiliar.
No exemplo abaixo, oStru a estrutura que contm os campos MEMO e o segundo parmetro um
vetor bi-dimensional onde cada par relaciona o campo da estrutura que contm o cdigo do
campo MEMO com o campo MEMO propriamente dito.
Verso 12 61
Nome do Treinamento
62 Verso 12