Páginas filhas
  • LGX - LQUERY

Versões comparadas

Chave

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

Pagetitle
LQUERY
LQUERY
Cria, manipula e executa queries SQL dinâmicas permitindo limitar e paginar os resultados obtidos na consulta.


Hierarquia



Sintaxe


Bloco de código
LET m_query_reference = _ADVPL_create_component(NULL,"LQUERY")


Métodos GET



Métodos acessíveis através da função _ADVPL_get_property que permite recuperar e manipular os valores do componente:


Expandir
titleGET COUNT

Método GET: COUNT

Retorna a quantidade de registros encontrados na consulta efetuada pelo método EXECUTE.

Sintaxe




Bloco de código
_ADVPL_get_property(< cReference >,"COUNT") => INTEGER

Retorno




TipoDescrição
INTEGERQuantidade de registros encontrados na consulta.

Exemplo




Bloco de código
titleExemplo SQLCODE
linenumberstrue
#------------------------------------------------------------------------------#
FUNCTION LQUERY_getCOUNT()
#------------------------------------------------------------------------------#
    DEFINE l_count INTEGER
    LET l_count = _ADVPL_get_property(m_query_reference,"COUNT")
END FUNCTION




Expandir
titleGET ERRMESSAGE

Método GET: ERRMESSAGE

Retorna a mensagem de erro ocorrido na execução da query pelo método EXECUTE.

Sintaxe




Bloco de código
_ADVPL_get_property(< cReference >,"ERRMESSAGE") => CHAR

Retorno




TipoDescrição
CHARMensagem de erro ocorrido na execução da query.

Exemplo




Bloco de código
titleExemplo SQLCODE
linenumberstrue
#------------------------------------------------------------------------------#
FUNCTION LQUERY_getERRMESSAGE()
#------------------------------------------------------------------------------#
    DEFINE l_err_message CHAR(200)
    LET l_err_message = _ADVPL_get_property(m_query_reference,"ERRMESSAGE")
END FUNCTION




Âncora
metodo_execute
metodo_execute

Expandir
titleGET EXECUTE

Método GET: EXECUTE

Executa uma query SQL no banco de dados, permitindo limitar e paginar os registros encontrados.

Sintaxe




Bloco de código
_ADVPL_get_property(< cReference >,"EXECUTE",< cSql >,< aRecord >,[ nIni ],[ nCount ]) => SMALLINT

Parâmetros




NomeTipoDescriçãoObrigatório?Padrão
cSqlCHAR(10000)Query SQL que será executada e manipulada pelo componente.Sim
aRecordARRAY OF RECORDARRAY OF RECORD onde serão salvos os dados encontrados na consulta.1
Sim
nIniINTEGERNúmero do registro inicial para paginação dos registros encontrados na consulta.Não1
nCountINTEGERQuantidade máxima de registros que devem ser retornadas na consulta.2
Não

1 Após a execução da query, o aRecord é redimensionado para conter apenas a quantidade de registros encontrados.
2
Se informado nulo para o parâmetro nCount, serão retornados todos os registros encontrados na consulta.

Retorno




TipoDescrição
SMALLINTRetorna verdadeiro se o SQL foi executado com sucesso.

Exemplo




Bloco de código
titleExemplo SQLCODE
linenumberstrue
#------------------------------------------------------------------------------#
FUNCTION LQUERY_teste()
#------------------------------------------------------------------------------#
    DEFINE l_component VARCHAR(10)
    DEFINE l_sql_stmt CHAR(500)
    DEFINE l_status SMALLINT

    DEFINE la_menu_logix ARRAY[10] OF RECORD LIKE menu_logix.*

       
	INITIALIZE la_menu_logix TO NULL       

# Monta o SQL que será executado pelo componente.     
 	LET l_sql_stmt = "SELECT cod_sistema,",
                            "cod_nivel_1,",
                            "cod_nivel_2,",
                            "cod_nivel_3,",
                            "num_sequencia,",
                            "cod_processo,",
                            "cod_tip_processo,",
                            "cod_help,",
                            "cod_transacao,",
                            "den_transacao,",
                            "chave_sistema",
                      " FROM menu_logix",
                     " WHERE cod_processo 
							IS NOT NULL",
					 "ORDER BY cod_processo"

    # Executa a consulta acima permitindo retornar no máximo 10 registros a partir do 1o.
    LET l_component = _ADVPL_create_component(NULL,"LQUERY")
    LET l_status = _ADVPL_get_property(l_component,"EXECUTE",l_sql_stmt,la_menu_logix,1,10)

    CALL _ADVPL_destroy_component(l_component)
    LET l_component = NULL

    RETURN l_status
END FUNCTION  




Expandir
titleGET SQLCODE

Método GET: SQLCODE

