Árvore de páginas

01. CNTA121 - Exemplos de utilização de pontos de entrada MVC


Produto:

TOTVS Backoffice

Linha de Produto:

Linha Protheus

Segmento:

Backoffice

Módulo:Gestão de Contratos
Função:CNTA121 - Medições
ObjetivoListar exemplos de implementação dos pontos de entrada MVC

Lista dos Pontos de Entrada

Para uma lista com o De/Para dos pontos de entrada do CNTA120 para o CNTA121, acessar a página GCT0084_Nova_Medição_CNTA121

Desenvolvimento de customizações

Caso tenha interesse em utilizar o modelo do CNTA121 em customizações é possível achar diversos exemplos na página Utilizando o modelo do CNTA121


Índice:



02. Impedir o encerramento da medição


Descrição:

Possibilitar ao desenvolvedor realizar a mesma operação anteriormente feita no ponto de entrada CN120ENVL e no CN120VENC

Eventos:

MODELVLDACTIVE

Programa Fonte:

CNTA121.PRW

Função:

CN121VlAct

Parâmetros:
PosiçãoTipoDescrição
PARAMIXB[1]Objeto do tipo MPFormModel

Modelo do CNTA121 antes da sua ativação

PARAMIXB[2]caractereIdentificador do evento, nesse exemplo será sempre MODELVLDACTIVE
PARAMIXB[3]caractereIdentificador do modelo, nesse exemplo será CNTA121
Retorno:
ValorTipoDescrição
xRetlógico

O evento MODELVLDACTIVE requer um retorno lógico.

.T. = Prossegue com a operação

.F. = Aborta a operação




Exemplo
#INCLUDE "Protheus.ch"
#INCLUDE "FWMVCDEF.CH"

/*{Protheus.doc} CNTA121()
	Possibilitar ao desenvolvedor realizar a mesma operação anteriormente feita no ponto de entrada CN120ENVL
*/
User Function CNTA121()
	Local aParam := PARAMIXB
	Local xRet := .T.
	Local oModel := ''
	Local cIdPonto := ''
	Local cIdModel := ''

	If aParam <> NIL
		oModel 	:= aParam[1]
		cIdPonto:= aParam[2]
		cIdModel:= aParam[3]
		
		/*O evento de id <MODELVLDACTIVE> será sempre chamado ao iniciar uma operação com o modelo de dados via método Activate do MPFormModel,
		então para nos certificarmos que a validação só será executada no encerramento tal qual o p.e CN120ENVL, é necessário verificar se a chamada está sendo realizada
		através da função CN121MedEnc, pra isso utilizamos a função FwIsInCallStack
		 */
		If cIdPonto == 'MODELVLDACTIVE' .And. FwIsInCallStack("CN121MedEnc")
			/*Como o modelo ainda não foi ativado, devemos utilizar as tabelas p/ validação, a única informação que constara em oModel 
			será a operação(obtida pelo método GetOperation), que nesse exemplo sempre será MODEL_OPERATION_UPDATE. 				
			*/
			If (CND->CND_VLTOT > 1000)
				Help("",1,"CNTA121ENC",,"Nao foi possivel realizar essa operacao",1,1)
				xRet := .F.
			EndIf
		EndIf
	EndIf
Return xRet


03. Importar rateios para medição(CNZAUTRAT)


Descrição:

Possibilitar ao desenvolvedor realizar a mesma operação anteriormente feita no ponto de entrada CNZAUTRAT

Eventos:

BUTTONBAR

Programa Fonte:

CNTA121.PRW

Função:

Não há

Parâmetros:
PosiçãoTipoDescrição
PARAMIXB[1]Objeto do tipo MPFormModel

Modelo do CNTA121

PARAMIXB[2]caractereIdentificador do evento, nesse exemplo será sempre BUTTONBAR
PARAMIXB[3]caractereIdentificador do modelo, nesse exemplo será CNTA121
Retorno:
ValorTipoDescrição
xRetvetor

O evento BUTTONBAR requer como retorno um vetor bidimensional(matriz).

Cada posição da matriz deve ser um vetor de 4 posições no seguinte formato:

TipoDescrição
CTítulo do botão
CNome do bitmap para exibição
BBloco de código que será executado
CTooltip



