Ver Mensaje Individual
  #16  
Antiguo 15-05-2007
Avatar de zcatzz
zcatzz zcatzz is offline
Miembro
 
Registrado: dic 2006
Posts: 48
Reputación: 0
zcatzz Va por buen camino
Thumbs up Muchisimas Gracias por esta informacion

Cita:
Empezado por roman
zcatzz,

Vamos a ver si nos aclaramos un poco, porque lo que funciona en un proyecto debe funcionar en el otro.

Tú tienes dos problemas:
  • Formato para mostrar las fechas
  • Formato para introducir las fechas en la base
Lo primero ya lo tienes resuelto con el uso de DTM_SETFORMAT que viene a suplir la propiedad Format, faltante en Delphi 5. Y eso es válido para cualquier configuración regional que tengas en el equipo, porque DTM_SETFORMAT lo que hace es precisamente saltarse dicha configuración. Así que debe funcionar bien en ambos proyectos.

El segundo problema es distinto, porque tiene que ver, no con el formato en que se muestran las fechas en la computadora, sino con el formato que la base de datos requiere para introducir fechas.

Desconozco como es en Informix, pero MySQL espera el formato:

yyyy-mm-dd

No me queda claro de qué fechas estás partiendo, pero dado que hablas de un DateTimePicker, imagino que haces algo como:


Código Delphi [-]
fecha := DateToStr(DateTimePicker.Date);





El problema es que una función como DateToStr basa su conversión en la configuración regional de la computadora, de manera que según la que tengas, obtendrás cadenas en formato dd/mm/yy (México) o m/d/yyyy (EU).

Dado que tú, en cualquier caso, necesitas el formato yyyy-mm-dd para pasarlo a MySQL, requieres distintas funciones de conversión, según la configuración regional:

dd/mm/yyyy --> yyyy-mm-dd (México)
m/d/yyyy --> yyyy-mm-dd (EU)

De ahí las dos funciones que estás usando. Aquí es donde valdría usar ShortDateFormat, para instruir a DateToStr al formato deseado y evitar así dos funciones de conversión distintas:


Código Delphi [-]
ShortDateFormat := 'yyyy-mm-dd';
fecha := DateToStr(DateTimePicker.Date);





Lo anterior convierte la fecha del DateTimePicker a una cadena yyyy-mm-dd sin importar qué configuración se tenga en la PC.

Pero, todo esto es innecesario y propenso a errores. Así como te funciona para MySQL, podría no funcionarte para Informix. Por ello es que lo mejor es hacer uso de parámetros en las consultas SQL y dejar que el driver correspondiente haga las conversiones requeridas.

Hasta ahora creo que no has mencionado qué componentes estás usando, pero, por el uso de Parameters y la falta de la propiedad AsDate, imagino que esta usando ADO.

En ADO hay que especificar explícitamente cuál es el tipo de datos de los parámetros:


Código Delphi [-]
ADOQuery.Parameters.ParamByName('fecha').DataType := ftDate;
ADOQuery.Parameters.ParamByName('fecha').Value := DateTimePicker.Date;





Observa entonces que tomamos ya directamente el valor del DateTimePicker, sin recurrir a ninguna conversión. Será el propio driver de MySQL (o de Informix) el que haga la conversión.

Quizá sea algo distinto en Delphi 5, no recuerdo, pero lo importante es que debes especificar el tipo de datos del campo.

Y, en resumen, el punto que yo destacaría es:

No recurrir nunca a proporcionar fechas/horas a una base de datos como cadenas de caracteres. Hacerlo siempre con los valores de tipo Date, Time o DateTime que no dependen para nada de la configuración regional, y dejar que los drivers hagan su trabajo.

// Saludos
Primeramente una disculpa porque se me olvido explicar en todo momento que efectivamete estoy utilizando Ado.

De verdad que con esta gran explicacion me has aclarado muchas cosas.. como uno malmente hace muchas veces incorrecta la programacion haciendo conversiones innecesarias. Definitivamente voy a checar esto ultimo que me has explicado en el programa "rebelde" , hare pruebas con informix y con mysql y expondré los resultados..
Responder Con Cita