Retorna o código SQL resultante da execução da query pelo método EXECUTE.

Sintaxe




_ADVPL_get_property(< cReference >,"SQLCODE") => INTEGER

Retorno




Tipo

Descrição

Tipo

Descrição

INTEGERCódigo SQL resultante da execução da query (possui o valor da global SQLCA.SQLCODE).

Exemplo




Bloco de código
titleExemplo SQLCODE
linenumberstrue
#------------------------------------------------------------------------------#
FUNCTION LQUERY_getSQLCODE()
#------------------------------------------------------------------------------#
    DEFINE l_sql_code INTEGER
    LET l_sql_code = _ADVPL_get_property(m_query_reference,"SQLCODE")
END FUNCTION




Expandir
titleGET VALUE

Método GET: VALUE

Retorna o valor de uma determinada coluna para um determinado registro encontrado na execução da query pelo método EXECUTE.

Sintaxe




Bloco de código
_ADVPL_get_property(< cReference >,"VALUE",< cColumn >,< nIndex >) => Mixed

Parâmetros




NomeTipoDescriçãoObrigatório?Padrão
cColumnCHARNome da coluna conforme definido no ARRAY OF RECORD informado no 4o parâmetro.Sim
nIndexINTEGERNúmero da linha do registro do qual deseja-se retornar o valor da coluna.Sim

Retorno




TipoDescrição
MixedValor da coluna informada encontrado na consulta para a linha do registro informado.

Exemplo




Bloco de código
titleExemplo SQLCODE
linenumberstrue
#------------------------------------------------------------------------------#
FUNCTION LQUERY_getVALUE()
#------------------------------------------------------------------------------#
    DEFINE l_cod_empresa LIKE empresa.cod_empresa
    LET l_cod_empresa = _ADVPL_get_property(m_query_reference,"VALUE","cod_empresa",10)
END FUNCTION





Métodos SET



Métodos acessíveis através da função _ADVPL_set_property que permite alterar e manipular os valores do componente:


Expandir
titleGET EVENT

Método ET: EVENT

Define um evento executado para cada registro encontrado na consulta da query do método EXECUTE.

Sintaxe




Bloco de código
CALL _ADVPL_set_property(< cReference >,"EVENT",< cFunction >)

Parâmetros




NomeTipoDescriçãoObrigatório?Padrão
cFunctionCHARFunção 4GL que será executada para cada registro encontrado na consulta.*Sim


* A função 4GL definida no evento deve estar preparada para receber um parâmetro do tipo INTEGER que indicará a linha do registro atual da consulta. Ela deverá também retornar um valor SMALLINT verdadeiro ou falso, caso retorne falso o registro atual será desconsiderado da lista.

Exemplo




Bloco de código
titleExemplo SQLCODE
linenumberstrue
#------------------------------------------------------------------------------#
FUNCTION LQUERY_setEVENT()
#------------------------------------------------------------------------------#
    CALL _ADVPL_set_property(m_query_reference,"EVENT","LQUERY_testeEvent")
END FUNCTION

#------------------------------------------------------------------------------#
FUNCTION LQUERY_testeEvent(l_ind)
#------------------------------------------------------------------------------#
    DEFINE l_ind INTEGER
    DEFINE lr_menu_logix RECORD LIKE menu_logix.*

    LET lr_menu_logix.cod_sistema = _ADVPL_get_property(m_query_reference,"VALUE","cod_sistema",l_ind)
    LET lr_menu_logix.cod_nivel_1 = _ADVPL_get_property(m_query_reference,"VALUE","cod_nivel_1",l_ind)
    LET lr_menu_logix.cod_nivel_2 = _ADVPL_get_property(m_query_reference,"VALUE","cod_nivel_2",l_ind)
    LET lr_menu_logix.cod_nivel_3 = _ADVPL_get_property(m_query_reference,"VALUE","cod_nivel_3",l_ind)
    LET lr_menu_logix.num_sequencia = _ADVPL_get_property(m_query_reference,"VALUE","num_sequencia",l_ind)
    LET lr_menu_logix.cod_processo = _ADVPL_get_property(m_query_reference,"VALUE","cod_processo",l_ind)
    LET lr_menu_logix.cod_tip_processo = _ADVPL_get_property(m_query_reference,"VALUE","cod_tip_processo",l_ind)
    LET lr_menu_logix.cod_help = _ADVPL_get_property(m_query_reference,"VALUE","cod_help",l_ind)
    LET lr_menu_logix.cod_transacao = _ADVPL_get_property(m_query_reference,"VALUE","cod_transacao",l_ind)
    LET lr_menu_logix.den_transacao = _ADVPL_get_property(m_query_reference,"VALUE","den_transacao",l_ind)
    LET lr_menu_logix.chave_sistema = _ADVPL_get_property(m_query_reference,"VALUE","chave_sistema",l_ind)

    CALL CONOUT("MENU LOGIX "||lr_menu_logix.cod_processo CLIPPED||".")

    RETURN TRUE