Exemplo
#INCLUDE "Protheus.ch"
#INCLUDE "FWMVCDEF.CH"

/*{Protheus.doc} CNTA121()
Possibilitar ao desenvolvedor realizar a mesma operação anteriormente feita no ponto de entrada CNZAUTRAT
*/
User Function CNTA121()
 	 Local aParam := PARAMIXB
     Local xRet := .T.
     Local oModel := ''
     Local cIdPonto := ''
     Local cIdModel := ''
 
     If aParam <> NIL
         oModel  := aParam[1]
         cIdPonto:= aParam[2]
         cIdModel:= aParam[3]
         
         If(cIdPonto == 'BUTTONBAR')
 			xRet := { {'Importar Rateios', 'BUDGET', { |x| U_Exemplo(x) }, 'Importa Rateios Excel' } } //Uma opção nova será adicionada ao menu Outras Ações
         EndIf
     EndIf
 Return xRet

User Function Exemplo(oView)
 	Local oModel	:= oView:GetModel()
	Local aHeadCNZ	:= {}
	Local nOpc		:= oModel:GetOperation()
	Local oModelCNZ := oModel:GetModel("CNZDETAIL")
	Local aRetAutRat:= {}
	Local nX 		:= 0
	Local nY 		:= 0

 	If (nOpc == MODEL_OPERATION_INSERT .Or. nOpc == MODEL_OPERATION_UPDATE)
		 If ExistBlock("CNZAUTRAT") 
			 aHeadCNZ	:= GCTHeadCNZ()
			 aRetAutRat := ExecBlock("CNZAUTRAT",.F.,.F.,{aHeadCNZ, {}, nOpc}) /*Nesse exemplo ele chamará o P.E já existente*/

			 If (Len(aRetAutRat) > 0)
			 	If (oModelCNZ:Length() > 1)
					for nX := 1 to oModelCNZ:Length()
						oModelCNZ:GoLine(nX)
						If !oModelCNZ:IsDeleted()
							oModelCNZ:DeleteLine()
						EndIf
					next nX
				EndIf

				for nX := 1 to Len(aRetAutRat) /*Percorrerá os registros e adicionará ao submodelo CNZDETAIL */
					If Len(aRetAutRat[nX]) == Len(aHeadCNZ)+1
						If !Empty(oModelCNZ:GetValue("CNZ_CC"))
							oModelCNZ:AddLine()							
						EndIf

						for nY := 1 to Len(aHeadCNZ)
							If AllTrim(aHeadCNZ[nY,2]) $ 'CNZ_PERC|CNZ_CC|' /*Adicionar os campos desejados*/
								oModelCNZ:SetValue(aHeadCNZ[nY,2], aRetAutRat[nX,nY])
							EndIf
						next nY
					EndIf
				next nX
			 EndIf
		 EndIf
 	Else
 		Alert( 'Operacao inválida.' )
 	EndIf
Return 

04. Realizar validações antes do estorno da Medição


Descrição:

Possibilitar ao desenvolvedor realizador validações antes do estorno da medição

Eventos:

MODELVLDACTIVE

Programa Fonte:

CNTA121.PRW

Função:

CN121Estorn

Parâmetros:
PosiçãoTipoDescrição
PARAMIXB[1]Objeto do tipo MPFormModel

Modelo do CNTA121 antes da sua ativação

PARAMIXB[2]caractereIdentificador do evento, nesse exemplo será sempre MODELVLDACTIVE
PARAMIXB[3]caractereIdentificador do modelo, nesse exemplo será CNTA121
Retorno:
ValorTipoDescrição
xRetlógico

O evento MODELVLDACTIVE requer um retorno lógico.

.T. = Prossegue com a operação

.F. = Aborta a operação


Importante

O único evento do MVC chamado no estorno da medição é o MODELVLDACTIVE, pois as demais operações de estorno são feitas sem utilizar o modelo de dados.

Exemplo
#INCLUDE "Protheus.ch"
#INCLUDE "FWMVCDEF.CH"

