Javascript: probleme avec Split: [Résolu]

Signaler
Messages postés
12
Date d'inscription
mercredi 29 avril 2009
Statut
Membre
Dernière intervention
20 mars 2015
-
Messages postés
4933
Date d'inscription
samedi 1 juillet 2006
Statut
Membre
Dernière intervention
2 février 2015
-
Bonjour,
Je developpe actuellement un intranet soushtml,css php,sql et javascript pour permettre aux employés de saisir leurs demandes de congé.
J'ai longtemps cherché sur internet et sur ce site mais je n'ai pas trouvé la solution à un problème:
Lorsqu'une personne pose un congé elle met une date de debut, une date de fin et un nombre de jour.
Si la personne clique sur la case nombre de jours je lance un script :
Test(dateDebut,dateFin,nbJours,demiDebut,demiFin).
Ce script verifie que l'utilisateur a rempli le champ dateDebut puis dateFin.
Ensuite il verifie que dateDebut < dateFin.
Apres, il calcule le nombre de jours et l'affiche.

Dans mon formulaire j'ai plusieurs lignes. La ligne contient dateDebuti,dateFin et nbJoursi que je passe en paramettre a ma fonction (idem pour demidebut et demifin).

Si la personne rentre des parametres corrects et clique sur nbJours, le script fonctionne tres bien et affiche le nombre de jours.
Sinon, il affiche a l'utilisateur qu'il s'est trompé.
Le probleme est lorsque, avant de valider mon formulaire, on rempli une deuxieme ligne, lors du clic sur nbJours, rien ne se passe.
J'ai regardé mon code et j'ai remarqué qu'il n'y avait que lorsque mon script utilisait la fonction split que je ne pouvais plus réutiliser mon script dans la page.
controlerDateDebut(dateDebut) et controlerDateFin(dateFin) peuvent etre réutilisé a chaque fois sans aucun probleme, c'est a partir de controlerFinSupDeb(dateFin,dateDebut) que ca ne veut plus etre réutilisé.

Merci d'avance. Rémi

Voici le code javascript:

function Test(dateDebut,dateFin,nbJours,demiDebut,demiFin)
{
   ok = 0;
   if(controlerDateDebut(dateDebut))
   {
      if(controlerDateFin(dateFin))
      {
         if(controlerFinSupDeb(dateFin,dateDebut))
         {
             // je ne l'affiche pas car c'est long et ca bug sans passer par la
         }
         else
         {
            nbJours.value = "deb>fin";
         }
      }
      else
      {
         nbJours.value = "err_fin";
      }
   }
   else
   {
      nbJours.value = "err_deb";
   }
   return true;
}

function controlerFinSupDeb(Fin,Debut)
{
   //reg=new RegExp("[ /]+", "g");
  
   debut = Debut.value.split("/");
   fin = Fin.value.split("/");
   valeurDebut = parseInt(debut[2]+debut[1]+debut[0],10);
   valeurFin = parseInt(fin[2]+fin[1]+fin[0],10);
  
   //valeurFin = fin[0];
   //valeurDebut = debut[0];
  
   //valeurFin = parseInt("12",10);
   //valeurDebut =  parseInt("14",10);
  
   if (valeurFin < valeurDebut)
   {
      val = 0;
   }
   else
   {
      val = 1;
   }
   return val;
}

16 réponses

Messages postés
12
Date d'inscription
mercredi 29 avril 2009
Statut
Membre
Dernière intervention
20 mars 2015

J'ai trouvé l'origine du probleme.
Si vous avez un bug tres bizarre et que vous ne comprenez vraiment pas de quoi ca vient,
que vous ne trouvez rien sur internet,
verifiez que vous n'avez aucune fonction appelée ayant le meme nom qu'une de vos variables !!!!
En effet, dans une des fonctions qui marchait tres bien mon predecesseur appellait une fonction debut
et dans mon code une variable s'appellait debut, donc lors du 2eme appel de la fonction,
si la variable debut avait été utilisée => ca plantait !

Rémi
Messages postés
4933
Date d'inscription
samedi 1 juillet 2006
Statut
Membre
Dernière intervention
2 février 2015
11
Bonjour,
pas tout compris....
tu veux le nombre de jours entre 2 Dates ?
fais une soustraction peut-être ? ( Date en Javascript permet "tout" )

        var dd="23/04/2009";
        var df="29/04/2009";
        var r=new Date(dd) - new Date(df);
        alert( new Date(r).getDate() );

