François DORIN
Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
Site internet | Profils Viadéo & LinkedIn
---------
Page de cours : fdorin.developpez.com
---------
N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels
Je vais prendre le temps d'analyser ce que vous avez fais, mais je pense que je devrais m'en sortir..
En effet le problème du 23h 05h est un cas particulier je pense que je vais le gérer en deux fois.
En tout cas merci énormément pour vos réponse !!
Tout à fait !
Pour preuve : mon algo est incomplet. Le voici corrigé :
Il manquait le cas où la période recherchée était complètement incluse durant l'intervention (j'ai eu un flash à la piscine ). Du coup, j'en ai profité pour rajouter le support des périodes à cheval sur 2 journées.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55 public static double GetHour(int idUser, string date, string startTime, string endTime) { DateTime period = DateTime.ParseExact(date, "yyyy-MM-dd", null); DateTime start = DateTime.ParseExact(startTime, "H:mm:ss", null); DateTime end = DateTime.ParseExact(endTime, "H:mm:ss", null); double totalHour = 0; foreach (var intervention in InterventionCollection.GetAll(idUser)) { if (intervention.StartDate.Year == period.Year && intervention.StartDate.Month == period.Month && intervention.StartDate.DayOfWeek != DayOfWeek.Sunday) { DateTime startPeriod = new DateTime(intervention.StartDate.Year, intervention.StartDate.Month, intervention.StartDate.Day, start.Hour, start.Minute, start.Second); DateTime endPeriod = new DateTime(intervention.StartDate.Year, intervention.StartDate.Month, intervention.StartDate.Day, end.Hour, end.Minute, end.Second); if (endPeriod < startPeriod) { endPeriod = endPeriod.AddDays(1); } if ((startPeriod <= intervention.StartDate && intervention.StartDate <= endPeriod) || (startPeriod <= intervention.EndDate && intervention.EndDate <= endPeriod) || (intervention.StartDate <= startPeriod && endPeriod <= intervention.EndDate)) { // L'intervention chevauche la plage horaire. Il reste à calculer la plage effective TimeSpan duree; if (startPeriod <= intervention.StartDate) { startPeriod = intervention.StartDate; } if (intervention.EndDate <= endPeriod) { endPeriod = intervention.EndDate; } duree = endPeriod - startPeriod; totalHour += duree.TotalHours; } } } return totalHour; }
Après, pour aller au delà, il faudrait changer la signature de la méthode...
François DORIN
Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
Site internet | Profils Viadéo & LinkedIn
---------
Page de cours : fdorin.developpez.com
---------
N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels
J'ai testé ton script par curiosité, voici quelques anomalies afin que tu puisse le modifier et le rendre viable.
Exception
Exception surIl est vrai que amalliap ne nous as pas donné les séparateurs à utiliser il me semble, pour ma part j'utilise les classiques "/" (ce qui génère l'exception dans ton code).DateTime period = DateTime.ParseExact(date, "yyyy-MM-dd", null);
Cas concret 1 (a cheval sur deux mois) :
J'ai une intervention qui début le "30/06/2016 22:00:00" (jeudi) et qui finit le "01/07/2016 05:00:00" (vendredi).
Je souhaite connaitre pour le mois de Juin les heures travaillés entre "22:00:00" et "04:00:00".
Avec cette appel à ta fonction il me retourne 6 au lieu de 2.
Cas concret 2 (a cheval sur dimanche) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part double h = GetHour(1, "2016-06-30", "22:00:00", "04:00:00"); // h = 6
J'ai une intervention qui début le "30/07/2016 22:00:00" (samedi) et qui finit le "31/07/2016 02:00:00" (dimanche).
Je souhaite connaitre pour le mois de Juillet les heures travaillés entre "20:00:00" et "05:00:00".
Avec cette appel à ta fonction il me ressort 4 au lieu de 2, car 2 heures était présentent le dimanche (à exclure).
Code : Sélectionner tout - Visualiser dans une fenêtre à part double h = GetHour(1, "2016-07-30", "20:00:00", "05:00:00"); // h = 4
J'avais aussi un bug sur les années que j'ai corrigés.
Dans le même principe tu aura un aussi un bug supplémentaire sur des interventions à cheval sur 2 années. Si l'année de EndDate ne fait pas parti de l’année valide (définit par le paramètre 'date').
Les paramètres de type string ce n'est pas top comme même ... trop de risque d'erreur.
Un DateTime pour date, 2 int pour startTime et endTime serais plus fiable et adapté.
Ou mieux 4 int
anné
mois
startHour
endHour
J'en profite pour informer 'amalliap' qu'il y a déjà des bugs déjà citées dans ton script de départ, donc j’espère que vous ne payer pas les heures de vos intervenants à partir de code.
Il l'a fait. Dans son code. Il utilise "-" comme séparateur.
Concernant les remarques sur tes deux cas concrets, c'est tout à fait correct. Tout n'est pas géré. Et il n'a pas la prétention de le faire d'ailleurs. Il avait pour but de montrer une version moins usine à gaz que le code présenté par amalliap. Il n'en fait pas plus, il n'en fait pas moins. Le but n'est pas de faire son travail mais de l'aider.
Tu pars aussi du principe que toute heure faite un dimanche ne doive pas être comptabilisée, même si l'intervention débute le samedi. Si une intervention est à cheval sur deux mois (ou deux années), tu pars du principe qu'il faut la "couper" en deux. Tu pars également du principe que les heures d'interventions sont forcément pleines. Ce n'est pas à toi de faire ces suppositions mais à amalliap d'agir en conséquence en fonction de ses besoins réels.
Remarque pertinente à laquelle j'adhère.Les paramètres de type string ce n'est pas top comme même ... trop de risque d'erreur.
Un DateTime pour date, 2 int pour startTime et endTime serais plus fiable et adapté.
François DORIN
Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
Site internet | Profils Viadéo & LinkedIn
---------
Page de cours : fdorin.developpez.com
---------
N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager