IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

WinDev Discussion :

Calcul de dates excluant les weekends !


Sujet :

WinDev

  1. #21
    Expert éminent
    Avatar de frenchsting
    Homme Profil pro
    multitâches-multifonctions
    Inscrit en
    Juin 2003
    Messages
    5 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : multitâches-multifonctions
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 348
    Points : 9 496
    Points
    9 496
    Par défaut
    Citation Envoyé par serendib Voir le message
    Bref la seule difficulté est le calcul du jour de Pâques.
    Même plus... Dans Windev, il y a une fonction pour cela.

    Quant à Steeves, je suis également surpris, tout comme un autre débutant sur ce forum, par le temps passé pour des choses hyper simples. Du moins, qui le seraient, si ces mêmes débutants, prenaient un papier et un crayon pour écrire un exemple.., un schéma ou une analyse détaillée...

  2. #22
    Membre expérimenté
    Inscrit en
    Août 2010
    Messages
    732
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 732
    Points : 1 650
    Points
    1 650
    Par défaut
    Si vous n'arrivez pas à le développer vous-même, tant pis pour vous.

    Version naïve mais largement assez performante pour la plupart des cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    PROCEDURE gJoursOuvrésNaïf(dDateDébut, dDateFin, bOuvrables = Faux)
    dDate			est Date	= dDateDébut
    nNbJours		est entier	= 0
    tabJourOuvré	est tableau de booléens	= [Vrai, Vrai, Vrai, Vrai, Vrai, bOuvrables, Faux]
     
    TANTQUE dDate <= dDateFin
    	SI tabJourOuvré[DateVersJour(dDate)] _ET_ PAS JourFérié(dDate) ALORS
    		nNbJours++
    	FIN
    	dDate++
    FIN
    RENVOYER nNbJours
    Vous voyez que c'est vraiment pas compliqué.

    Version bien plus rapide sur de gros intervalles (mais pas encore optimale) :
    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
    56
    57
    58
    59
    60
    61
    62
    63
    PROCEDURE gJoursOuvrés(dDateDébut, dDateFin, bOuvrables = Faux)
    tabPâques		est tableau d'entiers
    nNbJoursTotal	est entier
    nNbJours		est entier
    dDateFérié		est Date
    tabJourOuvré	est tableau de booléens	= [Vrai, Vrai, Vrai, Vrai, Vrai, bOuvrables, Faux]
    taDéjàFérié		est tableau associatif (*, *, wlEntier) de booléen
    nFérié			est entier
     
    SI PAS DateValide(dDateDébut) OU PAS DateValide(dDateFin) OU dDateFin < dDateDébut ALORS
    	ErreurDéclenche(1, "Paramètres invalides")
    	RENVOYER 0
    FIN
    nDateDébut		est entier	= DateVersEntier(dDateDébut)
    nDateFin		est entier	= DateVersEntier(dDateFin)
    nNbJoursTotal = nDateFin + 1 - nDateDébut
    nNbJours = nNbJoursTotal
    // Enlève les dimanches
    nNbJours -= PartieEntière((nNbJoursTotal + (EntierVersJour(nDateDébut) + 6) modulo 7) / 7)
    // Enlève les samedis
    SI PAS bOuvrables ALORS
    	nNbJours -= PartieEntière((nNbJoursTotal + EntierVersJour(nDateDébut) modulo 7) / 7)
    FIN
    // Cherche Pâques sur les années concernées
    POUR nAnnée = dDateDébut..Année _A_ dDateFin..Année
    	TableauAjoute(tabPâques, DateVersEntier(Pâques(nAnnée)))
    FIN
    // Enlève les jours fériés
    POUR TOUTE CHAÎNE sJourFérié DE JourFériéListe() SEPAREE PAR RC
    	SI sJourFérié [= "@" ALORS
    		nDécalage est entier = 0
    		SELON sJourFérié
    			CAS jfJeudiDeLAscension
    				nDécalage = 39
    			CAS jfLundiDePâques
    				nDécalage = 1
    			CAS jfLundiDePentecôte
    				nDécalage = 50
    			CAS jfVendrediSaint
    				nDécalage = -2
    		FIN
    		SI nDécalage <> 0 ALORS
    			POUR TOUT nPâques DE tabPâques
    				nFérié = nPâques + nDécalage
    				SI PAS taDéjàFérié[nFérié] _ET_ nDateDébut <= nFérié <= nDateFin _ET_ tabJourOuvré[EntierVersJour(nFérié)] ALORS
    					nNbJours--
    					taDéjàFérié[nFérié] = Vrai
    				FIN
    			FIN
    		FIN
    	SINON
    		dDateFérié = "2000" + sJourFérié
    		POUR nAnnée = dDateDébut..Année _A_ dDateFin..Année
    			dDateFérié..Année = nAnnée
    			nFérié = DateVersEntier(dDateFérié)
    			SI PAS taDéjàFérié[nFérié] _ET_ nDateDébut <= nFérié <= nDateFin _ET_ tabJourOuvré[EntierVersJour(nFérié)] ALORS
    				nNbJours--
    				taDéjàFérié[nFérié] = Vrai
    			FIN
    		FIN
    	FIN
    FIN
    RENVOYER nNbJours
    Pour avoir les jours fériés dans WinDev :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    PROCEDURE gJoursFériésInit()
    JourFériéSupprimeTout()
    // Initialisation des 11 jours fériés communs aux départements français et DOM/TOM
    JourFériéAjoute("0101")					// 1er Janvier
    JourFériéAjoute(jfLundiDePâques)		// Lundi de Pâques
    JourFériéAjoute("0501")					// 1er Mai
    JourFériéAjoute("0508")					// 8 Mai
    JourFériéAjoute(jfJeudiDeLAscension)	// Jeudi de l'Ascension
    JourFériéAjoute(jfLundiDePentecôte)		// Lundi de Pentecôte
    JourFériéAjoute("0714")					// 14 Juillet
    JourFériéAjoute("0815")					// 15 Août (Assomption)
    JourFériéAjoute("1101")					// Toussaint
    JourFériéAjoute("1111")					// 11 Novembre
    JourFériéAjoute("1225")					// Noël

  3. #23
    Membre éclairé
    Avatar de Narwe
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2013
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2013
    Messages : 257
    Points : 670
    Points
    670
    Par défaut
    Je suis désolé pour Steeves des messages désobligeant qu'il a reçu.
    Il ne les mérite absolument pas.

    Il a démarré son message par un "Bonjour", le termine par un "merci" et ne demande qu'une "idée d'algo" en exposant clairement son problème.
    Il n'y aucune critique à lui faire.

    la première réponse de serendib est un peu sèche mais comme il l'exprime dans son message, c'est dû au titre d'Ingénieur développement logiciels qui apparaît sur le profil.
    Ce message à reçu 6 "moins" et 1 "plus". Steeves n'a pu mettre qu'un seul "moins" (et je doute qu'il l'ai fait). Pour info, je n'en ai "noté" aucun message de cette conversation.

    Par contre, à partir de message 16 de tbc92, qui insulte le maitre de stage, la conversation deviennent de plus en plus insultante. Donc au risque de faire preuve de peu de courtoisie, je vous informe que non, Narwe, n'est pas mon véritable nom. Pire, j'ai même utilisé plusieurs profils différents, ErwanA notamment, par le passé.
    De plus, on peut imaginer que si le maitre de stage, qui n'est pas toujours présent, donne ses identifiants pour que son stagiaire pose des questions sur ce forum, c'est justement pour retrouver ces messages et savoir ce que fait son stagiaire.

    Pour terminer, concernant le fait de dire que ce problème est "truc simple", retourner voir les premiers messages que vous postiez sur les forums, vous verrez qu'on pose tous des questions simples (mes premiers messages, se trouve sur le newsgroup Windev, un exemple après 2 ans d'expérience sur Windev : https://groups.google.com/forum/#!topicsearchin/fr.comp.developpement.agl.windev/before$3A2004$2F03$2F05$20Allain/fr.comp.developpement.agl.windev/cbTijflS5EU, par bonheur, je ne me rappelle absolument pas pourquoi je passais par une fonction compilée).

    Steeves, accroche toi et ne tiens pas compte des mauvaises remarques qui ont été écrites ici. On a tous débuté, on a tous été mauvais et on l'est tous encore (et si on en a pas conscience, c'est pire). Mais on s'améliore. A la fin de ton stage, relis le code que tu as fait en arrivant et tu vas constater tes progrès. Et relire son vieux code fait toujours cette effet comme Commit Strip l'a illustré :
    http://www.commitstrip.com/fr/2013/0...de-des-autres/
    http://www.commitstrip.com/fr/2016/0...ote-this-code/

    Bon courage, et aimez vous les uns les autres bordel de merde.

    Cordialement,
    Narwe (entre autre)

  4. #24
    Membre expérimenté
    Inscrit en
    Août 2010
    Messages
    732
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 732
    Points : 1 650
    Points
    1 650
    Par défaut
    C'est un forum sur le développement ou une cour de récréation ?

Discussions similaires

  1. Réponses: 2
    Dernier message: 20/11/2012, 14h55
  2. calculer la différence entre deux dates en excluant les weekends
    Par darkdark dans le forum Collection et Stream
    Réponses: 19
    Dernier message: 26/05/2011, 16h49
  3. diiff date en y excluant les weekend
    Par Rookie75 dans le forum Langage
    Réponses: 5
    Dernier message: 26/04/2007, 16h45
  4. [SQL Server] Calcul durée entre 2 dates sans les dimanches
    Par sarahsonia dans le forum Langage SQL
    Réponses: 6
    Dernier message: 03/04/2006, 17h59
  5. CALCUL D UNE DUREE ENTRE 2 DATES SANS LES DIMANCHES
    Par sarahsonia dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 03/04/2006, 17h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo