Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   !!!Comparación de Fechas en una aplicación!!! (https://www.clubdelphi.com/foros/showthread.php?t=73218)

Darkseratul 08-04-2011 03:18:57

!!!Comparación de Fechas en una aplicación!!!
 
hola amigos del club, en esta ocasión les escribo por que tengo un tremendo problema pues bien les cuento como esta el enredo

Estoy desarrollando una aplicación con el propósito de que esta avise si se ha atrasado un expediente bueno les explico para que me entiendan a ver si alguien me puede ayudar
el gestor de expedientes que estoy programando va muy bien, ya saben la gestión de la información de la base de datos el problema es el siguiente

la teoría es esta cuando se crea un nuevo expediente - pasa por algunos lugares de la ciudad digamos así

nuevo expediente - (se va ha oficina central) regresa y vuelve ha irse a (centro de en micado) y de nuevo vuelve a irse a (oficina del director)

no son todos los lugares pero así es como va esto

el problema es que los expedientes se atrasan por días y hasta por meses
lo que quiero hacer es que mi aplicación me diga cuando un expediente ya tenga mas de 15 días en algún lugar




tengo unos DBDatePickerEdit donde se pone la fecha de salida del expediente una ves puesto el dato que empiece a contar los 15 días de limite y que cuando pasen los 15 días me lo resalte en un dbgrid parpadeando algo asi



Claro esta que si se pone el dato de entrega pues que ya no cuente

como le hago para calcular días en mi aplicación ??
sobre todo que no importe si se cierra la aplicación

la mera verdad no se como hacerlo no pongo código por que no tengo ni idea ni se de algún componente

se que esta difícil pero es un programa para mi papa ya que puso un negocio y pues no hay dinero como para pagarle a un programador profesional por eso me la quise aventar yo si me pudieran ayudar se los agradecería mucho:):)

y para dejarlo claro mi aplicación esta compuesta de un adoconectec, una adotable y un datasurce la base de datos esta en access 2003 y tiene 7 tablas 3 con mas de 40 campos.

bueno gracias por su tiempo y espero que me puedan ayudar

(para el modelador por favor ayúdame no me pongas cosas como "busca en el foro" o checa estos link de la parte de abajo "ya he buscado por días y nadie a puesto este tipo de pregunta no es por se grasero pero eso no me ayuda gracias por tu tiempo.)

ecfisa 08-04-2011 05:27:05

Hola Darkseratul.

Cita:

(para el modelador por favor ayúdame no me pongas cosas como "busca en el foro" o checa estos link de la parte de abajo "ya he buscado por días y nadie a puesto este tipo de pregunta no es por se grasero pero eso no me ayuda gracias por tu tiempo.)
Acabo de revisar: De los temas comenzados por vos, en todos tuviste una respuesta dirécta y en uno sólo te sugirieron mirar enlaces (y todos estaban relacionados con tu pregunta). Así que no entiendo el por que del pedido...

Si algún moderador o compañero te sugiere que busques en el foro es por que el tema por el que preguntas se ha tratado muchas veces. (Seguramente
con pequeñas variantes sobre las que deberás trabajar un poco). Si encima se toma la molestia de buscar por vos y poner "los links en la parte de abajo", deberías estarle muy agradecido por que aquí tampoco se recibe dinero alguno. ;)

Bueno, ahora a tu pregunta.

Este código te va a poner la linea en rojo con letras blancas, cuando encuentre un registro cuyo campo 'TU_CAMPO' (no pusiste el nombre del campo)
tenga más de 15 días:
Código Delphi [-]
uses DateUtils;

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
  if DaysBetween(Now,DBGrid1.DataSource.DataSet.FieldByName('TU_CAMPO').Value) > 15 then
  begin
    DBGrid1.Canvas.Brush.Color:= clRed;
    DBGrid1.Canvas.Font.Color:= clWhite;
    DBGrid1.DefaultDrawColumnCell(Rect,DataCol,Column,State);
  end;
end;

Si deseas que parpadee, lo podés investigar (pista: TTimer), ahora si te da pereza... ¡ A llamar al programador profesional ! :D

Un saludo. :)

gatosoft 08-04-2011 06:04:42

bueno, amigo, primero que todo, para colorear tu grilla

Código Delphi [-]
procedure Tform1.DBGrid1DrawColumnCell(Sender: TObject;
  const Rect: TRect; DataCol: Integer; Column: TColumn;
  State: TGridDrawState);
begin
if Query1.FieldByName('Diferenciadias').AsInteger >= 15 then //en general, cualquier condición

if Column.FieldName='NombreDelComprador' then // solo vas a olorear una casilla
  if (gdSelected in State) then
      Begin
        DBGrid1.canvas.Brush.Color:=clNavy; //lo que sea
      end
    else
      Begin
        dbGrid1.canvas.Brush.Color :=clMaroon;//lo que sea
        dbGrid1.canvas.Font.Color :=clWhite;//lo que sea
      end;
DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;

Segundo, tu necesidad en general es clara, pero la forma como la expresas no tanto, asi que veamos...

Ahora, para la diferencia de las fechas es relativamente facil, pues las fechas en si, se almacenan como Números reales... (Float, Double)

Asi que si haces Fecha1-Fecha2 tendras un valor numerico, como 15, 16, etc.


Dependiendo del motor de Bd que utilices, pudes tambien hacer la resta en la sentencia SQL..

Código SQL [-]
Select Fecha1-Fecha2 as diferencia from expedientes

espero haberte ayudado...

Con respecto a tu comentario:

Cita:

