[RESOLU] SOS sur Dates

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
omega
Messages : 617
Inscription : sam. 26/nov./2011 13:04
Localisation : Alger

[RESOLU] SOS sur Dates

Message par omega »

Bonsoir à tous

J'ai beau essayé, mais je n'ai pas réussi à régler ce problème de dates. Je m'explique: le but est d'afficher le nombre de jours restants par rapport au délai prescrit. Il s'agit en fait d'un entrepreneur qui réalise des travaux d'électricité pour ses clients.
Définition des variables:
Debut=Date début des travaux (date numérique)
today= Date du jour (date())
delai= Délai de réalisation des travaux en nombre de jours (valeur numérique indiquant le nombre de jous)
Datemax=Date limite fixée indiquant la fin des travaux (elle est donc égale à date début des travaux + le délai fixé
Ce que je dois afficher en permanence (exemple):
Date début des travaux: 01/02/2018 (donnée saisie une seule fois inchangeable)
Délai : 90 jours (donnée saisie une seule fois inchangeable)
Date limite des travaux: DateLimite$ (cette date est calculable facilement)
Reste : C'est le nombre de jours restants par rapport au délai fixé (ce nombre est calculable et change tous les jours évidemment)

Jusqu'ici tout marche bien, la valeur de la variable RESTE est bien calculée et affichée convenablement.
Mon problème est le suivant: Dans certains cas exceptionnels, les travaux doivent faire l'objet d'une suspension provisoire, c'est ce que les entrepreneurs appellent ODS qui signifie tout simplement ARRET DES TRAVAUX JUSQU'A NOUVEL ORDRE (sur décision des deux parties client et fournisseur). Donc, en plus des données ci-dessus, on peut avoir dans des cas pareils, une (ou plusieurs) date ODS c'est à dire DATE D'ARRET DES TRAVAUX, les travaux reprendront plus tard suite à une nouvelle décision, cette date est appelée DATE DE REPRISE DES TRAVAUX. Le problème c'est que on peut avoir plusieurs ODS... exemple:
Date ODS1 suivie par une date de reprise des travaux REP1
Date ODS2 suivie par une date de reprise des travaux REP2 et ainsi de suite (4 arrêts au maximum)
A mon avis, en cas de date ODS, la valeur du RESTE (nbre de jours restants) sera bloquée et ne changera plus jusqu'à ce que une date de reprise des travaux sera saisie. Là encore je ne sais plus quoi faire, ça me semble, à ce niveau, SUPER Compliqué....
Voici le code qui permet de calculer le RESTE + la date limite (sans ODS bien entendu)
Données réelles :
DebutTrav$="01/05/2018"
Delai=90 jours

Code : Tout sélectionner

Procedure CalculerReste()
Debut=ParseDate("%dd/%mm/%yyyy",debutTrav$)
today=Date()
delai=Val(delai$)
Datemax=AddDate(Debut, #PB_Date_Day, delai)
fin=0
Reste=0
While fin=0
   If datemax>today
      today=AddDate(today, #PB_Date_Day,1)
      Reste=Reste+1
   EndIf
   If Datemax<=today
      fin=1
   EndIf
Wend              
Datelimite$=FormatDate("%dd/%mm/%yyyy",datemax)
Debug "RESTE : " + Str(reste) + " JOURS") 
Debug "Date limite: " + datelimite$) 
 
 ;Traitement ODS (éventuellement)
   ....... CODE A PREVOIR ..............

EndProcedure


Merci de votre aide
Dernière modification par omega le sam. 02/juin/2018 1:17, modifié 1 fois.
Win7 (x64) 64 bits Pb 5.72
Avatar de l’utilisateur
TazNormand
Messages : 1294
Inscription : ven. 27/oct./2006 12:19
Localisation : Calvados (14)

Re: SOS sur Dates

Message par TazNormand »

Salut Omega,

Déjà, je prendrai au plus simple un tableau 2D pour les ODS comportant les dates d'arrêt et celle de reprise.

Ensuite, quand tu connais ces 2 dates, leur différence (reprise - arrêt) te donne le nombre de jours d'arrêt, à cumuler avec le reste pour connaitre ta date de fin théorique calculée de fin des travaux.

Dans le cas où la date de reprise n'est pas saisie, tu cumule tous les jours écoulés depuis la date d'arrêt.

Code : Tout sélectionner

Ex :
Début : 20 Mai 2018
Aujourd'hui : 24 mai 2018
Délai : 90 jours
date Max : 1 novembre 2018
Date limite : 18 Aout 2018
A la saisie des travaux, Reste=90 jours. Au 24 mai (aujourd'hui 86 jours)

Arrêt le 25 mai, donc Reste 85 jours, Date Limite = 18 Aout 2018 (ça n'a pas encore changé)
Le 26 mai, Reste toujours 85 jours,Date Limite = 19 Aout 2018 ==> Today -Date Arrêt
le 27 Mai, Reste encore 85 jours, Date Limite = 20 Aout 2018 )==> Today -Date Arrêt mais Today est le 27 mai
etc...
Le 15 juin, Reprise des travaux, donc on repart avec notre formule de calcul avec le nombre de jours restant :
Date de fin = today + Reste
Edit :
Un flag te permettrai de vérifier qu'une date de reprise est bien saisie, et dans ton tableau d'ODS (date arrêt, date reprise) si date reprise est nulle, c'est que l'on est tjrs en arrêt)

Pour tes dates, une petite structure du genre :

Code : Tout sélectionner

Structure TravauxDate
  DateSaisie.s          ; Date de la saisie des travaux
  DateDebut.s          ; Date de début des travaux
  Delai.i                   ; Délai de réalisation
  DateMax.s             ; Date maxi de fin des travaux
  array ODS.s(10,10) ; Tableau des dates ODS
  Reste.i                  ; Nombre de jours restant
EndStructure
Image
Image
Marc56
Messages : 2146
Inscription : sam. 08/févr./2014 15:19

Re: SOS sur Dates

Message par Marc56 »

Si travaux stoppés
alors
date de fin minimale estimée = date du jour + 1 + (jours estimés - jours déjà faits)

:wink:
Avatar de l’utilisateur
omega
Messages : 617
Inscription : sam. 26/nov./2011 13:04
Localisation : Alger

Re: SOS sur Dates

Message par omega »

Merci beaucoup pour ces bonnes informations
Le problème, c'est que je n'arrive pas à traduire tout ça en code. Je crois que la meilleure solution est de prendre un exemple concret.
DebutTrav.s="01/05/2018"
Delai: 10 jours
--------------------------------------
1er cas:
A la date du 01/05/2018 le reste affichera 10 jours

2ème cas:
A la date du 05/05/2018 le reste affichera 5 jours

3ème cas:
A la date du 06/05/2018 une ODS a été saisie ODS1.s="08/05/2018"
Quel sera donc la valeur du reste qui sera affichée cette journée du 6 mai 2018?

Merci
Win7 (x64) 64 bits Pb 5.72
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: SOS sur Dates

Message par djes »

Ben 2. Et passé le 8, rien puisque tu seras dans une période ods.
Avatar de l’utilisateur
TazNormand
Messages : 1294
Inscription : ven. 27/oct./2006 12:19
Localisation : Calvados (14)

Re: SOS sur Dates

Message par TazNormand »

djes a écrit :Ben 2. Et passé le 8, rien puisque tu seras dans une période ods.
Heu, j'aurai plutôt dit 5 voire 4, compte tenu du fait que tu es en ODS, et qu'en ODS ton chantier ne bouges pas, donc tu as toujours des jours restants.

Par contre, Omega, au 5 tu dis il reste 5 jours, tout dépend si tu "consultes" le nombre de jours restant le matin ou le soir. J'aurais tendance à penser que le chantier devant commencer le 01/05/2018 au matin, le 05/05/2018 au matin, il ne se sera écoulé que 4 jours "travaillés", donc le 6, date de début d'ODS, donc journée non travaillée, il te restera 5 jours.

Sauf si j'ai mal compris et que l'ODS ne débute donc que le 08/05/2018 ?
Image
Image
Avatar de l’utilisateur
omega
Messages : 617
Inscription : sam. 26/nov./2011 13:04
Localisation : Alger

Re: SOS sur Dates

Message par omega »

tout dépend si tu "consultes" le nombre de jours restant le matin ou le soir.
Aucune importance, cela dépendra du moment de la saisie de l'ODS (ça peut être n'importe quel moment de la journée), on prendra en compte la date de l'ods dès que celle-ci sera détectée (présente). Pour répondre à ta question sur le reste, je pense que la valeur ne change pas tant que l'ods existe (c'est à dire 5 jours). Ce chiffre ne changera que lorsque l'utilisateur saisisse une date de reprise des travaux...A ce moment là, je crois (si je ne dis pas de bêtise) que le reste deviendra Reste+(Date de reprise-Date ODS) Est ce correct?
Win7 (x64) 64 bits Pb 5.72
Avatar de l’utilisateur
TazNormand
Messages : 1294
Inscription : ven. 27/oct./2006 12:19
Localisation : Calvados (14)

Re: SOS sur Dates

Message par TazNormand »

omega a écrit :
tout dépend si tu "consultes" le nombre de jours restant le matin ou le soir.
Aucune importance, cela dépendra du moment de la saisie de l'ODS (ça peut être n'importe quel moment de la journée), on prendra en compte la date de l'ods dès que celle-ci sera détectée (présente). Pour répondre à ta question sur le reste, je pense que la valeur ne change pas tant que l'ods existe (c'est à dire 5 jours). Ce chiffre ne changera que lorsque l'utilisateur saisisse une date de reprise des travaux...A ce moment là, je crois (si je ne dis pas de bêtise) que le reste deviendra Reste+(Date de reprise-Date ODS) Est ce correct?
Je ne crois pas, sinon cela voudrait dire que ton "Reste" serait supérieur à sa valeur avant ODS, si j'ai bien compris, Reste correspond au nombre de jours restant réellement à travailler.

J'ai fait une "simulation" sur un tableau EXCEL en utilisant 4 colonnes et une formule, ça donne à peu près ceci pour 10 jours de travaux à compter du 01/05/2018 :

Code : Tout sélectionner


Formule de calcul de la colonne "Reste" : SI (ColonneODS="*") ALORS (Reste=Valeur ligne précédente) SINON (Reste=Valeur Ligne précédente - 1)
Dans mon tableau Excel, B2 vaut 10, et les lignes Bx (B3, B4 à B...) ont la formule "=SI(D3="*";B2;B2-1)" pour B3, B4 "=SI(D4="*";B3;B3-1)"
NB : Ligne 1 correspond à la ligne d'entête du tableau (Date "Today", Reste..."), La ligne 2 ne contient que le reste initial en B2, le tableau à proprement parler ne commence qu'en ligne 3

Date "TODAY"  |  Reste  | Date Fin Calc |  ODS
--------------+---------+---------------+-------
01/05/2018     |   10   | 10/05/2018    |
02/05/2018     |    9   | 10/05/2018    |
03/05/2018     |    8   | 10/05/2018    |
04/05/2018     |    7   | 10/05/2018    |  *
05/05/2018     |    7   | 11/05/2018    |  *
06/05/2018     |    7   | 12/05/2018    |  *
07/05/2018     |    7   | 13/05/2018    |
08/05/2018     |    6   | 14/05/2018    |  *
09/05/2018     |    6   | 15/05/2018    |  *
10/05/2018     |    6   | 15/05/2018    |
11/05/2018     |    5   | 15/05/2018    |
12/05/2018     |    4   | 15/05/2018    |
13/05/2018     |    3   | 15/05/2018    |
14/05/2018     |    2   | 15/05/2018    |
15/05/2018     |    1   | 15/05/2018    |
16/05/2018     |    0   | 15/05/2018    |
Une chose qu'il ne faut pas oublier de prendre en compte : les jours fériés, et les samedis-dimanches

Je sais que ce n'est pas un bout de code qui pourrait t'aider, mais du "pseudo" code ou de l'algo très simplifié reprenant je pense ce que tu as exposé.
Image
Image
Marc56
Messages : 2146
Inscription : sam. 08/févr./2014 15:19

Re: SOS sur Dates

Message par Marc56 »

Si une date d'ODS est dans le futur et qu'aucune date de REP n'est positionnée, la date de fin ne change pas.

Si tu sais que tu n'auras toujours qu'au maximum 4 ODS positionne les variables ODS et ne met rien dans REP

Quand tu connais une date de REP, il suffit de la positionner, ce qui modifie la date de fin

À chaque demande d'affichage, faire:

Code : Tout sélectionner

Si REP1 <> 0 : Ajout1 = REP1 - ODS1 : FinSi
Si REP2 <> 0 : Ajout2 = REP2 - ODS2 : FinSi
Si REP3 <> 0 : Ajout3 = REP3 - ODS3 : FinSi
Si REP4 <> 0 : Ajout4 = REP4 - ODS5 : FinSi

Date de fin = Nb de jours prévus - nombre de jours faits + Ajout1 + Ajout2 + Ajout3 + Ajout4
:wink:
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: SOS sur Dates

Message par djes »

Ah oui, j'avais mal compris. Il faut que tu gères quelques exceptions, et que tu fasses ton calcul à chaque modification de champ. Certaines choses sont impossibles, par exemple le délai maximum ne doit pas être dépassé, ce qui peut arriver dans certains cas. Ça pourrait être utile d'afficher en rouge quand une date de reprise est impossible, ou de masquer carrément certains champs.
Avatar de l’utilisateur
omega
Messages : 617
Inscription : sam. 26/nov./2011 13:04
Localisation : Alger

Re: SOS sur Dates

Message par omega »

Merci à vous tous pour ces éclaircissements, je commence à voir plus clair maintenant. Si je comprends bien, en reprenant vos exemples, essayons de récapituler :
1er cas : calcul du reste sans ODS

Code : Tout sélectionner

Procedure CalculerReste()
Debut=ParseDate("%dd/%mm/%yyyy",debutTrav$)
today=Date()
delai=Val(delai$)
Datemax=AddDate(Debut, #PB_Date_Day, delai)
fin=0
Reste=0
While fin=0
   If datemax>today
      today=AddDate(today, #PB_Date_Day,1)
      Reste=Reste+1
   EndIf
   If Datemax<=today
      fin=1
   EndIf
Wend              
Datelimite$=FormatDate("%dd/%mm/%yyyy",datemax)
Debug "RESTE : " + Str(reste) + " JOURS") 
Debug "Date limite: " + datelimite$) 
EndProcedure

2ème cas : calcul du reste avec une date ODS (sans Reprise)

Code : Tout sélectionner

Procedure CalculerReste()
Debut=ParseDate("%dd/%mm/%yyyy",debutTrav$)
today=Date()
delai=Val(delai$)
Datemax=AddDate(Debut, #PB_Date_Day, delai)
DateOds1=ParseDate("%dd/%mm/%yyyy",dateODS1$)
fin=0
Reste=0
While fin=0
   If dateods1>=today
      today=AddDate(today, #PB_Date_Day,1)
      Reste=Reste+1
   Else
      fin=1
   EndIf
Wend              
Debug "RESTE : " + Str(reste) + " JOURS") 
EndProcedure

3ème cas : calcul du reste avec une date ODS + une date Reprise

Code : Tout sélectionner

Procedure CalculerReste()
Debut=ParseDate("%dd/%mm/%yyyy",debutTrav$)
today=Date()
delai=Val(delai$)
Datemax=AddDate(Debut, #PB_Date_Day, delai)
DateOds1=ParseDate("%dd/%mm/%yyyy",dateODS1$)
DateRep1=ParseDate("%dd/%mm/%yyyy",dateRep1$)
fin=0
Reste=0
While fin=0
   If dateods1>=today or  daterep1<=today
       today=AddDate(today, #PB_Date_Day,1)
      Reste=Reste+1
   Else
      fin=1
   EndIf
Wend              
Debug "RESTE : " + Str(reste) + " JOURS") 
EndProcedure


Pour le 3ème cas, je ne suis pas sûr que c'est correct, j'aurais aimé utiliser la méthode proposée par Marc56 (ci-dessous) mais je ne sais pas comment la traduire en code et surtout à quel niveau... La date du jour (today) peut très bien être supérieur à la date ods, et dans ce cas précis, mon code ne marche pas...

Code : Tout sélectionner

Si REP1 <> 0 : Ajout1 = REP1 - ODS1 : FinSi
Si REP2 <> 0 : Ajout2 = REP2 - ODS2 : FinSi
Si REP3 <> 0 : Ajout3 = REP3 - ODS3 : FinSi
Si REP4 <> 0 : Ajout4 = REP4 - ODS5 : FinSi
;Date de fin = Nb de jours prévus - nombre de jours faits + Ajout1 + Ajout2 + Ajout3 + Ajout4
Win7 (x64) 64 bits Pb 5.72
Répondre