Usina BRGuía AdvPL
Ingresar
← Todos los temas
FUNDAMENTOPublicado

Desarrollo de queries en Protheus

cQuery → ChangeQuery() → TCQUERY / TCGenQry() → WorkArea → DbCloseArea()

Construye consultas SQL portables y eficientes en Protheus con DBAccess, alias dinámicos y manejo correcto del result set.

SQLDBAccessTopConnQueryRendimientoBase de datos
01 · DESCRIPCIÓN GENERAL

Descripción general

DBAccess conecta Protheus con las bases SQL homologadas y permite acceso ISAM y SQL nativo. Para conjuntos de datos, una query bien diseñada normalmente reduce recorridos, procesamiento en el cliente y tráfico de red. Puede construirse como string o con Embedded SQL; ambos modelos llegan a DBAccess.

02 · SINTAXIS

Sintaxis

cQuery → ChangeQuery() → TCQUERY / TCGenQry() → WorkArea → DbCloseArea()

Parámetros

GetNextAlias()
FunçãoObligatorio

Genera un alias temporal para el result set y evita colisiones.

RetSqlName()
FunçãoObligatorio

Convierte el alias lógico de Protheus en el nombre físico de la tabla.

ChangeQuery()
FunçãoObligatorio

Adapta la sintaxis SQL a los bancos homologados.

TcSetField()
FunçãoOpcional

Ajusta campos no carácter del resultado a los tipos AdvPL.

SqlOrder()
FunçãoOpcional

Convierte una expresión de índice AdvPL para ORDER BY.

xFilial()
FunçãoOpcional

Proporciona la filial correcta para el filtro de una tabla.

DToS()
FunçãoOpcional

Produce AAAAMMDD para comparaciones de fechas cuando corresponda.

03 · EJEMPLO PRÁCTICO

Consulta básica portable

#Include "TOTVS.ch"
#Include "TopConn.ch"

// Consulta el ejemplo en portugués; localiza solo los textos para el usuario.
Resultado esperado

Utiliza nombre físico, filtros de filial y exclusión, compatibilidad, alias dinámico y cierre explícito.

04 · EJEMPLO PRÁCTICO

Query de Recno para posicionar la tabla real

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())
Resultado esperado

El result set identifica las filas y DbGoTo() posiciona la tabla física mediante R_E_C_N_O_.

BUENAS PRÁCTICAS
  • Selecciona solo las columnas necesarias; evita SELECT *.
  • Utiliza GetNextAlias() en lugar de alias fijos.
  • Utiliza RetSqlName() y pasa la instrucción por ChangeQuery().
  • Filtra cada filial con xFilial() de su tabla.
  • Excluye registros eliminados lógicamente en todas las tablas.
  • Prefiere JOIN en sintaxis ANSI.
  • Utiliza funciones de agregación para reducir filas cuando corresponda.
  • Cierra siempre la WorkArea con DbCloseArea().
  • Considera el rendimiento como resultado conjunto del código AdvPL, DBAccess, SGBD, infraestructura y volumen; mide las consultas lentas antes de cambiar índices o hardware.
  • Documenta los índices personalizados y revísalos después de actualizar Protheus.
  • Define archivo y retención con requisitos de negocio, legales, de copia y recuperación.
  • Obtén las tablas físicas con RetSqlName() y el contexto de filial con xFilial(); no deduzcas sufijos por empresa o filial.
  • Mantén la estructura del banco alineada con el diccionario de Protheus y utiliza mecanismos admitidos por TOTVS para cambios estructurales.
  • Confirma los tipos reales del resultado: fechas tradicionales y valores vacíos pueden usar caracteres, espacios o cero en lugar de NULL.
ERRORES COMUNES
  • Los campos de control de DBAccess representan registros y exclusiones lógicas.
  • No supongas que el resultado admite la misma navegación de una tabla ISAM.
  • El SQL específico de un banco puede fallar en los demás.
  • Los campos no agregados deben ser compatibles con GROUP BY.
  • Utiliza queries de Recno solo cuando necesites posicionar la tabla real.
  • Nunca concatenes entradas no confiables directamente en SQL.
  • No deshabilites ni elimines índices estándar de Protheus sin orientación formal de TOTVS, revisión de un DBA, homologación y plan de reversión.
  • No apliques FILLFACTOR, reconstrucción de índices ni cambios de estadísticas globalmente; mide cada carga.
  • El artículo citado relata experiencia práctica con SQL Server en un contexto histórico de Protheus. No es documentación oficial de TOTVS ni se aplica automáticamente a otros bancos o versiones.
  • No crees campos, tablas, constraints o índices sin evaluar el diccionario, la compatibilidad con DBAccess y el proceso oficial de actualización.
  • Particionado, compresión, replicación, clúster e In-Memory dependen de las versiones actuales del SGBD, Protheus y DBAccess. Las afirmaciones de 2012 son contexto histórico, no reglas actuales.

Contenido relacionado

REFERENCIAS
  1. TOTVS. Desarrollo de queries en Protheus. TDN.
  2. TOTVS. Embedded SQL. TDN.
  3. TOTVS. Comando TCQUERY. TDN.
  4. LIMA, Fabrício. 5 motivos para que quienes utilizan Protheus (TOTVS) contraten un DBA SQL Server. Blog, publicado el 14 dic. 2013, con actualizaciones posteriores. Referencia práctica complementaria; no es documentación oficial de TOTVS.
  5. INOWE, Marcel. Consejos sobre la base de datos de Protheus (TOTVS). 4SQLServer, 12 sep. 2012. Referencia práctica e histórica sobre SQL Server; los comentarios originales registran correcciones y cambios posteriores.
  6. MICROSIGA. Manual de Programación. Documento colaborativo, archivo fechado el 11 jul. 2001. Referencia histórica.
Estado
Publicado
Página creada el
Última revisión el
Idioma original
Portugués
Revisión
Usina.BR