Home

Linha Microsiga Protheus

Páginas filhas
  • Ponto de Entrada Padrão no MVC

Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.

...

Portuguese

Pagetitle
Padrão de Ponto de Entrada no MVC
Padrão de Ponto de Entrada no MVC

Documento:

Padrão de Ponto de Entrada no

MVC
Padrão de Ponto de Entrada no MVC

 

A idéia de ponto de entrada, para fontes desenvolvidos utilizando-se o conceito de MVC e suas classes, é um pouco diferente dos fontes desenvolvidos de maneira convencional.
Nos fontes convencionais temos um "nome" para cada ponto de entrada criado, por exemplo, na rotina MATA010 – Cadastro de Produtos, temos os pontos de entrada: MT010BRW, MTA010OK, MT010CAN, etc. Em MVC, não é desta forma. Em MVC criamos um único ponto de entrada e este é chamado em vários momentos dentro do fonte em

MVC

.
Este ponto de entrada único deve ser uma User Function e ter como nome o ID do Modelo de Dados (Model) do Fonte. Peguemos de exemplo um fonte do Modulo Jurídico:   JURA001. Neste fonte o ID do Modelo de Dados ( definido na funcão ModelDef()  ) é também JURA001, portanto ao se escrever o ponto de entrada desta rotina, faríamos:
 
User Function JURA001()
Local aParam := PARAMIXB
Local xRet   := .T.
...
Return xRet
 
O ponto de entrada criado recebe via parâmetro (PARAMIXB) um vetor com informações referentes ao fonte.
 
A estrutura deste vetor é:
 
POS.
TIPO
DESCRIÇÃO
1
O
Objeto do formulário ou do modelo, conforme o caso.
2
C
ID do local de execução do ponto de entrada
3
C
ID do formulário
 
 
Se for um grid ( FORMGRID ), também serão informados:
 
POS.
TIPO
DESCRIÇÃO
4
N
Número da Linha da Grid
5
C
 Ação da Grid
 

 

Como já foi dito, o ponto de entrada é chamado em vários momentos dentro do fonte, na 2ª posição da estrutura do vetor é passado um ID que identifica qual é este momento. Ela pode ter como conteúdo:
 
ID
MOMENTO DE EXECUÇÃO DO PONTO DE ENTRADA
MODELPRE
Antes da alteração de qualquer campo do modelo.
(requer um retorno lógico)
MODELPOS
Na validação total do modelo
(requer um retorno lógico)
FORMPRE
Antes da alteração de qualquer campo do formulário.
(requer um retorno lógico)
FORMPOS
Na validação total do formulário
(requer um retorno lógico)
FORMLINEPRE
Antes da alteração da linha do formulário GRID.
(requer um retorno lógico)
FORMLINEPOS
Na validação total da linha do formulário GRID.
(requer um retorno lógico)
MODELCOMMITTTS
Após a gravação total do modelo e dentro da transação
MODELCOMMITNTTS
Apos a gravação total do modelo e fora da transação
FORMCOMMITTTSPRE
Antes da gravação da tabela do formulário
FORMCOMMITTTSPOS
Após a gravação da tabela do formulário
FORMCANCEL
No cancelamento do botão.
BUTTONBAR
Para a inclusão de botões na ControlBar
(requer retorno como array)
 
Para criar os botões deve-se retornar um array bi-dimensional com a seguinte estrutura de cada item:
 
[1] (C) Titulo para o botão
[2] (C) Nome Bitmap para exibição
[3] (B) CodeBlock a ser executado
[4] (C) ToolTip (Opcional)
 
 
 
