Message de rapport:
 

Cumul des heures pour calculer Date fin

Sujet: Cumul des heures pour calculer Date fin
par McLéonce sur 7/8/2007 12:44:36

Bonjour,

Je voudrais calculer la date et l'heure fin en cumulant les heures des équipes à partir d'une date et heure début.

J'ai une table EQUIPE qui contient les équipes avec les horaires respectifs.
Exemple : E1 : 13:00 - 20:00
E2 : 22:00 - 05:00

L'User doit pouvoir choisir à quelle veut il commencer le travail. Pour ce faire, le programme doit vérifier si l'heure est conforme aux bornes des équipes et déterminer quelle est l'équipe débutante.

Soit le scénario suivant :

Date début : 07/08/07 23:00
Nombre d'heures à travailler : 30 h

Logiquement, le programme doit retourner la planification suivante :

Intervalle planifié : 07/08/07 23:00 - 10/08/07 01:00

J'ai écris ce code pour ce faire mais la solution idéale pour tous les cas n'est pas encore au rendez-vous.

Quelqu'un peut-il m'éclairer ?

Voici mon code. Ayant un peu de patience car il est volumineux :


wHeureDernièreEquipe est une Heure
wHDE1,wHFE1,wHDE2,wHFE2,wHDE3,wHFE3 sont des Heures //HeureDeb & HeureFin des équipes E1,E2 & E3
wEquipeDébutante est une chaîne = "" //Quelle équipe va débuter la fabrication ? Ceci est connu en fonction de l'heure saisie par l'utilisateur
wEstInterne est un booléen //Pour voir si l'heure saisie par l'User est à l'intérieur des intervalles d'heures des équipes
wNbEquipe est un entier = 0 //On a combien d'équipe pour cette Machine ?


//Détermination du nombre d'équipe et de l'équipe débutante
CléParcours = HFiltreIdentique(MACHINE,PK_MACHINE,g_Societe_defaut,g_ent_defaut,P_CodMach)
HLitPremier(MACHINE,CléParcours)
SI HTrouve() ALORS
	//1ère équipe
	SI MACHINE.HEURDEB1 <> "" ALORS
		wEstInterne = VerifBorneHeureOK(MACHINE.HEURDEB1,MACHINE.HEURFIN1,P_HeureDeb)
		SI wEstInterne = Vrai ALORS
			wEquipeDébutante = "E1"
		FIN
		wHDE1..Heure = Gauche(MACHINE.HEURDEB1,2)
		wHDE1..Minute = Milieu(MACHINE.HEURDEB1,3,2)
		wHFE1..Heure = Gauche(MACHINE.HEURFIN1,2)
		wHFE1..Minute = Milieu(MACHINE.HEURFIN1,3,2)
		wHeureDernièreEquipe = wHFE1
		wNbEquipe++
	FIN
	//2ème équipe
	SI MACHINE.HEURDEB2 <> "" ALORS
		wEstInterne = VerifBorneHeureOK(MACHINE.HEURDEB2,MACHINE.HEURFIN2,P_HeureDeb)
		SI wEstInterne = Vrai ALORS
			wEquipeDébutante = "E2"
		FIN
		wHDE2..Heure = Gauche(MACHINE.HEURDEB2,2)
		wHDE2..Minute = Milieu(MACHINE.HEURDEB2,3,2)
		wHFE2..Heure = Gauche(MACHINE.HEURFIN2,2)
		wHFE2..Minute = Milieu(MACHINE.HEURFIN2,3,2)
		wHeureDernièreEquipe = wHFE2
		wNbEquipe++
	FIN
	//3ème équipe
	SI MACHINE.HEURDEB3 <> "" ALORS
		wEstInterne = VerifBorneHeureOK(MACHINE.HEURDEB3,MACHINE.HEURFIN3,P_HeureDeb)
		SI wEstInterne = Vrai ALORS
			wEquipeDébutante = "E3"
		FIN
		wHDE3..Heure = Gauche(MACHINE.HEURDEB3,2)
		wHDE3..Minute = Milieu(MACHINE.HEURDEB3,3,2)
		wHFE3..Heure = Gauche(MACHINE.HEURFIN3,2)
		wHFE3..Minute = Milieu(MACHINE.HEURFIN3,3,2)
		wHeureDernièreEquipe = wHFE3
		wNbEquipe++
	FIN
FIN
HDésactiveFiltre(MACHINE)

wRenvoyer = DébuterPar(wEquipeDébutante,wNbEquipe,NbreMinutes,P_DateDeb,P_HeureDeb,...
						wHDE1,wHFE1,wHDE2,wHFE2,wHDE3,wHFE3,wHeureDernièreEquipe)

RENVOYER(wRenvoyer)





//Procédure DébuterPar

PROCEDURE DébuterPar(P_EquipeDeb,P_NbEquipe,P_NbTotMin,P_DateDeb,P_HeureDeb,P_HDE1,...
									P_HFE1,P_HDE2,P_HFE2,P_HDE3,P_HFE3,P_HeureDernièreEquipe)

