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 16-02-2012
ZiriusB ZiriusB is offline
Miembro
 
Registrado: oct 2010
Posts: 86
Poder: 14
ZiriusB Va por buen camino
Question Restar un dia a Datetimepicker sin contar fines de semana

Buenas amigos, tengo el siguiente problema...

Necesito que en un Datatimepicker se muestre el dia anterior al actual,


Código Delphi [-]
procedure TForm7.FormActivate(Sender: TObject);
Var
midate:TDate;
begin
midate:=now-1;
HFecha.DateTime:= midate;
end;

Hfecha es el Datetimepicker, todo bien, me coloca el dia anterior pero el problema es que solo quiero que me coloque los dias laborables (Lunes a Viernes) cuando llega el dia del lunes el Datetimepicker me muestra el dia Domingo, pero yo quiero que me muestre el dia Viernes que es el ultimo dia laborable!

¿Tienen alguna sugerencia?, Añado que el control se carga solo, no es un valor tomado de una base de datos ni algo por el estilo!

Saludos
__________________
"Ningun precio es alto por el privilegio de ser uno mismo..."
Responder Con Cita
  #2  
Antiguo 16-02-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 ZiriusB.

Según entiendo el problema lo vas a tener los días lunes y domingo, en el primer caso tenes que restar 3 a la fecha y en el segundo 2 ya que en ambos el último día laboral anterior es viernes, en los casos restantes restar 1:
Código Delphi [-]
...
implementation 

uses DateUtils;

function LaboralAnterior(ADate: TDate): TDate;
begin
  case DayOfTheWeek(ADate) of
    DayMonday: ADate:= ADate-3;
    DaySunday: ADate:= ADate-2;
    else
     ADate:= ADate-1;
  end;
  Result:= ADate;
end;

Ejemplo de llamada:
Código Delphi [-]
begin
  DateTimePicker1.Date:= LaboralAnterior(StrToDate('20/02/2012'));
end;

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #3  
Antiguo 16-02-2012
ZiriusB ZiriusB is offline
Miembro
 
Registrado: oct 2010
Posts: 86
Poder: 14
ZiriusB Va por buen camino
Wink

La verdad solo serian los Lunes, porque cuando llegue el dia Lunes el Datetimepicker me colocaria el dia anterior osea DOMINGO, ya de ahi no tendria problema!

Probare esto, gracias amigo
__________________
"Ningun precio es alto por el privilegio de ser uno mismo..."
Responder Con Cita
  #4  
Antiguo 16-02-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 ecfisa Ver Mensaje
Según entiendo el problema lo vas a tener los días lunes y domingo
Te has comido el sábado amigo :P

Esta es mi alternativa:
Código Delphi [-]
function LaboralAnterior(ADate: TDate): TDate;
begin
    Result := IncDay(ADate, -1);
    
    case DayOfTheWeek(Result) of
        DaySunday  : Result := IncDay(Result, -2);
        DaySaturday: Result := IncDay(Result, -1);
    end;
end;

Saludos!
__________________
Perfil Github - @chrramirez - Delphi Blog - Blog Web

Última edición por Chris fecha: 16-02-2012 a las 17:16:20.
Responder Con Cita
  #5  
Antiguo 16-02-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
Cita:
Empezado por Chris Ver Mensaje
Te has comido el sábado amigo :P
Cierto, debe ser por que odio madrugar el sabado...

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #6  
Antiguo 16-02-2012
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Chris, ecfisa sus códigos se pueden mejorar.
Dentro del case simplemente establezco los días a restar, y directamente hago la operación afuera. Después de todo es una expresión común a todos los casos y puede estar fuera del case. Es como sacar factor común en una expresión matemática

Código Delphi [-]
case  DayOfTheWeek(ADate) of
DayMonday: Dec := -3;
DaySunday: Dec := -2;
..
end; // fin case
result := IncDay(Date, Dec);

A mi parecer es un código más legible.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #7  
Antiguo 16-02-2012
[egostar] egostar is offline
Registrado
 
Registrado: feb 2006
Posts: 6.557
Poder: 25
egostar Va camino a la fama


