Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 03-03-2011
Rowerto Rowerto is offline
Miembro
 
Registrado: abr 2010
Posts: 20
Poder: 0
Rowerto Va por buen camino
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.

Última edición por rgstuamigo fecha: 03-03-2011 a las 17:24:24. Razón: Estética
Responder Con Cita
  #2  
Antiguo 03-03-2011
Avatar de defcon1_es
defcon1_es defcon1_es is offline
Miembro
 
Registrado: mar 2004
Ubicación: Cuenca - España
Posts: 533
Poder: 21
defcon1_es Va por buen camino
Hola, si usas parámetros, no te pasarán esas cosas

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
__________________
Progress Openedge
https://abevoelker.com/progress_open...dered_harmful/


Delphi forever...

Última edición por defcon1_es fecha: 03-03-2011 a las 18:38:04.
Responder Con Cita
  #3  
Antiguo 04-03-2011
Rowerto Rowerto is offline
Miembro
 
Registrado: abr 2010
Posts: 20
Poder: 0
Rowerto Va por buen camino
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

Última edición por Rowerto fecha: 04-03-2011 a las 10:29:57.
Responder Con Cita
  #4  
Antiguo 07-03-2011
Rowerto Rowerto is offline
Miembro
 
Registrado: abr 2010
Posts: 20
Poder: 0
Rowerto Va por buen camino
Question Otra pregunta...

Y por que no me funciona cuando cambio el MonthCalendar por un DateTimePicker?
Responder Con Cita
  #5  
Antiguo 10-03-2011
Avatar de oscarac
[oscarac] oscarac is offline
Miembro Premium
 
Registrado: sep 2006
Ubicación: Lima - Perú
Posts: 2.010
Poder: 20
oscarac Va por buen camino
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
Responder Con Cita
  #6  
Antiguo 10-03-2011
Rowerto Rowerto is offline
Miembro
 
Registrado: abr 2010
Posts: 20
Poder: 0
Rowerto Va por buen camino
Talking 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 )
Responder Con Cita
  #7  
Antiguo 10-03-2011
Avatar de oscarac
[oscarac] oscarac is offline
Miembro Premium
 
Registrado: sep 2006
Ubicación: Lima - Perú
Posts: 2.010
Poder: 20
oscarac Va por buen camino
me alegra haber sido de utilidad !!!
saludos
__________________
Dulce Regalo que Satanas manda para mi.....
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Color distintivo en DBgrid segun fechas amadis OOP 2 03-10-2007 20:00:21
Distintos Fonts en distintos PC lucasarts_18 Windows 2 12-07-2007 05:18:09
Problemas con el formatos de Fechas en SQL zorrocarolini SQL 7 31-01-2006 20:26:42
DBGrid, trabajar con fechas BlueSteel Varios 4 02-09-2005 21:30:20
Iconos distintos en distintos escritorios. abel Linux 2 16-02-2004 14:55:35


La franja horaria es GMT +2. Ahora son las 13:02:09.


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
Copyright 1996-2007 Club Delphi