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.
Comentário: Migration of unmigrated content due to installation of a new plugin

...

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,

Pontos de Entrada para fontes Advpl 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
 
 
 
 

MVCpara fonts Advpl desenvolvidos utilizando o conceito MVC