Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 11-02-2015
uberos uberos is offline
Registrado
NULL
 
Registrado: feb 2015
Posts: 7
Poder: 0
uberos Va por buen camino
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!
Responder Con Cita
  #2  
Antiguo 11-02-2015
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.039
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Lo mismo es por el formato, yyyy/mm/dd mm/dd/yyyy etc.
Responder Con Cita
  #3  
Antiguo 11-02-2015
uberos uberos is offline
Registrado
NULL
 
Registrado: feb 2015
Posts: 7
Poder: 0
uberos Va por buen camino
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á?
Responder Con Cita
  #4  
Antiguo 11-02-2015
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
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.
Responder Con Cita
  #5  
Antiguo 12-02-2015
uberos uberos is offline
Registrado
NULL
 
Registrado: feb 2015
Posts: 7
Poder: 0
uberos Va por buen camino
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.
Responder Con Cita
  #6  
Antiguo 12-02-2015
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.039
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por uberos Ver Mensaje
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

Falta que pongas más código, con eso solo no se puede saber nada, no somos adivinos.
Responder Con Cita
  #7  
Antiguo 12-02-2015
uberos uberos is offline
Registrado
NULL
 
Registrado: feb 2015
Posts: 7
Poder: 0
uberos Va por buen camino
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.
Responder Con Cita
  #8  
Antiguo 12-02-2015
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.039
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
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.
Responder Con Cita
  #9  
Antiguo 12-02-2015
uberos uberos is offline
Registrado
NULL
 
Registrado: feb 2015
Posts: 7
Poder: 0
uberos Va por buen camino
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.
Responder Con Cita
  #10  
Antiguo 12-02-2015
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
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?
Responder Con Cita
  #11  
Antiguo 12-02-2015
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.039
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por uberos Ver Mensaje
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

Cita:
Empezado por duilioisola Ver Mensaje
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?
Responder Con Cita
  #12  
Antiguo 12-02-2015
uberos uberos is offline
Registrado
NULL
 
Registrado: feb 2015
Posts: 7
Poder: 0
uberos Va por buen camino
Cita:
Empezado por duilioisola Ver Mensaje
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?
Responder Con Cita
  #13  
Antiguo 12-02-2015
uberos uberos is offline
Registrado
NULL
 
Registrado: feb 2015
Posts: 7
Poder: 0
uberos Va por buen camino
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!
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Evitar error de excepción general con ficheros Belaix Varios 2 16-12-2008 16:57:53
Error General Sql Error lock conflict ...deadlock Patricio Varios 1 19-03-2008 14:52:14
general sql error -2147221164 luchin001 Conexión con bases de datos 1 02-12-2004 17:44:49
General SQL Error ander SQL 3 09-09-2004 16:05:07
General SQL ORACLE ODBC error jmbarrio SQL 0 26-02-2004 12:10:19


La franja horaria es GMT +2. Ahora son las 21:22:27.


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
Copyright 1996-2007 Club Delphi