Estimado Jorge,
El error principal es que estás intentando ejecutar una sentencia SQL directamente sobre archivos DBF utilizando una función que parece estar diseñada para conexiones de servidor (como MariaDB o MySQL), pero el motor de base de datos local no entiende esa sintaxis o la conexión no está configurada para interpretar SQL de esa manera.
Aquà te detallo los puntos crÃticos que están causando el fallo:
1. Conflicto de Sintaxis (SQL vs DBF)
Aunque uses herramientas de SQL para leer DBFs, hay funciones que no existen en el motor estándar de FoxPro/DBF:
- CAST: Los archivos DBF no suelen soportar CAST de la misma forma que SQL Server o MySQL.
- GROUP BY incompleto: En SQL estándar, si usas GROUP BY tipo, todas las demás columnas (precio, costo) deben tener una función de agregación como SUM(), AVG(), o MAX(). De lo contrario, la consulta es inválida.
2. El Error de las Fechas
Estás concatenando strings para las fechas (CTOT y DTOC). Esto es muy propenso a errores de formato (DD/MM/YY vs MM/DD/YY). Si el motor espera un formato y le envÃas otro, la consulta fallará o no devolverá datos.
3. Uso de FW_OpenRecordSet
Esta función de FiveWin normalmente requiere una conexión activa (oCnM). Si esa conexión apunta a una carpeta de DBFs a través de ADO, debes asegurarte de que el Provider (como Microsoft Jet o ACE) esté correctamente configurado.
---
¿Cómo solucionarlo?
Si tu intención es obtener totales por tipo, la consulta deberÃa verse asà (asumiendo que usas el motor ADO para DBF):
// 1. Construye la fecha en formato ISO (YYYY-MM-DD) para evitar errores
cFechaD := DTOS(fechad) // Formato AAAAMMDD
cFechaH := DTOS(fechah)
// 2. Corrige la sentencia SQL
cSql := "SELECT tipo, SUM(precio), SUM(costo) " + ;
"FROM esp\detlici " + ;
"WHERE anulado <> 'S' " + ;
"AND fecha >= '" + cFechaD + "' AND fecha <= '" + cFechaH + "' " + ;
"GROUP BY tipo"
// 3. Ejecuta
oRs1 := FW_OpenRecordSet( oCnM, cSQL )
if oRs1 != nil
xbrowse(oRs1)
oRs1:Close()
else
msgStop("Error al abrir el RecordSet")
endif
Alternativa: La forma Nativa (Sin SQL)
Si estás trabajando con DBFs locales, a veces es más rápido y seguro usar los comandos nativos de [x]Harbour:
SELECT detlici
SET FILTER TO !anulado == "S" .AND. fecha >= fechad .AND. fecha <= fechah
TOTAL ON tipo FIELDS precio, costo TO resumen
USE resumen NEW
XBrowse()
Sugerencia: ¿PodrÃas mostrar cómo estás creando el objeto de conexión oCnM? Eso me ayudarÃa a decirte exactamente qué driver usar para que acepte el comando SQL.