Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Problemas entre fechas con resto de la sentencia (https://www.clubdelphi.com/foros/showthread.php?t=91793)

netcom 28-04-2017 12:30:03

Problemas entre fechas con resto de la sentencia
 
Buenas,
Primero de todo gracias de antemano por vuestras posibles respuestas.
Tengo un problema con la siguiente sentencia SQL, pero no se donde radica el error. Haciendo pruebas, si la modifica para solo condición 1 y 2, funciona. Si la modifico solo para condición 3 y 4, también funciona. Pero si la modifico para que tenga las 4 da error. Os adjunto el código completo:

Código Delphi [-]
With Datamodule1.ADOQuery_consultasFlujo Do
            Begin
              Close;
              SQL.Clear;
              SQL.Add('SELECT * FROM Entradas_Salidas_ECS WHERE tipo_de_entrada=condicion1 and tipo_de_salida=condicion2 and Fecha_salida BETWEEN :condicion3 and :condicion4');                
              Parameters.ParamByName('condicion1').Value:=RG_Entradas.ItemIndex;
              Parameters.ParamByName('condicion2').Value:=RG_Salidas.ItemIndex;
              Parameters.ParamByName('condicion3').Value:=E_Entrada_Inicio.Text;
              Parameters.ParamByName('condicion4').Value:=E_Entrada_Fin.Text;              
              Open;
            End;

Gracias de nuevo!

Casimiro Notevi 28-04-2017 12:43:28

¿Y cuál es el error?

manelb 28-04-2017 12:58:58

Código Delphi [-]
SQL.Add('SELECT * FROM Entradas_Salidas_ECS WHERE tipo_de_entrada=condicion1 and tipo_de_salida=condicion2 and Fecha_salida BETWEEN :condicion3 and :condicion4');

En condición1 y condicion2 no veo los dos puntos (:condicion1, :condicion2). Podría ser esto??

netcom 28-04-2017 14:16:47

Buenas,

Cuando cambio la sentencia solo para condicion1 y 2 o solo para condicion3 y 4 no hay error ninguno. Cuando lo pongo junto como veis lanza un error indicando que el parámetro condicion1 no lo encuentra, algo muy raro.

He probado lo de los puntos por si las moscas, no tienen nada que ver.

Gracias por las respuestas!

Casimiro Notevi 28-04-2017 16:44:00

Cita:

Empezado por netcom (Mensaje 516079)
Buenas,
Cuando cambio la sentencia solo para condicion1 y 2 o solo para condicion3 y 4 no hay error ninguno. Cuando lo pongo junto como veis lanza un error indicando que el parámetro condicion1 no lo encuentra, algo muy raro.
He probado lo de los puntos por si las moscas, no tienen nada que ver.
Gracias por las respuestas!

Lo primero de todo, la sentencia está mal, faltan los : como indica manel, a partir de ahí tienes que ver qué parámetros recibe y ver qué error da.

netcom 28-04-2017 16:57:44

nuca he usado los puntos con este tipo de sentencias, haciendo pruebas y modificando código:
Código Delphi [-]
With Datamodule1.ADOQuery_consultasFlujo Do
            Begin
              Close;
              SQL.Clear;
              SQL.Add('SELECT * FROM Entradas_Salidas_ECS WHERE tipo_de_entrada =condicion1 and tipo_de_salida =condicion2 and nombre =condicion3 ');
              SQL.Add('and Fecha_salida BETWEEN :condicion4 and :condicion5 ');
              SQL.Add('and Fecha_de_entrada BETWEEN :condicion6 and :condicion7');
              Parameters.Refresh;
              Parameters.ParamByName('condicion1').Value:=RG_Entradas.Items.strings[RG_Entradas.ItemIndex];
              Parameters.ParamByName('condicion2').Value:=RG_Salidas.Items.strings[RG_Entradas.ItemIndex];
              Parameters.ParamByName('condicion3').Value:='Cliente';
              Parameters.ParamByName('condicion4').Value:=StrToDatetime(E_Entrada_Inicio.Text);
              Parameters.ParamByName('condicion5').Value:=StrToDate(E_Entrada_Fin.Text);
              Parameters.ParamByName('condicion6').Value:=StrToDate(E_Salida_Inicio.Text);
              Parameters.ParamByName('condicion7').Value:=StrToDate(E_Salida_Fin.Text);
              Open;
            End;

Ahora melanza el error "PArameter 'codición4' not found". Me estoy volviendo tarumba. ¿alguna otra idea?

Casimiro Notevi 28-04-2017 16:59:24

Cita:

Empezado por netcom (Mensaje 516088)
nuca he usado los puntos con este tipo de sentencias, haciendo pruebas y modificando código:
Ahora melanza el error "PArameter 'codición4' not found". Me estoy volviendo tarumba. ¿alguna otra idea?

Para empezar, ¿qué base de datos estás usando?

Casimiro Notevi 28-04-2017 16:59:59

Y que leas nuestra guía de estilo ;)

