Vídeo Aula – AdvPL 023 – Pontos de Entrada em MVC

Olá pessoal…

Na aula de hoje vou mostrar como fazer pontos de entrada em MVC.

Abaixo o código fonte do ponto de entrada MATA070:

//Bibliotecas
#Include "Protheus.ch"

/*---------------------------------------------------------------------------------------------------------------------------*
 | P.E.:  MATA070                                                                                                            |
 | Autor: Daniel Atilio                                                                                                      |
 | Data:  23/10/2016                                                                                                         |
 | Desc:  Ponto de entrada MVC no cadastro de Bancos                                                                         |
 | Obs.:  Ao criar um P.E. em MVC com o mesmo nome do ModelDef, deixe o nome do prw com outro nome, por exemplo,             |
 |        MATAXXX_pe.prw                                                                                                     |
 | Ref.:  http://tdn.totvs.com/display/public/mp/Pontos+de+Entrada+para+fontes+Advpl+desenvolvidos+utilizando+o+conceito+MVC |
 *---------------------------------------------------------------------------------------------------------------------------*/


User Function MATA070()
	Local aParam     := PARAMIXB
	Local xRet       := .T.
	Local oObj       := Nil
	Local cIdPonto   := ''
	Local cIdModel   := ''
	Local nOper      := 0
	Local cCampo     := ''
	Local cTipo      := ''

	//Se tiver parâmetros
	If aParam <> NIL
		ConOut("> "+aParam[2])
		
		//Pega informações dos parâmetros
		oObj     := aParam[1]
		cIdPonto := aParam[2]
		cIdModel := aParam[3]
		
		//Valida a abertura da tela
		If cIdPonto == "MODELVLDACTIVE"
			nOper := oObj:nOperation
			
			//Se for Exclusão, não permite abrir a tela
			If nOper == 5
				xRet := .F.
			EndIf
		
		//Pré configurações do Modelo de Dados
		ElseIf cIdPonto == "MODELPRE"
			xRet := .T.
		
		//Pré configurações do Formulário de Dados
		ElseIf cIdPonto == "FORMPRE"
			nOper  := oObj:GetModel(cIdPonto):nOperation
			cTipo  := aParam[4]
			cCampo := aParam[5]
			
			//Se for Alteração
			If nOper == 4
				//Não permite alteração dos campos chave
				If cTipo == "CANSETVALUE" .And. Alltrim(cCampo) $ ("A6_COD.A6_AGENCIA.A6_NUMCON")
					xRet := .F.
				EndIf
			EndIf
		
		//Adição de opções no Ações Relacionadas dentro da tela
		ElseIf cIdPonto == 'BUTTONBAR'
			xRet := {}
			aAdd(xRet, {"* Titulo 1", "", {|| Alert("Botão 1")}, "Tooltip 1"})
			aAdd(xRet, {"* Titulo 2", "", {|| Alert("Botão 2")}, "Tooltip 2"})
			aAdd(xRet, {"* Titulo 3", "", {|| Alert("Botão 3")}, "Tooltip 3"})
		
		//Pós configurações do Formulário
		ElseIf cIdPonto == 'FORMPOS'
			xRet := .T.
		
		//Validação ao clicar no Botão Confirmar
		ElseIf cIdPonto == 'MODELPOS'
			//Se o campo de contato estiver em branco, não permite prosseguir
			If Empty(M->A6_CONTATO)
				Aviso('Atenção', 'Por favor, informe um Contato!', {'OK'}, 03)
				xRet := .F.
			EndIf
		
		//Pré validações do Commit
		ElseIf cIdPonto == 'FORMCOMMITTTSPRE'
		
		//Pós validações do Commit
		ElseIf cIdPonto == 'FORMCOMMITTTSPOS'
			
		//Commit das operações (antes da gravação)
		ElseIf cIdPonto == 'MODELCOMMITTTS'
			
		//Commit das operações (após a gravação)
		ElseIf cIdPonto == 'MODELCOMMITNTTS'
			nOper := oObj:nOperation
			
			//Se for inclusão, mostra mensagem de sucesso
			If nOper == 3
				Aviso('Atenção', 'Banco criado com sucesso!', {'OK'}, 03)
			EndIf
		EndIf
	EndIf
