Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > MySQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 15-10-2007
VRO VRO is offline
Miembro
 
Registrado: abr 2004
Posts: 230
Poder: 21
VRO Va por buen camino
Procedimiento almacenado con fecha

Hola, ¿que hay de nuevo?,

tengo el siguiente problemilla, utilizo una base de datos de mysql y estoy haciendo un procedimiento almacenado al que le paso como parametros 2 variable de tipo Datetime. Cuando hago la consulta en el procedimiento tal que así:

Código:
  select * from tabla where fecha between ',f1,' and ',f2,'
Me da un error en ese punto y la verdad no se como pasar esos parametros.

Por favor necesito su ayuda.

Gracias de antemano.-
Responder Con Cita
  #2  
Antiguo 15-10-2007
Avatar de duilioisola
[duilioisola] duilioisola is online now
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
el select supongo que deberá ser algo asi:
Código SQL [-]
  select * from tabla where fecha between :f1 and :f2

y la parte delphi

Código Delphi [-]
   var
      F1, F2 : TDateTime;
   (...)
   t.sql.text := 'select * from tabla where fecha between :f1 and :f2';
   t.params.ByName['F1'].AsDateTime := F1;
   t.params.ByName['F2'].AsDateTime := F2;
   (...)
Responder Con Cita
  #3  
Antiguo 15-10-2007
VRO VRO is offline
Miembro
 
Registrado: abr 2004
Posts: 230
Poder: 21
VRO Va por buen camino
Procedimiento almacenado fecha

Gracias por tu respuesta, pero la verdad es que esa sentencia me sirve para SQL e interbase pero no para Mysql.

Seguiremos investigando, si se te ocurre alguna otra forma ruego me lo comuniques.

Muchas gracias por todo.-
Responder Con Cita
  #4  
Antiguo 15-10-2007
Avatar de duilioisola
[duilioisola] duilioisola is online now
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
Prueba cambiando
:f1 por ?f1

Mira en el foro y en los trucos casos como este para base de datos MySQL
Responder Con Cita
  #5  
Antiguo 15-10-2007
Avatar de duilioisola
[duilioisola] duilioisola is online now
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
De todos modos, cual es el error que te da?
Escribe el mensaje de error y quizás te podamos dar la respuesta exacta que buscas.
Responder Con Cita
  #6  
Antiguo 15-10-2007
Avatar de duilioisola
[duilioisola] duilioisola is online now
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
Si bien lo de pasar parámetros creo que es la forma más elegante y legible, puedes también hacerlo de otra manera:

Código Delphi [-]
var
      F1, F2 : TDateTime;
   (...)
   t.sql.text := 'select * from tabla where fecha between '+QuotedStr(DateTimeToStr(F1))+' and '+QuotedStr(DateTimeToStr(F1));
   (...)

esto generará algo así:

Si F1= 01/01/2007 y F2 31/12/2007 23:59:59
Código SQL [-]
select * from tabla where fecha between '01/01/2007 00:00:00' and '31/12/2007 23:59:59'

Nota: Ten en cuenta que quizás MySQL espere que el formato de la fecha sea diferente. (mm/dd/yyyy o yyyy/mm/dd)
Responder Con Cita
  #7  
Antiguo 16-10-2007
VRO VRO is offline
Miembro
 
Registrado: abr 2004
Posts: 230
Poder: 21
VRO Va por buen camino
Smile Procedimiento almacenado con fecha

Siento no haberte respondido antes, pero me surgio otro problemailla que he estado intentando resolver ayer de forma frenetica y que aun no he conseguido solucionar.

Decirte que al final pase los parametros fecha como char(20) para que abarque la fecha y la hora, de la siguiente forma:

Código SQL [-]
 
DELIMITER $$
DROP PROCEDURE IF EXISTS `aytosantillana`.`prueba` $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `prueba`(IN f1 char(20), IN f2 char(20))
BEGIN
  SET @s = ('SELECT puertos.tag,puertos.dispositivo as disp,valores.fecha,,case puertos.numpuerto when 0 then valores.A0 when 1 then valores.A1 when 2 then valores.A2 when 3 then valores.A3 when 3 then valores.A3 when 4 then valores.A4 when 5 then valores.A5 end as valor from equipos,puertos,valores where ((valores.idEquipo=puertos.idEquipo) and (equipos.idEquipo=puertos.idEquipo) and (equipos.idEquipo=valores.idEquipo) and (valores.fecha >= ' , f1 ,' and valores.fecha<=' ,f2, ') and (puertos.dispositivo<>''Contador'') and (puertos.dispositivo<>''Alimentacion'') and (puertos.dispositivo<>''Temperatura'')  and (puertos.tag<>'''')) having (valor<>'''') order by puertos.dispositivo,valores.idEquipo asc,puertos.numpuerto asc, fecha asc');
  PREPARE stmt FROM @s;
  EXECUTE stmt;
END $$
DELIMITER ;