wNbreTotMin est un numérique
wRésultat,wTourEquipe sont des chaînes //wTourEquipe permet de dire c'est le tour de quelle équipe ?
wDateFin est une Date
wHeureDeb,wHeureFin,wDernièreBorneHF,wHeureDernièreEquipe sont des Heures
wHDE1,wHFE1,wHDE2,wHFE2,wHDE3,wHFE3 sont des Heures //HeureDeb & HeureFin des équipe E1,E2 & E3
wDiffMin est un entier = 0 //Nombre de Minutes entre une DateDeb et une DateFin
wPartirHeureDeb est un booléen = Vrai
wNbEquipe est un entier = P_NbEquipe

//Initialisations
wNbreTotMin = P_NbTotMin
wDateFin = P_DateDeb
wHeureDeb = P_HeureDeb
wHDE1 = P_HDE1
wHFE1 = P_HFE1
wHDE2 = P_HDE2
wHFE2 = P_HFE2
wHDE3 = P_HDE3
wHFE3 = P_HFE3
wHeureDernièreEquipe = P_HeureDernièreEquipe


SELON P_EquipeDeb
	CAS "E1"
		wDiffMin = DiffHeureEnMinutes(wHeureDeb,wHFE1)
		wDernièreBorneHF..Heure = Gauche(wHFE1,2)
		wDernièreBorneHF..Minute = Milieu(wHFE1,3,2)
	CAS "E2"
		wDiffMin = DiffHeureEnMinutes(wHeureDeb,wHFE2)
		wDernièreBorneHF..Heure = Gauche(wHFE2,2)
		wDernièreBorneHF..Minute = Milieu(wHFE2,3,2)
	CAS "E3"
		wDiffMin = DiffHeureEnMinutes(wHeureDeb,wHFE3)
		wDernièreBorneHF..Heure = Gauche(wHFE3,2)
		wDernièreBorneHF..Minute = Milieu(wHFE3,3,2)		
FIN

//On soustrait l'intervalle "Date saisie par l'User jusqu'à Borne HeureFin Equipe" du nombre Totale Min
SI wNbreTotMin >= wDiffMin ALORS
	wPartirHeureDeb = Faux
	wNbreTotMin-= wDiffMin
	wDiffMin = 0 //Réinitialisation
	//Prendre à présent tout l'intervalle "HeureDeb jusqu'à HeureFin" de l'équipe
	//puis déterminer à quelle équipe le Tour ?
	SELON P_NbEquipe
		CAS 1
			wDiffMin = DiffHeureEnMinutes(wHDE1,wHFE1)
			wTourEquipe = "ME"
			//*************************
			//Incrémenter la DateFin car c'est sa différence qu'on vient de soustraire ci-haut
			SI wNbreTotMin > 0 ALORS
				wDateFin..Jour++
			FIN
			//*************************
		CAS 2
			SI P_EquipeDeb = "E1" ALORS
				wDiffMin = DiffHeureEnMinutes(wHDE2,wHFE2)
				wTourEquipe = "E1"
			SINON
				wDiffMin = DiffHeureEnMinutes(wHDE1,wHFE1)
				wTourEquipe = "E2"
				//*************************
				//Incrémenter la DateFin car la boucle n'incrémente que sur E1
				SI wNbreTotMin > 0 ALORS
					wDateFin..Jour++
				FIN
				//*************************
			FIN
		CAS 3
			SI P_EquipeDeb = "E1" ALORS
				wDiffMin = DiffHeureEnMinutes(wHDE2,wHFE2)
				wTourEquipe = "E3"
			SINON
				SI P_EquipeDeb = "E2" ALORS
					wDiffMin = DiffHeureEnMinutes(wHDE3,wHFE3)
					wTourEquipe = "E1"
				SINON
					wDiffMin = DiffHeureEnMinutes(wHDE1,wHFE1)
					wTourEquipe = "E2"
					//*************************
					//Incrémenter la DateFin car la boucle n'incrémente que sur E1
					SI wNbreTotMin > 0 ALORS
						wDateFin..Jour++
					FIN
					//*************************
				FIN
			FIN
	FIN
FIN

