Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 26-06-2012
mantraxer21 mantraxer21 is offline
Miembro
 
Registrado: ago 2010
Posts: 94
Poder: 14
mantraxer21 Va por buen camino
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
Responder Con Cita
  #2  
Antiguo 26-06-2012
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
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.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 26-06-2012 a las 10:38:47. Razón: corregir ortografía
Responder Con Cita
  #3  
Antiguo 26-06-2012
Avatar de ElDioni
[ElDioni] ElDioni is offline
Miembro Premium
 
Registrado: jul 2005
Ubicación: Murcia (España)
Posts: 935
Poder: 19
ElDioni Va por buen camino
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.
__________________
Confórmate con lo que tienes pero anhela lo que te falta.
Responder Con Cita
  #4  
Antiguo 26-06-2012
Avatar de Chris
[Chris] Chris is offline
Miembro Premium
 
Registrado: abr 2007
Ubicación: Jinotepe, Nicaragua
Posts: 1.678
Poder: 19
Chris Va por buen camino
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!
__________________
Perfil Github - @chrramirez - Delphi Blog - Blog Web

Última edición por Chris fecha: 26-06-2012 a las 21:38:49.
Responder Con Cita
  #5  
Antiguo 27-06-2012
Avatar de ElDioni
[ElDioni] ElDioni is offline
Miembro Premium
 
Registrado: jul 2005
Ubicación: Murcia (España)
Posts: 935
Poder: 19
ElDioni Va por buen camino
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.
__________________
Confórmate con lo que tienes pero anhela lo que te falta.
Responder Con Cita
  #6  
Antiguo 27-06-2012
Avatar de Chris
[Chris] Chris is offline
Miembro Premium
 
Registrado: abr 2007
Ubicación: Jinotepe, Nicaragua
Posts: 1.678
Poder: 19
Chris Va por buen camino
Cita:
Empezado por ElDioni Ver Mensaje
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!
__________________
Perfil Github - @chrramirez - Delphi Blog - Blog Web
Responder Con Cita
  #7  
Antiguo 27-06-2012
Avatar de ElDioni
[ElDioni] ElDioni is offline
Miembro Premium
 
Registrado: jul 2005
Ubicación: Murcia (España)
Posts: 935
Poder: 19
ElDioni Va por buen camino
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.
__________________
Confórmate con lo que tienes pero anhela lo que te falta.
Responder Con Cita
  #8  
Antiguo 27-06-2012
Avatar de Chris
[Chris] Chris is offline
Miembro Premium
 
Registrado: abr 2007
Ubicación: Jinotepe, Nicaragua
Posts: 1.678
Poder: 19
Chris Va por buen camino
Cita:
Empezado por ElDioni Ver Mensaje
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í
__________________
Perfil Github - @chrramirez - Delphi Blog - Blog Web
Responder Con Cita
Respuesta



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
ayuda con los Condicionales jose_kira_sk8 Varios 5 09-08-2011 15:22:58
Problema con condicionales encadenados Parabol77 Varios 4 10-02-2011 17:24:00
Se puede hacer consultas SQL condicionales con Firebird David SQL 2 04-04-2008 15:34:54
condicionales en SQL Max_E. SQL 2 31-10-2006 19:28:33
SQL´s con condicionales AMINOA2R Firebird e Interbase 3 02-02-2006 09:33:14


La franja horaria es GMT +2. Ahora son las 23:28:43.


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
Copyright 1996-2007 Club Delphi