/*{Protheus.doc} CNTA121()
	Possibilitar ao desenvolvedor realizador validações antes do estorno da medição
*/
User Function CNTA121()
	Local aParam := PARAMIXB
	Local xRet := .T.
	Local oModel := ''
	Local cIdPonto := ''
	Local cIdModel := ''

	If aParam <> NIL
		oModel 	:= aParam[1]
		cIdPonto:= aParam[2]
		cIdModel:= aParam[3]
		
		/*O evento de id <MODELVLDACTIVE> será sempre chamado ao iniciar uma operação com o modelo de dados via método Activate do MPFormModel,
		então para nos certificarmos que a validação só será executada no estorno da medição é necessário verificar se a chamada está sendo realizada
		através da função CN121Estorn, pra isso utilizamos a função FwIsInCallStack
		 */
		If(cIdPonto == 'MODELVLDACTIVE' .And. FwIsInCallStack("CN121Estorn"))
			/*Como o modelo ainda não foi ativado, devemos utilizar as tabelas p/ validação, a única informação que constara em oModel 
			será a operação(obtida pelo método GetOperation), que nesse exemplo sempre será MODEL_OPERATION_UPDATE. 				
			*/
			If (CND->CND_VLTOT > 1000)
				Help("",1,"CN121ESTOR",,"Nao foi possível realizar essa operacao",1,1)
				xRet := .F.
			EndIf
		EndIf
	EndIf
Return xRet

05. Carregar dados adicionais na carga dos itens(CNE)


Descrição:

Possibilitar ao desenvolvedor realizar a mesma operação anteriormente feita no ponto de entrada CN130INC

Eventos:

FORMLINEPOS

Programa Fonte:

CNTA121.PRW

Parâmetros:
PosiçãoTipoDescrição
PARAMIXB[1]Objeto do tipo MPFormModel

Modelo do CNTA121

PARAMIXB[2]caractereIdentificador do evento, nesse exemplo será sempre FORMLINEPOS
PARAMIXB[3]caractereIdentificador do submodelo, nesse exemplo será CNEDETAIL
Retorno:
ValorTipoDescrição
xRetlógico

O evento requer um retorno lógico.

.T. = Prossegue com a operação

.F. = Aborta a operação




Exemplo
#INCLUDE "Protheus.ch"
#INCLUDE "FWMVCDEF.CH"

/*{Protheus.doc} CNTA121()
	Possibilitar ao desenvolvedor realizar a mesma operação anteriormente feita no ponto de entrada CN130INC
*/
User Function CNTA121()
	Local aParam 	:= PARAMIXB
	Local xRet 		:= .T.
	Local oModel 	:= Nil
	Local oModelCND	:= Nil
	Local oModelCNE	:= Nil
	Local cIdPonto 	:= ''
	Local cIdModel	:= ''
	Local cCampo	:= ""
	Local cAction	:= ""
	Local xValue	:= 0

	If aParam <> NIL
		oModel  := aParam[1]
		cIdPonto:= AllTrim(aParam[2])
		cIdModel:= aParam[3]
		If(cIdModel == 'CNEDETAIL')
			oModelCNE := oModel //Qnd cIdModel for CNEDETAIl, oModel será o submodelo(FwFormGridModel) da CNE

			If cIdPonto == "FORMPRE"
				//
			ElseIf cIdPonto == "FORMLINEPRE"
				cAction := aParam[5]
				cCampo	:= aParam[6]

				If cAction == "SETVALUE"
					//
				Elseif cAction == "CANSETVALUE"
					//
				EndIf
			ElseIf cIdPonto == "FORMLINEPOS"//Será ativado 1x por linha			

				oModelCND := oModelCNE:GetModel():GetModel("CNDMASTER")//Obtêm o modelo da CND, com ele é possível verificar valores da CND

				/*Abaixo um exemplo de como informar valores para campos(que poderia ser um campo de usuário).*/
				If oModelCNE:GetValue("CNE_VLUNIT") > 100
					oModelCNE:LoadValue("CNE_CC", "GCT000001")	
				Else
					oModelCNE:LoadValue("CNE_CC", "GCT000002")
				EndIf
			EndIf			
		ElseIf(cIdModel == 'CNDMASTER')//Cabeçalho
			oModelCND := oModel //Qnd cIdModel for CNDMASTER, oModel será o submodelo(FWFormModel) da CND
			If cIdPonto == "FORMPRE"
				cAction := aParam[4]
				cCampo	:= aParam[5]
				xValue	:= aParam[6]

				If cAction == "SETVALUE"
					If cCampo == "CND_CONTRA"//Ao preencher o contrato
						oModel:LoadValue("CND_OBS", "Observacao") 
					EndIf
				Elseif cAction == "CANSETVALUE"
					//
				EndIf
			EndIf
		EndIf
	EndIf
