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

VBScript Discussion :

Comment faire parler un écart entre deux dates !


Sujet :

VBScript

  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 468
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 468
    Points : 1 342
    Points
    1 342
    Par défaut Comment faire parler un écart entre deux dates !
    Bonjour à toutes et à tous,

    Avec mon test j'arrive à dire l'écart entre deux dates (pour le mois de février) pour une application qui me permettrait de savoir mois par mois combien de jours il reste avant de percevoir ma pension.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    dim Madate, lecture
     
    Madate =  DateSerial(2024,02,22) 
     
    Set lecture=CreateObject("sapi.spvoice")
    lecture.rate=1
     
    Texte= "Plus que " & DateDiff("d",now,Madate) & " Jours"  & vbCrlf & " Avant le " & Madate
     
    lecture.speak texte
    Hors j'aurai aimé le faire pour les 12 mois de l'année puisque je connais les dates de payement :

    ex : Quand nous serons au mois de mars le 18 il restera 3 jours avant de toucher.

    Janvier 24/01/2024

    Février 22/02/2024

    Mars 21/03/2024

    Avril 23/04/2024

    Mai 23/05/2024

    Juin 21/06/2024

    Juillet 24/07/2024

    Août 23/08/2024

    Septembre 23/09/2024

    Octobre 24/10/2024

    Novembre 22/11/2024

    Décembre 20/12/2024
    Je n'aimerai pas recopier 12 x Madate.

    Si quelqu'un avait une solution plus restreinte, merci d'avance.

    @+,

    cincap

  2. #2
    Expert éminent sénior
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 112
    Points : 16 645
    Points
    16 645
    Par défaut
    Salut

    Je n'aimerai pas recopier 12 x Madate.
    Étant donné que le jour de chaque mois n'est pas le même, impossible de faire autrement.
    Ou du moins peut être de cette façon
    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
    dim lecture
     
    Set lecture=CreateObject("sapi.spvoice")
    lecture.rate=1
     
    dim MesDate(12),TheMois
     
    For t = 1 to 12
            select case t
                    Case 12: MesDate(t) = DateSerial(2024,int(t),20)
                    Case 3,6: MesDate(t) = DateSerial(2024,int(t),21)
                    case 2,11: MesDate(t) = DateSerial(2024,int(t),22)
                    case 4,5,8: MesDate(t) = DateSerial(2024,int(t),23)
                    Case 1,7,10: MesDate(t) = DateSerial(2024,int(t),24)
            end select
    next
     
    'exemple d'utilisation pour le mois en cours
    TheMois = Month(Now)
    lecture.speak "Plus que " & DateDiff("d",now,MesDate(TheMois)) & " Jours"  & vbCrlf & " Avant le " & MesDate(TheMois)

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 468
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 468
    Points : 1 342
    Points
    1 342
    Par défaut
    @ ProgElect, Merci pour ta solution, chapeau bas et astucieux du 1er coup cela fonctionne.

    Certainement en 2025 je devrai peut-être modifier un peu car ce n'est jamais le même jour le même mois.

    J'avais fait le test avec un tableau en Delphi et cela fonctionnait aussi

    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
     public
        { Déclarations publiques }
         DatesLimite: array [1..12] of TDateTime;
      end;
     
    procedure TForm1.InitializeDatesLimite;
    begin
     
      DatesLimite[1] := EncodeDate(2024, 1, 24);
      DatesLimite[2] := EncodeDate(2024, 2, 22);
      DatesLimite[3] := EncodeDate(2024, 3, 21);
      DatesLimite[4] := EncodeDate(2024, 4, 23);
      DatesLimite[5] := EncodeDate(2024, 5, 23);
      DatesLimite[6] := EncodeDate(2024, 6, 21);
      DatesLimite[7] := EncodeDate(2024, 7, 24);
      DatesLimite[8] := EncodeDate(2024, 8, 23);
      DatesLimite[9] := EncodeDate(2024, 9, 23);
      DatesLimite[10] := EncodeDate(2024, 10, 24);
      DatesLimite[11] := EncodeDate(2024, 11, 22);
      DatesLimite[12] := EncodeDate(2024, 12, 20);
     
    end;
    Encore merci, je peux continuer mes tests

    @+,

    cincap

  4. #4
    Expert éminent sénior
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 112
    Points : 16 645
    Points
    16 645
    Par défaut
    Salut

    Complément pour toutes situations dans l'année 2024
    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
    dim lecture
     
    Set lecture=CreateObject("sapi.spvoice")
    lecture.rate=1
     
    dim MesDate(12),TheMois,DatePension,DateCeJour
     
    For t = 1 to 12
            select case t
                    Case 12: MesDate(t) = DateSerial(2024,int(t),20)
                    Case 3,6: MesDate(t) = DateSerial(2024,int(t),21)
                    case 2,11: MesDate(t) = DateSerial(2024,int(t),22)
                    case 4,5,8: MesDate(t) = DateSerial(2024,int(t),23)
                    Case 1,7,10: MesDate(t) = DateSerial(2024,int(t),24)
            end select
    next
     
    'exemples d'utilisation
    DateCeJour = Now                                'date du jours
    'DateCeJour = cdate("29/02/2024")          'date quelque jours après échéance du mois en cours
    'DateCeJour = cdate("29/12/2024")          'date au delà de l'année 2024
    TheMois = Month(DateCeJour)
    if DateCeJour > MesDate(TheMois) then
            TheMois = TheMois + 1
            if TheMois > 12 then
                    lecture.speak "Je ne sais pas faire le calcul au delà de l'année 2024"
                    WScript.Quit
            end if
    end if
    DatePension = MesDate(TheMois)
     
    if DateCeJour = DatePension then
            lecture.speak "Les sousous arrive aujourd'hui"
    else
            lecture.speak "Plus que " & DateDiff("d",DateCeJour,DatePension) & " Jours"  & vbCrlf &_
            " Avant le " & DatePension
    end if
    Mettre en commentaire, à tour de rôle, les lignes 19, 20 et 21
    Au final, seules les lignes 20 et 21 doivent être mises en commentaire.

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 344
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 344
    Points : 1 961
    Points
    1 961
    Par défaut
    Il me semble plus simple pour les mises à jour, d'avoir les 12 lignes pour les 12 mois.
    Une amélioration sera peut-être d'avoir un fichier texte (par an par exemple) à côté du script, dans lequel se trouverait les dates (façon csv).
    Le script lirait et chargerait les dates depuis le fichier selon l'année en cours (que l'on récupèrerait par Year(Now) )

  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 468
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 468
    Points : 1 342
    Points
    1 342
    Par défaut
    Bonjour à toutes et à tous,

    @ ProgElect, merci pour ta suggestion (j'ai rit avec les sousous) mais les dates de payement ne changent parfois que d'un jour lors d'une nouvelle année.

    Ex: en 2022 en octobre c'était le 24/10/2022 (la même qu'en 2024) et en novembre c'était le 23/11/2022 et en décembre le 21/12/2022.

    Sinon l'idée de umfred que je remercie me parait intéressante.

    Tant que l'on y est, j'ai remarqué dans un message box :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    inputbox("Comment vas tu ?","Selection") je ne sais pas mettre le caractère é
    Dans un fichier .bat c'est possible (chcp 65001 > nul).

    Modification !

    Désolé, voici mon texte résolu il y a peut-être mieux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     testX = inputbox("Comment vas tu ?","S"& chr(233) &"lection")
    Merci pour tous vos commentaires,

    @+,

    cincap

  7. #7
    Membre chevronné
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 344
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 344
    Points : 1 961
    Points
    1 961
    Par défaut
    Je pense que ton histoire de "é" c'est un problème d'encodage de ton ficher vbs, selon qu'il est enregistré en ANSI ou en UTF8

  8. #8
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 468
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 468
    Points : 1 342
    Points
    1 342
    Par défaut
    Bonjour à toutes et à tous,

    @ umfred, tu as raison je n'y avais pas fais attention, je l'ai réencodé en Ansi mais il faudra peut être que je modifie dans RegEdit.

    Au fait pour le calcul de jours avant le payement de la pension, début d'année je vais sur le site des pensions et je copie les dates.

    https://www.sfpd.fgov.be/fr/paiement/date-de-paiement.

    Fichier .txt que je crée car en janvier 2024 sur le site il laisse décembre 2023 :

    Janvier 24/01/2024

    Février 22/02/2024

    Mars 21/03/2024

    etc.
    Comment ferais tu pour avec le code proposé par ProgElect pour charger le fichier texte avec les dates au démarrage du .vbs ?

    J'ai essayé mais toujours un petit débutant !

    @+,

    cincap

  9. #9
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 468
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 468
    Points : 1 342
    Points
    1 342
    Par défaut
    Voila en testant je charge mon fichier avec les dates pour lecture, j'ai enlevé le nom des mois à cause des caractères :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Const ForReading = 1, ForWriting = 2  
    Dim oFso, f 
     
    Set oFso = CreateObject("Scripting.FileSystemObject") 
    Set f = oFso.OpenTextFile("Payement pension_2024.txt", ForReading) 
    while Not f.AtEndOfStream  
    wscript.echo f.ReadLine 
    Wend 
    f.Close
    Reste plus qu'à l'adapter mais....

    @+,

    cincap

  10. #10
    Membre chevronné
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 344
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 344
    Points : 1 961
    Points
    1 961
    Par défaut
    Tu n'as pas besoin de préfixer les dates par le mois
    Code fichier.txt : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    24/01/2024
    22/02/2024
    21/03/2024
    ..
    20/12/2024

    Pour la lecture et charger le tableau des dates (en reprenant ton code)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Const ForReading = 1, ForWriting = 2  
    Dim oFso, f 
    Dim i 
    Dim MesDates(1 to 12)
     
    Set oFso = CreateObject("Scripting.FileSystemObject") 
    Set f = oFso.OpenTextFile("Payement pension_2024.txt", ForReading) 
     
    i=1
    while Not f.AtEndOfStream  And i <=12
        MesDates(i)=CDate(f.ReadLine)
        i=i+1
    Wend 
    f.Close

  11. #11
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 468
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 468
    Points : 1 342
    Points
    1 342
    Par défaut
    @ umfred, merci pour ta suggestion, j'ai une erreur à la ligne 4 "Dim Mesdates(1 to 12).

    A réfléchir, j'aurai plus facile de modifier le fichier .vbs lors du passage d'une année.

    Merci à tous.

    @+,

    cincap

  12. #12
    Membre chevronné
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 344
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 344
    Points : 1 961
    Points
    1 961
    Par défaut
    c'est une façon d'écrire que les indices du tableau vont de 1 à 12 (c'est du VB, mais bon ça ne semble pas fonctionner en VBS (je pratique peu le VBS)); donc juste mettre MesDates(12) comme ça avait été écrit précédemment.

    Après, ce n'était qu'une proposition. Dans tous les cas, il faudra faire une mise à jour des date;
    (sauf si il était possible d'interroger le site via une API par exemple, ou un peu plus compliqué en faisant du web scrapping (récupérer l'info directement sur la page web du site))

  13. #13
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 468
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 468
    Points : 1 342
    Points
    1 342
    Par défaut
    Bonjour à toutes et à tous,

    Avec mon test et fichier ini extérieur, j'obtiens un faux calcul :

    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
    Const ForReading = 1
     
    Dim oFso, f
     
    Dim lecture
     
    Set lecture=CreateObject("sapi.spvoice")
    lecture.rate=1
     
    'Pour 2024 
    dim MesDate(12),TheMois
     
    Set oFso = CreateObject("Scripting.FileSystemObject")
    Set f = oFso.OpenTextFile("Test vbs_2.ini", ForReading)
    ln=-1
    cl=0
    'Wend
    f.Close
     
     'end select
    'next
     
    'exemple d'utilisation pour le mois en cours
    TheMois = Month(Now)
    lecture.speak "Plus que " & DateDiff("d",now,MesDate(TheMois)) & " Jours"  & vbCrlf & " Avant de toucher ma pension"
    Mon fichier .ini :

    For t = 1 to 12
    select case t
    Case 12: MesDate(t) = DateSerial(2024,int(t),20)
    Case 3,6: MesDate(t) = DateSerial(2024,int(t),21)
    case 2,11: MesDate(t) = DateSerial(2024,int(t),22)
    case 4,5,8: MesDate(t) = DateSerial(2024,int(t),23)
    Case 1,7,10: MesDate(t) = DateSerial(2024,int(t),24)
    Ou est mon erreur ?

    Merci d'avance, je vais aussi tester en Delphi.

    @+,

    cincap

  14. #14
    Membre chevronné
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 344
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 344
    Points : 1 961
    Points
    1 961
    Par défaut
    Euh, un fichier ini n'est pas un script;
    Ici en plus, tu ne fais juste que l'ouvrir (ouvrir ne veut pas dire exécuter, mais comme j'ai dit un fichier ini n'est pas exécutable) puis le fermer sans rien en faire ....
    Donc MesDates est vide (0 pour tous ces indices) et donc cela correspond au 30/12/1899 (c'est la date que me retourne VBA);
    Et donc finalement, la valeur renvoyée est correcte en prenant en compte ceci (-45343 jours).

    Ps: sauf erreur de copier/coller, il manquerait aussi les fin de Select et de For

  15. #15
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 468
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 468
    Points : 1 342
    Points
    1 342
    Par défaut
    Bonjour à toutes et à tous,

    Voila après mes soins je suis à nouveau dispo et j'ai remanié mon application en chargeant un fichier .txt contenant les dates de payement.

    Fichier Dates.txt :

    24/01/2024
    22/02/2024
    21/03/2024
    23/04/2024
    23/05/2024
    21/06/2024
    24/07/2024
    23/08/2024
    23/09/2024
    24/10/2024
    22/11/2024
    20/12/2024
    Code 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
    procedure TForm1.ChargerDatesDepuisFichier(const NomFichier: string);
    var
      Fichier: TStringList;
      i: Integer;
    begin
      Fichier := TStringList.Create;
      try
        Fichier.LoadFromFile(NomFichier);
        for i := 0 to Fichier.Count - 1 do
        begin
          try
            DatesLimite[i + 1] := StrToDate(Fichier[i]);
          except
            on E: Exception do
            begin
              ShowMessage(Format('Erreur de conversion de date à la ligne %d : %s', [i + 1, E.Message]));
            end;
          end;
        end;
      finally
        Fichier.Free;
      end;
    end;
     
    procedure TForm1.BcalculClick(Sender: TObject);
    var
      MoisEnCours: Integer;
      JoursRestants: Integer;
     
    begin
     
      // Charger les dates depuis le fichier
      ChargerDatesDepuisFichier(chappli + 'dates.txt'); //
     
      MoisEnCours := MonthOf(Now);
     
      if (MoisEnCours >= 1) and (MoisEnCours <= 12) then
      begin
     
        JoursRestants := DaysBetween(Now, DatesLimite[MoisEnCours])+1;
     
        Edcalcul.Text := (Format('Il reste %d jours jusqu''au %s.', [JoursRestants, DateToStr(DatesLimite[MoisEnCours])]));
     
        end
      else
      begin
        Edcalcul.Text := ('Le mois en cours n''est pas valide.');
      end;
      end;
    Cela fonctionne bien pour les jours (restant) donc antérieur à la date du payement et j'aurai bien voulu ajouter deux messages.

    un pour le jour de payement et un pour le dépassement du jour de payement.

    Si quelqu'un avait une idée merci d'avance.

    @+,

    cincap

  16. #16
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 468
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 468
    Points : 1 342
    Points
    1 342
    Par défaut
    @ Tous oups trompé de site.

    Excuses.

    @+,

    cincap

  17. #17
    Membre chevronné
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 344
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 344
    Points : 1 961
    Points
    1 961
    Par défaut
    Il suffit de rajouter et gérer les conditions qui vont bien (que ce soit en delphi en vbscript)

Discussions similaires

  1. [AC-2010] Comment bloquer un matériel loué entre deux dates ?
    Par Founi84 dans le forum Modélisation
    Réponses: 13
    Dernier message: 02/04/2015, 12h41
  2. [SPS07] Comment faire un filtre entre deux dates ?
    Par Tybo34 dans le forum Développement Sharepoint
    Réponses: 11
    Dernier message: 23/07/2010, 10h42
  3. Réponses: 2
    Dernier message: 29/05/2006, 20h16
  4. Comment obtenir la différence entre deux dates ?
    Par jbat dans le forum Langage
    Réponses: 4
    Dernier message: 02/06/2005, 10h34
  5. comment obtenir l’intervalle de mois entre deux date
    Par looc 6699 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 23/02/2005, 12h08

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