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    

aParam := PARAMIXB
Local

xRet      

xRet := .T.
Local

oObj      

oObj := ''
Local

cIdPonto  

cIdPonto := ''
Local

cIdModel  

cIdModel := ''
Local

lIsGrid   

lIsGrid := .F.

 


Local

nLinha    

nLinha := 0
Local nQtdLinhas := 0
Local

cMsg      

cMsg := ''

 

 

If aParam <> NIL

 

oObj       

oObj := aParam[1]

cIdPonto  

cIdPonto := aParam[2]

cIdModel  

cIdModel := aParam[3]

       lIsGrid   

lIsGrid := ( Len( aParam ) > 3 )

 


If lIsGrid

      

nQtdLinhas := oObj:GetQtdLine()

       nLinha    

nLinha := oObj:nLine
EndIf

 
If    

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     

If lIsGrid

            

cMsg

+=

um

FORMGRID

com

'

+

Alltrim(

Str(

nQtdLinhas

)

)

+

'

linha(s).'

+

CRLF

            

cMsg

+=

'Posicionado

na

linha

'

+

Alltrim(

Str(

nLinha    

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    

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    

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