END FUNCTION




Exemplo


Expandir
titleExemplo de utilização
Bloco de código
titleExemplo LQUERY
linenumberstrue
DATABASE logix

DEFINE m_query_reference VARCHAR(10)

#------------------------------------------------------------------------------#
FUNCTION LQUERY_teste()
#------------------------------------------------------------------------------#
    DEFINE l_sql_stmt CHAR(500)
    DEFINE l_status SMALLINT
    DEFINE l_message CHAR(200)

    DEFINE la_menu_logix ARRAY[50] OF RECORD LIKE menu_logix.*

    DEFINE l_ind SMALLINT
    DEFINE l_length SMALLINT

    INITIALIZE la_menu_logix TO NULL

    # Monta o SQL que será executado pelo componente.
    LET l_sql_stmt = "SELECT cod_sistema,",
                            "cod_nivel_1,",
                            "cod_nivel_2,",
                            "cod_nivel_3,",
                            "num_sequencia,",
                            "cod_processo,",
                            "cod_tip_processo,",
                            "cod_help,",
                            "cod_transacao,",
                            "den_transacao,",
                            "chave_sistema",
                      " FROM menu_logix WHERE cod_processo IS NOT NULL ORDER BY cod_processo"

    # Cria o componente LQUERY.
    LET m_query_reference = _ADVPL_create_component(NULL,"LQUERY")

    # Define um evento de exeução para cada registro encontrado.
    CALL _ADVPL_set_property(m_query_reference,"EVENT","LQUERY_testeEvent")

    # Executa o SQL, retornando 50 registros a partir do 250o registro.
    LET l_status = _ADVPL_get_property(m_query_reference,"EXECUTE",l_sql_stmt,la_menu_logix,250,50)

    # Se retornou falso, exibe a mensagem de erro em tela.
    IF  NOT l_status THEN
        LET l_message = _ADVPL_get_property(m_query_reference,"ERRMESSAGE")
        CALL log0030_mensagem(l_message,"excl")
        RETURN FALSE
    END IF

    # Recupera a quantidade de registros encontrados na consulta.
    LET l_length = _ADVPL_get_property(m_query_reference,"COUNT")

    FOR l_ind = 1 TO l_length
        CALL CONOUT("MENU LOGIX "||la_menu_logix[l_ind].cod_processo CLIPPED||".")
    END FOR

    # Remove e libera o componente da memória.
    CALL _ADVPL_destroy_component(m_query_reference)
    LET m_query_reference = NULL

    RETURN TRUE
END FUNCTION

#------------------------------------------------------------------------------#
FUNCTION LQUERY_testeEvent(l_ind)
#------------------------------------------------------------------------------#
    DEFINE l_ind INTEGER
    DEFINE lr_menu_logix RECORD LIKE menu_logix.*

    LET lr_menu_logix.cod_sistema = _ADVPL_get_property(m_query_reference,"VALUE","cod_sistema",l_ind)
    LET lr_menu_logix.cod_nivel_1 = _ADVPL_get_property(m_query_reference,"VALUE","cod_nivel_1",l_ind)
    LET lr_menu_logix.cod_nivel_2 = _ADVPL_get_property(m_query_reference,"VALUE","cod_nivel_2",l_ind)
    LET lr_menu_logix.cod_nivel_3 = _ADVPL_get_property(m_query_reference,"VALUE","cod_nivel_3",l_ind)
    LET lr_menu_logix.num_sequencia = _ADVPL_get_property(m_query_reference,"VALUE","num_sequencia",l_ind)
    LET lr_menu_logix.cod_processo = _ADVPL_get_property(m_query_reference,"VALUE","cod_processo",l_ind)
    LET lr_menu_logix.cod_tip_processo = _ADVPL_get_property(m_query_reference,"VALUE","cod_tip_processo",l_ind)
    LET lr_menu_logix.cod_help = _ADVPL_get_property(m_query_reference,"VALUE","cod_help",l_ind)
    LET lr_menu_logix.cod_transacao = _ADVPL_get_property(m_query_reference,"VALUE","cod_transacao",l_ind)
    LET lr_menu_logix.den_transacao = _ADVPL_get_property(m_query_reference,"VALUE","den_transacao",l_ind)
    LET lr_menu_logix.chave_sistema = _ADVPL_get_property(m_query_reference,"VALUE","chave_sistema",l_ind)

    CALL CONOUT("MENU LOGIX EVENT "||lr_menu_logix.cod_processo CLIPPED||".")

    RETURN TRUE
END FUNCTION