(para el modelador por favor ayúdame no me pongas cosas como "busca en el foro" o checa estos link de la parte de abajo "ya he buscado por días y nadie a puesto este tipo de pregunta no es por se grasero pero eso no me ayuda gracias por tu tiempo.)
Entiendo que no es grosero y te invito a visitar el siguiente hilo para que participes... http://www.clubdelphi.com/foros/showthread.php?t=73161

Es un poco extenso, pero se propone "bajarle el volumen" a los comentarios de parte y parte... un salduo,

Darkseratul 08-04-2011 06:11:47

Muchas gracias ecfisa
 
Muchas gracias por tu pronta respuesta respuesta pero no entendí muy bien este código me contara los días??

y los campos que tengas mas de los 15 días se resaltaran en rojo ????

Muchas gracias por tu ayuda:D:D:D

gatosoft 08-04-2011 06:21:51

nop, el codigo no te contara los dias...


pero si tienes la fecha en una campo de un datset, puedes hacer algo como:

if (Now() - Query1.FieldByName('FechaEntrega').AsDatetime) >= 15 then
//hacer algo...

es una resta simple contraa la fecha de hoy..

ecfisa 08-04-2011 06:32:51

Cita:

Empezado por Darkseratul (Mensaje 396249)
Muchas gracias por tu pronta respuesta respuesta pero no entendí muy bien este código me contara los días??

y los campos que tengas mas de los 15 días se resaltaran en rojo ????

Muchas gracias por tu ayuda:D:D:D

De nada.

El código tál como te dije te pondrá en rojo aquellos registros (lineas) cuya fecha tenga más de 15 días a la fecha actual.

Del cálculo se encarga la function DaysBetween (unit DateUtils), que devuelve el número de días enteros entre dos valores declarados como TDateTime.

No interpreté que una línea pudiera tener varias columnas en rojo... si fuera así podrías probar el código que puso gatosoft. Por mi parte voy a pensarlo ...

Un saludo. :)

ecfisa 08-04-2011 06:58:59

Hola de nuevo DarkSeratul.

Lo prometido es deuda. Este código pone en rojo sólo aquellas celdas que contengan un TDateTimeField y su valor supere los 15 días a la fecha:

Código Delphi [-]
uses DateUtils;

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
  if (Column.Field is TDateTimeField)and
      (DaysBetween(Now,Column.Field.Value) > 15) then
  begin
     DBGrid1.Canvas.Brush.Color:= clRed;
     DBGrid1.Canvas.Font.Color:= clWhite;
     DBGrid1.DefaultDrawColumnCell(Rect,DataCol,Column,State);
  end;
end;

Un saludo. :)

Darkseratul 08-04-2011 07:19:33

Muchas gracias ecfisa de nuevo
 
Si eres mujer te besaría y si eres hombre te invitaba a una parrilla da con cervezas incluidas

sabes me has dado una parte de la solución a un problemas muy grande que tengo
gracias al dato que mas dado ya tengo idea de como hacer el resto de mi aplicación ya solo falta estructurarlo y aplicar la solución a mas de 40 campos muy bueno espesare ha aplicarme y mañana te comento como me fue y pues muchas gracias ecfisa muchisimas gracias

cuando mi aplicación este lista la subiré al club para compartirla con todos

gracias,gracias,gracias,gracias,gracias,gracias,gracias,gracias,gracias,gracias,
:D:D:D:D:D:D:D:D:D

ecfisa 08-04-2011 07:39:54

Para tu desilusión, me quedo con la parrillada. :D:D:D


Un saludo.:)

Casimiro Notevi 08-04-2011 11:18:58

Cita:

Empezado por ecfisa (Mensaje 396258)
Para tu desilusión, me quedo con la parrillada. :D:D:D
Un saludo.:)

¡¡¡ Aunque le cueste dinero !!! :D

Darkseratul 13-04-2011 17:55:18

gracias a todos por responder le debo una parrilada
 
Gracias :D:D

El código va de perlas pero mmm tengo un detalle con el código de ecfisa

Código Delphi [-]
uses DateUtils;

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
  if (Column.Field is TDateTimeField)and
      (DaysBetween(Now,Column.Field.Value) > 15) then
  begin
     DBGrid1.Canvas.Brush.Color:= clRed;
     DBGrid1.Canvas.Font.Color:= clWhite;
     DBGrid1.DefaultDrawColumnCell(Rect,DataCol,Column,State);
  end;
end;

me da un error cuando unos de los campos(cual sea) esta vació me dice que el campo debe estar lleno como le hago para que los campos que no tengan información(fechas) no los tome en cuenta :confused::confused::confused:

ecfisa 13-04-2011 20:17:56

Hola Darkseratul.

Tenés que agregar una línea al condicional:
Código Delphi [-]
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
  if (Column.Field.AsString > '') and
     (Column.Field is TDateTimeField) and
     (DaysBetween(Now,Column.Field.Value) > 15) then
  begin
     DBGrid1.Canvas.Brush.Color:= clRed;
     DBGrid1.Canvas.Font.Color:= clWhite;
     DBGrid1.DefaultDrawColumnCell(Rect,DataCol,Column,State);
  end;
end;

Un saludo.

Darkseratul 13-04-2011 20:31:45

Muchas pero muchas gracias ecfisa
 
Eres una persona genial lastima que vivas tan lejos sino parranda segura contigo y pues mil gracias tu si que te la sabes de todas :D:D:D

estoy muy agrede sido contigo y con esta maravillosa comunidad

gracias gracias gracias


La franja horaria es GMT +2. Ahora son las 13:30:26.

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