Return xRet

06. Modificar dados da CND antes da sua gravação(MD130GRV/CN130PGRV)


Descrição:

Possibilitar ao desenvolvedor realizar a mesma operação anteriormente feita no ponto de entrada MD130GRVCN130PGRV

Eventos:

FORMCOMMITTTSPRE

Programa Fonte:

CNTA121.PRW

Parâmetros:
PosiçãoTipoDescrição
PARAMIXB[1]Objeto do tipo FwFormModel

Submodelo CNDMASTER

PARAMIXB[2]caractereIdentificador do evento, nesse exemplo será sempre FORMCOMMITTTSPRE
PARAMIXB[3]caractereIdentificador do submodelo, nesse exemplo será CNDMASTER
Retorno:
ValorTipoDescrição
xRetlógico

Indiferente


Exemplo FORMCOMMITTTSPRE
#include "PROTHEUS.CH"
#INCLUDE "FWMVCDEF.CH"
#INCLUDE "RWMAKE.CH"
#INCLUDE "TBICONN.CH"

User Function CNTA121()
    Local aParam    := PARAMIXB
    Local xRet      := .T.
    Local oModelCND := Nil    
    Local cIdPonto  := ''
    Local cIdModel  := ''
    Local lIsInsert	:= .F.
 
    If aParam <> NIL        
        cIdPonto:= AllTrim(aParam[2])
        cIdModel:= aParam[3]		
		If (cIdPonto == "FORMCOMMITTTSPRE" .And. cIdModel == "CNDMASTER")//FORMCOMMITTTSPRE: Antes da gravação da tabela do formulário. Equivalente ao MD130GRV
		    oModelCND	:= aParam[1]			
			lIsInsert	:= aParam[4]
			
			If lIsInsert .And. AllTrim(oModelCND:GetValue("CND_SITUAC")) == "B"
				oModelCND:LoadValue("CND_SITUAC", "L")
			EndIf
		ElseIf (cIdPonto == "FORMCOMMITTTSPOS" .And. cIdModel == "CNDMASTER")//FORMCOMMITTTSPOS: Após a gravação da tabela do formulário. Equivalente ao CN130PGRV
		    //Lógica do usuário
		EndIf       
    EndIf
Return xRet

07. Adicionar botões na tela de medições(CN130BUT)


Descrição:

Possibilitar ao desenvolvedor realizar a mesma operação anteriormente feita no ponto de entrada CN130BUT

Eventos:

BUTTONBAR

Programa Fonte:

CNTA121.PRW

Função:

Não há

Parâmetros:
PosiçãoTipoDescrição
PARAMIXB[1]Objeto do tipo MPFormModel

Modelo do CNTA121

PARAMIXB[2]caractereIdentificador do evento, nesse exemplo será sempre BUTTONBAR
PARAMIXB[3]caractereIdentificador do modelo, nesse exemplo será CNTA121
Retorno:
ValorTipoDescrição
xRetvetor

O evento BUTTONBAR requer como retorno um vetor bidimensional(matriz).

Cada posição da matriz deve ser um vetor de 4 posições no seguinte formato:

TipoDescrição
CTítulo do botão
CNome do bitmap para exibição
BBloco de código que será executado
CTooltip
Exemplo
#INCLUDE "Protheus.ch"
#INCLUDE "FWMVCDEF.CH"

/*{Protheus.doc} CNTA121()
   Possibilitar ao desenvolvedor realizar a mesma operação anteriormente feita no ponto de entrada CN130BUT 
*/
User Function CNTA121()
 	 Local aParam := PARAMIXB
     Local xRet := .T.
     Local oModel := ''
     Local cIdPonto := ''
     Local cIdModel := ''
 
     If aParam <> NIL
         oModel  := aParam[1]
         cIdPonto:= aParam[2]
         cIdModel:= aParam[3]
         
         If(cIdPonto == 'BUTTONBAR')
 			xRet := { {'Botão customizado', 'BUDGET', { |x| U_Exemplo(x) }, 'Botão customizado' } } //Uma opção nova será adicionada ao menu Outras Ações
         EndIf
     EndIf
 Return xRet