Código Delphi [-]
case  DayOfTheWeek(ADate) of
DayMonday: Decremento := -3;
DaySunday: Decremento := -2;
..
end; // fin case
result := IncDay(Date, Decremento);

Saludos
Responder Con Cita
  #8  
Antiguo 16-02-2012
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
¡Ah! pero, cómo gastan líneas
Código Delphi [-]
function LaboralAnterior(ADate: TDate): TDate;
const
  Dias: array[1..7] of Integer = (3, 1, 1, 1, 1, 1, 2);

begin
  Result := ADate - Dias[DayOfTheWeek(ADate)];
end;

Por cierto:

Cita:
Empezado por Chris
Te has comido el sábado amigo :P
No se lo ha comido, el sábado no representa ningún problema ya que el día inmediato anterior es laboral.

// Saludos
Responder Con Cita
  #9  
Antiguo 16-02-2012
ZiriusB ZiriusB is offline
Miembro
 
Registrado: oct 2010
Posts: 86
Poder: 14
ZiriusB Va por buen camino
Saludos ROMAN gracias por responder

me suelta este error el ejemplo que tu me diste

[DCC Error] PaseHoras.pas(154): E2066 Missing operator or semicolon


Código Delphi [-]
//begin
//midate:=now-1;
function LaboralAnterior(ADate: TDate): TDate;
const
  Dias: array[1..7] of Integer = (3, 1, 1, 1, 1, 1, 2);

begin
  Result:= ADate - Dias[DayOfTheWeek(ADate)];
end;

Me lo señala en esta linea
Código Delphi [-]
  Result:= ADate - Dias[DayOfTheWeek(ADate)];

pero no veo que falte algun parentesis o corchete!
__________________
"Ningun precio es alto por el privilegio de ser uno mismo..."
Responder Con Cita
  #10  
Antiguo 16-02-2012
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Yo creo que es un problema que cargas desde alguna línea anterior. A mi me compila sin problemas.

// Saludos
Responder Con Cita
  #11  
Antiguo 16-02-2012
ZiriusB ZiriusB is offline
Miembro
 
Registrado: oct 2010
Posts: 86
Poder: 14
ZiriusB Va por buen camino
Código Delphi [-]
procedure TForm7.FormCreate(Sender: TObject);
//begin
//midate:=now-1;
function LaboralAnterior(ADate: TDate): TDate;
const
  Dias: array[1..7] of Integer = (3, 1, 1, 1, 1, 1, 2);

begin
  Result:= ADate - Dias[DayOfTheWeek(ADate)];
end;

esta colocado en el Formcreate... no hay lineas antes de esas, de todas formas revisare a fondo!
__________________
"Ningun precio es alto por el privilegio de ser uno mismo..."
Responder Con Cita
  #12  
Antiguo 16-02-2012
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
¡Ahí está el problema. No lo coloques dentro del FormCreate.

// Saludos
Responder Con Cita
  #13  
Antiguo 16-02-2012
ZiriusB ZiriusB is offline
Miembro
 
Registrado: oct 2010
Posts: 86
Poder: 14
ZiriusB Va por buen camino
En el Formactivate tambien me da el mismo error, la cuestion es que al abrir al formulario debe mostrarme de una vez el dia anterior...
__________________
"Ningun precio es alto por el privilegio de ser uno mismo..."
Responder Con Cita
  #14  
Antiguo 16-02-2012
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
A ver, se trata de una función suelta, no es para que la pongas dentro de ningún evento. Tal función la usarías en el momento que desees:

Código Delphi [-]
implementation

uses Date Utils;

function LaboralAnterior(ADate: TDate): TDate;
const
  Dias: array[1..7] of Integer = (3, 1, 1, 1, 1, 1, 2);

begin
  Result:= ADate - Dias[DayOfTheWeek(ADate)];
end;

procedure TForm7.FormCreate(Sender: TObject);
begin
  ...
end;

procedure TForm7.FormActivate(Sender: TObject);
begin
  HFecha.DateTime := LaboralAnterior(Now);
end;

// Saludos
Responder Con Cita
  #15  