ahora mi problema es que cuando lo ejecuto me da el error " Operan should contain 1 column", he estado ojeando por los foros, pero no he conseguido dar con la solución seguiré probando, si se te ocurre algo...


Gracias por todo.
Responder Con Cita
  #8  
Antiguo 16-10-2007
VRO VRO is offline
Miembro
 
Registrado: abr 2004
Posts: 230
Poder: 21
VRO Va por buen camino
Wink Solucion final

Por si os hace falta el procedimiento es mas facil de lo que yo me pensaba, probe, por si sonaba la flauta y sonó.

La solución es la siguiente:

Código SQL [-]
 
DELIMITER $$
DROP PROCEDURE IF EXISTS `aytosantillana`.`prueba` $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `prueba`(IN f1 char(20), IN f2 char(20))
BEGIN

  SELECT puertos.tag,puertos.dispositivo as disp,valores.fecha,case puertos.numpuerto when 0 then valores.A0 when 1 then valores.A1 when 2 then valores.A2 when 3 then valores.A3 when 3 then valores.A3 when 4 then valores.A4 when 5 then valores.A5 end as valor from equipos,puertos,valores where ((valores.idEquipo=puertos.idEquipo) and (equipos.idEquipo=puertos.idEquipo) and (equipos.idEquipo=valores.idEquipo) and (valores.fecha between  f1 and f2 )and (puertos.dispositivo<>'Contador') and (puertos.dispositivo<>'Alimentacion') and (puertos.dispositivo<>'Temperatura')  and (puertos.tag<>'')) having (valor<>'') order by puertos.dispositivo asc,valores.idEquipo asc,puertos.numpuerto asc, fecha asc;

END $$
DELIMITER ;

Gracias por vustra ayuda.
Responder Con Cita
  #9  
Antiguo 17-10-2007
VRO VRO is offline
Miembro
 
Registrado: abr 2004
Posts: 230
Poder: 21
VRO Va por buen camino
Parece que el procedimiento almacenado y yo no nos vamos a llevar muy bien.


El procedimiento almacenado es el siguiente aunque ya os lo he detallado.

Código SQL [-]

DELIMITER $$
DROP PROCEDURE IF EXISTS `aytosantillana`.`prueba` $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `prueba`(IN f1 char(20), IN f2 char(20))
BEGIN

SELECT puertos.tag,puertos.dispositivo as disp,valores.fecha,case puertos.numpuerto when 0 then valores.A0 when 1 then valores.A1 when 2 then valores.A2 when 3 then valores.A3 when 3 then valores.A3 when 4 then valores.A4 when 5 then valores.A5 end as valor from equipos,puertos,valores where ((valores.idEquipo=puertos.idEquipo) and (equipos.idEquipo=puertos.idEquipo) and (equipos.idEquipo=valores.idEquipo) and (valores.fecha between f1 and f2 )and (puertos.dispositivo<>'Contador') and (puertos.dispositivo<>'Alimentacion') and (puertos.dispositivo<>'Temperatura') and (puertos.tag<>'')) having (valor<>'') order by puertos.dispositivo asc,valores.idEquipo asc,puertos.numpuerto asc, fecha asc;

END $$
DELIMITER ;







Bueno cuando ejecuto el procedimiento almacenado desde Mysql no me da ningún problema lo hago de la siguiente forma:


Código SQL [-]

call prueba (valorf1, valorf2);





Ahora bien cuando intento sacar el resultado desde Delphi ( para la conexion a la base de datos Mysql utilizo componentes Zeos), atraves de un Zquery de esta forma:

Código:
 Zquery.close;
 Zquery.sql.text:='call prueba(valorf1, valorf2)';
 Zquery.open;
Me dice: 'Can't return a result set in the given context'


Si por el contrario hago la llamada a traves de un componente ZStoredProcedure de la siguiente forma:

Código:
 
  Z1.StoredProcName := 'prueba';
  Z1.ParamByName('f1').AsString := DatetimeToStr(StrTodatetime(datetostr(fecha.Date) + ' ' +'00:00:00'));
  Z1.ParamByName('f2').AsString := DatetimeToStr(StrTodatetime(datetostr(fecha.Date) + ' ' +'23:59:59'));
  z1.ExecProc;
Para este caso el mensaje de error es: 'Unsoported operation';

Así que aqui estoy que ya no se para donde tirar una ayudta, por favor.

Gracias
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
Procedimiento Almacenado rodrigo19 Oracle 5 22-08-2007 22:55:40
Fecha modificacion Procedimiento almacenado lgarcia SQL 2 28-05-2007 21:33:54
Procedimiento Almacenado pichi Vignola Firebird e Interbase 2 17-08-2006 01:07:38
Procedimiento almacenado y Ado LucianoRey MS SQL Server 11 06-07-2004 22:55:23
procedimiento Almacenado Gabriel A Reyes Conexión con bases de datos 4 19-06-2003 00:14:31


La franja horaria es GMT +2. Ahora son las 12:30:45.


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