Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   MySQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=21)
-   -   Procedimiento almacenado con fecha (https://www.clubdelphi.com/foros/showthread.php?t=49160)

VRO 15-10-2007 10:14:30

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.-

duilioisola 15-10-2007 11:31:28

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;
   (...)

VRO 15-10-2007 18:46:49

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.-

duilioisola 15-10-2007 18:52:56

Prueba cambiando
:f1 por ?f1

Mira en el foro y en los trucos casos como este para base de datos MySQL

duilioisola 15-10-2007 19:27:26

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.

duilioisola 15-10-2007 19:33:04

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)

VRO 16-10-2007 09:47:42

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.

VRO 16-10-2007 11:06:57

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.

VRO 17-10-2007 08:23:09

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


La franja horaria es GMT +2. Ahora son las 16:49:38.

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