Escolar Documentos
Profissional Documentos
Cultura Documentos
MVC na Prática
WWW.UNIVERSOADVPL.COM
WWW.UNIVERSOADVPL.COM Versão 1.00
Apresentação
Meu nome é Eurai Rapelli, tenho 25 anos e sou formado em Ciências da Computação.
WWW.UNIVERSOADVPL.COM Página 2
WWW.UNIVERSOADVPL.COM Versão 1.00
SUMÁRIO
WWW.UNIVERSOADVPL.COM Página 3
WWW.UNIVERSOADVPL.COM Versão 1.00
WWW.UNIVERSOADVPL.COM Página 4
WWW.UNIVERSOADVPL.COM Versão 1.00
MVC na Prática
Para instalar o plugin desenhador, no TDS, vá até ajuda -> Instalador novo programa.
WWW.UNIVERSOADVPL.COM Página 5
WWW.UNIVERSOADVPL.COM Versão 1.00
2. Browser
Para iniciar, precisamos criar um browser na tela; onde será usado as funções dos menus como
INCLUIR / ALTERAR / ETC.
No e-book será usado tabela ZAA, crie uma tabela customizado com alguns campos para
estudo:
#INCLUDE "TOTVS.CH"
User Function UAMVC001()
Local oBrowse := Nil
oBrowse := FWMBrowse():New()
oBrowse:SetAlias("ZAA")
oBrowse:SetDescription("Cadastro de Grupo")
oBrowse:Activate()
Return( Nil )
Para criar como MarkBrowse, ou seja, ter uma coluna de marcação, use:
#INCLUDE "TOTVS.CH"
User Function UAMVC001()
oMark := FWMarkBrowse():New()
oMark:SetAlias("ZAA")
oMark:SetDescription( "Cadastro de Grupo" )
oMark:SetFieldMark( "ZAA_OK" )
oMark:Activate()
Return( Nil )
WWW.UNIVERSOADVPL.COM Página 6
WWW.UNIVERSOADVPL.COM Versão 1.00
3. Menu - MenuDef
Após criação do browser. Precisamos do MENU, ou seja, os botões que irão aparecer.
Ambos os casos permitem manipulação e adição de outros botões, como por exemplo:
Adicionar EXPORTAR, PROCESSAR, PARAMETROS; são outros botões além dos padrões.
E tanto na sintaxe clipper quanto no ADVPL o efeito será o mesmo. É questão de preferência
de cada desenvolvedor.
Uma terceira forma de criar o MENU seria a função abaixo. A mesma retorna os botões
padrões. Incluir / Alterar / Excluir / Imprimir e Copiar.
WWW.UNIVERSOADVPL.COM Página 7
WWW.UNIVERSOADVPL.COM Versão 1.00
4. Modelo – ModelDef
Return( oModel )
Sempre informe a chave primária para o modelo, em último caso, se não for possível, deixe em
branco da seguinte forma:
oModel:SetPrimaryKey({ })
WWW.UNIVERSOADVPL.COM Página 8
WWW.UNIVERSOADVPL.COM Versão 1.00
5. Visão – ViewDef
Note que são três funções estática padrões para criação do MVC => MenuDef / ModelDef /
ViewDef.
oView:SetModel(oModel)
oView:AddField( 'VIEW_ZAA', oStructZAA, "MODEL_ZAA" )
Return( oView )
WWW.UNIVERSOADVPL.COM Página 9
WWW.UNIVERSOADVPL.COM Versão 1.00
#INCLUDE "TOTVS.CH"
oModel := MPFormModel():New("MODELO")
oModel:AddFields("MODEL_ZAA", NIL, oStructZAA)
oModel:SetPrimaryKey({ 'ZAA_FILIAL', 'ZAA_ID' })
WWW.UNIVERSOADVPL.COM Página 10
WWW.UNIVERSOADVPL.COM Versão 1.00
Return( oModel )
Static Function ViewDef()
Local oModel := ModelDef()
Local oView := FWFormView():New() // Criacao da Interface
Local oStructZAA:= FWFormStruct(2, "ZAA")
oView:SetModel(oModel)
oView:AddField( 'VIEW_ZAA', oStructZAA, "MODEL_ZAA" )
Return( oView )
WWW.UNIVERSOADVPL.COM Página 11
WWW.UNIVERSOADVPL.COM Versão 1.00
Para adicionar legenda no seu browser, ou seja, uma nova coluna com imagens coloridas de
status e além de ser mostrado no filtro.
Browser completo:
#INCLUDE "TOTVS.CH"
oBrowse:Activate()
Return( Nil )
WWW.UNIVERSOADVPL.COM Página 12
WWW.UNIVERSOADVPL.COM Versão 1.00
oBrowse:SetFilterDefault( "ZAA_ATIVO=='1'" )
Browser completo:
oBrowse:SetFilterDefault( "ZAA_ATIVO=='1'" )
oBrowse:Activate()
Return( Nil )
WWW.UNIVERSOADVPL.COM Página 13
WWW.UNIVERSOADVPL.COM Versão 1.00
Em alguns momentos pode ser que deseje usar o filtro padrão ou legenda, ou até mesmo
remover campos da tela de acordo com uma condição.
OBS: Irei ensinar nos próximos capítulos como remover campo da tela.
oBrowse:SetFilterDefault( "ZAA_ATIVO=='1'" )
Endif
oBrowse:SetFilterDefault( "ZAA_ATIVO=='1'" )
Endif
oBrowse:Activate()
Return( Nil )
WWW.UNIVERSOADVPL.COM Página 14
WWW.UNIVERSOADVPL.COM Versão 1.00
No exemplo, coloco condição para não mostrar determinados campos se não for usuário
administrador:
oView:SetModel(oModel)
oView:AddField( 'VIEW_ZAA', oStructZAA, "MODEL_ZAA" )
Return( oView )
WWW.UNIVERSOADVPL.COM Página 15
WWW.UNIVERSOADVPL.COM Versão 1.00
Agora vamos adicionar botão na tela, pode ser usado para executar alguma função.
Adicione a include abaixo no seu fonte, necessário para algumas execuções no MVC; como por
exemplo:
MODEL_OPERATION_INSERT | MODEL_OPERATION_UPDATE
#INCLUDE 'FWMVCDEF.CH'
oView:AddUserButton('NomeBotão','CLIPS',{||MsgAlert('Oieee')},'UniversoADVPL')
Para esse botão ser visualizado apenas quando for inserção ou alteração, faça como abaixo:
oView:AddUserButton('NomeBotão','CLIPS',{||MsgAlert('Oieee')},'UniversoADVPL',/*nShortCut*/,{MOD
EL_OPERATION_INSERT, MODEL_OPERATION_UPDATE})
Resultado:
Static Function ViewDef()
Local oModel := ModelDef()
Local oView := FWFormView():New() // Criacao da Interface
Local oStructZAA:= FWFormStruct(2, "ZAA")
oView:SetModel(oModel)
oView:AddUserButton('NomeBotão','CLIPS',{||MsgAlert('Oieee')},'UniversoADVPL')
oView:AddField( 'VIEW_ZAA', oStructZAA, "MODEL_ZAA" )
Return( oView )
WWW.UNIVERSOADVPL.COM Página 16
WWW.UNIVERSOADVPL.COM Versão 1.00
Caso tenha notado, quando confirma a gravação do registro; a tela não é fechada.
Defini se pode abrir a tela ou não. Executado no Botão -> INCLUIR / ALTERAR / EXCLUIR /
VISUALIZAR / COPIAR:
WWW.UNIVERSOADVPL.COM Página 17
WWW.UNIVERSOADVPL.COM Versão 1.00
Return( lRet )
WWW.UNIVERSOADVPL.COM Página 18
WWW.UNIVERSOADVPL.COM Versão 1.00
If nOperation == MODEL_OPERATION_INSERT
MsgInfo('Incluindo')
ElseIf nOperation == MODEL_OPERATION_UPDATE
MsgInfo('Atualizando')
ElseIf nOperation == MODEL_OPERATION_DELETE
MsgInfo('Deletando')
ElseIf nOperation == MODEL_OPERATION_VIEW
MsgInfo('Visualizando')
Endif
WWW.UNIVERSOADVPL.COM Página 19
WWW.UNIVERSOADVPL.COM Versão 1.00
oModel:SetActivate({|| MsgInfo(ZAA->ZAA_DESC) })
WWW.UNIVERSOADVPL.COM Página 20
WWW.UNIVERSOADVPL.COM Versão 1.00
Antes de ativar o modo. É possível criar validação se pode ou não abrir a tela de acordo com
uma função.
Return( lRet )
WWW.UNIVERSOADVPL.COM Página 21
WWW.UNIVERSOADVPL.COM Versão 1.00
Nos eventos de validação, que possuem retorno True or False; necessário retornar a
mensagem com a função HELP.
WWW.UNIVERSOADVPL.COM Página 22
WWW.UNIVERSOADVPL.COM Versão 1.00
Não estarei tratando a criação da tabela no e-book. Apenas no curso em vídeo será tratado.
No Modelo, adicione:
No caso queria adicionar que uma linha é única, ou seja, o valor não pode se repetir; por
exemplo:
WWW.UNIVERSOADVPL.COM Página 23
WWW.UNIVERSOADVPL.COM Versão 1.00
No caso que você tenha 4 grid e 2 deles não são obrigado a ser preenchido; é opcional.
oModel:getModel('MODEL_ZAC'):SetOptional(.T.)
Para adicionar o campo como sequencial; ou seja, auto incremento. Por exemplo:
WWW.UNIVERSOADVPL.COM Página 24
WWW.UNIVERSOADVPL.COM Versão 1.00
oView:CreateFolder( 'PASTAS' )
oView:EnableTitleView('VIEW_ZAA')
oView:EnableTitleView('VIEW_ZAB')
oView:EnableTitleView('VIEW_ZAC')
oView:EnableTitleView('VIEW_ZAD')
WWW.UNIVERSOADVPL.COM Página 25
WWW.UNIVERSOADVPL.COM Versão 1.00
Nessa validação, é possível validar se pode editar a coluna, deletar, ou se pode setar o valor.
bLinePre.
oModel:addGrid('MODEL_ZAB','MODEL_ZAA',oStructZAB,bLinPreZAB)
Função:
If nOperation == MODEL_OPERATION_UPDATE
If cAction == "SETVALUE" //CANSETVALUE
If cIDField == 'ZAB_DESC'
Help( ,, 'HELP','UniversoADVPL', 'Não é possível alterar linha já inserida', 1, 0)
lRet := .F.
Endif
Endif
If cAction == "DELETE"
Help( ,, 'Help', 'UniversoADVPL', 'Não permitido apagar linhas na alteração', 1, 0)
lRet := .F.
Endif
Endif
Return( lRet )
WWW.UNIVERSOADVPL.COM Página 26
WWW.UNIVERSOADVPL.COM Versão 1.00
oModel:addGrid('MODEL_ZAB','MODEL_ZAA',oStructZAB,,bLinPosZAB)
Função:
If ! oGridModel:IsDeleted()
If AllTrim( oGridModel:GetValue("ZAB_DESC") ) == "VALIDA"
Help( ,, 'HELP','UniversoADVPL', 'Validação da Linha', 1, 0)
lRet := .F.
Endif
Endif
Return( lRet )
WWW.UNIVERSOADVPL.COM Página 27
WWW.UNIVERSOADVPL.COM Versão 1.00
Nessa validação, é possível validar se pode editar a coluna, deletar, ou se pode setar o valor.
bPre.
Não vejo diferença entre bPre e o bLinePre. No caso do bLinePre, tem a ação ADDLINE; que
por sinal não funciona até o momento.
oModel:addGrid('MODEL_ZAB','MODEL_ZAA',oStructZAB,,,bPreLinZAB)
Função:
If nOperation == MODEL_OPERATION_UPDATE
If cAction == "SETVALUE" //CANSETVALUE
If cIDField == 'ZAB_DESC'
Help( ,, 'HELP','UniversoADVPL', 'Não é possível alterar linha já inserida', 1, 0)
lRet := .F.
Endif
Endif
If cAction == "DELETE"
Help( ,, 'Help', 'UniversoADVPL', 'Não permitido apagar linhas na alteração', 1, 0)
lRet := .F.
Endif
Endif
Return( lRet )
WWW.UNIVERSOADVPL.COM Página 28
WWW.UNIVERSOADVPL.COM Versão 1.00
oModel:addGrid('MODEL_ZAB','MODEL_ZAA',oStructZAB,,,,bPrePosZAB)
Função:
WWW.UNIVERSOADVPL.COM Página 29
WWW.UNIVERSOADVPL.COM Versão 1.00
Sempre que for validar todo grid e usar For, salve e restaure as posições das linhas do GRID.
FwRestRows( aSaveLines )
AllTrim( oGridModel:GetValue("ZAB_DESC") )
WWW.UNIVERSOADVPL.COM Página 30
WWW.UNIVERSOADVPL.COM Versão 1.00
Irei demostrar como validar todos grids e informações apenas nesse evento.
WWW.UNIVERSOADVPL.COM Página 31
WWW.UNIVERSOADVPL.COM Versão 1.00
No caso acima, apenas escrevi a validação da ZAB, porém recuperei todos os modelos das
tabelas no início da função; com esses modelos podemos executar For nos outros grids ou
pegar valor do FormField e validar os valores.
WWW.UNIVERSOADVPL.COM Página 32
WWW.UNIVERSOADVPL.COM Versão 1.00
Em alguns casos, podemos precisar criar um campo que não está na tabela.
Por Exemplo: Um campo observação, onde apenas será usado para enviar um e-mail e não
será salvo no banco.
Código no ModelDef:
WWW.UNIVERSOADVPL.COM Página 33
WWW.UNIVERSOADVPL.COM Versão 1.00
Código no ViewDef:
WWW.UNIVERSOADVPL.COM Página 34
WWW.UNIVERSOADVPL.COM Versão 1.00
Na ViewDef:
WWW.UNIVERSOADVPL.COM Página 35
WWW.UNIVERSOADVPL.COM Versão 1.00
43. OtherObject
Adicione na ViewDef:
Função:
WWW.UNIVERSOADVPL.COM Página 36
WWW.UNIVERSOADVPL.COM Versão 1.00
Conclusão
WWW.UNIVERSOADVPL.COM Página 37
WWW.UNIVERSOADVPL.COM Versão 1.00
Obrigado!!!
www.universoadvpl.com
https://www.facebook.com/UniversoADVPL?ref=hl
https://www.youtube.com/user/UniversoADVPL/
https://plus.google.com/u/0/+UniversoADVPL
universoadvpl@universoadvpl.com
WWW.UNIVERSOADVPL.COM Página 38