Probleme de date !!!

Signaler
Messages postés
113
Date d'inscription
mercredi 29 novembre 2000
Statut
Membre
Dernière intervention
16 avril 2006
-
Messages postés
113
Date d'inscription
mercredi 29 novembre 2000
Statut
Membre
Dernière intervention
16 avril 2006
-
Salut a tous,


j'ai une appli qui permet de calculer entre 2 dates le nombre de jours entiers et le nombre de jours sans les week end. Mais je n'arrive pas a corriger les bug en rapport avec les week end, dans le calcul de ExcludeWe et dans le test if DFrom = DTo then
if (DayOfTheWeek(dfrom)=6)or(DayOfTheWeek(dfrom)=7) then.
Voici la procedur de calcul, en rouge, la ou je pense qu'il y a des problemes. Aidez moi a les résoudre,merci

procedure AllDaysBetweenProc(out DaysCount : integer;
const DFrom,DTo : TDateTime; const ExcludeWE : boolean = false);
var DMin,DMax : TDateTime; WS : integer;
begin
if DFrom = DTo then
if (DayOfTheWeek(dfrom)=6)or(DayOfTheWeek(dfrom)=7) then
begin
DaysCount:=0;
exit;
end
else
begin
DaysCount := 1;
exit;
end;
DMin := DateOf(Min(DFrom,DTo));
DMax := DateOf(Max(DFrom,DTo));
DaysCount := trunc(DaySpan(DMin,DMax))+1;
if ExcludeWe then
begin
WS := trunc(WeekSpan(DMin,DMax)*2);
if DaysCount < 7 then
Dec(WS,1);
if WS > 0 then
Dec(DaysCount,WS+1);
end;
end;

4 réponses

Messages postés
3826
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
10 mai 2021
46
Salut,
essaye comme ceci cette procedure calcule le nombre de jour entier entre deux date :

Procedure AllDaysBetweenProc(Out DaysCount: integer;
Const DFrom, DTo: TDateTime; Const ExcludeWE: boolean = false);
Var DMin, DMax : TDateTime; WS: integer;
Begin
DMin : = DateOf(Min(DFrom, DTo));
DMax := DateOf(Max(DFrom, DTo));
DaysCount := DaysBetween(DMin, DMax);
If ExcludeWe Then
Begin
WS : = WeeksBetween(DMin, DMax);
If WS > 0 Then
Dec(DaysCount, WS * 2);
End;
End;



@+
Cirec
Messages postés
113
Date d'inscription
mercredi 29 novembre 2000
Statut
Membre
Dernière intervention
16 avril 2006

Voici la version finale, bien plus simple, et aucun bug, elle est parfaite

procedure Tfrm_principal.bt_calculerClick(Sender: TObject);
var i : integer;
j : integer;
jour : string;
begin
i := 0;
j := 0;


date3.DateTime := date1.DateTime;
date4.DateTime := IncDay(date2.DateTime, 1);
if date1.DateTime>date2.DateTime then
begin
gb_resultat.Visible := false;
MessageDlg('La date de début doit être inférieure à la date de fin !',
mterror,[mbOk],0);
end
else
Repeat
jour := FormatDateTime('dddd',date3.DateTime);
label5.Caption := jour; if (jour 'samedi') OR (jour 'dimanche') Then
begin
j := j+1;
date3.DateTime := IncDay(date3.DateTime, 1);
end
else
begin
i := i+1;
date3.DateTime := IncDay(date3.DateTime, 1);
end;


Until CompareDate(date3.DateTime,date4.DateTime) = 0;


gb_resultat.Visible:=true;
lbl_resultat5.Caption := inttostr(i);
lbl_resultatwe.Caption := inttostr(j);
lbl_resultat7.Caption := inttostr(i+j);


end;
Messages postés
3826
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
10 mai 2021
46
salut,
as-tu au moins essayé celle que je t'ai proposé parce que pour être simple elle est simple et fonctionnelle alors que celle que tu proposes on ne peut même pas l'essayé puisqu'elle dépend de x composants n'oublie pas que les reponses donnée sur le forum peuvent servir à d'autre. Ta devise serait plutôt pouquoi faire simple quand on peut faire compliqué

@+
Cirec
Messages postés
113
Date d'inscription
mercredi 29 novembre 2000
Statut
Membre
Dernière intervention
16 avril 2006

Salut,
j'ai essayé ta solution, mais a chaque fois que j'utilisai une otre procédure, je n'obtenez pas le résultat voulu. Je ne comprenez d'ailleur pas pourquoi dans mon cas cela ne fonctionnai pas correctement.
La solution que j'ai donner marche parfaitement chez moi, meme si elle est plus longue, et je pense qu'elle peut encore etre optimisée, mais elle n'est pas plus compliquée!
@++