Return xRet

Abaixo o código fonte do ponto de entrada OS010BTN:

//Bibliotecas
#Include "Protheus.ch"

/*--------------------------------------------------------------------------*
 | P.E.:   OS010BTN                                                         |
 | Autor:  Daniel Atilio                                                    |
 | Data:   27/08/2016                                                       |
 | Descr.: Função que adiciona Ações Relacionadas dentro da Tabela de Preço |
 *--------------------------------------------------------------------------*/
 
User Function OS010BTN()
	Local aArea    := GetArea()
	Local aButtons := {}
	
	//Adicionando o botão no Ações Relacionadas
	aAdd(aButtons,{ "* Atualiza Produtos", {|| u_zAtuGrid()}, "* Atualiza Produtos" })
	
	RestArea(aArea)
Return aButtons

/*/{Protheus.doc} zAtuGrid
Função para atualizar a DA1 - MVC
@type function
@author Atilio
@since 27/08/2016
@version 1.0
/*/
User Function zAtuGrid()
	Local aArea      := GetArea()
	Local nJanAltu   := 100
	Local nJanLarg   := 700
	Local oFontPad   := TFont():New("Arial", , -14)
	Private lNovo    := .F.
	Private oDlgAtu
	Private cMaskDA1 := PesqPict('DA1', 'DA1_PRCVEN')
	
	//Carregando os modelos de dados do cabeçalho e grid
	Private oModelPad  := FWModelActive()
	Private oModelGrid := oModelPad:GetModel('DA1DETAIL')
	Private nOperacao  := oModelPad:nOperation
	
	//Pegando posições do aHeader
	Private nPosProd   := aScan(oModelGrid:aHeader, {|x| AllTrim(x[2]) == AllTrim("DA1_CODPRO")})
	Private nPosDesc   := aScan(oModelGrid:aHeader, {|x| AllTrim(x[2]) == AllTrim("DA1_DESCRI")})	
	Private nPosPrcV   := aScan(oModelGrid:aHeader, {|x| AllTrim(x[2]) == AllTrim("DA1_PRCVEN")})
	
	//Linha Atual
	Private nLinAtu    := oModelGrid:nLine
	
	//Linha encontrada
	Private nLinEnc    := 0
	
	//Gets
	Private oGetCod, cGetCod := Space(TamSX3('B1_COD')[01])
	Private oGetDes, cGetDes := Space(TamSX3('B1_DESC')[01])
	Private oGetPrc, nGetPrc := 0
	Private oGetMsg, cGetMsg := ""
	
	//Montando a janela
	DEFINE MSDIALOG oDlgAtu TITLE "Atualização Preço" FROM 000, 000  TO nJanAltu, nJanLarg COLORS 0, 16777215 PIXEL
		//Produto
		nColAux := 3
		@ 007, nColAux      SAY oSayCod PROMPT "Produto: " 				SIZE 050, 007 OF oDlgAtu COLORS 0, 16777215  PIXEL
		@ 004, nColAux+40   MSGET 	oGetCod VAR cGetCod                SIZE 060, 010 OF oDlgAtu COLORS 0, 16777215  F3 'SB1' VALID (fPesqSB1()) PIXEL
		
		//Descrição
		nColAux += 103
		@ 007, nColAux      SAY oSayDes PROMPT "Descrição: " 			SIZE 050, 007 OF oDlgAtu COLORS 0, 16777215  PIXEL
		@ 004, nColAux+40   MSGET 	oGetDes VAR cGetDes                SIZE 100, 010 OF oDlgAtu COLORS 0, 16777215  PIXEL
		oGetDes:lActive := .F.
		
		//Preço Venda
		nColAux += 143
		@ 007, nColAux      SAY oSayPrc PROMPT "Preço Venda: " 			SIZE 050, 007 OF oDlgAtu COLORS 0, 16777215  PIXEL
		@ 004, nColAux+40   MSGET 	oGetPrc VAR nGetPrc                SIZE 060, 010 OF oDlgAtu COLORS 0, 16777215  PICTURE cMaskDA1 PIXEL
		
		//Get de Log
		@ 023, 003   MSGET oGetMsg VAR    cGetMsg        SIZE (nJanLarg/2)-12, 012 OF oDlgAtu COLORS 0, 16777215 NO BORDER FONT oFontPad PIXEL
		oGetMsg:lActive := .F.
		oGetMsg:setCSS("QLineEdit{color:#FF0000; background-color:#FEFEFE;}")
		
		//Botão confirmar
		If nOperacao == 3 .Or. nOperacao == 4
			@ (nJanAltu/2)-24, (nJanLarg/2)-53        BUTTON oBtnCon  PROMPT "Confirmar"  SIZE 048, 018 OF oDlgAtu ACTION(fConfirmar() )                                                 PIXEL
		EndIf
	ACTIVATE MSDIALOG oDlgAtu CENTERED
	
	//Volta pra primeira linha
	oModelGrid:nLine := 1
	
	RestArea(aArea)