netcom 28-04-2017 18:23:11

Perdón, uso acces 2013, windows 10 y delphi XE2. Si necesitais otro dato importante que me haya dejado ya me decis. Gracias!!

manelb 28-04-2017 20:18:20

Otra sugerencia:
Cambia los .Value por el tipo concreto de cada parametro

mRoman 02-05-2017 04:27:45

Creo q tienes algunos errores....
Código Delphi [-]
With Datamodule1.ADOQuery_consultasFlujo Do
            Begin
              Close;
              SQL.Clear;
              SQL.Add('SELECT * FROM Entradas_Salidas_ECS WHERE tipo_de_entrada =:condicion1 and tipo_de_salida =:condicion2 and nombre =:condicion3 ');
              SQL.Add('and Fecha_salida BETWEEN :condicion4 and :condicion5 ');
              SQL.Add('and Fecha_de_entrada BETWEEN :condicion6 and :condicion7');
              Parameters.Refresh;
              Parameters.ParamByName('condicion1').Value:=RG_Entradas.Items.strings[RG_Entradas.ItemIndex];
              Parameters.ParamByName('condicion2').Value:=RG_Salidas.Items.strings[RG_Entradas.ItemIndex]; //AQUI HACE REFERENCIA RG_ENTRADAS... no debería ser a RG_Salidas.ItemIndex???
              Parameters.ParamByName('condicion3').Value:='Cliente';
              Parameters.ParamByName('condicion4').Value:=StrToDatetime(E_Entrada_Inicio.Text);
              Parameters.ParamByName('condicion5').Value:=StrToDate(E_Entrada_Fin.Text);
              Parameters.ParamByName('condicion6').Value:=StrToDate(E_Salida_Inicio.Text);
              Parameters.ParamByName('condicion7').Value:=StrToDate(E_Salida_Fin.Text);
              Open;
            End;

Y mas arriba te hacian un comentario de registrar el tipo de dato que debe aceptar, es decir cambiar VALUE por el tipo de dato que deberá aceptar como parametro:

Código Delphi [-]
Parameters.ParamByName('condicion5').Value:=StrToDate(E_Entrada_Fin.Text);
              Parameters.ParamByName('condicion6').AsDate:=StrToDate(E_Salida_Inicio.Text);//AsDate o AsDateTime, segun...si el campo TimeStamp
              Parameters.ParamByName('condicion7').AsDate:=StrToDate(E_Salida_Fin.Text);

Saludos.

netcom 02-05-2017 12:11:31

Gracias por la sugerencia Manel.
Roman, bien visto el error de entrada/salida, aunque no afecta en nada al problema que tengo.

Intento cambiar "value" por el tipo concreto de cada parámetro como me sugerís, pero el delhpi da error de sentencia. ParamByName no acepta otra cosa queno sea Value, ni AsString, ni Asdate... quizá tengo una versión algo obsoleta? trabajo con XE2:

