FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
||||
|
||||
Optimizar comparación de fechas
El título puede no ser del todo exacto, pero no se me ocurría otro mejor. Gracias de antemano a todos.
Es una cuestión algo tonta: me he planteado si lo estaré haciendo de un modo óptimo o por lo menos mínimo. El problema: Tengo que comparar 4 fechas más o menos lo que quiero saber es: Cita:
Problema, los datos se obtienen de una consulta, están en DBEdits y algunos pueden llegar en blanco, y ese es el problema. Tengo un pequeño monstruo de if-else anidados para asegurarme de que no comparo cuando llegan en blanco y sí cuando tienen datos... que no me acaba de convencer.
Peculiaridades: fecha_creacion: nunca llega en blanco. fecha_aprobacion: si no existe las otras dos (fecha_emision_f_ant y fecha_emision_f) tampoco. PD: Me ha costado escribir todo esto... creo que me voy a tomar una galleta para recuperarme . |
#2
|
||||
|
||||
Si quieres optimizar el código para menor uso de procesador, yo evitaría convertir un string a un TDate para cada comparación. O a lo sumo excluír en en las primeras líneas las comparaciones que serán mas comunes!
Por otro lado, líneas como esta: no es lo mismo que esto? : Yo personalmente prefiero evitar los Exit intentando que la lógica te lleve a la salida Saludos!
__________________
delphi.com.ar Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla. Última edición por delphi.com.ar fecha: 20-07-2006 a las 23:50:34. |
#3
|
||||
|
||||
A raíz del último comentario, una forma de optimizar podría ser:
Como ves, Result sólo se asigna en dos puntos y la propia lógica "te lleva fuera". Además reduces en operaciones ya que no tienes que hacer:
|
#4
|
|||
|
|||
Yo seguramente haria algo como:
Código:
function fechasValidas: Boolean; var f1,f2,f3,f4: TDateTime; begin f1:= StrToDateDef(fecha_creacion.text ,MaxDouble); f2:= StrToDateDef(fecha_aprovacion.text ,MaxDouble); f3:= StrToDateDef(fecha_emision_f_ant.text,MaxDouble); f4:= StrToDateDef(fecha_emision_f.text ,MaxDouble); Result:= (f1<=f2) and (f2<=f3) and (f3<=f4); end; que el codigo quedaria mucho mas enrevesado, y salvo que haya que llamar miles de veces por segundo a esa funcion, la velocidad de ejecucion sera suficiente. Saludos |
#5
|
||||
|
||||
Antes de nada gracias a todos por vuestros comentarios
Por partes: delphi.com.ar He puesto los exit porque antes lo tenía todo con if-else y era múchísimo más grande y lioso, a mi entender, y en un caso como este no creo que sea un mal uso, y eso que a mi tampoco me gusta emplearlos. Creo que es buena idea lo de hacer las transformaciones una única vez, al principio y luego usar directamente esos valores. Ñuño Martínez En el caso que pones no estás considerando las fechas nulas, que siempre deben ignorarse de la lógica de las comparaciones, por lo que ese sistema no me sirve en este caso concreto. Quizá usar result una única vez sea lo mejor (lo tenía así al principio y en su lugar usaba una variable temporal). Mick Igualmente no estás considerando las fechas nulas que darían falsos negativos. Y creo que definitivamente voy a hacer las transformaciones a "TDate" al principio. |
#6
|
||||
|
||||
De todas las respuestas dadas, la que más me gusta es la de Mick, de hecho, yo haría algo así:
Si delphi tiene desactivada la directiva "Complete Boolean evaluation" (por defecto creo que sí en Tools --> enviroment), las comparaciones serían tremendamente efectivas. El punto es usar Result una y otra vez y siempre como primera condición de comparación, si ya es false, Delphi detecta que está unida la comparación con un "and" y no evalúa la condición de la derecha del "and", directamente devuelve falso. Creo que las comparaciones están correctas. Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente, se lo volveré a explicar hasta que no lo entienda, Gracias. Última edición por Lepe fecha: 21-07-2006 a las 10:31:45. |
#7
|
||||
|
||||
Que curioso, acabo de hacer una segunda versión de la función que toma detalles que todos me habéis indicado y que se parece mucho a la tuya Lepe
Esta ya me gusta más, ¡¡MUCHAS GRACIAS A TODOS!! |
#8
|
||||
|
||||
Si... pero en la mia uso variables más descriptivas y me ahorro la Booleana
Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente, se lo volveré a explicar hasta que no lo entienda, Gracias. Última edición por Lepe fecha: 21-07-2006 a las 18:48:44. |
#9
|
|||
|
|||
El codigo que he puesto si tiene en cuenta las fechas nulas.
Precisamente por eso se usa un StrToIntDef con valor por defecto MaxDouble, simplemente esta hecho asi a proposito para ahorrarnos los IFs posteriores. Es decir el uso de MaxDouble en los STrToIntDef hace que no sea necesario poner ningun IF posterior de comprobacion. Porque esos IFS estan implicitos en la comparacion final: Result:= (f1<=f2) and (f2<=f3) and (f3<=f4); Si las fecha es nula el strtointdef da error y devuelve MaxDouble de modo que las comparaciones posteriores dan el resultado correcto (por lo menos el mismo que el codigo inicial que se ha puesto). Saludos |
#10
|
||||
|
||||
Que cosas... entonces "MaxDouble" es una constante definida en alguna unidad, ¿en cual? No la conocía.
|
#11
|
||||
|
||||
Cita:
__________________
delphi.com.ar Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla. |
#12
|
||||
|
||||
Cita:
|
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Optimizar con Case XXX of | TIKIMORE | Varios | 9 | 10-07-2010 17:21:20 |
comparación de fechas | Nelly | Varios | 2 | 27-10-2005 17:30:42 |
Comparación de Fechas | sierraja | Varios | 5 | 19-06-2005 06:56:20 |
Optimizar Vistas | repo | Firebird e Interbase | 1 | 02-03-2005 18:13:43 |
Optimizar Paradox en red | Sick boy | Conexión con bases de datos | 0 | 26-02-2005 13:31:48 |
|