GetNextAlias()Gera um alias temporário para o result set e evita colisões, inclusive em chamadas recursivas.
AdvPL GuiacQuery → ChangeQuery() → TCQUERY / TCGenQry() → WorkArea → DbCloseArea()Estruture consultas SQL portáveis e eficientes no Protheus com DBAccess, aliases dinâmicos e tratamento correto do result set.
O DBAccess conecta o Protheus aos bancos SQL homologados e permite acesso ISAM ou SQL nativo. Para conjuntos de dados, uma query bem construída normalmente reduz varreduras, processamento no cliente e tráfego de rede. No Protheus, a consulta pode ser montada como string ou escrita em Embedded SQL; os dois modelos chegam ao DBAccess. O desenvolvimento deve considerar nomes físicos, filial, exclusão lógica, portabilidade, tipos retornados e encerramento da área de trabalho.
cQuery → ChangeQuery() → TCQUERY / TCGenQry() → WorkArea → DbCloseArea()GetNextAlias()Gera um alias temporário para o result set e evita colisões, inclusive em chamadas recursivas.
RetSqlName()Converte o alias lógico do Protheus no nome físico da tabela usado no FROM ou JOIN.
ChangeQuery()Adapta a sintaxe SQL aos bancos homologados. A referência recomenda seu uso, salvo casos especiais devidamente controlados.
TcSetField()Ajusta campos não caractere do result set aos tipos AdvPL esperados, quando necessário.
SqlOrder()Converte uma expressão de chave AdvPL em expressão SQL para ORDER BY.
xFilial()Fornece a filial correta da tabela para o filtro SQL.
DToS()Produz AAAAMMDD para comparações de datas conforme o armazenamento adotado pelo Protheus.
#Include "TOTVS.ch"
#Include "TopConn.ch"
User Function ExQueryClientes()
Local cAlias := GetNextAlias()
Local cQuery := ""
cQuery := "SELECT A1_COD, A1_LOJA, A1_NOME "
cQuery += "FROM " + RetSqlName("SA1") + " SA1 "
cQuery += "WHERE SA1.A1_FILIAL = '" + xFilial("SA1") + "' "
cQuery += "AND SA1.D_E_L_E_T_ = ' ' "
cQuery += "ORDER BY A1_COD, A1_LOJA"
cQuery := ChangeQuery(cQuery)
TCQUERY (cQuery) ALIAS (cAlias) NEW
While !(cAlias)->(Eof())
ConOut((cAlias)->A1_COD + " - " + (cAlias)->A1_NOME)
(cAlias)->(DbSkip())
EndDo
(cAlias)->(DbCloseArea())
ReturnA consulta usa nome físico, filial da própria tabela, filtro de exclusão lógica, compatibilidade entre bancos, alias dinâmico e fechamento explícito.
cQuery := "SELECT R_E_C_N_O_ RECNO "
cQuery += "FROM " + RetSqlName("SA1") + " SA1 "
cQuery += "WHERE A1_FILIAL = '" + xFilial("SA1") + "' "
cQuery += "AND D_E_L_E_T_ = ' '"
cQuery := ChangeQuery(cQuery)
TCQUERY (cQuery) ALIAS (cAlias) NEW
While !(cAlias)->(Eof())
SA1->(DbGoTo((cAlias)->RECNO))
// Leia ou trate o registro real já posicionado.
(cAlias)->(DbSkip())
EndDo
(cAlias)->(DbCloseArea())O result set identifica rapidamente os registros e DbGoTo() posiciona a tabela física pela chave primária R_E_C_N_O_.
© 2026 Usina.BR. Todos os direitos reservados. TOTVS, Protheus, Microsiga e seus respectivos logotipos são marcas de titularidade da TOTVS S.A. AdvPL é uma linguagem de programação desenvolvida pela TOTVS. O AdvPL Guia é um projeto independente, sem vínculo, representação, patrocínio ou afiliação com a TOTVS S.A., suas franquias ou representantes.