Cordialement [mon Site] [M'écrire] Bul
Messages postés
4933
Date d'inscription
samedi 1 juillet 2006
Statut
Membre
Dernière intervention
2 février 2015
11
erreur de copié/collé !
la date doit être sous la forme aaaa/mm/jj ( par exemple, pas seulement )
et bien entendu date fin  - date début !
le résultat ici est = 7
Messages postés
12
Date d'inscription
mercredi 29 avril 2009
Statut
Membre
Dernière intervention
20 mars 2015

C'est plus compliqué : faut enlever les jours feries et les week end mais tu as raison je me suis mal expliqué. Le probleme n'est pas dans la soustraction

Le probleme a lieu lorsque j'utilise la fonction controlerFinSupDeb(Fin,Debut) une fois
et que je veux la réutiliser pour une autre ligne du formulaire (ca rappelle la fonction test mais avec des parametres différents). Alors que pour la premiere ligne ca marchait, pour la deuxieme ca marche pas
Messages postés
4933
Date d'inscription
samedi 1 juillet 2006
Statut
Membre
Dernière intervention
2 février 2015
11
ah....
et comment est fait l'appel ?
tu as les mêmes name dans le html ?
oui : il faut dire lequel     name_du_champ[index]
non : faut voir l'appel
Messages postés
12
Date d'inscription
mercredi 29 avril 2009
Statut
Membre
Dernière intervention
20 mars 2015

Erf, j'avais mal compris ta réponse.
Tu me propose de supprimer le split et de la remplacer par une soustraction  ?
je vais tester pour voir :)
Messages postés
12
Date d'inscription
mercredi 29 avril 2009
Statut
Membre
Dernière intervention
20 mars 2015

voila l'appel :
// Date de début
      $onfocus = "onFocus="Test(datedebut".$i.",datefin".$i.",nbjours".$i.",demiDebut".$i.",demiFin".$i.")"";
      $onchange  = "onChange="controlerDateDebut(datedebut".$i.")"";
      $datedebut = "";
// Date de fin
      $onchange  = "onChange="controlerDateFin(datefin".$i.")"";
      $datefin   = "";
      
// Nombre de jours
      $onchange  = "onChange="controlerNbJours(nbjours".$i.")"";
      $nbjours   = "";