Antiguo 16-02-2012
ZiriusB ZiriusB is offline
Miembro
 
Registrado: oct 2010
Posts: 86
Poder: 14
ZiriusB Va por buen camino
Me da exactamente el mismo error...lo estoy colocando justo como me dices pero me salta el error que comente arriba...

Código Delphi [-]
Result:= ADate - Dias[DayOfTheWeek(ADate)];

ERROR: [DCC Error] PaseHoras.pas(105): E2066 Missing operator or semicolon

justo en esa linea, pense que me faltaba algun parentesis o cerrar con ; pero lo copie tal cual como lo pasaste para ver! es decir esa linea pues
__________________
"Ningun precio es alto por el privilegio de ser uno mismo..."
Responder Con Cita
  #16  
Antiguo 16-02-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.

A mi no me dá error ni siquiera en el evento OnCreate...

Código Delphi [-]
implementation

uses DateUtils;

function LaboralAnterior(ADate: TDate): TDate;
const
  Dias: array[1..7] of Integer = (3, 1, 1, 1, 1, 1, 2);
begin
  Result:= ADate - Dias[DayOfTheWeek(ADate)];
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
   DateTimePicker1.Date:=  LaboralAnterior(Now);
end;
Este código funciona correctamente.

Por otro lado el error : Missing operator or semicolon, se produce por que falta un operador entre dos expresiones o por que falta un punto y coma entre dos sentencias.

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #17  
Antiguo 16-02-2012
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Cita:
Empezado por roman Ver Mensaje
¡Ah! pero, cómo gastan líneas
Código Delphi [-]
function LaboralAnterior(ADate: TDate): TDate;
const
  Dias: array[1..7] of Integer = (3, 1, 1, 1, 1, 1, 2);

begin
  Result := ADate - Dias[DayOfTheWeek(ADate)];
end;
Lo siento pero el profe ya no acepta trabajos después de clase
Que ganas de destrozar la autoestima de los otros, ¡porqué no se me ocurrió antes!

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #18  
Antiguo 17-02-2012
Avatar de kapcomx
kapcomx kapcomx is offline
Miembro
 
Registrado: jun 2007
Ubicación: Puebla México
Posts: 350
Poder: 17
kapcomx Va por buen camino
desde otro form

interesante funcion esa.

oye ZiriusB y si la ejecutas desde el formulario donde mandas a llamar el formulario que contiene ese datetimepicker.

algo asi como

Código Delphi [-]
 
formx.HFecha.DateTime := LaboralAnterior(Now);
formx.show;

saludos...
Responder Con Cita
  #19  
Antiguo 17-02-2012
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Y bueno, si les parecen muchas líneas, también podemos hacer así la función:

Código Delphi [-]
function LaboralAnterior(ADate: TDate): TDate;
begin
    Result := IncDay(ADate, -1-2*Integer(DayOfTheWeek(ADate) = 1)-Integer(DayOfTheWeek(ADate) = 7));
end;



// Saludos
Responder Con Cita
  #20  
Antiguo 17-02-2012
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Cita:
Empezado por roman Ver Mensaje
Y bueno, si les parecen muchas líneas, también podemos hacer así la función:

Código Delphi [-]
function LaboralAnterior(ADate: TDate): TDate;
begin
    Result := IncDay(ADate, -1-2*Integer(DayOfTheWeek(ADate) = 1)-Integer(DayOfTheWeek(ADate) = 7));
end;



// Saludos
¿-1-2?

Lo tuyo ya es de presumido Te voy a acusar con el profe porque nos estás haciendo quedar mal

Yo me quedo con el case, definir el decremento y calcular.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
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
La semana del DBA roman Noticias 5 18-02-2010 19:49:33
restar/sumar 3 meses a un datetimepicker Milperrimo Varios 3 17-11-2007 00:50:16
Dia de la semana lokodelphi Varios 5 18-05-2006 22:46:32
La semana del Cu... jhonny Humor 0 23-12-2003 17:55:53
Contar dias de la semana entre fechas lolobs Varios 1 04-09-2003 16:11:24


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


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