TANTQUE wNbreTotMin >= wDiffMin
	wNbreTotMin-= wDiffMin
	SELON wTourEquipe
		CAS "ME"
			SI wNbreTotMin > 0 ALORS
				wDateFin..Jour++
			FIN
			wDiffMin = DiffHeureEnMinutes(wHDE1,wHFE1)
			wTourEquipe = "ME"
			wDernièreBorneHF..Heure = Gauche(wHFE1,2)
			wDernièreBorneHF..Minute = Milieu(wHFE1,3,2)
		CAS "E1" 
			//Que ce soit 2 ou 3 équipes, on passe toujours de la 1ère à la 2ème équipe
			//On incrémenter car on recycle
			SI wNbreTotMin > 0 ALORS
				wDateFin..Jour++
			FIN
			wDiffMin = DiffHeureEnMinutes(wHDE1,wHFE1)
			wTourEquipe = "E2"
			//Mais la dernière borne HeureFin varie en fonction du nombre d'équipe
			SI P_NbEquipe = 2 ALORS
				wDernièreBorneHF..Heure = Gauche(wHFE2,2)
				wDernièreBorneHF..Minute = Milieu(wHFE2,3,2)
			SINON //3 équipes
				wDernièreBorneHF..Heure = Gauche(wHFE3,2)
				wDernièreBorneHF..Minute = Milieu(wHFE3,3,2)
			FIN
		CAS "E2"
			wDiffMin = DiffHeureEnMinutes(wHDE2,wHFE2)
			//On a ici une seule dernière borne HeureFin : celle de l'équipe E1
			wDernièreBorneHF..Heure = Gauche(wHFE1,2)
			wDernièreBorneHF..Minute = Milieu(wHFE1,3,2)
			//Mais 2 cas se posent pour l'équipe suivante : on peut avoir 2 ou 3 équipes
			SI P_NbEquipe = 2 ALORS
				wTourEquipe = "E1"
			SINON //3 équipes
				wTourEquipe = "E3"
			FIN
		CAS "E3"
			//On a ici 3 équipes ==>> On boucle alors pour revenir à la 1ère équipe
			wDiffMin = DiffHeureEnMinutes(wHDE3,wHFE3)
			wTourEquipe = "E1"
			wDernièreBorneHF..Heure = Gauche(wHFE2,2)
			wDernièreBorneHF..Minute = Milieu(wHFE2,3,2)
	FIN
FIN

SI wPartirHeureDeb = Faux ALORS
	SI wNbreTotMin = 0 ALORS
		wHeureFin = wDernièreBorneHF
	SINON //wNbreTotMin > 0
		SELON wTourEquipe
			CAS "ME"
				//Le temps restant sera compté à partir de l'HeureDeb de l'équipe 1
				wHeureFin = wHDE1
				wHeureFin..Heure+= PartieEntière(wNbreTotMin / 60)
				wHeureFin..Minute+= modulo(wNbreTotMin,60)
			CAS "E1"
				SI P_NbEquipe = 2 ALORS
					//Le temps restant sera compté à partir de l'HeureDeb de l'équipe 2
					wHeureFin = wHDE2
					wHeureFin..Heure+= PartieEntière(wNbreTotMin / 60)
					wHeureFin..Minute+= modulo(wNbreTotMin,60)
				SINON // 3 équipes
					//Le temps restant sera compté à partir de l'HeureDeb de l'équipe 3
					wHeureFin = wHDE3
					wHeureFin..Heure+= PartieEntière(wNbreTotMin / 60)
					wHeureFin..Minute+= modulo(wNbreTotMin,60)
				FIN
			CAS "E2"
				//Indépendant du nombre d'équipe si c'est le tour de l'équipe E2
				//car on vient toujours de l'équipe E1
				//Le temps restant sera compté à partir de l'HeureDeb de l'équipe 1
				wHeureFin = wHDE1
				wHeureFin..Heure+= PartieEntière(wNbreTotMin / 60)
				wHeureFin..Minute+= modulo(wNbreTotMin,60)
			CAS "E3"
				//On est forcément en présence de 3 équipes
				//et on ne peut provenir que de l'équipe E2
				//Le temps restant sera compté à partir de l'HeureDeb de l'équipe 2
				wHeureFin = wHDE2
				wHeureFin..Heure+= PartieEntière(wNbreTotMin / 60)
				wHeureFin..Minute+= modulo(wNbreTotMin,60)
		FIN
	FIN
SINON
	wHeureFin = wHeureDeb
	wHeureFin..Heure+= PartieEntière(wNbreTotMin / 60)
	wHeureFin..Minute+= modulo(wNbreTotMin,60)
FIN

//Exécution de la requête SQL pour obtenir le nombre de jours fériés
HExécuteRequête(ReqJourFerie,hRequêteDéfaut,g_Societe_defaut,g_ent_defaut,P_DateDeb,wDateFin)
HLitPremier(ReqJourFerie)
SI HNbEnr(ReqJourFerie) > 0 ALORS //Il existe des jours fériés entre Date début et date fin
	wDateFin..Jour+= HNbEnr(ReqJourFerie) //La date fin doit inclure ces jours fériés
FIN

wRésultat = wDateFin + TAB + wHeureFin
RENVOYER(wRésultat)

Connexion
Menu
Chercher WDForge
Chercher Web
Partenaires
Visualiser tous les Partenaires...
WinDev, WebDev, WinDev Mobile et HyperFile sont des marques déposées par PCSoft. |  Voter |  Legal |  Contact |   XOOPS 2.0.13.2