User Function Exemplo(oView)
 	Local oModel	:= oView:GetModel()	
	Local nOpc		:= oModel:GetOperation()	

	Alert( 'Ação customizada.' )

Return 


08. Validar exclusão dos itens da medição(C130KDEL)


Descrição:

Possibilitar ao desenvolvedor realizar a mesma operação anteriormente feita no ponto de entrada C130KDEL

Eventos:

FORMLINEPRE

Programa Fonte:

CNTA121.PRW

Parâmetros:
PosiçãoTipoDescrição
PARAMIXB[1]Objeto do tipo FwFormGrid

Submodelo CNEDETAIL

PARAMIXB[2]caractereIdentificador do evento, nesse exemplo será sempre FORMLINEPRE
PARAMIXB[3]caractereIdentificador do submodelo, nesse exemplo será CNEDETAIL
Retorno:
ValorTipoDescrição
xRetlógico

O evento requer um retorno lógico.

.T. = Prossegue com a operação

.F. = Aborta a operação


Exemplo
#INCLUDE "Protheus.ch"
#INCLUDE "FWMVCDEF.CH"

/*{Protheus.doc} CNTA121()
	Possibilitar ao desenvolvedor realizar a mesma operação anteriormente feita no ponto de entrada C130KDEL
*/ 
User Function CNTA121()
    Local aParam    := PARAMIXB
    Local xRet      := .T.
    Local oModelCNE	:= Nil
    Local cIdPonto  := ''
    Local cIdModel  := ''
    Local cAction	:= ""
 
    If aParam <> NIL        
        cIdPonto:= AllTrim(aParam[2])
        cIdModel:= aParam[3]		
		If (cIdPonto == "FORMLINEPRE" .And. cIdModel == "CNEDETAIL")
			oModelCNE	:= aParam[1]
			cAction		:= aParam[5]			

			If cAction == "DELETE"
				xRet := MsgYesNo("Confirma a exclusão?")
			EndIf			
		EndIf       
    EndIf
Return xRet  

09. Implementação equivalente CN130TOK

Exemplo
#INCLUDE "Protheus.ch"
#INCLUDE "FWMVCDEF.CH"

/*{Protheus.doc} CNTA121()
	Possibilitar ao desenvolvedor realizar a mesma operação anteriormente feita no ponto de entrada CN130TOK
 */  
User Function CNTA121()
    Local aParam    := PARAMIXB
    Local xRet      := .T.
    Local oModel	:= Nil
    Local cIdPonto  := ''
    Local cIdModel  := ''
 
    If aParam <> NIL        
        cIdPonto:= AllTrim(aParam[2])
        cIdModel:= aParam[3]		
		If (cIdPonto == "MODELPOS")//CN130TOK
			oModel := aParam[1]//instância de MPFormModel
			if oModel:GetOperation() == MODEL_OPERATION_INSERT
				If Empty(oModel:GetValue("CNDMASTER", "CND_OBS"))
					Alert("Informe observação.")
					xRet := .F.				
				EndIf
			ElseIf oModel:GetOperation() == MODEL_OPERATION_UPDATE
				//
			ElseIf oModel:GetOperation() == MODEL_OPERATION_DELETE
				xRet := MsgYesNo("Confirma exclusão?")
			endif
		EndIf       
    EndIf
Return xRet

10. Implementação equivalente CN130VLIN

Exemplo
#INCLUDE "Protheus.ch"
#INCLUDE "FWMVCDEF.CH"