Return
/*---------------------------------------------------------------------*
 | Func:  fPesqSB1                                                     |
 | Autor: Daniel Atilio                                                |
 | Data:  27/08/2016                                                   |
 | Desc:  Função que valida o código do produto digitado               |
 *---------------------------------------------------------------------*/
Static Function fPesqSB1()
	Local lRet := .T.
	
	DbSelectArea('SB1')
	SB1->(DbSetOrder(1)) //B1_FILIAL + B1_COD
	
	//Se conseguir posicionar no produto
	If SB1->(DbSeek(FWxFilial('SB1') + cGetCod))
		cGetDes := SB1->B1_DESC
		lRet := .T.
		
		//Busca a linha
		nLinEnc := aScan(oModelGrid:aCols, {|x| AllTrim(x[nPosProd]) == AllTrim(cGetCod)})
		
		//Caso não encontre
		If nLinEnc == 0
			cGetMsg := "Item Novo"
			nGetPrc := 0
			lNovo   := .T.
		Else
			cGetMsg := "Item Existente"
			nGetPrc := oModelGrid:aCols[nLinEnc][nPosPrcV]
			lNovo   := .F.
		EndIf
		
	Else
		lRet := .F.
		MsgAlert("Produto não encontrado!", "Atenção")
	EndIf
	
Return lRet
/*---------------------------------------------------------------------*
 | Func:  fConfirmar                                                   |
 | Autor: Daniel Atilio                                                |
 | Data:  27/08/2016                                                   |
 | Desc:  Função chamada pelo botão confirmar                          |
 *---------------------------------------------------------------------*/
Static Function fConfirmar()
	Local nLin
	
	//Se for novo, adiciona uma nova linha
	If lNovo
		oModelGrid:AddLine()
		nLin := Len(oModelGrid:aCols)
	
	//Senão pega a linha encontrada
	Else
		nLin := nLinEnc
	EndIf
	
	//Define a linha que será utilizada
	oModelGrid:nLine := nLin
	oModelPad:SetValue('DA1DETAIL', 'DA1_CODPRO', cGetCod)
	oModelPad:SetValue('DA1DETAIL', 'DA1_DESCRI', cGetDes)
	oModelPad:SetValue('DA1DETAIL', 'DA1_PRCVEN', nGetPrc)
	
	//Atualiza os textos
	cGetCod := Space(TamSX3('B1_COD')[01])
	cGetDes := Space(TamSX3('B1_DESC')[01])
	nGetPrc := 0
	cGetMsg := ""
	oGetCod:Refresh() 
	oGetDes:Refresh() 
	oGetPrc:Refresh() 
	oGetMsg:Refresh()
Return

Bom pessoal, por hoje é só.
Abraços e até a próxima.

Dan (Daniel Atilio)
Cristão de ramificação protestante. Especialista em Engenharia de Software pela FIB, graduado em Banco de Dados pela FATEC Bauru e técnico em informática pelo CTI da Unesp. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor e mantenedor do portal Terminal de Informação.

Deixe uma resposta

Terminal de Informação