Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Coloboración Paypal con ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 13-05-2007
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
zcatzz, ¿cómo estás insertando los datos en la base? Normalmente, las componentes de acceso deben encargarse de colocar los datos en el formato de fecha adecuado usando las propiedades AsDate o AsDateTime del campo correspondiente o parámetro si usas una consulta SQL. Muchos problemas de fechas vienen por que uno intenta construir la cadena sql intercalando directamente el valor de la fecha como un string, y claro, viene el problema del formato. Pero si utilizas los parámetros adecuadamente, los valores los pasas, no como cadenas, sino como valores Date, que no dependen del formato.

Por ejemplo, suponiendo que usas un Query:

Código Delphi [-]
Query.SQL.Text := 'select * from tabla where fecha = :fecha';
Query.SQL.ParamByName('fecha').AsDate := Trunc(DateTimePicker1.Date);
Query.Open;

Esto debería poner correctamente el valor, sin necesidad de ninguna conversión de formatos.

// Saludos
Responder Con Cita
  #2  
Antiguo 15-05-2007
Avatar de zcatzz
zcatzz zcatzz is offline
Miembro
 
Registrado: dic 2006
Posts: 48
Poder: 0
zcatzz Va por buen camino
Lo he logrado en los 2 programas de manera distinta

Me ha pasado una cosa curiosisima.. como les he comentado tengo 2 proyectos y he resuelto el problema de manera distinta en el 1er proyecto lo he dejado asi:


Código Delphi [-]
Fmt := 'dd/MM/yyyy';

FechaC.DateTime := Now;
FechaC.Perform(DTM_SETFORMAT, 0, Integer(PChar(Fmt)));




como el maestro Roman me ha dicho para simplificar me convertidero anterior..
Esto funciona perfectamente en el 1ero.

En el 2do proyecto tuve que agregarle la comparacion en el que identifique que lenguaje de sistema tiene el sistema antes de insertar la fecha en la tabla:


Código Delphi [-]
if idioma='080A' then // si el formato esta en espanol
fecha:=conversionfechaparatablaespanol(fechan.text)
else if idioma='0409' then // si el formato esta en ingles
fecha:=conversionfechaparatablaingles(fechan.text);
inserta en la tabla el campo fecha





Y Ya de esta manera dependiendo del idioma lo cambio al formato con las
funciones que implemente a: yyyy-mm-dd.
Responder Con Cita
  #3  
Antiguo 15-05-2007
Avatar de zcatzz
zcatzz zcatzz is offline
Miembro
 
Registrado: dic 2006
Posts: 48
Poder: 0
zcatzz Va por buen camino
Asi es lo tomo como string la fecha

Cita:
Empezado por roman
zcatzz, ¿cómo estás insertando los datos en la base? Normalmente, las componentes de acceso deben encargarse de colocar los datos en el formato de fecha adecuado usando las propiedades AsDate o AsDateTime del campo correspondiente o parámetro si usas una consulta SQL. Muchos problemas de fechas vienen por que uno intenta construir la cadena sql intercalando directamente el valor de la fecha como un string, y claro, viene el problema del formato. Pero si utilizas los parámetros adecuadamente, los valores los pasas, no como cadenas, sino como valores Date, que no dependen del formato.

Por ejemplo, suponiendo que usas un Query:


Código Delphi [-]
Query.SQL.Text := 'select * from tabla where fecha = :fecha';
Query.SQL.ParamByName('fecha').AsDate := Trunc(DateTimePicker1.Date);
Query.Open;





Esto debería poner correctamente el valor, sin necesidad de ninguna conversión de formatos.

// Saludos
Hola :
Con respecto a su pregunta.. la respuesta es si .. lo convierto en string
para manipularlo..

Estuve intentando su sugerencia... pero me marca el siguiente error:

undeclared identifier parambyname

cambie la linea de esta manera:

query.parameters.ParamByName('fecha').AsDate := Trunc(Fecha.Date);

pero me dice:

undeclared identifier asdate

Sera acaso porque uso delphi 5? o me faltara declarar alguna unidad?

Nota: Estos programas hago pruebas en mysql5 pero son para informix
asi me trae la jefa a falta de otra solucion eso me complica un poquitin mas la existencia

Muchas gracias por toda la ayuda a todos .. Saludos
Responder Con Cita
  #4  
Antiguo 15-05-2007
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
Responder Con Cita
  #5  
Antiguo 15-05-2007
Avatar de zcatzz
zcatzz zcatzz is offline
Miembro
 
Registrado: dic 2006
Posts: 48
Poder: 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
  #6  
Antiguo 15-05-2007
Avatar de zcatzz
zcatzz zcatzz is offline
Miembro
 
Registrado: dic 2006
Posts: 48
Poder: 0
zcatzz Va por buen camino
Sin palabras estoy Feliz!!!

Muchisimas gracias de verdad !! estoy super contenta , gracias al ultimo comentario del maestro Roman se ha logrado el objetivo... definitivamente reitero lo de mi ultimo comentario.. Mal programar ocasiona muchos problemas.. nunca mas vuelvo a convertir a string los formatos date.

1era prueba : Ha funcionado sin ningun problema, sin importar en que configuracion regional este la insercion correcta a la tabla en mysql de un datetimepicker..

En cuanto lo pueda probar en informix les digo los resultados..
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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
problemas al comparar un rango de fechas con datetimepicker robertillo Varios 3 18-04-2007 19:05:27
Formato de fechas y DateTimePicker. aoiTo C++ Builder 9 08-12-2006 01:13:39
Between DateTimePicker com fechas iguais le4br SQL 3 23-02-2005 05:18:56
DateTimePicker: problema comparando fechas Tomás OOP 7 06-09-2004 12:22:13
delphi5 y xml quake2420 Internet 1 28-06-2004 14:52:30


La franja horaria es GMT +2. Ahora son las 18:54:43.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi