GetNextAlias()Genera un alias temporal para el result set y evita colisiones con áreas de trabajo ya abiertas.
Guía AdvPLcQuery → ChangeQuery() → TCQUERY / Embedded SQL | FWPreparedStatement / FWExecStatement → WorkAreaConstruye consultas SQL portables y eficientes en Protheus y usa statements parametrizados con FWPreparedStatement y FWExecStatement cuando los valores deban permanecer separados del texto SQL.
DBAccess sigue siendo la capa de acceso a los bancos SQL homologados, mientras RetSqlName(), GetNextAlias(), ChangeQuery(), TCQUERY y Embedded SQL continúan siendo relevantes. Para queries con valores variables, FWPreparedStatement organiza los parámetros y FWExecStatement permite ejecutar la consulta y abrir el resultado como alias. La documentación oficial también indica que SetIn(), heredado por FWExecStatement desde FWPreparedStatement, se utiliza con cláusulas SQL IN.
cQuery → ChangeQuery() → TCQUERY / Embedded SQL | FWPreparedStatement / FWExecStatement → WorkAreaGetNextAlias()Genera un alias temporal para el result set y evita colisiones con áreas de trabajo ya abiertas.
RetSqlName()Convierte el alias lógico de Protheus en el nombre físico de la tabla en la base de datos.
ChangeQuery()Adapta la instrucción SQL para compatibilidad con las bases homologadas.
TcSetField()Ajusta los campos no carácter del resultado a los tipos AdvPL esperados.
SqlOrder()Convierte una expresión de índice AdvPL para utilizarla en una cláusula ORDER BY.
xFilial()Devuelve la sucursal adecuada para el filtro de la tabla informada.
DToS()Convierte una fecha a AAAAMMDD cuando ese formato sea necesario al construir la query.
FWPreparedStatement():New( <cQuery> )FWExecStatement():New( <cQuery> )oStatement:SetIn( <nParameter>, <aValues> )#Include "TOTVS.ch"
#Include "TopConn.ch"
User Function ExQueryBasica()
Local cAlias := GetNextAlias()
Local cQuery := ""
// RetSqlName() resuelve el nombre físico de la tabla en la base de datos.
cQuery := "SELECT A1_COD, A1_NOME FROM " + RetSqlName("SA1")
cQuery += " WHERE A1_FILIAL = '" + xFilial("SA1") + "'"
cQuery += " AND D_E_L_E_T_ = ' '"
// ChangeQuery() adapta la instrucción a las bases homologadas.
cQuery := ChangeQuery(cQuery)
TCQuery cQuery New Alias (cAlias)
While !(cAlias)->(Eof())
// A1_NOME significa “Nombre”; conserva sin cambios el identificador real de Protheus.
ConOut((cAlias)->A1_COD + " - " + (cAlias)->A1_NOME)
(cAlias)->(DbSkip())
EndDo
// Cierra siempre la WorkArea abierta para el result set.
(cAlias)->(DbCloseArea())
ReturnLa query usa el nombre físico, filtro de sucursal, eliminación lógica, alias dinámico y cierre explícito.
User Function ExQueryRecno()
Local cAlias := GetNextAlias()
Local cQuery := ""
// R_E_C_N_O_ identifica el registro físico representado por la fila del resultado.
cQuery := "SELECT R_E_C_N_O_ RECNO, A1_COD, A1_NOME FROM " + RetSqlName("SA1")
cQuery += " WHERE A1_FILIAL = '" + xFilial("SA1") + "'"
cQuery += " AND D_E_L_E_T_ = ' '"
cQuery := ChangeQuery(cQuery)
TCQuery cQuery New Alias (cAlias)
While !(cAlias)->(Eof())
DbSelectArea("SA1")
SA1->(DbGoTo((cAlias)->RECNO))
// Después de DbGoTo(), SA1 queda posicionada en el registro real. A1_NOME significa “Nombre”.
ConOut(SA1->A1_COD + " - " + SA1->A1_NOME)
(cAlias)->(DbSkip())
EndDo
(cAlias)->(DbCloseArea())
ReturnEl result set identifica los registros y DbGoTo() posiciona la tabla real mediante R_E_C_N_O_.
User Function ExFWExec()
Local cQuery := ""
Local cAlias := ""
Local oStmt
// El marcador ? mantiene el valor fuera del texto SQL.
cQuery := "SELECT A1_COD, A1_NOME FROM " + RetSqlName("SA1")
cQuery += " WHERE A1_FILIAL = ? AND D_E_L_E_T_ = ' '"
cQuery := ChangeQuery(cQuery)
oStmt := FWExecStatement():New(cQuery)
oStmt:SetString(1, xFilial("SA1"))
cAlias := oStmt:OpenAlias()
While !(cAlias)->(Eof())
// A1_NOME significa “Nombre”; conserva sin cambios el identificador real de Protheus.
ConOut((cAlias)->A1_COD + " - " + (cAlias)->A1_NOME)
(cAlias)->(DbSkip())
EndDo
(cAlias)->(DbCloseArea())
oStmt:Destroy()
ReturnLa query parametriza la sucursal, abre el resultado como alias y libera los recursos explícitamente.
User Function ExSetIn()
Local cQuery := ""
Local cAlias := ""
Local aClientes := {"000010", "000020", "000030"}
Local oStmt
// El segundo marcador representa la lista usada por la cláusula IN.
cQuery := "SELECT A1_COD, A1_NOME FROM " + RetSqlName("SA1")
cQuery += " WHERE A1_FILIAL = ? AND A1_COD IN (?) AND D_E_L_E_T_ = ' '"
cQuery := ChangeQuery(cQuery)
oStmt := FWExecStatement():New(cQuery)
oStmt:SetString(1, xFilial("SA1"))
oStmt:SetIn(2, aClientes)
cAlias := oStmt:OpenAlias()
While !(cAlias)->(Eof())
ConOut((cAlias)->A1_COD + " - " + (cAlias)->A1_NOME)
(cAlias)->(DbSkip())
EndDo
(cAlias)->(DbCloseArea())
oStmt:Destroy()
ReturnSetIn() asocia un array con el marcador de la cláusula IN.
Desarrollado con Usina Docs · Alpha
© 2026 Usina.BR. Todos los derechos reservados. TOTVS, Protheus, Microsiga y sus respectivos logotipos son marcas de sus titulares. Guía AdvPL es independiente y utiliza citas limitadas, atribuidas y justificadas por fines educativos. Consulta los Términos de Uso. Términos de Uso
Comentarios
Todavía no hay comentarios aprobados.
Inicia sesión con Google o Microsoft para comentar.