C'est le on focus de l'input nbjours qui appelle test :)
Je reviens d'ici 2h.
Merci
Rémi
Messages postés
4933
Date d'inscription
samedi 1 juillet 2006
Statut
Membre
Dernière intervention
2 février 2015
11
peut-être pas, si la saisie est jj/mm/aaaa
et new Date accepte 3 paramètres aussi ( et d'autres format de dates )
jour mois an, je ne sais plus dans quel ordre.
Messages postés
4933
Date d'inscription
samedi 1 juillet 2006
Statut
Membre
Dernière intervention
2 février 2015
11
un extrait pas suffisant et surtout du php !
l'élément html généré, résultant est nécessaire !
Messages postés
12
Date d'inscription
mercredi 29 avril 2009
Statut
Membre
Dernière intervention
20 mars 2015

ok des que j'arrive au boulot, j'essaye de poster ce qu'il faut et je ferais aussi qques tests
Messages postés
12
Date d'inscription
mercredi 29 avril 2009
Statut
Membre
Dernière intervention
20 mars 2015

Les champs pour rentrer les données sont les suivants :

<table>

<form method=post name=main action= /CRANET/appli/conges/cg.main.demande.php >
<tr>

  <td class='saisie_date'> <input name=datedebut4 type=text size=14 onChange="controlerDateDebut(datedebut4)"> <a class='calendrier' href='#' onclick='ouvrirCalendrier("datedebut4",calendrierDebut4)'><img src='../include/media/vide.gif'></a> </td>
<td class='saisie_date'> <input name=datefin4 type=text size=14 onChange="controlerDateFin(datefin4)"> <a class='calendrier' href='#' onclick='ouvrirCalendrier("datefin4",calendrierFin4)'><img src='../include/media/vide.gif'></a> </td>
<td rowspan=2 class='nombre'> <input name=nbjours4 type=text size=4 onChange="controlerNbJours(nbjours4)" onFocus="Test(datedebut4,datefin4,nbjours4,demiDebut4,demiFin4)"> </td>
<td rowspan=2> <input name=Ignorer4 type=CHECKBOX value=-1></td>
</tr>
<tr>
<td> <div class='calendrier' id='calendrierDebut4'></div> <input type='radio' name='demiDebut4' value='M' checked> matin<input type='radio' name='demiDebut4' value='A' > après-midi </td>
<td> <div class='calendrier' id='calendrierFin4' ></div> <input type='radio' name='demiFin4' value='M' > matin<input type='radio' name='demiFin4' value='A' checked> après-midi </td>


</tr>
<tr>
<td class='saisie_date'> <input name=datedebut5 type=text size=14 onChange="controlerDateDebut(datedebut5)"> <a class='calendrier' href='#' onclick='ouvrirCalendrier("datedebut5",calendrierDebut5)'><img src='../include/media/vide.gif'></a> </td>
<td class='saisie_date'> <input name=datefin5 type=text size=14 onChange="controlerDateFin(datefin5)"> <a class='calendrier' href='#' onclick='ouvrirCalendrier("datefin5",calendrierFin5)'><img src='../include/media/vide.gif'></a> </td>
<td rowspan=2 class='nombre'> <input name=nbjours5 type=text size=4 onChange="controlerNbJours(nbjours5)" onFocus="Test(datedebut5,datefin5,nbjours5,demiDebut5,demiFin5)"> </td>
<td rowspan=2> <input name=Ignorer5 type=CHECKBOX value=-1></td>



 

<tr>
<td> <div class='calendrier' id='calendrierDebut5'></div> <input type='radio' name='demiDebut5' value='M' checked> matin<input type='radio' name='demiDebut5' value='A' > après-midi </td>
<td> <div class='calendrier' id='calendrierFin5' ></div> <input type='radio' name='demiFin5' value='M' > matin<input type='radio' name='demiFin5' value='A' checked> après-midi </td>


</tr>
<tr>
<td class='saisie_date'> <input name=datedebut6 type=text size=14 onChange="controlerDateDebut(datedebut6)"> <a class='calendrier' href='#' onclick='ouvrirCalendrier("datedebut6",calendrierDebut6)'><img src='../include/media/vide.gif'></a> </td>
<td class='saisie_date'> <input name=datefin6 type=text size=14 onChange="controlerDateFin(datefin6)"> <a class='calendrier' href='#' onclick='ouvrirCalendrier("datefin6",calendrierFin6)'><img src='../include/media/vide.gif'></a> </td>
<td rowspan=2 class='nombre'> <input name=nbjours6 type=text size=4 onChange="controlerNbJours(nbjours6)" onFocus="Test(datedebut6,datefin6,nbjours6,demiDebut6,demiFin6)"> </td>
<td rowspan=2> <input name=Ignorer6 type=CHECKBOX value=-1></td>


</tr>
<tr>
<td> <div class='calendrier' id='calendrierDebut6'></div> <input type='radio' name='demiDebut6' value='M' checked> matin<input type='radio' name='demiDebut6' value='A' > après-midi </td>
<td> <div class='calendrier' id='calendrierFin6' ></div> <input type='radio' name='demiFin6' value='M' > matin<input type='radio' name='demiFin6' value='A' checked> après-midi </td>


</tr>
<!-- Annuler / Valider -->
<tr>
<td id="annuler"> <input id="annuler" type=RESET value=Annuler> </td>
<td id="valider"> <input id="valider" type=SUBMIT value=Valider> </td>
</tr>

</form>
</table>
Messages postés
12
Date d'inscription
mercredi 29 avril 2009
Statut
Membre
Dernière intervention
20 mars 2015

Bon, je viens de faire plusieurs tests :
Quand on a les bons parametres la premiere fois (tous les tests a 1) ca se passe bien (le nbre de jour apparait), 
et lors deuxiemes fois(remplissage d'une autre ligne du formulaire), il appelle quand meme la fonction mais c'est lors du
premier test qu'il s'arrete.

Si la premiere fois,  la date de debut ou la date de fin ne va pas, (je n'arrive donc pas au test d'infériorité)
la deuxieme fois ne rencontre aucun probleme et si les parametres sont bien renseigné, la fois suivante ne marchera pas
Si la date de debut ou la date de fin ne va toujours pas, alors la 3me fois ne rencontre aucun pb etc.
Messages postés
12
Date d'inscription
mercredi 29 avril 2009
Statut
Membre
Dernière intervention
20 mars 2015

C'est bon, ca marche, c'etait une fonction que mon prédécesseur avait mis en début de controlerdatedebut qui ne faisait "QUE" afficher
un message alerte mais seulement quand un parametre etait a 1 .... et pour je sais pas quelle raison, ca faisait planté le programme.
Fonction bizarre=> poubelle
Merci d'avoir essayé de m'aider (surtout que je m'explique tres mal alors faut etre patient avec moi :-/ )


Rémi


ps: désolé a ceux qui viendront dans ce post en espérant trouver un probleme et qui perdront du temps pour rien
Messages postés
4933
Date d'inscription
samedi 1 juillet 2006
Statut
Membre
Dernière intervention
2 février 2015
11
>>verifiez que vous n'avez aucune fonction appelée ayant le meme nom qu'une de vos variables !!!!
ah... problème je dirais classique.
soit je n'ai pas vu dans ce que tu nous donnais et là... navré,
soit on n'avait pas assez de billes
>>désolé a ceux qui viendront dans ce post en espérant trouver un probleme
tu vois que tout sert toujours

nickel si ça baigne et merci du retour.
Messages postés
12
Date d'inscription
mercredi 29 avril 2009
Statut
Membre
Dernière intervention
20 mars 2015

Il te manquait un bout mais ce bout la, il me le manquait aussi en quelque sorte puisque je ne l'avais pas regardé
car ce n'etait pas moi qui l'avait codé et je n'avait pas pensé que d'appeler une variable debut ecrasait la fonction debut.

Rémi
Messages postés
4933
Date d'inscription
samedi 1 juillet 2006
Statut
Membre
Dernière intervention
2 février 2015
11
même en ayant tout, pas simple à détecter ce genre de chose !
le deboggage n'aide pas beaucoup.... me semble-t-il...
faut avoir été pris pour y songer, quand on a épuiser
les autres pistes...