Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Fechas con distintos formatos en una DBGrid (https://www.clubdelphi.com/foros/showthread.php?t=72646)

Rowerto 03-03-2011 16:59:34

Fechas con distintos formatos en una DBGrid
 
Hola, delphines XD
Me dirijo de nuevo a ustedes para resolver mis dudas sobre algo que me estoy haciendo para vivir mejor en mi trabajo.
Para empezar decir que como no supe muy bien donde colocar esta duda, me he ido a lo "mas generico" que he encontrado. Y es que al usar componentes ADO podria haberla puesto en la parte de conexion a BdDs, o al usar sentencias SQL no se si tendra la culpa y deberia haberlo puesto en su propia seccion... Bueno, al lio que me lio.
Trabajamos con una BdD Access (version 97, cosas de la empresa) y dentro de ella hay una tabla que se llama "Movimientos" donde estan todos los registros de movimientos de centros. Yo solo quiero poder hacer una consulta de los movimientos de un dia en concreto, algo que aparentemente es facil y sencillo se ha convertido en cuatro dias "malgastados" en revisar codigo y mirar foros (este, sobretodo) para aclararme algo las ideas, pero ni asi.
Tengo un form con :
- Una query llamada "ADOQDatos" al que le paso la sentencia SQL por codigo, ya que necesito primero darle la fecha que quiero consultar. La
sentencia final es
Código SQL [-]
SELECT F_Mov, B1, B2, B3, Ord_Eje_Inc, Ord_Noeje, Ord_Bien, Observac 
FROM Movimientos 
WHERE F_Mov = #'+ datetostr(MCalendario.Date) +'# ORDER BY B1'

- Un DataSource ("DataSource1") cuyo DataSet es el "ADOQDatos".
- Un DBGrid para poner la informacion cuyo DataSource es el "DataSource1".
- Y un TMonthCalendar ("MCalendario") que uso para elegir la fecha de consulta.
Para lanzar todo el proceso tengo el siguiente codigo (eso es todo, no tengo mas) en el evento del doble-click
Código Delphi [-]
  
  ADOQDatos.Close;
  ADOQDatos.SQL.Clear;
  ADOQDatos.SQL.Add('SELECT F_Mov, B1, B2, B3, Ord_Eje_Inc, Ord_Noeje, Ord_Bien, Observac FROM MOV_SCADA WHERE F_Mov = #'
                                 + datetostr(MCalendario.Date) +'# ORDER BY B1');
  ADOQDatos.Open;
  ADOQDatos.ExecSQL;

Todo parece funcionar bien, hasta que me doy cuenta que sabiendo que tengo registros de todos los dias del mes de Enero y Febrero resulta que cuando pico en el calendario los dias del 3 al 12 (ambos incluidos y tanto en Enero como en Febrero) no aparece nada. Pero si por ejemplo quiero ver las del 04/01/11 tengo que ir al 01/04/11, como si fuese fecha de formato americano (y lo mismo en Febrero).
otras cosas que he notado es que los registros de los dias 1 y 2 aparecen bien en ambos meses pero al visualizarse en la grid aparecen con formato americano, mientras los posteriores al dia 13 se visualizan en formato europeo.
Fui a la propia base de datos pero en la declaracion de F_Mov no hay mas que tipo "Fecha/Hora" sin mascara de entrada ni formato establecido. Ni que decir tiene que al ser una BdDs de empresa esta capada con usuario y contraseña (que no dan ni pa'tras, yo de hecho estoy trabajando con una copia local que realizo con el programa de Visual Basic que gestiona esa propia base) y no puedo crear consultas ni cosas parecidas para apoyarme en ellas. Pero al ver los datos de la tabla y ordenarlos, las fechas vienen correctas desde ella, es decir se guardan con formato 'dd/mm/aa'.
He encontrado algunos hilos en este foro sobre cosas parecidas como
http://www.clubdelphi.com/foros/showthread.php?t=44376
o este otro
http://www.clubdelphi.com/foros/showthread.php?t=55928
pero solo me han servido para liarme la cabeza aun mas.
He de suponer que estoy haciendo algo mal con los formatos de alguno de los componentes pero no logro detectar en cual ni donde y ahora mismo estoy bloqueado, perdido y no se que puedo hacer, por lo que cualquier ayuda o indicacion sera de agradecer.
Gracias de antemano, espero haberme explicado con claridad y perdon por el morrogo que acabo de soltar.
PD: Si algun admin. cree que esto debe estar en otra seccion, por favor que lo mueva sin dudar.

defcon1_es 03-03-2011 18:34:28

Hola, si usas parámetros, no te pasarán esas cosas :cool:

Código Delphi [-]
 ADOQDatos.Close;
 ADOQDatos.SQL.Clear;
 ADOQDatos.SQL.Add('SELECT F_Mov, B1, B2, B3, Ord_Eje_Inc, Ord_Noeje, Ord_Bien, Observac FROM MOV_SCADA WHERE F_Mov = :ParFecha ORDER BY B1');
 ADOQDatos.ParamByName('ParFecha').AsDateTime := MCalendario.Date;
 ADOQDatos.Open;
// ADOQDatos.ExecSQL; //creo que sobra

PD: Si en F_Mov guardas las horas,minutos y segundos, la consulta no saldrá correctamente.
Yo siempre omito las horas, minutos y segundos para estos casos:
Código:

SELECT F_Mov, B1, B2, B3, Ord_Eje_Inc, Ord_Noeje, Ord_Bien, Observac
FROM MOV_SCADA WHERE TRUNC(F_Mov) = :ParFecha ORDER BY B1


Rowerto 04-03-2011 10:26:04

Gracias por la pronta contestacion.
En casa y con un poco de calma he variado un poco el codigo, ya que el ASDATETIME no me funcionaba. Lo hice como sigue:

Código Delphi [-]
ADOQDatos.Close;
ADOQDatos.SQL.Clear;
ADOQDatos.SQL.Add('SELECT F_Mov, B1, B2, B3, Ord_Eje_Inc, Ord_Noeje, Ord_Bien, Observac FROM MOV_SCADA WHERE F_Mov = :ParFecha ORDER BY B1');
//ADOQDatos.ParamByName('ParFecha').AsDateTime := MCalendario.Date;//asi no sirve
ADOQDatos.Parameters.ParamByName('ParFecha').DataType := ftDateTime; 
//como no lo declaro y lo creo en ejecucion le defino el tipo de dato 
//que va a recoger el parametro
ADOQDatos.Parameters.ParamByName('ParFecha').Value := MCalendario.Date;
ADOQDatos.Open;
// ADOQDatos.ExecSQL; //como bien decia defcon1_es esto sobra

Yo antes de esto hacia un apaño, ya que me di cuenta que lo cambiaba solo en los 12 primeros dias y lo estaba haciendo con strings. Una chapuza como un templo (hay que tener dos variables en la funcion de tipo string, busco y buscom).

Código Delphi [-]
busco:=datetostr(MCalendario.Date);
if strtoint(copy(datetostr(MCalendario.Date), 0, 2)) < 13 then
begin
buscom:=trim(copy(busco, 4, 2)+'/'+copy(busco, 0, 2)+copy(busco, length(busco)-4, 5));
busco:=buscom;
end;
//aqui el codigo que yo tenia antes

Rowerto 07-03-2011 12:59:33

Otra pregunta...
 
Y por que no me funciona cuando cambio el MonthCalendar por un DateTimePicker?

oscarac 10-03-2011 15:12:27

hola

tambien tenia problemas con las fechas especialmente en access (q es un dolor de cabeza)

lo de abajo me funciona bien

Código Delphi [-]
 
Query.ParamByName('FechaInicio').AsDateTime := StrToDate(FormatDateTime('DD/MM/YYYY',DateTimePicker1.Date));

espero te ayude
saludos

Rowerto 10-03-2011 18:15:29

Gracias, tio, me estaba volviendo tarumba
 
Muchas gracias por el resuelve. Al final no lo puse tal cual me lo das, sino que tuve que variarlo un poco para que funcionara. Eso si, funciona FETEN!!!! :)

En el evento CloseUp del DateTimePicker

Código Delphi [-]
  
ADOQDatos.SQL.Clear;
  ADOQDatos.SQL.Add('SELECT * FROM MOV_SCADA WHERE F_Mov = :ParFecha ORDER BY B1');
  ADOQDatos.Parameters.ParamByName('ParFecha').DataType := ftDateTime;
  ADOQDatos.Parameters.ParamByName('ParFecha').Value := StrToDate(FormatDateTime('dd/MM/yyyy',DateTimePicker1.Date));
  ADOQDatos.Open;

Habia visto la solucion en un par de hilos, pero soy un poco lerdo (a veces :D)

oscarac 10-03-2011 20:14:47

me alegra haber sido de utilidad !!!
saludos


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

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