Donnez vie à vos documents numériques !
 

Calcul jours ouvrés entre deux dates. – RÉSOLU

abracadabraPDF Forums PDF – Général Calcul jours ouvrés entre deux dates. – RÉSOLU

  • Ce sujet est vide.
  • Créateur
    Sujet
  • #44179
    RafaelLopes
    Membre

    [Edit du modo : les sujets ont été déplacés et ré-ordonnés, ce sujet fait suite à celui-ci : http://abracadabrapdf.net/forum/index.php/topic,1624.0.html ]

    Bonjour,

    @ Merlin: j’avais déjà essayé, maintenant à la place d’avoir 1,89 par exemple j’ai… 1,00 ^^’
    Voici un bout de mon script si ça peut vous aider:
    function coefficient()
    {
    if( (r==”Non”) && (a==”ADECCO”) && (s{
    this.getField(“coefficient”).value=1.89;
    }
    if( (r==”Non”) && (a==”ADECCO”) && (s>>12,03) )
    {
    this.getField(“coefficient”).value=1,92;
    }}

    @alex même si ça ne gère pas les jours fériés je suis preneur. A vrai dire même si cela ne se voit pas au vu de toute l’aide que je vous demande, j’ai de bonnes connaissances dans d’autres langages comme le PHP par exemple, je pense que j’arriverai à modifier ton code tout seul. Le problème que je rencontre à chaque fois sur ce formulaire vient du fait que je ne connais pas vraiment le JavaScript, du coup je ne connais pas la syntaxe à utiliser(j’ai donc beaucoup de mal à me lancer) même si je comprend la logique.
    Merci à vous deux, vous me sauvez vraiment.  :Smiley08:

    Merci.

Affichage de 11 réponses de 1 à 11 (sur un total de 11)
  • Auteur
    Réponses
  • #53060
    alex
    Participant

    Voir maquette jointe:
    La saisie et l’affichage des nombres décimaux se fait dans le format du champ (ici S et coefficient).
    La définition de paramètres numériques décimaux dans un script se fait en séparant la partie entière de la partie décimale par un point.
    Les comparaisons de chaînes de caractères prennent en compte la casse (“Non” n’est pas “NON”).

    Pour le calcul des nombres de jours ouvrés, j’ai un script Php que je vais convertir en JavaScript. Pas aujourd’hui.

    A+

    [attachment deleted by admin]

    #53061
    RafaelLopes
    Membre

    Que je suis bête !
    J’avais pensé a essayer de mettre un point à la place d’une virgule dans le résultat mais pas dans la condition de mon if … Pardon  :Smiley05:
    voila une chose de réglée.
    Concernant la date j’ai un peu avancé, je n’arrivais pas à récupérer et exploiter la date d’un champ au format Date. J’ai donc créé 3 champs alignés et je les ai utilisé dans les scripts suivant, maintenant cela calcule correctement le nombre de jours entre deux dates(pour l’instant ça ne tient pas compte des weekend et fériés).
    Voila mes scripts :

    function joursOuvres()
    {
    var Date1 = new Date(this.getField(“dA”).value,this.getField(“dM”).value-1,this.getField(“dJ”).value);
    var Date2 = new Date(this.getField(“fA”).value,this.getField(“fM”).value-1,this.getField(“fJ”).value);

    this.getField(“jO”).value=diffDate(Date1,Date2);
    }

    function diffDate(d1,d2)
    {
    var diff = d2.getTime() – d1.getTime();
    return Math.ceil(diff/(1000*60*60*24));
    }
    Merci beaucoup pour ton aide alex.

    #53062
    RafaelLopes
    Membre

    @alex : pas besoin pour la conversion du script, j’arrive à m’en sortir tout seul, j’aurai fini ça ce soir normalement et je pourrais donc le poster ici pour aider ceux qui peuvent en avoir besoin dans le futur. Merci quand même !

    Voilà où j’en suis pour le moment, me manque plus que la gestion des fériés.

    function joursOuvres()
    {
    var Date1 = new Date(this.getField(“dA”).value,this.getField(“dM”).value-1,this.getField(“dJ”).value);
    var Date2 = new Date(this.getField(“fA”).value,this.getField(“fM”).value-1,this.getField(“fJ”).value);
    var Date0= new Date(2000, 00, 03); /* Lundi de référence */

    index=1;

    var Date11=Date1.getTime();
    var Date22=Date2.getTime();
    var Date00=Date0.getTime();

    if(Date00{
      for(i=Date00; i  {
          if(index<7)
          {
          index+=1;
          }
          else if(index>6)
          {
          index=1;
          }
      }

    this.getField(“jO”).value=0;

      for(i=Date11; i  {
          if(index      {
          this.getField(“jO”).value+=1;
          index+=1;
          }
          else if(index<7)
          {
          index+=1;
          }
          else if(index>6)
          {
          index=1;
          }
      }
    }
    }

    #53063
    alex
    Participant

    Oui, c’est bon mais assez compliqué pour gérer les jours fériés par la suite.
    J’aurais fait défiler les jours entre les deux dates et utilisé .getDay() pour récupérer la valeur du jour de la semaine pour la date courante (L’objet retourné est un entier qui correspond au jour de la semaine.. 0: dimanche 1: lundi …), comparé chaque date courante avec une table des jours fériés et ainsi obtenu un résultat exact (au moins dans un pays donné). Qu’en penses-tu ?
    Merlin, ce serait mieux d’ouvrir un nouveau fil car nous sommes hors sujet !

    [Edit du modo : les sujets ont été déplacés et ré-ordonnés)

    #53064
    RafaelLopes
    Membre

    Bonjour,
    J’ouvre un nouveau sujet concernant cette question bien qu’il en à déjà été discuté sur le topic suivant : http://abracadabrapdf.net/forum/index.php/topic,1624.0.html
    [Edit du modo : les sujets ont été déplacés et ré-ordonnés)

    Voila mon script fait maison permettant de calculer le nombre de jours ouvrés entre deux dates. Pour l’instant il ne gère pas les jours fériés qui changent de dates chaque année(type Paques).

    function joursOuvres()
    {
    var Date1 = new Date(this.getField(“dA”).value,this.getField(“dM”).value-1,this.getField(“dJ”).value); /* récupération du jours, mois et année dans les champs correspondant */
    var Date2 = new Date(this.getField(“fA”).value,this.getField(“fM”).value-1,this.getField(“fJ”).value);
    var Date0= new Date(2000, 00, 03); /* Lundi de référence qui permettra de connaitre le jour de la date de départ */
    var diffA=this.getField(“fA”).value-this.getField(“dA”).value; /* calcule la différence d’années entre la date de départ et la date de fin, cette variable sera ensuite utilisée pour “générer” les jours fériés de chaque année. */

    ferie= new Array();
    for(j=0; j{
    ferie[j]= new Array();
    ferie[j][0]= new Date(this.getField(“dA”).value+j, 0, 1).getTime();
    ferie[j][1]= new Date(this.getField(“dA”).value+j, 4, 1).getTime();
    ferie[j][2]= new Date(this.getField(“dA”).value+j, 4, 8).getTime();
    ferie[j][3]= new Date(this.getField(“dA”).value+j, 6, 14).getTime();
    ferie[j][4]= new Date(this.getField(“dA”).value+j, 7, 15).getTime();
    ferie[j][5]= new Date(this.getField(“dA”).value+j, 10, 1).getTime();
    ferie[j][6]= new Date(this.getField(“dA”).value+j, 10, 11).getTime();
    ferie[j][7]= new Date(this.getField(“dA”).value+j, 11, 25).getTime();
    } /* création des jours fériés dans des tableaux imbriqués */

    index=1; /* initialisation de l’index(jour actuel), index=1 signifie qu’on est lundi */

    var Date11=Date1.getTime();
    var Date22=Date2.getTime();
    var Date00=Date0.getTime(); /* conversion des dates dans un format exploitable */

    if(Date00{
      for(i=Date00; i  {
          if(index<7)
          { index+=1;}
          else if(index>6)
          {
          index=1;
          }
      } */ permet de connaitre le jour de la date de départ */
    var index2=index;
    this.getField(“jO”).value=0;

      for(i=Date11; i  {
          if(index      {
            this.getField(“jO”).value+=1;
            index+=1;
            }

          else if(index<7)
          {
          index+=1;
          }
          else if(index>6)
          {
          index=1;
          }

      } /* calcul des jouurs hors weekend */

    for(i=Date11; i  {
    if(index2 {
    for(j=0; j { for(g=0; g {if(i==ferie[j][g])
    {this.getField(“jO”).value-=1;}
    }}
    index2+=1;
    }
    else if(index2<7){index2+=1;}
    else if(index2>6){ index2=1;}
    } /* on soustrait les jours féries entre les deux dates au nombre de jours ouvres, seulement s’ils sont dans la semaine */
    }

    }

    Voilà où j’en suis, j’étais persuadé que ça marcherait parfaitement, or j’observe des écarts lorsque je fais le calcul sur une année entière. En 2012 j’ai par exemple 258 jours ouvrés alors qu’il y’en a réellement 250. Sachant que je prend pas encore compte dans mon script des jours feries qui change (comme Pacques) je devrais arriver à 255, j’ai donc 5 jours ouvres en trop et je dois admettre que je ne comprend absolument par où se situe le problème, quelqu’un aurait une idée?
    Merci d’avance

    #53065
    Lionel
    Membre

    :PouceHaut: :soleil: :PouceHaut:

    #53066
    RafaelLopes
    Membre

    Voilà j’ai rajouté les 3 jours fériés mobiles (grâce à des formules trouvés dans wikipedia), j’ai de plus vérifié avec toute une panoplie de test que ça me calculait les bon jours et ça marche bien :) cependant … mon problèmé de jours ouvrés “en trop” n’est pas rélgé et en plus de ça, ces 3 derniers jours fériés ne son pas comptés(Why !?), voila mon script:

    /* principe de fonctionnement, on calcule le jour de la semaine de la date de départ, on génère tous les jours fériés des années entre les deux dates, on calcul le nombre de jours hors weekend, on y soustrait les jours fériés hors weekend */
    function joursOuvres()
    {
    var Date1 = new Date(this.getField(“dA”).value,this.getField(“dM”).value-1,this.getField(“dJ”).value);
    var Date2 = new Date(this.getField(“fA”).value,this.getField(“fM”).value-1,this.getField(“fJ”).value);
    var Date0= new Date(2000, 00, 03); /* Lundi de référence */
    var diffA=this.getField(“fA”).value-this.getField(“dA”).value; /* calcule le nombre d’années entre les deux dates pour générer les jours fériés */

    ferie= new Array();
    for(j=0; j{
    ferie[j]= new Array();
    ferie[j][0]= new Date(this.getField(“dA”).value+j, 0, 1).getTime();
    ferie[j][1]= new Date(this.getField(“dA”).value+j, 4, 1).getTime();
    ferie[j][2]= new Date(this.getField(“dA”).value+j, 4, 8).getTime();
    ferie[j][3]= new Date(this.getField(“dA”).value+j, 6, 14).getTime();
    ferie[j][4]= new Date(this.getField(“dA”).value+j, 7, 15).getTime();
    ferie[j][5]= new Date(this.getField(“dA”).value+j, 10, 1).getTime();
    ferie[j][6]= new Date(this.getField(“dA”).value+j, 10, 11).getTime();
    ferie[j][7]= new Date(this.getField(“dA”).value+j, 11, 25).getTime();
    var g = (this.getField(“dA”).value+j) % 19;
    var c = Math.floor((this.getField(“dA”).value+j) / 100);
    var c_4 = Math.floor(c / 4);
    var h = (19 * g + c – c_4 – Math.floor((8 * c + 13) / 25) + 15) % 30;
    var k = Math.floor(h / 28);
    var i = (k * Math.floor(29 / (h + 1)) * Math.floor((21 – g) / 11) – 1) * k + h;
    var jourSemaine = (Math.floor( (this.getField(“dA”).value+j) / 4) +  (this.getField(“dA”).value+j) + i + 2 + c_4 – c) % 7; //jour de Pâques (0=dimanche, 1=lundi….)
    var presJour = 28 + i – jourSemaine;            //Jour de Pâques en jours en partant de 1 = 1er mars
    var moisP=0;
    var jourP=0;
    if(presJour>31) {moisP=3;}
    else{moisP=2;}
    if(mois==2) {jourP=presJour;}
    else{jourP=presJour – 31;}
    var dPacques= new Date(this.getField(“dA”).value+j, moisP, jourP).getTime();
    ferie[j][8]= dPacques+(1000*60*60*24);
    ferie[j][9]= ferie[j][8]+(38*(1000*60*60*24));
    ferie[j][10]=ferie[j][8]+(49*(1000*60*60*24));
    }/* génération des jours fériés, pour Pacques et les 2 autres jours mobiles je me suis servi de formules trouvés sur le net */
    index=1;
    var Date11=Date1.getTime();
    var Date22=Date2.getTime();
    var Date00=Date0.getTime();

    if(Date00{
      for(i=Date00; i  {
          if(index<7)
          { index+=1;}
          else if(index>6)
          {
          index=1;
          }
      }/* permet de savoir le jour de la semaine de la date de départ en se servant du lundi de référence */
    var index2=index;
    this.getField(“jO”).value=0;

      for(i=Date11; i  {
          if(index      {
            this.getField(“jO”).value+=1;
            index+=1;
            }

          else if(index<7)
          {
          index+=1;
          }
          else if(index>6)
          {
          index=1;
          }

      } /* compte le nombre de jours hors weekend entre les deux dates */

    for(i=Date11; i  {
    if(index2 {
    for(j=0; j { for(g=0; g {if(i==ferie[j][g])
    {this.getField(“jO”).value-=1;}
    }}
    index2+=1;
    }
    else if(index2<7){index2+=1;}
    else if(index2>6){ index2=1;}
    }/* exclue les jours fériés hors weekend du nombre de jours hors hors weekend calculé précédemment */
    }

    }

    Du coup théoriquement c’est fini et ça devrait marcher(enfin selon moi  :Smiley08:) … mais en pratique pas vraiment, je me demande bien où est le problème :/

    #53067
    Merlin
    Maître des clés

    Je ne sais pas si ça aidera mais le dernier numéro de Acumen Journal (May 2012 – Issue 64) est justement consacré à “The JavaScript Date Object” :
    http://www.acumentraining.com/acumenjournal.html

    Avec un exemple à la clé :
    http://www.acumentraining.com/ResourcesPage/DataObject.pdf.zip

    :idee:

    #53068
    RafaelLopes
    Membre

    Merci merlin mais ça ne m’aide pas pour le problème actuel(mais merci quand même ! )
    Bon je fais de nombreux test, j’me suis mis sur un nouveau document pdf pour que ce soit plus clair et j’essaye de faire plein de tests. Je met le PDF en pièce jointe pour que vous puissiez voir de quoi je parle !
    ainsi que le code de ce document :

    /* principe de fonctionnement, on calcule le jour de la semaine de la date de départ, on génère tous les jours fériés des années entre les deux dates, on calcul le nombre de jours hors weekend, on y soustrait les jours fériés hors weekend */
    function joursOuvres()
    {
    var Date1 = new Date(this.getField(“dA”).value,this.getField(“dM”).value-1,this.getField(“dJ”).value);
    var Date2 = new Date(this.getField(“fA”).value,this.getField(“fM”).value-1,this.getField(“fJ”).value);
    var Date0= new Date(2000, 00, 03); /* Lundi de référence */
    var diffA=this.getField(“fA”).value-this.getField(“dA”).value; /* calcule le nombre d’années entre les deux dates pour générer les jours fériés */

    ferie= new Array();
    for(q=0; q{
    ferie[q]= new Array();
    ferie[q][0]= new Date(this.getField(“dA”).value+q, 0, 1).getTime();
    ferie[q][1]= new Date(this.getField(“dA”).value+q, 4, 1).getTime();
    ferie[q][2]= new Date(this.getField(“dA”).value+q, 4, 8).getTime();
    ferie[q][3]= new Date(this.getField(“dA”).value+q, 6, 14).getTime();
    ferie[q][4]= new Date(this.getField(“dA”).value+q, 7, 15).getTime();
    ferie[q][5]= new Date(this.getField(“dA”).value+q, 10, 1).getTime();
    ferie[q][6]= new Date(this.getField(“dA”).value+q, 10, 11).getTime();
    ferie[q][7]= new Date(this.getField(“dA”).value+q, 11, 25).getTime();
    var g = (this.getField(“dA”).value+q) % 19;
    var c = Math.floor((this.getField(“dA”).value+q) / 100);
    var c_4 = Math.floor(c / 4);
    var h = (19 * g + c – c_4 – Math.floor((8 * c + 13) / 25) + 15) % 30;
    var k = Math.floor(h / 28);
    var i = (k * Math.floor(29 / (h + 1)) * Math.floor((21 – g) / 11) – 1) * k + h;
    var jourSemaine = (Math.floor( (this.getField(“dA”).value+q) / 4) + (this.getField(“dA”).value+q) + i + 2 + c_4 – c) % 7; //jour de Pâques (0=dimanche, 1=lundi….)
    var presJour = 28 + i – jourSemaine; //Jour de Pâques en jours en partant de 1 = 1er mars
    var moisP=0;
    var jourP=0;
    if(presJour>31) {moisP=3;}
    else{moisP=2;}
    if(mois==2) {jourP=presJour;}
    else{jourP=presJour – 31;}
    var dPacques= new Date(this.getField(“dA”).value+q, moisP, jourP).getTime();
    ferie[q][8]= dPacques+(1000*60*60*24);
    ferie[q][9]= ferie[q][8]+(38*(1000*60*60*24));
    ferie[q][10]=ferie[q][8]+(49*(1000*60*60*24));
    }/* génération des jours fériés, pour Pacques et les 2 autres jours mobiles je me suis servi de formules trouvés sur le net */
    index=1;
    var Date11=Date1.getTime();
    var Date22=Date2.getTime();
    var Date00=Date0.getTime();

    if(Date00{
    for(m=Date00; m{
    if(index<7)
    { index+=1;}
    else if(index>6)
    {
    index=1;
    }
    }/* permet de savoir le jour de la semaine de la date de départ en se servant du lundi de référence */
    var index2=index;
    this.getField(“jO”).value=0; /* Nombre de jours ouvres */
    this.getField(“nbrJT”).value=0; /* ombre total de jours */
    this.getField(“nbrF”).value=0; /* nombre de feries EN SEMAINE */
    this.getField(“nbrJWE”).value=0; /* nombre de jours de week-end */

    for(n=Date11; n{
    this.getField(“nbrJT”).value+=1;
    if(index{
    this.getField(“jO”).value+=1;
    index+=1;
    }

    else if(index<7)
    {
    index+=1;
    this.getField(“nbrJWE”).value+=1;
    }
    else if(index>6)
    {
    index=1;
    this.getField(“nbrJWE”).value+=1;
    }

    } /* compte le nombre de jours hors weekend entre les deux dates */

    for(o=Date11; o{
    if(index2{
    for(j=0; j{ for(g=0; g{if(o==ferie[j][g])
    {this.getField(“jO”).value-=1;
      this.getField(“nbrF”).value+=1;}
    }}
    index2+=1;
    }
    else if(index2<7){index2+=1;}
    else if(index2>6){ index2=1;}
    } /* exclue les jours fériés hors weekend du nombre de jours hors hors weekend calculé précédemment */
    }

    }

    pour toute l’année 2012 j’ai donc 366 Jours (ça c’est bon =D ), 259 jours ouvres(à la place de 253), 3 jours feries en semaine(à la place de 8!!!) et 104jours de weekend(à la place de 105) !

    [attachment deleted by admin]

    #53069
    Merlin
    Maître des clés

    Je met le PDF en pièce jointe pour que vous puissiez voir de quoi je parle !

    Ca ne fonctionne pas…
    :Smiley02:

    Je cite la console :
    ReferenceError: mois is not defined
    34:AcroForm:validation:Annot1:MouseUp:Action1

    :Euuuh:

    #53070
    RafaelLopes
    Membre

    Oui Merlin je viens de voir, sur Foxit Reader ça marche parfaitement tandis que sur Acrobat reader ca ne marche pas du tout… Je ne sais pas vraiment pourquoi, désolé  :Smiley02:
    Concernant mon script… ça marche, j’ai réglé mon problème!
    Je crois que le soucis venait du fait que je ne compares pas des dates au formats standard mais un nombre de millisecondes écoulées depuis le 1er janvier 1970… Ce qui veut dire que mon script interprétait le 1er janvier 2012 différemment en fonction de l’heure. Pour m’assurer que le problème venait pas de choses comme le décalage horaire ou encore les changements d’heures, j’ai décidé de passer par la fonction Date.UTC pour que ce soit plus fiable et tout marche nickel :D
    Je met le code pour les intéressés(que j’ai grandement allégé et optimisé en passant !)

    /* principe de fonctionnement, on calcule le jour de la semaine de la date de départ, on génère tous les jours fériés des années entre les deux dates, on calcul le nombre de jours hors weekend, on y soustrait les jours fériés hors weekend */
    function joursOuvres()
    {
    var Date1 = new Date(this.getField(“dA”).value,this.getField(“dM”).value-1,this.getField(“dJ”).value);
    var Date2 = new Date(this.getField(“fA”).value,this.getField(“fM”).value-1,this.getField(“fJ”).value);
    var diffA=this.getField(“fA”).value-this.getField(“dA”).value; /* calcule le nombre d’années entre les deux dates pour générer les jours fériés */

    Dateuh= new Array();
    ferie= new Array();
    for(var q=0; q{
    ferie[q]= new Array();
    ferie[q][0]= Date.UTC(this.getField(“dA”).value+q, 0, 1);
    ferie[q][1]= Date.UTC(this.getField(“dA”).value+q, 4, 1);
    ferie[q][2]= Date.UTC(this.getField(“dA”).value+q, 4, 8);
    ferie[q][3]= Date.UTC(this.getField(“dA”).value+q, 6, 14);
    ferie[q][4]= Date.UTC(this.getField(“dA”).value+q, 7, 15);
    ferie[q][5]= Date.UTC(this.getField(“dA”).value+q, 10, 1);
    ferie[q][6]= Date.UTC(this.getField(“dA”).value+q, 10, 11);
    ferie[q][7]= Date.UTC(this.getField(“dA”).value+q, 11, 25);
    var G = (this.getField(“dA”).value+q)%19;
    var C = Math.floor((this.getField(“dA”).value+q)/100);
    var H = (C – Math.floor(C/4) – Math.floor((8*C+13)/25) + 19*G + 15)%30;
    var I = H – Math.floor(H/28)*(1 – Math.floor(H/28)*Math.floor(29/(H + 1))*Math.floor((21 – G)/11));
    var J = ((this.getField(“dA”).value+q)*1 + Math.floor((this.getField(“dA”).value+q)/4) + I + 2 – C + Math.floor(C/4))%7;
    var L = I – J;
    var MoisPaques = 3 + Math.floor((L + 40)/44);
    var JourPaques = L + 28 – 31*Math.floor(MoisPaques/4);
    var dPaques = Date.UTC((this.getField(“dA”).value+q), MoisPaques-1, JourPaques);
    ferie[q][8]= dPaques+(1000*60*60*24);
    ferie[q][9]= ferie[q][8]+(38*(1000*60*60*24));
    ferie[q][10]= ferie[q][8]+(49*(1000*60*60*24));
    }/* génération des jours fériés*/
    var Date11= Date.UTC(this.getField(“dA”).value,this.getField(“dM”).value-1,this.getField(“dJ”).value)
    var Date22= Date.UTC(this.getField(“fA”).value,this.getField(“fM”).value-1,this.getField(“fJ”).value);

    this.getField(“jO”).value=0;
    this.getField(“listeFeries”).clearItems();
    var index=Date1.getDay();
    var Dateuh2=0;

    for(var n=Date11; n{
    if((index>0) && (index<6))
    {
    for(var j=0; j{ for(var g=0; g{
    if(n==ferie[j][g])
    {
    Dateuh[Dateuh2]= new Date();
    Dateuh[Dateuh2].setTime(n);
    this.getField(“listeFeries”).insertItemAt(Dateuh[Dateuh2]);
    Dateuh2+=1;
    }}}
    this.getField(“jO”).value+=1;
    index+=1;
    }

    else if(index>5)
    {
    index=0;
    }
    else if(index<1)
    {
    index+=1;
    }

    }
    var nbrItems=this.getField(“listeFeries”).numItems;
    this.getField(“jO”).value=this.getField(“jO”).value-nbrItems;

    }

    Merci à vous pour votre aide !
    Cordialement,
    Rafaël Lopes

Affichage de 11 réponses de 1 à 11 (sur un total de 11)
  • Vous devez être connecté pour répondre à ce sujet.