Observações:
·         Quando o modelo de dados possui vários componentes (por exemplo, vários grids), a 3ª posição do vetor trará o ID deste componente
·         Quando o tipo de retorno de um determinado momento de execução não for passado ou for passado com o tipo errado será exibida uma mensagem no console avisando sobre isso. Todos ID que esperam retorno devem ser tratado no ponto de entrada
·         Ao se escrever um fonte em MVC que será uma User Function, cuidado ao se atribuir o ID do modelo de dados (Model), pois ele não poderá ter o mesmo nome do fonte. Se o fonte tiver o nome FONT001, o ID do Modelo de Dados (Model) não poderá ser também FONT001, 
 
 
Exemplo:
#INCLUDE 'PROTHEUS.CH'
#INCLUDE 'FWMVCDEF.CH'
User Function JURA001()
Local aParam := PARAMIXB
Local xRet := .T.
Local oObj := ''
Local cIdPonto := ''
Local cIdModel := ''
Local lIsGrid := .F.
Local nLinha := 0
Local nQtdLinhas := 0
Local cMsg := ''

If aParam <> NIL
oObj := aParam[1]
cIdPonto := aParam[2]
cIdModel := aParam[3]
lIsGrid := ( Len( aParam ) > 3 )
If lIsGrid
nQtdLinhas := oObj:GetQtdLine()
nLinha := oObj:nLine
EndIf
If cIdPonto == 'MODELPOS'
cMsg := 'Chamada na validação total do modelo.' + CRLF
cMsg += 'ID ' + cIdModel + CRLF
xRet := ApMsgYesNo( cMsg + 'Continua ?' )
ElseIf cIdPonto == 'FORMPOS'
cMsg := 'Chamada na validação total do formulário.' + CRLF
cMsg += 'ID ' + cIdModel + CRLF
If lIsGrid
cMsg += 'É um FORMGRID com ' + Alltrim( Str( nQtdLinhas ) ) + ' linha(s).' + CRLF
cMsg += 'Posicionado na linha ' + Alltrim( Str( nLinha ) ) + CRLF
Else
cMsg += 'É um FORMFIELD' + CRLF
EndIf
xRet := ApMsgYesNo( cMsg + 'Continua ?' )

ElseIf cIdPonto == 'FORMLINEPRE'
If aParam[5] == 'DELETE'
cMsg := 'Chamada na pre validação da linha do formulário. ' + CRLF
cMsg += 'Onde esta se tentando deletar a linha' + CRLF
cMsg += 'ID ' + cIdModel + CRLF
cMsg += 'É um FORMGRID com ' + Alltrim( Str( nQtdLinhas ) ) + ' linha(s).' + CRLF
cMsg += 'Posicionado na linha ' + Alltrim( Str( nLinha ) ) + CRLF
xRet := ApMsgYesNo( cMsg + 'Continua ?' )
EndIf
ElseIf cIdPonto == 'FORMLINEPOS'
cMsg := 'Chamada na validação da linha do formulário.' + CRLF
cMsg += 'ID ' + cIdModel + CRLF
cMsg += 'É um FORMGRID com ' + Alltrim( Str( nQtdLinhas ) ) + ' linha(s).' + CRLF
cMsg += 'Posicionado na linha ' + Alltrim( Str( nLinha ) ) + CRLF
xRet := ApMsgYesNo( cMsg + 'Continua ?' )
ElseIf cIdPonto == 'MODELCOMMITTTS'
ApMsgInfo('Chamada apos a gravação total do modelo e dentro da transação.')
ElseIf cIdPonto == 'MODELCOMMITNTTS'
ApMsgInfo('Chamada apos a gravação total do modelo e fora da transação.')
ElseIf cIdPonto == 'FORMCOMMITTTSPOS'
ApMsgInfo('Chamada apos a gravação da tabela do formulário.')
ElseIf cIdPonto == 'MODELCANCEL'
cMsg := 'Deseja Realmente Sair ?'
xRet := ApMsgYesNo( cMsg )
ElseIf cIdPonto == 'BUTTONBAR'
xRet := { {'Salvar', 'SALVAR', { || Alert( 'Salvou' ) } } }
EndIf
EndIf
Return xRet