Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Restar un dia a Datetimepicker sin contar fines de semana (https://www.clubdelphi.com/foros/showthread.php?t=77661)

ZiriusB 16-02-2012 15:42:21

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

ecfisa 16-02-2012 16:03:54

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.

ZiriusB 16-02-2012 16:46:16

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

Chris 16-02-2012 17:11:25

Cita:

Empezado por ecfisa (Mensaje 425275)
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!

ecfisa 16-02-2012 17:37:48

Cita:

Empezado por Chris (Mensaje 425285)
Te has comido el sábado amigo :P

Cierto, debe ser por que odio madrugar el sabado... :p:D

Saludos.:)

Delphius 16-02-2012 18:30:15

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,

egostar 16-02-2012 18:46:21

:)

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

Saludos

roman 16-02-2012 19:26:20

¡Ah! pero, cómo gastan líneas :D
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

ZiriusB 16-02-2012 20:25:51

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!

roman 16-02-2012 20:36:53

Yo creo que es un problema que cargas desde alguna línea anterior. A mi me compila sin problemas.

// Saludos

ZiriusB 16-02-2012 20:45:25

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!

roman 16-02-2012 20:47:54

¡Ahí está el problema. No lo coloques dentro del FormCreate.

// Saludos

ZiriusB 16-02-2012 20:53:11

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...

roman 16-02-2012 20:57:21

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

ZiriusB 16-02-2012 21:05:02

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

ecfisa 16-02-2012 21:28:04

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.

Delphius 16-02-2012 22:34:48

Cita:

Empezado por roman (Mensaje 425293)
¡Ah! pero, cómo gastan líneas :D
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 :D
Que ganas de destrozar la autoestima de los otros, ¡porqué no se me ocurrió antes! :p :D

Saludos,

kapcomx 17-02-2012 01:02:34

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...

roman 17-02-2012 01:23:06

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;

:D

// Saludos

Delphius 17-02-2012 01:45:08

Cita:

Empezado por roman (Mensaje 425318)
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;

:D

// Saludos

¿-1-2? :confused:

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

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

Saludos,


La franja horaria es GMT +2. Ahora son las 13:36:38.

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