erro 300 con ado

Post Reply
jpcavagnaro
Posts: 35
Joined: Tue Aug 12, 2025 12:29 pm

erro 300 con ado

Post by jpcavagnaro »

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
User avatar
Antonio Linares
Site Admin
Posts: 44515
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Re: erro 300 con ado

Post by Antonio Linares »

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: Select all | Expand

// 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: Select all | Expand

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
jpcavagnaro
Posts: 35
Joined: Tue Aug 12, 2025 12:29 pm

Re: erro 300 con ado

Post by jpcavagnaro »

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
User avatar
karinha
Posts: 8720
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil
Contact:

Re: erro 300 con ado

Post by karinha »

João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
JoséQuintas
Posts: 104
Joined: Tue Feb 09, 2021 4:20 pm

Re: erro 300 con ado

Post by JoséQuintas »

Sugerencia:

Code: Select all | Expand

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)

JoséQuintas
Posts: 104
Joined: Tue Feb 09, 2021 4:20 pm

Re: erro 300 con ado

Post by JoséQuintas »

Yo uso ADO de forma diferente.

Code: Select all | Expand

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)

Post Reply