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 :D . |
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 :p Saludos! |
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:
|
Yo seguramente haria algo como:
Código:
function fechasValidas: Boolean; 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 |
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. |
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 |
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!! |
Si... pero en la mia uso variables más descriptivas y me ahorro la Booleana :p :D
Saludos |
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 |
Que cosas... entonces "MaxDouble" es una constante definida en alguna unidad, ¿en cual? No la conocía.
|
Cita:
|
Cita:
|
La franja horaria es GMT +2. Ahora son las 13:45:10. |
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