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)
Cette contribution était de : http://old.wdforge.org/newbb/viewtopic.php?forum=17&topic_id=5317&post_id=21961