Árvore de páginas

Versões comparadas

Chave

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

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


Produto:

Solucoes_totvs_cross
SolucaoCrossTOTVS Backoffice

Linha de Produto:

Linhas_totvs
SegmentoDistribuição
RegionConstrução Projetos
LinhaLinha Protheus

Segmento:

Segmentos_totvs
SegmentoBackoffice

Módulo:Gestão de Contratos
Função:CNTA121 - Medições
ObjetivoListar exemplos de implementação dos pontos de entrada MVC
Dica
titleLista 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

Informações
titleDesenvolvimento 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:

Índice
minLevel2



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




Bloco de código
titleExemplo
linenumberstrue
#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á 

02. Impedir o encerramento da medição

Descrição:

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

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çãoxRetlógico

O evento MODELVLDACTIVE requer um retorno lógico.

.T. = Prossegue com a operação

.F. = Aborta a operação

Bloco de código
titleExemplo
linenumberstrue
#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

antes da sua ativação

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



Bloco de código
titleExemplo
linenumberstrue
#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]caractere
Identificador do evento, nesse exemplo será sempre MODELVLDACTIVEPARAMIXB[3]caractereIdentificador do modelo, nesse exemplo será CNTA121Retorno:ValorTipoDescriçãoxRetlógico

O evento MODELVLDACTIVE requer um retorno lógico.

.T. = Prossegue com a operação

.F. = Aborta a operação

Informações
titleImportante

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.

Identificador 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


Informações
titleImportante

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.

Bloco de código
titleExemplo
linenumberstrue
User Function CNTA121()
	Local aParam := PARAMIXB
	Local xRet := .T.
	Local oModel := ''
	Local cIdPonto := ''
	Local cIdModel := ''
	local cUserCode := "000001"

	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

		//Para negar a ação de estorno por um determinado usuario.
		If cIdPonto == "MODELVLDACTIVE" .AND. FwIsInCallStack("CN121Estorn") .AND. cUserCode != RetCodUsr()
			msgInfo(I18N("O usuário #1 não possui direitos sobre a transação", {cUserCode}), 'Atenção')
			lRet :=.F.
		EndIf
	EndIf
Return xRet

05. Carregar dados adicionais na carga dos itens


Descrição:

Possibilitar ao desenvolvedor realizar a mesma operação anteriormente feita nos pontos de entrada CN130INC, CN130ALT e 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




Bloco de código
titleExemplo
linenumberstrue
collapsetrue
#INCLUDE "Protheus.ch"
#INCLUDE "FWMVCDEF.CH"
 
