FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin for Harbour/xHarbour erro 300 con ado
Posts: 14
Joined: Tue Aug 12, 2025 12:29 PM
erro 300 con ado
Posted: Fri Jan 02, 2026 10:46 AM

Hola gente, Feliz Año, tengo la siguiente consulta y me da error:

csql := "Select tipo, CAST(precio AS DECIMAL(14, 2)), CAST(costo AS DECIMAL(14, 2)) from esp\detlici where anulado <> 'S' and fecha between CTOT('" + dtoc( fechad ) + "') and CTOT('" + dtoc( fechah ) + "') group by tipo"

oRs1 := FW_OpenRecordSet( oCnM, cSQL ) xbrowse(ors1)

Que estoy haciendo mal?

Aclaro que estoy trabajando con DBFs, no con SQL.

Saludos Jorge

Saludos

Jorge
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: erro 300 con ado
Posted: Fri Jan 02, 2026 12:12 PM

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):

Code (fwb): Select all Collapse
// 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:

Code (fwb): Select all Collapse
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.

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 14
Joined: Tue Aug 12, 2025 12:29 PM
Re: erro 300 con ado
Posted: Fri Jan 02, 2026 03:14 PM

Antonio, gracias por responder, perdón, con las pruebas que hice para ver que error era, tendría que haber preguntado lo siguente:

Tengo una consulta que funciona perfecto, pero el tema es que si pido parciales del mes todo ok, pero si pido el mes entero da error:

Esta es la consulta:

csql := "Select tipo, sum(precio * cantidad) as importe, sum(costo * cantidad) as costo, sum(precio * cantidad * porc_iva) as importei, sum(costo * cantidad*porc_iva) as costoi from esp\detlici where anulado <> 'S' and fecha between CTOT('" + dtoc( fechad ) + "') and CTOT('" + dtoc( fechah ) + "') group by tipo"

oRs1 := FW_OpenRecordSet( oCnM, cSQL )

Este es el erro:
Error description: Error ADODB.RecordSet/6 DISP_E_UNKNOWNNAME: RECORDCOUNT
Args:

Stack Calls

Called from: => TOLEAUTO:RECORDCOUNT( 0 )
Called from: menu1.prg => XLSRESUGRAL( 231 )
Called from: menu1.prg => (b)GENRESUGRAL( 40 )

Me da la sensación que quedan chicos los acumuladores del sum( , de nuevo porque parciales de 10 días, sale perfecto, y si pido mas días, por ejemplo 20 días da error

Saludos
Jorge

Saludos

Jorge
Posts: 8515
Joined: Tue Dec 20, 2005 07:36 PM
Posts: 104
Joined: Tue Feb 09, 2021 04:20 PM
Re: erro 300 con ado
Posted: Sat Jan 03, 2026 09:49 PM

Sugerencia:

cSQL := "SELECT tipo, sum(precio * cantidad) AS importe, sum(costo * cantidad) AS costo, "
cSQL += " sum(precio * cantidad * porc_iva) AS importei, sum(costo * cantidad*porc_iva) AS costoi"
cSQL += " FROM esp\detlici"
cSQL += " WHERE anulado <> 'S' and DATE( fecha ) BETWEEN " + DateSQL( fechad ) + " AND " + DateSQL( fechah )
cSQL += " GROUP BY tipo"

FUNCTION DateSQL( dDate )

   RETURN ['] + hb_Dtoc( dDate, "YYYY-MM-DD" ) + [']

Notas:

  • deja un espacio en blanco al principio de cada uno para no olvidarlo
  • esp\detlici ???

José M. C. Quintas Brazil

gtwvg, fivewin 25.12, hwgui, mingw 15.2 (32 bits)

Posts: 104
Joined: Tue Feb 09, 2021 04:20 PM
Re: erro 300 con ado
Posted: Sat Jan 03, 2026 10:04 PM

Yo uso ADO de forma diferente.

oRs := Conexao:Execute( cSQL )

El valor de retorno difiere entre normal y terminal service, cuando esta vacio.
Uno devolve un registro sin campos, y el otro devuelve NIL, por lo tanto, no acepta oRs;RecordCount()
No sé si esto se aplica a FW_OpenRecordset()

José M. C. Quintas Brazil

gtwvg, fivewin 25.12, hwgui, mingw 15.2 (32 bits)

Continue the discussion