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