/*{Protheus.doc} CNTA121()
    Possibilitar ao desenvolvedor realizar a mesma operação anteriormente feita no ponto de entrada CN130INC, CN130ALT e 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


Bloco de código
firstline1
titleExemplo FORMCOMMITTTSPRE
linenumberstrue
#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 (Inclusão de botão customizado na pagina de edição em medições)

Eventos:

BUTTONBAR - Medição

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
Bloco de código
titleExemplo
linenumberstrue
#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


Bloco de código
firstline1
titleExemplo
linenumberstrue
collapsetrue
#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

Bloco de código
firstline1
titleExemplo
linenumberstrue
#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

Bloco de código
firstline1
titleExemplo
linenumberstrue
#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

Bloco de código
firstline1
titleExemplo
linenumberstrue
#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

Bloco de código
firstline1
titleExemplo
linenumberstrue
#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

13. Implementação equivalente CN120RAT

Bloco de código
firstline1
titleExemplo
linenumberstrue
#INCLUDE 'PROTHEUS.CH'

/*{Protheus.doc} CNTA121()
    Possibilita o desenvolvedor manipular o rateio pela tabela CNZ durante o encerramento de uma 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]

		If cIdPonto == "MODELVLDACTIVE" .And.;
				FwIsInCallStack("CN121MedEnc") //No Encerramento --> confere a função na pilha

			cChave := CND->(CND_FILIAL+CND_CONTRA+CND_REVISA+CND_NUMMED)
			CNZ->(DbSetOrder(2))//CNZ_FILIAL+CNZ_CONTRA+CNZ_REVISA+CNZ_NUMMED+CNZ_ITCONT+CNZ_ITEM
			if !( CNZ->(DbSeek(cChave)) )

				CNE->(DbSetOrder(5))//CNE_FILIAL+CNE_CONTRA+CNE_REVISA+CNE_NUMMED
				cChave := CND->(CND_FILIAL+CND_CONTRA+CND_REVISA+CND_NUMMED)
				if CNE->(DbSeek(cChave))
					while CNE->(!Eof() .and. CNE_FILIAL+CNE_CONTRA+CNE_REVISA+CNE_NUMMED == cChave)

						geraCNZ("GCT000001", "01", 50)//itens por rateio
						geraCNZ("GCT000002", "02", 50)//itens por rateio
						CNE->(dbSkip())

					enddo
				endif
			endif
		EndIf
	EndIf
Return xRet

// Função para manipulação por item
Static Function geraCNZ(cCentro, cItem, nPerc)

    //Pegando o tamanho total da CNZ_CC
	local nTamanho := GetSX3Cache("CNZ_CC", "X3_TAMANHO")
	RecLock("CNZ", .T.)

	CNZ->CNZ_FILIAL := xFilial("CNZ")
	CNZ->CNZ_CONTRA := CND->CND_CONTRA
	CNZ->CNZ_REVISA := CND->CND_REVISA
	CNZ->CNZ_NUMMED := CND->CND_NUMMED
	CNZ->CNZ_FORNEC := "GCT001"
	CNZ->CNZ_LJFORN := "01"
	CNZ->CNZ_CODPLA := CNE->CNE_NUMERO
	CNZ->CNZ_CC := PadR(cCentro, nTamanho)
	CNZ->CNZ_ITEM := cItem
	CNZ->CNZ_ITCONT := CNE->CNE_ITEM
	CNZ->CNZ_PERC := nPerc
	//preenche campos

	CNZ->(MsUnLock())
Return nil

14. Geração de multas em planilhas eventuais

Bloco de código
firstline1
titleExemplo
linenumberstrue
#INCLUDE 'PROTHEUS.CH'

/*{Protheus.doc} CNTA121()
 Exemplo de como utilizar o ponto de entrada padrão MVC para gerar multas por item
*/ 
User Function CNTA121()
    Local aParam := PARAMIXB
    Local xRet := .T.
    Local oModel := ''
    Local oMdlCNE:= Nil
    Local cIdPonto := ''
    Local cIdModel := ''
    Local lItem := .T.
 
    If aParam <> NIL
        oModel  := aParam[1]
        cIdPonto:= aParam[2]
        cIdModel:= aParam[3]        

        If cIdPonto == "FORMLINEPOS" .And.;//Validação da linha, é possível utilizar outros eventos se for necessário.
            cIdModel == "CNEDETAIL" //submodelo CNE
            
            oMdlCNE := aParam[1] //Submodelo CNEDETAIL
            oModel := oMdlCNE:GetModel()//instância do MPFormModel            
            if CN121RetSt("MEDEVE") //Se for medição eventual                
                //Incluir uma validação pra verificar se os itens já foram processados anteriormente e prevenir a duplicação das multas etc...
                /*lItem=.T. indica que é multa por item e não por planilha*/
                CN121CNRIt(oModel, lItem, CN121RetSt('TPMULT')) //Realiza o processamento das multas. 
            endif
        EndIf
    EndIf
Return xRet



15. Validação do contrato. CN120CTU

Bloco de código
firstline1
titleExemplo
 
Bloco de código
titleExemplo
linenumberstrue
#INCLUDE "Protheus.ch"
#INCLUDE "FWMVCDEF.CH"

/*{Protheus.doc} CNTA121()
	Possibilitar responsável aopor desenvolvedorvalidar realizadoro validaçõescontrato antesdurante doa estornoexecução 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

rotina automática na Medição. Ponto de entrada é executado após a validação de acesso do usuário na Medição do Contrato
*/  

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 == "MODELVLDACTIVE" .And. IsBlind()//não tem interface gráfica
			conOut("Ponto de Entrada verificado")
		EndIf
    EndIf
Return xRet