Código Delphi [-]
With Datamodule1.ADOQuery_consultasFlujo Do
            Begin
              Close;
              SQL.Clear;
              SQL.Add('SELECT * FROM Entradas_Salidas_ECS WHERE tipo_de_entrada =condicion1 and tipo_de_salida =condicion2 and nombre =condicion3 ');
              SQL.Add('and Fecha_salida BETWEEN :condicion4 and :condicion5 ');
              SQL.Add('and Fecha_de_entrada BETWEEN :condicion6 and :condicion7');
              Parameters.Refresh;
              Parameters.ParamByName('condicion1').AsString:=RG_Entradas.Items.strings[RG_Entradas.ItemIndex];
              Parameters.ParamByName('condicion2').AsString:=RG_Salidas.Items.strings[RG_Salidas.ItemIndex];
              Parameters.ParamByName('condicion3').AsString:='Cliente';
              Parameters.ParamByName('condicion4').AsString:=E_Entrada_Inicio.Text;
              Parameters.ParamByName('condicion5').AsString:=E_Entrada_Fin.Text;
              Parameters.ParamByName('condicion6').AsString:=E_Salida_Inicio.Text;
              Parameters.ParamByName('condicion7').AsString:=E_Salida_Fin.Text;
              Open;
            End;

Alguna otra idea?

Gracias de nuevo.

Casimiro Notevi 02-05-2017 16:06:25

Cita:

Empezado por netcom (Mensaje 516176)
Intento cambiar "value" por el tipo concreto de cada parámetro como me sugerís, pero el delhpi da error de sentencia. ParamByName no acepta otra cosa queno sea Value, ni AsString, ni Asdate... quizá tengo una versión algo obsoleta? trabajo con XE2:

Copia aquí tu código que lo veamos, y copia y pega también el error exactamente que sale y dónde.

netcom 02-05-2017 17:03:15

Primero, perdón... estaba obcecado con el problema y no veía más allá de mi nariz...:(
Ya lo he resuelto, el problema, los dos puntos, como muy bien me habíais indicado en primera instancia, y en segundo lugar había puesto mál uno de los campos de la tabla, que se llamaba "fecha recepcion' y en la consulta lo estaba llamando 'fecha entrada'. Os adjunto el código final que funciona:

Código Delphi [-]
With Datamodule1.ADOQuery_consultasFlujo Do
            Begin
              Close;
              SQL.Clear;
              SQL.Add('SELECT * FROM Entradas_Salidas_ECS WHERE tipo_de_entrada =:condicion1 and tipo_de_salida =:condicion2 and nombre =:condicion3');
              SQL.Add('and Fecha_salida BETWEEN :condicion4 and :condicion5 ');
              SQL.Add('and Fecha_recepcion BETWEEN :condicion6 and :condicion7');
              Parameters.ParamByName('condicion1').Value:=RG_Entradas.Items.strings[RG_Entradas.ItemIndex];
              Parameters.ParamByName('condicion2').Value:=RG_Salidas.Items.strings[RG_Salidas.ItemIndex];
              Parameters.ParamByName('condicion3').Value:='Test 1';
              Parameters.ParamByName('condicion4').Value:=E_Entrada_Inicio.Text;
              Parameters.ParamByName('condicion5').Value:=E_Entrada_Fin.Text;
              Parameters.ParamByName('condicion6').Value:=E_Salida_Inicio.Text;
              Parameters.ParamByName('condicion7').Value:=E_Salida_Fin.Text;
              Open;
            End;

De nuevo, siento haberos hecho perder el tiempo!! muchísimas gracias por vuestro interes y por vuestras respuestas. Tenéis un foro cojonudo, desde años que le hago consultas siempre que tengo alguna dudilla.

Vemos!


La franja horaria es GMT +2. Ahora son las 19:13: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