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 :

[WD28] Algo qui permet de créer des dossiers par rapport aux numéros de semaines


Sujet :

WinDev

  1. #1
    Membre éprouvé
    Avatar de Aooka
    Homme Profil pro
    Scripting Powershell & Wlangage
    Inscrit en
    Juillet 2015
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Scripting Powershell & Wlangage

    Informations forums :
    Inscription : Juillet 2015
    Messages : 227
    Points : 1 095
    Points
    1 095
    Par défaut [WD28] Algo qui permet de créer des dossiers par rapport aux numéros de semaines
    Bonjour à tous,

    Ce matin je bloque pour faire un programme qui je pense doit pas être très compliqué.

    Le but est assez simple :
    - On demande à l'utilisateur de choisir une année (exemple : "2023" ou "2024")
    - Ensuite on demande à l'utilisateur le chemin de là où il souhaite créer ses dossiers avec numéro de semaines associé
    - Enfin, on créer les 52 sous dossier dans le dossiers de l'année choisis par l'utilisateurs.

    Exemple en image : si l'utilisateur choisi 2023 et lance le programme tout les sous dossiers suivants seront automatiquement créer : (au total 52 sous dossiers puisque 52 semaines par ans)

    Nom : exemple.png
Affichages : 197
Taille : 14,3 Ko

    Mon code actuel qui ne fait je l'avoue pas grand chose :
    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
    gsCheminDossier				est une chaîne 	= "C:\Users\aooka\Desktop\"
    gsAnneeACreer				est un chaîne		= "2025"
    gnNombreDeSemaines			est un entier		= 52
     
    gsDateDebutSemaine			est une Date
    gsDateFinSemaine			est une Date
     
    gsDateDebutSemaine2023		est une Date = "02/01/2023" // Date début semaine 1 en 2023
    gsDateFinSemaine2023		est une Date = "08/01/2023" // Date fin semaine 1 en 2023
     
     
    SI fRepExiste(gsCheminDossier + gsAnneeACreer) = Vrai ALORS
     
    	SI fRepSupprime(gsCheminDossier + gsAnneeACreer, frRécursif) = Vrai ALORS
     
    		SI fRepCrée(gsCheminDossier + gsAnneeACreer) = Vrai ALORS
     
    			// i est le numéro de la semaine
    			POUR i = 1 _À_ gnNombreDeSemaines
     
    				PremierJ		est une Date = PremierJourDeLAnnée(gsAnneeACreer + "1105")
     
    				DateDebut		est une Date	= PremierJourDeLaSemaine(gsAnneeACreer)
     
    				DateFin		est une Date	= DernierJourDeLaSemaine(gsAnneeACreer)
     
    				Info(PremierJ)
    				Info(DateDebut)
    				Info(DateFin)
    				// savoir en quelle année nous sommes
    				//SI fRepCrée(gsCheminDossier + gsAnneeACreer + "\" + "S" + i + "-")  ALORS
     
    			FIN
     
    		SINON
     
    		FIN
     
    	FIN
     
    SINON
     
     
    FIN
    J'ai du mal à me lancer dans le code de ma boucle FOR.

    Auriez-vous des pistes pour me guider ?

    Merci par avance,
    Bonne journée à vous tous,

  2. #2
    Expert confirmé
    Avatar de Voroltinquo
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Juin 2017
    Messages
    2 811
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Juin 2017
    Messages : 2 811
    Points : 5 270
    Points
    5 270
    Billets dans le blog
    1
    Par défaut
    Bonjour,
    Pourquoi ne pas travailler avec un TANTQUE. Cela a en plus l'avantage de traiter les années à 53 semaines e.g. 2024
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    LundiEnCours= premier lundi de l'année
    
    TQ LundiEnCours<=31/12 de l'année
         Traiter semaine
         LundiEnCours+=7 j
    FTQ
    Un truc du style :
    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
     
    PROCÉDURE RépertoiresAnnée(nAnnée est entier=AnnéeEnCours)
    nIndSemaine			est entier
    dLundiEnCours		est une Date
    dDimanche			est Date
    dDernierJourAnnée	est Date
     
    dDernierJourAnnée	= ChaîneConstruit("%1%2",nAnnée,"1231")
    dLundiEnCours		= SemaineVersDate(1,nAnnée)	//Premier lundi de l'année
     
    //Semaine 0
    SI dLundiEnCours<>ChaîneConstruit("%1%2",nAnnée,"0101") ALORS
    	dDimanche=dLundiEnCours
    	dDimanche..Jour-=1
    	TraceConstruit("Semaine %1-%2 au %3",nIndSemaine,DateVersChaîne(ChaîneConstruit("%1%2",nAnnée,"0101")),...
    	DateVersChaîne(dDimanche))
    FIN
     
    nIndSemaine=1
    TANTQUE dLundiEnCours<=dDernierJourAnnée
    	dDimanche=dLundiEnCours
    	dDimanche..Jour+=6
    	SI dDimanche>dDernierJourAnnée ALORS
    		dDimanche=dDernierJourAnnée
    	FIN
    	TraceConstruit("Semaine %1-%2 au %3",nIndSemaine,DateVersChaîne(dLundiEnCours),...
    	DateVersChaîne(dDimanche))
    	nIndSemaine++
    	dLundiEnCours..Jour+=7
    FIN
    Par ailleurs, as-tu une raison pour utiliser des variables globales ?
    Il y a peut-être plus simple, mais ça tourne.
    Quand tout a échoué utilisez l'option RTFM

  3. #3
    Membre éprouvé
    Avatar de Aooka
    Homme Profil pro
    Scripting Powershell & Wlangage
    Inscrit en
    Juillet 2015
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Scripting Powershell & Wlangage

    Informations forums :
    Inscription : Juillet 2015
    Messages : 227
    Points : 1 095
    Points
    1 095
    Par défaut
    Bonjour Voroltinquo,

    Merci beaucoup pour ta réponse complète.

    Je suis en train d'analyser ton code et de l'adapter à mon besoin.

    Ce n'est qu'un petit script tout est codé dans le "code projet" d'où les variables global. Pas de fenêtre. Mon objectif est en fait de créer des dossiers automatiquement juste en un clique avec les bons noms.
    Pour moi les variables local sont uniquement utilisé lorsque je les déclares dans des procédures ou dans des objets. Mais peut-être que je fais fausse route.
    Donc, quand je fais du scripting comme ici, 99% de mes variables sont globales puisque le code n'excède jamais 500 lignes en moyenne et je ne fais pas de procédures. Et si procédure là je fais du local. Ou dans les boucles pour gérer les chaînes par exemple.

    Merci encore pour ta grande aide,
    Bonne journée,

  4. #4
    Expert éminent
    Avatar de frenchsting
    Homme Profil pro
    multitâches-multifonctions
    Inscrit en
    Juin 2003
    Messages
    5 202
    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 202
    Points : 9 190
    Points
    9 190
    Par défaut
    Bonjour,
    Pour l'histoire de ton arborescence, j'ajouterais l'année quelque part. Soit en créant un dossier Racine avec l'année soit en préfixant les semaines. Ex S2023-01 ou S202301.
    Pour ce qui est des variables, il faut les déclarer à l'endroit où tu en as besoin. Pas la peine de déclarer une variable dans le projet alors qu'elle sera utilisée uniquement dans un bouton.
    On utilise les variables globales lorsqu'elles doivent être visibles "partout". Et même cette notion de "partout" peut être "locale". On a des variables globales à une fenêtre ou des globales à un état.
    Les globales projets sont utiles quand on est amené à les utiliser vraiment partout. L'exemple le plus commun est la variable qui contient l'utilisateur en cours..
    [EDIT] Truc tout bête : il peut y avoir plus de 52 numeros de semaines. Il y a une norme ISO là-dessus su je me souviens bien...
    Commencez toujours appuyer sur la touche F1 et puis n'hésitez à passer par un moteur de recherche...
    Le forum est fait pour répondre aux questions : pas la peine de me les envoyer par MP. Merci.

    Sur internet, tout est vrai ! Honoré de Balzac
    Make it real not fantasy... Herman Rarebell

  5. #5
    Membre éclairé
    Homme Profil pro
    Chef de projet
    Inscrit en
    Mars 2017
    Messages
    329
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2017
    Messages : 329
    Points : 791
    Points
    791
    Par défaut
    Yop,

    dans ton exemple tes noms de dossier ne comportent pas les samedi/dimanche (j'imagine que c'est aussi un prérequis).
    Voici mon idée, qui permet donc aussi de débrayer la suppression des samedi dimanche dans les semaines:

    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
    PROCÉDURE _dossiersSemaines(nAnnee est entier)
     
    tabAssoDatesNumerosSemaine	est tableau associatif d'entiers //Chaque jour de l'année est associé à son numéro de semaine
    POUR entierDate = DateVersEntier(PremierJourDeLAnnée(nAnnee)) _À_ DateVersEntier(DernierJourDeLAnnée(nAnnee))
    	tabAssoDatesNumerosSemaine[EntierVersDate(entierDate)] = EntierVersNuméroDeSemaine(entierDate)
    FIN
    TableauTrie(tabAssoDatesNumerosSemaine,ttCroissant) //Précaution, mais bon, il est censé être déjà dans l'ordre
     
    tabNomsDossiers est tableau de chaîne
     
    POUR nSemaineEnCours = 1 _À_ NuméroDeSemaine(DernierJourDeLAnnée(nAnnee)) //On a directement le nombre de semaines de l'année concernée qu'on doit gérer avec ce qui est à droite du _A_
    	tabDatesSemaines est tableau de Dates //Mini tableau!
     
    	bExclureSamediDimanche est un booléen = Vrai
     
    	POUR TOUT valeur,cle de tabAssoDatesNumerosSemaine AVEC valeur = nSemaineEnCours //Cette boucle rempli le mini tableau avec uniquement les jours de la semaine concernée, identifiée par nSemaineEnCours
    		SI bExclureSamediDimanche ALORS
    			SI DateVersJour(cle) <> 6 _ET_ DateVersJour(cle) <> 7 ALORS tabDatesSemaines.Ajoute(cle)
    		SINON
    			tabDatesSemaines.Ajoute(cle)
    		FIN
    	FIN
     
    	TableauTrie(tabDatesSemaines,ttCroissant) //Par précaution
     
    	dDateDebutSemaine est Date = tabDatesSemaines[1]
    	dDateFinSemaine est Date = tabDatesSemaines[tabDatesSemaines..Occurrence]
     
    	tabNomsDossiers.Ajoute("S" + Droite("00"+NumériqueVersChaîne(nSemaineEnCours),2) + " - " + NumériqueVersChaîne(dDateDebutSemaine..Jour) + " " + NuméroDeMoisVersLettre(dDateDebutSemaine..Mois) + " au " + NumériqueVersChaîne(dDateFinSemaine..Jour) + " " + NuméroDeMoisVersLettre(dDateFinSemaine..Mois))
    FIN
     
    RENVOYER tabNomsDossiers
    Pour 2023 tu obtiens un tableau dont voici les extrémités:
    S01 - 2 janvier au 6 janvier
    S02 - 9 janvier au 13 janvier
    S03 - 16 janvier au 20 janvier
    S04 - 23 janvier au 27 janvier
    S05 - 30 janvier au 3 février
    ...
    S51 - 18 décembre au 22 décembre
    S52 - 25 décembre au 29 décembre

    Pour 2024:

    S01 - 1 janvier au 5 janvier
    S02 - 8 janvier au 12 janvier
    S03 - 15 janvier au 19 janvier
    S04 - 22 janvier au 26 janvier
    S05 - 29 janvier au 2 février
    ...
    S51 - 16 décembre au 20 décembre
    S52 - 23 décembre au 27 décembre
    S53 - 30 décembre au 31 décembre

    Le nombre de semaines variable d'une année à l'autre est géré, et on commence par récupérer la semaine 1 systématiquement, ainsi que le montrait ton exemple.

  6. #6
    Membre éprouvé
    Avatar de Aooka
    Homme Profil pro
    Scripting Powershell & Wlangage
    Inscrit en
    Juillet 2015
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Scripting Powershell & Wlangage

    Informations forums :
    Inscription : Juillet 2015
    Messages : 227
    Points : 1 095
    Points
    1 095
    Par défaut
    Bonjour kunnskap,

    Merci beaucoup pour ton code. Ma réponse est tardive car il m'a fallu du temps pour comprendre ce code et ces nouveaux types de variables que je ne connaissais pas.
    Le code marche super bien.

    Procédure
    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
    PROCÉDURE _dossiersSemaines(nAnnee est entier)
     
    tabAssoDatesNumerosSemaine					est un tableau associatif d'entiers // Chaque jour de l'année est associé à son numéro de semaine
    tabNomsDossiers 							est un tableau de chaîne // Tableau final
    tabDatesSemaines							est un tableau de Dates	// Mini tableau pour traitement
    dDateDebutSemaine							est une Date
    dDateFinSemaine								est une Date
     
    POUR entierDate = DateVersEntier(PremierJourDeLAnnée(nAnnee)) _À_ DateVersEntier(DernierJourDeLAnnée(nAnnee))
     
    	// On associe au tabAssoDatesNumerosSemaine chaque dates jour par jour au numéro de semaine associé
    	// date de chaque jour de l'année : 		EntierVersDate(entierDate))
    	// numéro de semaine  : 					EntierVersNuméroDeSemaine(entierDate)
     
    	tabAssoDatesNumerosSemaine[EntierVersDate(entierDate)] = EntierVersNuméroDeSemaine(entierDate)
     
    //	TraceConstruit("1)		EntierVersNuméroDeSemaine(entierDate) : " + EntierVersNuméroDeSemaine(entierDate))
    //	
    //	TraceConstruit("2)		EntierVersDate(entierDate) : " + EntierVersDate(entierDate))
    //	
    //	TraceConstruit("3)		tabAssoDatesNumerosSemaine[EntierVersDate(entierDate)] : " + NumériqueVersChaîne(tabAssoDatesNumerosSemaine[EntierVersDate(entierDate)]))
     
    FIN
     
    TableauTrie(tabAssoDatesNumerosSemaine, ttCroissant) // Précaution, mais bon, il est censé être déjà dans l'ordre
     
    POUR nSemaineEnCours = 1 _À_ NuméroDeSemaine(DernierJourDeLAnnée(nAnnee)) // On a directement le nombre de semaines de l'année concernée qu'on doit gérer avec ce qui est à droite du _A_
     
    	tabDatesSemaines.SupprimeTout()
     
    	POUR TOUT valeur, cle de tabAssoDatesNumerosSemaine AVEC valeur = nSemaineEnCours // Cette boucle rempli le mini tableau avec uniquement les jours de la semaine concernée, identifiée par nSemaineEnCours
     
    //		TraceConstruit("1)		Numéro de semaine (variable valeur) : " + NumériqueVersChaîne(valeur))
    //		
    //		TraceConstruit("2)		Date (variable clé) : " + NumériqueVersChaîne(cle))
    //		
    //		TraceConstruit("3)		Numéro de jours (DateVersJour(variable clé)) : " + NumériqueVersChaîne(DateVersJour(cle)))
     
    		SI DateVersJour(cle) <> 6 _ET_ DateVersJour(cle) <> 7 ALORS 
     
    			tabDatesSemaines.Ajoute(cle)
     
    		FIN
     
    	FIN
     
    	TableauTrie(tabDatesSemaines, ttCroissant) // Par précaution
     
    	dDateDebutSemaine = tabDatesSemaines[1]
     
    	dDateFinSemaine = tabDatesSemaines[tabDatesSemaines..Occurrence]
     
    	tabNomsDossiers.Ajoute("S" + Droite("00" + NumériqueVersChaîne(nSemaineEnCours), 2) + " - " + NumériqueVersChaîne(dDateDebutSemaine..Jour) + " " + NuméroDeMoisVersLettre(dDateDebutSemaine..Mois) + " au " + NumériqueVersChaîne(dDateFinSemaine..Jour) + " " + NuméroDeMoisVersLettre(dDateFinSemaine..Mois))
    FIN
     
    RENVOYER tabNomsDossiers
    Sujet résolu.

    Merci encore

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2010] Etat des données par rapport aux noms d'un listbox
    Par joponta dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 18/11/2020, 08h32
  2. [XL-2010] Code vba qui permet de comparer un tableau par rapport à un autre tableau
    Par Marc31 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 15/02/2020, 19h17
  3. Réponses: 2
    Dernier message: 18/08/2011, 11h32
  4. Avantage des EJB par rapport aux POJO
    Par Baptiste Wicht dans le forum JPA
    Réponses: 6
    Dernier message: 13/03/2008, 10h58
  5. Gestion des pages par rapport aux menus
    Par darontankian dans le forum Langage
    Réponses: 3
    Dernier message: 31/01/2008, 21h59

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