Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Error General SQL en Fecha (https://www.clubdelphi.com/foros/showthread.php?t=87686)

uberos 11-02-2015 15:33:24

Error General SQL en Fecha
 
Hola amigos, soy nuevo en delphi y quizás sea una tonteria pero a mi me esta volviendo loco, os cuento.

Estoy trabajando en un proyecto en el cuál tengo que modificar un programa de escritorio realizado en delphi 5. El tema es que el código funciona en el servidor de producción pero en mi equipo de desarrollo con una copia de la base de datos identica al de producción me da error en conversiones de fecha. El programa tira de sql server y estoy usando windows xp, el código donde da el error es este:

Datos.Params[0].asDate := StrToDate(eFecha.Text);
Datos.Open;


Datos contiene la consulta select y le paso el parámetro fecha. Haciendole un debug a eFecha.Text me devuelve la fecha introducida '28/02/2015' pero cuando hace el StrToDate la fecha cambia al entero 42063. Cuando hago Datos.Open; salta el error general sql en fecha.

Curiosamente cambiando el anterior código a este si me funciona en mi equipo:

Datos.Params[0].asString := eFecha.Text;
Datos.Open;


Entiendo que me debe faltar alguna configuración a nivel de configuración de delphi, base de datos o sistema operativo para que en mi equipo funcione al igual que en el servidor de producción pero no se cuál.

Cualquier ayuda es bienvenida, saludos!

Casimiro Notevi 11-02-2015 15:44:21

Lo mismo es por el formato, yyyy/mm/dd mm/dd/yyyy etc.

uberos 11-02-2015 18:49:31

En la instrucción SrtToDate veo que se le puede pasar el formato como parámetro pero.. ¿hay alguna forma de configurar este de una forma global para que el código funcione tal y como está?

duilioisola 11-02-2015 19:07:50

Muestra el SQL que tiene la consulta.
Además, verifica que el tipo de dato del parámetro que quieres rellenar sea del tipo fecha (el campo en la base de datos quizás es un string).
ejemplo:
Código SQL [-]
CREATE TABLE TABLA
ID INTEGER,
FECHA VARCHAR(10);
Código:

SQL := 'SELECT * FROM TABLA WHERE FECHA <= :FECHA'
Si el campo FECHA es del tipo VARCHAR(10), el hecho de enviárselo con el formato de fecha dará un error.

uberos 12-02-2015 09:21:29

La consulta es esta:
Código SQL [-]
SELECT *
FROM DATOS
WHERE FECHA <= :FECHA AND M.TIP IN ('01','02','91','92')

En la base de datos Fecha esta definida como DATETIME.
Por lo que veo al hacer el StrToDate la fecha cambia a días: 42063 (sumados a la fecha 30/12/1899 da la fecha introducida)

El StrToDate debería de pasar a un formato fecha como este: "28/12/2015" ya que por lo visto al pasar los días a la consulta la select falla.

El problema parece estar relacionado más con Delphi que con Sql.

Casimiro Notevi 12-02-2015 10:15:53

Cita:

Empezado por uberos (Mensaje 488710)
El problema parece estar relacionado más con Delphi que con Sql.

Creo que no, que el problema está más relacionada con el programador que con delphi o sql :D

Falta que pongas más código, con eso solo no se puede saber nada, no somos adivinos.

uberos 12-02-2015 12:33:53

jeje, el problema es que no lo he programado yo...

Pongo algo más de código:
Código SQL [-]
uses Windows, Messages, SysUtils, Classes, Graphics, Controls,
Forms, Dialogs,   Fin1, ExtCtrls, Gauges, Mask, DBCtrls, StdCtrls,
Buttons, Db, DBTables,   DBClient, Provider, ObjReporting;  

type     
Datos: TQuery;     
(más código...)  

procedure Fichero.Visualizar(); 
begin   
  Datos.SQL.Clear;
  Datos.SQL.Add('SELECT * FROM DATOS WHERE FECHA <= :FECHA AND M.TIP IN (''01'',''02'',''91'',''92'')');
  Datos.Params[0].asDate := StrToDate(eFecha.Text);
  Datos.Open;
end;

eFecha.Text es una caja de texto que contiene la fecha 28/02/2015

Tan solo me gustaría saber si la función StrToDate me debería devolver una fecha o los días, estoy seguro que el que lo programó le devolvia la fecha en formato dd/mm/yyyy, no se porque a mi me devuelve los días que hay desde el 30/12/1899 hasta el 28/02/2015.

Casimiro Notevi 12-02-2015 12:48:39

Debes poner un 'breakpoint' en la línea 'Datos.Open', y antes de ejecutarla, copias la sentencia que tenga Datos.Sql y abres el programa "manejador de bases de datos" que uses, copias la sentencia y el valor del parámetro y... pruebas.

uberos 12-02-2015 13:08:29

probado...

en producción funciona perfectamente:
SELECT * FROM DATOS WHERE FECHA <= '28/02/2015' AND M.TIP IN ('01','02','91','92')

en mi equipo de desarrollo falla:

SELECT * FROM DATOS WHERE FECHA <= '42063' AND M.TIP IN ('01','02','91','92')

No quiere tener que modificar todo el código, tan solo quiero que funcione al igual que producción.

duilioisola 12-02-2015 13:09:08

StrToDate o StrToDateTime devuelve un número. Esto es correcto y es la forma de representar una fecha.
El método AsDate o AsDateTime toma ese número y lo asigna al parámetro transformándolo según sea necesario para cada base de datos.
El SQL que se ejecuta al decirle al DataSet Open o ExecuteSQL debería tener el formato que el motor de la base de datos necesita automáticamente.

Dicho esto, un par de notas:
¿Cuál es el mensaje exacto del error. (Sin traducir, sin abreviar, sin modificar.)?
¿Qué componentes utilizas para conectar?
¿Cómo has configurado la conexión/componentes?
¿Qué versión utilizas de SQL Server? ¿Es la misma que en el cliente?

Casimiro Notevi 12-02-2015 13:14:35

Cita:

Empezado por uberos (Mensaje 488724)
No quiere tener que modificar todo el código, tan solo quiero que funcione al igual que producción.

Por eso hay que ir paso a paso, pero si no te gusta :confused:

Cita:

Empezado por duilioisola (Mensaje 488725)
Dicho esto, un par de notas:
¿Cuál es el mensaje exacto del error. (Sin traducir, sin abreviar, sin modificar.)?
¿Qué componentes utilizas para conectar?
¿Cómo has configurado la conexión/componentes?
¿Qué versión utilizas de SQL Server? ¿Es la misma que en el cliente?

^\||/

uberos 12-02-2015 13:42:18

Cita:

Empezado por duilioisola (Mensaje 488725)
StrToDate o StrToDateTime devuelve un número. Esto es correcto y es la forma de representar una fecha.
El método AsDate o AsDateTime toma ese número y lo asigna al parámetro transformándolo según sea necesario para cada base de datos.
El SQL que se ejecuta al decirle al DataSet Open o ExecuteSQL debería tener el formato que el motor de la base de datos necesita automáticamente.

Dicho esto, un par de notas:
¿Cuál es el mensaje exacto del error. (Sin traducir, sin abreviar, sin modificar.)?
¿Qué componentes utilizas para conectar?
¿Cómo has configurado la conexión/componentes?
¿Qué versión utilizas de SQL Server? ¿Es la misma que en el cliente?

Mensaje de error: General SQL error. [Microsoft][ODBC SQL Server Driver]Formato de fecha no válido]
Conecto mediante ODBC, componente sql server.
En producción y desarrollo tengo la misma versión 2005 de sql.

Gracias a los dos por echarme una mano, este tema me esta volviendo loco.
una pregunta, ¿puede ser que el metodo asDate no funcione correctamente?

uberos 12-02-2015 17:29:11

Solucionado!!
 
Solucionado!!

Por si alguien se encuentra con el mismo error. A pesar de que en producción se usa el driver ODBC de 'Sql server' usando en desarrolo el driver de ODBC 'Sql Server Native Client' no da error en fechas y funciona correctamente.

Gracias por el apoyo, saludos!


La franja horaria es GMT +2. Ahora son las 12:04:28.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi