PDA

Ver la Versión Completa : Ejecucion de consulta de fechas con problemas


jeremiselxi
09-02-2015, 22:23:02
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:


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


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:



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:


' (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


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


...
query_procedimientos.Parameters.ParamByName('fechadesde').AsDateTime := Fechadesde.date;
query_procedimientos.Parameters.ParamByName('fechahasta').AsDateTime := fechahasta.date;
...

jeremiselxi
10-02-2015, 13:34:27
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.


...
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 (http://www.clubdelphi.com/foros/guiaestilo.php), gracias por tu colaboración :)

AgustinOrtu
10-03-2015, 16:51:22
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 (http://docwiki.embarcadero.com/Libraries/XE2/en/System.SysUtils.TFormatSettings)