/*{Protheus.doc} CNTA121()
	Possibilitar ao desenvolvedor realizar a mesma operação anteriormente feita no ponto de entrada CN130VLIN
*/  
User Function CNTA121()
	Local aParam 	:= PARAMIXB
	Local xRet 		:= .T.
	Local oModel 	:= Nil	
	Local oModelCNE	:= Nil
	Local cIdPonto 	:= ''
	Local cIdModel	:= ''
	Local cCampo	:= ""
	Local cAction	:= ""
	Local lOnCheck	:= .F.

	If aParam <> NIL
		oModel  := aParam[1]
		cIdPonto:= AllTrim(aParam[2])
		cIdModel:= aParam[3]
		If(cIdModel == 'CNEDETAIL')
			oModelCNE	:= oModel //Qnd cIdModel for CNEDETAIl, oModel será o submodelo(FwFormGridModel) da CNE
			lOnCheck	:= FwIsInCallStack("CN121ITEM")//Indica que trata-se da carga dos itens ao marcar a CXN

			If cIdPonto == "FORMLINEPRE" .And. !lOnCheck
				cAction := aParam[5]
				cCampo	:= aParam[6]

				If cAction == "SETVALUE"
					//Inserir validação do valor de acordo com <cCampo>
					if cCampo == "CNE_QUANT"
						if oModelCNE:GetValue(cCampo) > 1
							//Apresentar HELP
							xRet := .F.
						endif
					endif
				Elseif cAction == "CANSETVALUE"
					//Retorna se é possível alterar o campo(WHEN) de <cCampo>, usar com cuidado pois pode impactar performance
				EndIf			
			EndIf
		EndIf
	EndIf
Return xRet

11. Implementação equivalente CN130VCK/CN130VAD

Exemplo
#INCLUDE "Protheus.ch"
#INCLUDE "FWMVCDEF.CH"

/*{Protheus.doc} CNTA121()
	Possibilitar ao desenvolvedor realizar a mesma operação anteriormente feita no ponto de entrada CN130VCK/CN130VAD
*/   
User Function CNTA121()
	Local aParam 	:= PARAMIXB
	Local xRet 		:= .T.
	Local oModel 	:= Nil	
	Local oModelCZY	:= Nil
	Local cIdPonto 	:= ''
	Local cIdModel	:= ''
	Local cCampo	:= ""
	Local cAction	:= ""	

	If aParam <> NIL
		oModel  := aParam[1]
		cIdPonto:= AllTrim(aParam[2])
		cIdModel:= aParam[3]
		If(cIdModel == 'CZYDETAIL')//CZY = Tabela de amarração Medição x Adiantamentos(CNX)
			oModelCZY	:= oModel //Qnd cIdModel for CZYDETAIL, oModel será o submodelo(FwFormGridModel) da CZY
			If cIdPonto == "FORMLINEPRE"//CN130VCK
			    cAction := aParam[5]
				cCampo	:= aParam[6]

				If cAction == "SETVALUE"					
					if cCampo == "CZY_VALOR"
						if oModelCZY:GetValue(cCampo) > 100
							//Apresentar HELP
							xRet := .F.
						endif
					endif
				EndIf			
			ElseIf cIdPonto == "FORMPOS" //CN130VAD
				//Realizar validacao
			EndIf
		EndIf
	EndIf
Return xRet

12. Implementação equivalente CN130VCK/CN130MTINC

Exemplo
#INCLUDE "Protheus.ch"
#INCLUDE "FWMVCDEF.CH"

/*{Protheus.doc} CNTA121()
	Possibilitar ao desenvolvedor realizar a mesma operação anteriormente feita no ponto de entrada CN130VCK/CN130MTINC 
*/    
User Function CNTA121()
	Local aParam 	:= PARAMIXB
	Local xRet 		:= .T.	
	Local cIdPonto 	:= ''
	Local cIdModel	:= ''
	Local oMdlCNQ	:= Nil
	Local oMdlCNR1	:= Nil
	Local oMdlCNR2	:= Nil

	If aParam <> NIL
		
		cIdPonto:= AllTrim(aParam[2])
		cIdModel:= aParam[3]

		If (cIdPonto == "FORMPOS" .And. cIdModel $ 'CNQDETAIL|CNRDETAIL1|CNRDETAIL2|')		
			
			If(cIdModel == 'CNQDETAIL') //Descontos
				oMdlCNQ := aParam[1]
			ElseIf(cIdModel == 'CNRDETAIL1') //Multas/Bonificacoes por Medição
				oMdlCNR1 := aParam[1]
			ElseIf(cIdModel == 'CNRDETAIL2') //Multas/Bonificacoes por Item
				oMdlCNR2 := aParam[1]
			EndIf
		endif

	EndIf
Return xRet