Résolu Boucle Do..While qui ne fonctionne pas correctement pour ajouter des jours

Plus d'informations
il y a 6 mois 3 semaines - il y a 6 mois 3 semaines #33837 par gertrude
Bonjour la communauté !

Aujourd'hui je viens vous voir car j'ai un cas qui me semblait en apparence simple à résoudre mais sur lequel je me casse bien les dents. Et j'ai tenté différentes choses, sans succès. Ce que je propose ici est la version la plus "aboutie", bien que non fonctionnelle.

Je suis en train de créer un planning d'affection. J'ai une boucle principale qui tourne pour parcourir chaque ligne de ma variable $planning. Cette variable $planning comporte les propriétés suivantes : Client (nom du client), Week (numéro de semaine dans le cycle de rotation, va de 1 à 10 dans le cas présent), Vague 1, Vague 2, Vague 3, Vague 4, etc. Les "Vague x" sont les dates auxquels les interventions ont lieu. Les dates sont vides au départ, puis remplies par le script au fur et à mesure.

Le script fonctionnait très bien jusqu'à ce que je veuille rajouter le fait que lorsqu'on a un jour férié, on décale d'une semaine la date (et les suivantes, on décale tout le planning. J'ai voulu faire une boucle car dans le cas du 1 et 8 mai, il faut décaler deux fois. Par ailleurs, on n'est pas à l'abri qu'un nouveau jour férié soit ajouté 7 jours après le 8 mai ou 7 jours après le 1 mai, donc autant prendre en compte tous les cas de figure !

Bref, la partie qui me pose souci se situe dans la boucle Do..While car lorsque je détecte un jour férié, je veux ajouter 7 jours. Et c'est là que ça ne fonctionne pas, car j'ai ce message d'erreur qui se répète à l'infini :

Échec lors de l’appel de la méthode, car [System.String] ne contient pas de méthode nommée « AddDays ».
Au caractère Ligne:304 : 17
+ ...             $dateToTest = ($dateToTest.AddDays(7)).ToString("dd/MM/yy ...
+                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation : (: ) , RuntimeException
    + FullyQualifiedErrorId : MethodNotFound


Je comprends bien que je ne peux pas ajouter des jours à une chaîne de caractères, mais je ne comprends pas comment résoudre cette erreur.

Voici la partie du script en question :

#définir l'URL de l'API fournissant les jours fériés en France métropolitaine
$apiHolidays = 'calendrier.api.gouv.fr/jours-feries/metropole.json'
#appeler l'API pour récupérer la liste des jours fériés
$holidays = Invoke-RestMethod -Uri $apiHolidays

# créer une boucle qui démarre de 0, s'incrémente de 1 en 1, et va jusqu'au nombre de lignes de $planning : on parcourt chaque ligne
for($l=0; $l -lt $planning.Count ;$l++){
    # initialiser la variable multiplicateur à 0
    [int]$multiplier = 0
    # créer une boucle qui démarre de 1, s'incrémente de 1 en 1, et va jusqu'au nombre de colonnes "Vagues de $planning : on parcourt chaque colonne Vague 1, Vague 2, etc.
    for($v=1; $v -le $nbWave; $v++){
        #convertir la date à tester au format 'yyyy-MM-dd' pour correspondre au format de l'API
        $dateToTest = Get-Date (((Get-Date $firstUpdateDate).AddDays(([int]$planning[$l].Week - 1)*7 + $numberOfWeeks*$multiplier*7 + $NoMaj*$multiplier*7)).ToString("dd/MM/yyyy")) -Format 'yyyy-MM-dd'
        #si la date est un jour férié
        if($holidays.$dateToTest){
            #alors entrer dans une boucle Do..While
            Do{
                #ajouter 7 jours à la date testée
                $dateToTest = ($dateToTest.AddDays(7)).ToString("dd/MM/yyyy")
            }While ($holidays.$dateToTest)
        }
        # remplir avec la date de départ selon la formule = n°DeSemaineDépart + Week de la ligne en cours -1
        $planning[$l]."Vague $v" = ((Get-Date $firstUpdateDate).AddDays(([int]$planning[$l].Week - 1)*7 + $numberOfWeeks*$multiplier*7 + $NoMaj*$multiplier*7)).ToString("dd/MM/yyyy")
        # ajouter 1 au multiplicateur
        $multiplier = $multiplier +1
    }
}

Dernière édition: il y a 6 mois 3 semaines par gertrude. Raison: oubli de citation pour le message d'erreur

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 6 mois 3 semaines #33839 par Fabien
Bonjour Gertrude,

Ce que te renvoi l'erreur est  un problème de format de date.
Dans la variable $dateToTest, tu as modifié le format de la date.
Quand tu utilises cette variable après, tu n'as plus la méthode "AddDays" car ta variable est au Format String et non Date.
Voici un exemple pour comprendre : 
#Date au format Date
$date = Get-Date
#Affichage du  format
$date.GetType()
#Ajouter 3 jours à la date du jour
$date.AddDays(3)

#Date au format String
$date2 = Get-Date -Format 'yyyy-MM-dd'
#Affichage du  format
$date2.GetType()
#Ajouter 3 jours à la date du jour (Non Fonctionnel)
$date2.addDays(3)

Fabien

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 6 mois 1 semaine - il y a 6 mois 1 semaine #33865 par gertrude
Bonjour Fabien,

Merci pour ta réponse très claire, j'ai remis ma variable dans un Get-Date, puis ensuite j'ai ajouté les jours nécessaires.
Pour répondre à ton exemple qui est parlant :

$date2 = Get-Date -Format 'yyyy-MM-dd'
#Affichage du  format
$date2.GetType()
#Ajouter 3 jours à la date du jour (Fonctionnel car on retransforme la variable en date)
(Get-Date $date2).addDays(3)

Comme ça, ça fonctionne :)

Nous pouvons clore ce sujet.

ps : ma boucle dans le message initial, d'un point de vue logique, est à jeter à la poubelle, mais ça fera (ou pas, si je m'en sors seule) l'objet d'un nouveau sujet
Dernière édition: il y a 6 mois 1 semaine par gertrude.

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.103 secondes
Propulsé par Kunena