Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Condicionales para las fechas (https://www.clubdelphi.com/foros/showthread.php?t=79327)

mantraxer21 26-06-2012 06:15:35

Condicionales para las fechas
 
Estimados,

Tengo un pequeño dilema con un tema que quiero efectuar,

En una Grid por consulta SQl se realizará una búsqueda de "Productos" de un Sistema Básico de Inventario, y en esta grilla se mostrarán los datos en columnas algo asi...

ID PRODUCTO FAMILIA FECHA VENCIMIENTO
1 Manzana Frutas 28/06/2012
2 Pera Frutas 30/06/2012
3 Plátano Frutas 02/07/2012

Si hoy en mi Base de Datos (Firebird) la fecha es 26/06/2012, necesito COLOREAR LA FILA de distintos colores, ejemplo:

Si la fecha de vencimiento del producto es igual o inferior a 3 días de la fecha actual del sistema, entonces, Color ROJO
Si la fecha de vencimiento del producto es igual o mayor a 4 días de la fecha actual del sistema, entonces, Color NARANJO
Si la fecha de vencimiento del producto es igual o mayor a 5 y menor igual a 8 días de la fecha actual del sistema, entonces, Color VERDE

Trabajo con Firebird SQL

El tema de la consulta de búsqueda ya la tengo, pero quiero condicionar los datos de la GRID según criterio presentado...


Saludos

ecfisa 26-06-2012 10:08:08

Hola mantraxer21.
Cita:

Si la fecha de vencimiento del producto es igual o inferior a 3 días de la fecha actual del sistema, entonces, Color ROJO
Si la fecha de vencimiento del producto es igual o mayor a 4 días de la fecha actual del sistema, entonces, Color NARANJO
Si la fecha de vencimiento del producto es igual o mayor a 5 y menor igual a 8 días de la fecha actual del sistema, entonces, Color VERDE
Creo que la lógica anterior no va a funcionar así como está planteada.

La segunda condición solapa la tercera, es decir, la expresión N > 4 contiene a 5 >= N <= 8.
Otra cosa que noto (no sé si será así el requerimiento), es que en las comparaciones quedan excluídos los dos días anteriores a la fecha actual.

Saludos.

ElDioni 26-06-2012 18:26:11

Hola,
tendrás que poner en el DrawColumnCell del grid las condiciones necesarias para pintar las líneas, pero ojo porque, como te señala ecfisa, las condiciones que comentas se solapan unas a otras. en todo caso te pongo un ejemplo.


Código Delphi [-]
if QueryFrutas.FieldByName('Vencimiento').AsDateTime<=date then
  begin
    if DaysBetween(QueryFrutas.FieldByName('Vencimiento').AsDateTime,date)<4 then
      begin
        DBGridFrutas.Canvas.Brush.Color:=clred;
      end
    else
      begin
        if daysbetween(QueryFrutas.FieldByName('Vencimiento').AsDateTime,date)=4 then
          begin
            DbGridFrutas.Canvas.Brush.Color:=ClOrange;
          end
        else
          begin
            DbGridFrutas.Canvas.Brush.color:=ClGreen;
          end;
      end;
  end;

Saludos.

Chris 26-06-2012 21:25:38

En el evento OnDrawColumnCell, agrega el siguiente código:
Código Delphi [-]
var
    BkColor: TColor;
    days_to_void: Integer; // Días para vencimiento
begin
    BkColor := TDBGrid(Sender).Canvas.Brush.Color;
    DBetween := DaysBetween(Query.FieldByName('vencimiento').Value, Now());
    
    case days_to_void of
        0..3: BkColor := clRed;
           4: BkColor := clOrange;
        5..8: BkColor := clGreen;
        else
            BkColor := iif(days_to_void < 0, clRed, BkColor);
    end;
    
    TDBGrid(Sender).Canvas.Brush.Color := BkColor;
end;

Para utilizar el código anterior, necesitas agregar a tus USES la unidad DateUtils. Además, ten en cuenta que utilizo una función llamada iif. Realmente esta función no existe. Su declaración sería:
Código Delphi [-]
function iif(TestValue: Boolean, ATrue: Variant; AFalse: Variant): Variant; inline;
begin
    if TestValue then
        result := ATrue
    else
        result := AFalse;
end;

Saludos!

ElDioni 27-06-2012 09:52:24

Hola Chris,

donde pones DBetween en realidad debería poner days_to_void, ¿verdad?, y otra cosa, si la fecha de vencimiento fuera 5 días después de la actual te volvería a pintar la fila en verde, o me equivoco, creo que no llego a comprender para que sirve la función iff.

Saludos.

Chris 27-06-2012 16:10:00

Cita:

Empezado por ElDioni (Mensaje 436100)
Hola Chris,

donde pones DBetween en realidad debería poner days_to_void, ¿verdad?, y otra cosa, si la fecha de vencimiento fuera 5 días después de la actual te volvería a pintar la fila en verde, o me equivoco, creo que no llego a comprender para que sirve la función iff.

Saludos.

En realidad sí. Es que luego que puse el código, cambié el nombre de la variable. Olvidé esa línea. Gracias por la observación.

Si la fecha fuera 5 días después de hoy, la fila se pintaría en rojo. Es de ahí la última condición "days_to_void < 0".

La función iif es una función común en algunos lenguajes o entornos. Lástima que Delphi no la incluye -hasta dónde sé-. La función iif es cómo cualquier otra función. Es una función que se utiliza para ahorra líneas de código y hacer el código más leíble. Tienes que declararla en cualquier lugar de tu aplicación. El último código que puse sería su "source code".

Lo que aún si no estoy claro es en el orden de los parámetros de la función DaysBetween. Si hay cualquier problema, la solución sería intercambiar los parámetros Query.FieldByName(...) y Now().

Saludos!

ElDioni 27-06-2012 17:53:32

Hola,
yo es que creo que en la función de DaysBetween da igual el orden de las fechas, siempre te marca la diferencia de días entre una y otra, aunque la primera fecha se superior a la segunda.

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
fecha1,fecha2:TDate;
begin
fecha1:=Now;
fecha2:=now+10;
ShowMessage(IntToStr(daysbetween(fecha1,fecha2)));//muestra 10
ShowMessage(IntToStr(daysbetween(fecha2,fecha1)));//muestra 10
end;

Saludos.

Chris 27-06-2012 18:03:01

Cita:

Empezado por ElDioni (Mensaje 436140)
Hola,
yo es que creo que en la función de DaysBetween da igual el orden de las fechas, siempre te marca la diferencia de días entre una y otra, aunque la primera fecha se superior a la segunda.

Tienes razón! Que tonto soy :P

Creo que ya llevar unos meses fuera de Delphi está empezando a hacer efecto en mí :p


La franja horaria es GMT +2. Ahora son las 18:59:50.

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