PureBasic

Forums PureBasic
Nous sommes le Jeu 14/Nov/2019 2:53

Heures au format UTC + 1 heure




Poster un nouveau sujet Répondre au sujet  [ 11 messages ] 
Auteur Message
 Sujet du message: [RESOLU] SOS sur Dates
MessagePosté: Jeu 24/Mai/2018 1:50 
Hors ligne
Avatar de l’utilisateur

Inscription: Sam 26/Nov/2011 13:04
Messages: 469
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:
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

_________________
Win7 (x86) 32 bits Pb 5.70


Dernière édition par omega le Sam 02/Juin/2018 1:17, édité 1 fois.

Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: SOS sur Dates
MessagePosté: Jeu 24/Mai/2018 8:19 
Hors ligne
Avatar de l’utilisateur

Inscription: Ven 27/Oct/2006 12:19
Messages: 1224
Localisation: Calvados (14)
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:
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:
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


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: SOS sur Dates
MessagePosté: Jeu 24/Mai/2018 8:39 
Hors ligne

Inscription: Sam 08/Fév/2014 15:19
Messages: 1634
Si travaux stoppés
alors
date de fin minimale estimée = date du jour + 1 + (jours estimés - jours déjà faits)

:wink:

_________________
Windows 10 Famille x64 + Linux (Slackware, Debian sur Oracle VirtualBox 6.0), Raspberry Pi


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: SOS sur Dates
MessagePosté: Jeu 24/Mai/2018 12:39 
Hors ligne
Avatar de l’utilisateur

Inscription: Sam 26/Nov/2011 13:04
Messages: 469
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 (x86) 32 bits Pb 5.70


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: SOS sur Dates
MessagePosté: Jeu 24/Mai/2018 16:34 
Hors ligne
Avatar de l’utilisateur

Inscription: Ven 11/Fév/2005 17:34
Messages: 4224
Localisation: Arras, France
Ben 2. Et passé le 8, rien puisque tu seras dans une période ods.


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: SOS sur Dates
MessagePosté: Jeu 24/Mai/2018 16:57 
Hors ligne
Avatar de l’utilisateur

Inscription: Ven 27/Oct/2006 12:19
Messages: 1224
Localisation: Calvados (14)
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


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: SOS sur Dates
MessagePosté: Ven 25/Mai/2018 0:30 
Hors ligne
Avatar de l’utilisateur

Inscription: Sam 26/Nov/2011 13:04
Messages: 469
Citation:
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 (x86) 32 bits Pb 5.70


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: SOS sur Dates
MessagePosté: Ven 25/Mai/2018 8:17 
Hors ligne
Avatar de l’utilisateur

Inscription: Ven 27/Oct/2006 12:19
Messages: 1224
Localisation: Calvados (14)
omega a écrit:
Citation:
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:

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


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: SOS sur Dates
MessagePosté: Ven 25/Mai/2018 8:40 
Hors ligne

Inscription: Sam 08/Fév/2014 15:19
Messages: 1634
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:
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:

_________________
Windows 10 Famille x64 + Linux (Slackware, Debian sur Oracle VirtualBox 6.0), Raspberry Pi


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: SOS sur Dates
MessagePosté: Ven 25/Mai/2018 23:10 
Hors ligne
Avatar de l’utilisateur

Inscription: Ven 11/Fév/2005 17:34
Messages: 4224
Localisation: Arras, France
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.


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: SOS sur Dates
MessagePosté: Dim 27/Mai/2018 0:45 
Hors ligne
Avatar de l’utilisateur

Inscription: Sam 26/Nov/2011 13:04
Messages: 469
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:
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:
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:
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:
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 (x86) 32 bits Pb 5.70


Haut
 Profil  
Répondre en citant le message  
Afficher les messages postés depuis:  Trier par  
Poster un nouveau sujet Répondre au sujet  [ 11 messages ] 

Heures au format UTC + 1 heure


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité


Vous ne pouvez pas poster de nouveaux sujets
Vous ne pouvez pas répondre aux sujets
Vous ne pouvez pas éditer vos messages
Vous ne pouvez pas supprimer vos messages

Rechercher:
Aller à:  

 


Powered by phpBB © 2008 phpBB Group | Traduction par: phpBB-fr.com
subSilver+ theme by Canver Software, sponsor Sanal Modifiye