Função para criar uma consulta (F3 – SXB) via AdvPL

Salve salve pessoal…

Hoje vou mostrar para vocês uma função que criei, para criar via código fonte consultas genéricas na SXB.

Ao invés de abrir o configurador, ir em Base De Dados, e criar uma consulta específica, imagine você ter um fonte que basta você fazer uma chamada, que ele automaticamente já cria a consulta, pronta a ser vinculada nos campos via F3?

Pensando nisso criei a zCriaCEsp, que recebe por parâmetro o alias da consulta, a descrição, o alias da tabela, qual é a função que será executada e seu retorno.

Por exemplo, com base no artigo Consulta Específica com Like de dados em AdvPL (zConsEsp), vamos criar uma consulta da SB1 com Like via código AdvPL:

User Function zTeste
	cFuncao := 'u_zConsEsp("SB1", {"B1_COD","B1_DESC","B1_TIPO"}, " ", "B1_COD")'
	u_zCriaCEsp("X_SB1", "Produtos com Like", "SB1", cFuncao, "__cRetorn")
Return

Agora é só você vincular em algum F3 a consulta X_SB1 e utilizá-la.

Consulta específica filtrando a letra "o"

Consulta específica filtrando a letra “o”

Abaixo o código fonte completo para criação da SXB:

//Bibliotecas
#Include "Protheus.ch"

/*/{Protheus.doc} zCriaCEsp
Função para criar uma consulta específica similar ao criar pelo Configurador, mas via código fonte
@author Atilio
@since 04/01/2018
@version 1.0
@param cConsulta, characters, Código da Consulta na SXB
@param cDescricao, characters, Descrição da consulta criada
@param cAliasCons, characters, Alias da consulta, se houver
@param cFuncao, characters, Função que será chamada (Expressão)
@param cRetorno, characters, Retorno que será posicionado
@type function
@example
	cFuncao := 'u_zConsEsp("SB1", {"B1_COD","B1_DESC","B1_TIPO"}, " ", "B1_COD")'
	u_zCriaCEsp("X_SB1", "Produtos com Like", "SB1", cFuncao, "__cRetorn")
/*/

User Function zCriaCEsp(cConsulta, cDescricao, cAliasCons, cFuncao, cRetorno)
	Local aArea        := GetArea()
	Local aAreaXB      := SXB->(GetArea())
	Default cConsulta  := ""
	Default cDescricao := ""
	Default cAliasCons := ""
	Default cFuncao    := ""
	Default cRetorno   := ""
	
	//Se tiver consulta, função e retorno
	If ! Empty(cConsulta) .And. ! Empty(cFuncao) .And. ! Empty(cRetorno)
		//Caso não encontre, será criado os dados
		DbSelectArea("SXB")
		If ! SXB->(DbSeek(cConsulta))
		
			//Descrição
			RecLock("SXB",.T.)
				XB_ALIAS   := cConsulta
				XB_TIPO    := "1"
				XB_SEQ	   := "01"
				XB_COLUNA  := "RE"
				XB_DESCRI  := cDescricao
				XB_DESCSPA := cDescricao
				XB_DESCENG := cDescricao
				XB_CONTEM  := cAliasCons
				XB_WCONTEM := ""
			SXB->(MsUnlock())
			
			//Função
			RecLock("SXB",.T.)
				XB_ALIAS   := cConsulta
				XB_TIPO    := "2"
				XB_SEQ	   := "01"
				XB_COLUNA  := "01"
				XB_DESCRI  := ""
				XB_DESCSPA := ""
				XB_DESCENG := ""
				XB_CONTEM  := cFuncao
				XB_WCONTEM := ""
			SXB->(MsUnlock())
			
			//Retorno
			RecLock("SXB",.T.)
				XB_ALIAS   := cConsulta
				XB_TIPO    := "5"
				XB_SEQ	   := "01"
				XB_COLUNA  := ""
				XB_DESCRI  := ""
				XB_DESCSPA := ""
				XB_DESCENG := ""
				XB_CONTEM  := cRetorno
				XB_WCONTEM := ""
			SXB->(MsUnlock())
		EndIf
	EndIf
	
	RestArea(aAreaXB)
	RestArea(aArea)
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