Ponto de Entrada – OS010BTN

Exemplo do Ponto de Entrada OS010BTN.

Exemplo do Ponto de Entrada:

//Bibliotecas
#Include "Protheus.ch"

/*--------------------------------------------------------------------------*
 | P.E.:   OS010BTN                                                         |
 | 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

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                                                     |
 | 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                                                   |
 | 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

Observações:

– Caso tenha dúvidas ou problemas com os exemplos, entre em contato;
– Se tiver sugestões de rotinas, pode entrar em contato;

Links:

Pesquisa no TDN