Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   MS SQL Server (https://www.clubdelphi.com/foros/forumdisplay.php?f=23)
-   -   Ejecucion de consulta de fechas con problemas (https://www.clubdelphi.com/foros/showthread.php?t=87668)

jeremiselxi 09-02-2015 22:23:02

Ejecucion de consulta de fechas con problemas
 
Buenas tardes.

Esperando se encuentren bien, expreso mi siguiente situación.

Estoy trabajando con D7 y SQLServer 2012.

Tengo una tabla llamada fechas y tiene la siguiente estructura:

Fecha date
Descripcion nvarchar(50)
No int

con la siguiente información:

Código:

Fecha                Descripción    No
2015-01-01        Enero            1
2015-02-01        Febrero            2
2015-03-01        Marzo            3
2015-04-01        Abril                    4
2015-05-01        Mayo                    5
2015-06-01        Junio                    6
2015-07-01        Julio                    7
2015-08-01        Agosto            8
2015-09-01        Septiembre  9
2015-10-01        Octubre          10
2015-11-01        Noviembre          11
2015-12-01        Diciembre          12


Además tengo una tabla llamada procedimientos y en la misma hay varios tipos de nóminas (Empleados fijos, vacaciones y licencias entre otras).

Adjunto la estructura:

No int
Descripcion_del_Procedimiento nvarchar(255)
Fecha date
Cantidad_de_registros int
Monto float


y algunos registros de ejemplo

Código:

Descripcion del¨Procedimiento                        Monto                Cantidad_de_registros        Fecha
Generación de Nómina Bono Vacacional        562502.15                38                                      23/01/2015
Generación de Nómina Empleados Fijos        52981362.56        2057                                      23/01/2015
Generación de Nómina Empleados Fijos        53163587.86        2060                                      23/12/2014
Generación de Nómina Bono Vacacional        0                        0                                      04/12/2014


El problema es este código que me esta dando dolor de cabeza:

Código Delphi [-]

procedure TForm1.Button1Click(Sender: TObject);
var
STRSQL: string;
begin


STRSQL := 'SET LANGUAGE Spanish; ' +
' select fechas.No,  datename(month, fechas.fecha) Fecha,'+

//Campo con la fecha escrita manual (2014-12-01)   y   (2015-01-31)
'   (select  sum(empcant.Cantidad_de_registros) from  Procedimientos empcant  where (datename(month, fechas.fecha) = datename(month, empcant.fecha)) and empcant.Descripcion_del_Procedimiento like ''%Nómina Empleados Fijos%'''+
' and (empcant.Fecha >= ''2014-12-01'' and empcant.Fecha <=   ''2015-01-31'' )) CantidadEmpleado, '+

//Campo con la fecha elegida con dos datetimepicker llamado fechadesde y fechahasta.

'   (select  sum(emp.monto) from  Procedimientos emp  where (datename(month, fechas.fecha) = datename(month, emp.fecha)) and emp.Descripcion_del_Procedimiento like ''%Nómina Empleados Fijos%'''+
' and (emp.Fecha >= :fechadesde and emp.Fecha <= :fechahasta)) MontoEmpleado '+



' from fechas fechas '+
' group by datename(month, fechas.fecha), fechas.No order by fechas.No asc ';




query_procedimientos.Close;
query_procedimientos.SQL.Clear;
query_procedimientos.SQL.Text := STRSQL;
query_procedimientos.Parameters.ParamByName('fechadesde').Value :=   FormatDateTime('yyyy-mm-dd', Fechadesde.date);
query_procedimientos.Parameters.ParamByName('fechahasta').Value :=   FormatDateTime('yyyy-mm-dd', fechahasta.date);
query_procedimientos.Open;
//' and Upper('+ComboBox1.Text+') LIKE Upper(' + QuotedStr('%' + txtBuscar.Text + '%') + ')' +



end;

Si ejecuto el sql anterior funciona a la perfección.

Cual es el problema?

Si pueden observar en el código SQL está esto:

Código SQL [-]
'   (select  sum(empcant.Cantidad_de_registros) from  Procedimientos empcant  where (datename(month, fechas.fecha) = datename(month, empcant.fecha)) and empcant.Descripcion_del_Procedimiento like ''%Nómina Empleados Fijos%'''+
' and (empcant.Fecha >= ''2014-12-01'' and empcant.Fecha <=   ''2015-01-31'' )) CantidadEmpleado, '+
en la cual las fechas están digitadas de forma manual y en el siguiente código están elegidos con los datetimepicker

Código SQL [-]
'   (select  sum(emp.monto) from  Procedimientos emp  where (datename(month, fechas.fecha) = datename(month, emp.fecha)) and emp.Descripcion_del_Procedimiento like ''%Nómina Empleados Fijos%'''+
' and (emp.Fecha >= :fechadesde and emp.Fecha <= :fechahasta)) MontoEmpleado '+


pero si cambio donde están las fechas digitadas manual por :fechadesde y :fechahasta me sale el siguiente error:


"Objeto Parameter mal definido. Se proporcionó información incompleta o incoherente."

Podrían ayudarme a solucionarlo?

Gracias de antemano por su ayuda.

Saludos.

Neftali [Germán.Estévez] 10-02-2015 10:08:49

Código Delphi [-]
query_procedimientos.Close;
query_procedimientos.SQL.Clear;
query_procedimientos.SQL.Text := STRSQL;
query_procedimientos.Parameters.ParamByName('fechadesde').Value :=   FormatDateTime('yyyy-mm-dd', Fechadesde.date);
query_procedimientos.Parameters.ParamByName('fechahasta').Value :=   FormatDateTime('yyyy-mm-dd', fechahasta.date);
query_procedimientos.Open;

Lo que no entiendo es que si estás usando parámetros y son de tipo fecha, fueerzas el formato a uno determinado.
Lo lógico sería enviar la fecha y que el driver lo formatee como sea necesario.

Código Delphi [-]
...
query_procedimientos.Parameters.ParamByName('fechadesde').AsDateTime := Fechadesde.date;
query_procedimientos.Parameters.ParamByName('fechahasta').AsDateTime := fechahasta.date;
...

jeremiselxi 10-02-2015 13:34:27

Cita:

Empezado por Neftali (Mensaje 488608)
Código Delphi [-]
query_procedimientos.Close;
query_procedimientos.SQL.Clear;
query_procedimientos.SQL.Text := STRSQL;
query_procedimientos.Parameters.ParamByName('fechadesde').Value :=   FormatDateTime('yyyy-mm-dd', Fechadesde.date);
query_procedimientos.Parameters.ParamByName('fechahasta').Value :=   FormatDateTime('yyyy-mm-dd', fechahasta.date);
query_procedimientos.Open;

Lo que no entiendo es que si estás usando parámetros y son de tipo fecha, fueerzas el formato a uno determinado.
Lo lógico sería enviar la fecha y que el driver lo formatee como sea necesario.

Código Delphi [-]
...
query_procedimientos.Parameters.ParamByName('fechadesde').AsDateTime := Fechadesde.date;
query_procedimientos.Parameters.ParamByName('fechahasta').AsDateTime := fechahasta.date;
...


muchísimas Gracias Neftalí.

Saludos

weltonsee4 10-03-2015 06:27:46

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á?





________________________________
see

Casimiro Notevi 10-03-2015 09:17:11


Explícate mejor, creo que no se entiende bien lo que comentas.
Por cierto, bienvenido a clubdelphi, como siempre aconsejamos a los nuevos, no olvides leer nuestra guía de estilo, gracias por tu colaboración :)

AgustinOrtu 10-03-2015 16:51:22

Cita:

Empezado por weltonsee4 (Mensaje 489783)
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á?
see

Si se puede. Que version de delphi? Hay un record que tiene toda la configuracion regional de windows y podes modificarlo

TFormatSettings


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