Donnez vie à vos documents numériques !
 

Formulaire avec date calculée en JavaScript

abracadabraPDF Forums PDF – Général Formulaire avec date calculée en JavaScript

Étiqueté : 

  • Créateur
    Sujet
  • #74886
    Nath65
    Participant

    Bonjour,

    Je souhaite réaliser un formulaire qui comporte 2 dates :

    • La date de commande = date du jour modifiable en avant mais bloquée pour les dates antérieurs

    • La date limite de livraison = la date de la commande + 5 jours mais il y a 2 exceptions : si la date de commande est un lundi alors la date limite est le vendredi et si la date de commande est un mardi alors la date limite est le lundi.

    Et-ce possible ? je débute en JavaScript, pouvez-vous m’aider ? D’avance merci de votre réponse.

    Cordialement

    Attachments:
    You must be logged in to view attached files.
Affichage de 16 réponses de 1 à 16 (sur un total de 16)
  • Auteur
    Réponses
  • #74888
    bebarth
    Maître des clés

    bonjour,
    En scripr de validation de ton champ date :
    var jour=["Dimanche","Lundi","Mardi","Mercredi","Jeudi","Vendredi","Samedi"]
    if (event.value!="") {
    var d=util.scand("dd/mm/yyyy",event.value);
    var laDate=d.getTime();
    var aujourdhui=util.scand("dd/mm/yyyy", new Date()).getTime();
    if (laDate>aujourdhui) {
    app.alert("Veuillez indiquer une date antérieure à aujourd'hui.",3);
    event.rc=false;
    } else {
    var jCommande=jour[d.getDay()];
    this.getField("jourCommande").value=jCommande;
    if (d.getDay()==1) var nbJours=4;
    else if (d.getDay()==2) var nbJours=6;
    else var nbJours=5;
    var dateLivraison=laDate+(nbJours*24*3600*1000);
    this.getField("DateLimite").value=new Date(dateLivraison);
    var jLivraison=jour[new Date(dateLivraison).getDay()];
    this.getField("jourLivraison").value=jLivraison;
    }
    }

    @+
    😎

    Attachments:
    You must be logged in to view attached files.
    #74890
    jctremblay
    Participant

    Une date future à aujourd’hui et non pas antérieur. Donc, < et non pas > ici:

    if (laDate<aujourdhui) {
    app.alert("Veuillez indiquer une date future à aujourd'hui.",3);

    #74891
    bebarth
    Maître des clés

    bonjour,
    Oups, j’avais mal lu…

    Donc, < et non pas >

    Ça ne suffit pas dans ce sens là ! Sans indications supplémentaires la valeur de “laDate” est indiquée à minuit pile. Alors que la valeur de “aujourdhui” est indiquée à ‘instant “t”. À moins que l’on remplisse le champ à 0:00 au millième de seconde près, ce qui est peu probable… si “aujourdhui” est aujourd’hui, la valeur “laDate” est toujours inférieure à la valeur “aujourdhui”. 🙂
    Le script est donc à modifier comme suit :
    var jour=["Dimanche","Lundi","Mardi","Mercredi","Jeudi","Vendredi","Samedi"]
    if (event.value!="") {
    var d=util.scand("dd/mm/yyyy",event.value); // valeur donnée à minuit pile
    var laDate=d.getTime()+24*3600*1000;
    var aujourdhui=util.scand("dd/mm/yyyy", new Date()).getTime();
    if (laDate<aujourdhui) {
    app.alert("Veuillez indiquer une date postérieure ou égale à celle d'aujourd'hui.\rou\rVeuillez indiquer une date qui n'est pas antérieure à celle d'aujourd'hui.",3);
    event.rc=false;
    } else {
    var jCommande=jour[d.getDay()];
    this.getField("jourCommande").value=jCommande;
    if (d.getDay()==1) var nbJours=4;
    else if (d.getDay()==2) var nbJours=6;
    else var nbJours=5;
    var dateLivraison=laDate+((nbJours-1)*24*3600*1000); // ...comme on a modifié "laDate"
    this.getField("DateLimite").value=new Date(dateLivraison);
    var jLivraison=jour[new Date(dateLivraison).getDay()];
    this.getField("jourLivraison").value=jLivraison;
    }
    } else {
    this.getField("jourCommande").value="";
    this.getField("DateLimite").value="";
    this.getField("jourLivraison").value="";
    }

    @+
    😎

    Attachments:
    You must be logged in to view attached files.
    #74904
    Nath65
    Participant

    Bonjour et merci beaucoup de votre retour, mais je rencontre un problème que je ne comprends pas, votre fichier fonctionne, bien que je n’arrive pas à comprendre la logique du script. Mais quand j’applique le même script dans mon fichier, les 2 exceptions (commande un lundi ou un mardi) le décalage au vendredi ou lundi pour la date limite ne se fait plus alors que tout est identique…

    D’autre part, je ne souhaite pas avoir de cases jourCommande et jourLivraison mais juste le décalage dans la date pour que la date limite ne soit pas le week-end.

    Pouvez-vous m’aider ? Merci encore.

    #74905
    bebarth
    Maître des clés

    Qu’est-ce qui ne fonctionne pas ?
    Y a-t-il un message dans la console ?
    Si tu ne veux pas ces informations, il faut retirer des lignes du script, ce qui donne :
    var jour=["Dimanche","Lundi","Mardi","Mercredi","Jeudi","Vendredi","Samedi"]
    if (event.value!="") {
    var d=util.scand("dd/mm/yyyy",event.value); // valeur donnée à minuit pile
    var laDate=d.getTime()+24*3600*1000;
    var aujourdhui=util.scand("dd/mm/yyyy", new Date()).getTime();
    if (laDate<aujourdhui) {
    app.alert("Veuillez indiquer une date postérieure ou égale à celle d'aujourd'hui.\rou\rVeuillez indiquer une date qui n'est pas antérieure à celle d'aujourd'hui.",3);
    event.rc=false;
    } else {
    var jCommande=jour[d.getDay()];
    if (d.getDay()==1) var nbJours=4;
    else if (d.getDay()==2) var nbJours=6;
    else var nbJours=5;
    var dateLivraison=laDate+((nbJours-1)*24*3600*1000); // ...comme on a modifié "laDate"
    this.getField("DateLimite").value=new Date(dateLivraison);
    var jLivraison=jour[new Date(dateLivraison).getDay()];
    }
    } else {
    this.getField("DateLimite").value="";
    }

    @+
    😎

    #74908
    jctremblay
    Participant

    C’est amusant comment il y a plusieurs chemin pour obtenir le même résultat avec le JavaScript.
    J’ai réussi à obtenir 3, 4 méthode qui donnes le même résultat. Voici la plus courte.

    if (event.value) {
    var enteredDate = util.scand("dd/mm/yyyy", event.value);
    if (enteredDate >= new Date()) {
    this.getField("DateLimite").value = util.printd("dd/mm/yyyy", new Date(enteredDate.getTime() + ([5,4,6,5,5,5,5][enteredDate.getDay()] * 86400000))
    );
    event.rc = true;
    } else {
    app.alert("La date doit être aujourd'hui ou une date ultérieure.");
    event.rc = false; }
    }

    Attachments:
    You must be logged in to view attached files.
    #74910
    bebarth
    Maître des clés

    La syntaxe est différente, mais le principe est le même !

    @+
    😎

    #74911
    Nath65
    Participant

    Merci  à tous les deux pour votre aide. Je ne comprends pas pourquoi ça ne fonctionne pas dans mon fichier. J’ai toujours 5 jours de plus quelque soit le jour de la semaine. J’essaierai de résoudre le problème lundi matin et je reviendrai vers vous.

    Bon week-end et encore merci

    #74912
    bebarth
    Maître des clés

    Partage ton fichier si cela t’est possible.

    @+
    😎

    #74913
    bebarth
    Maître des clés

    bonjour,

    event.rc = true;

    Juste pour info,  ce n’est pas la peine d’indiquer event.rc = true; car c’est l’état par défaut de la validation si on indique pas event.rc = false;.
    Ça fait une ligne de moins…

    @+
    😎

    #74914
    jctremblay
    Participant

    Juste pour info,  ce n’est pas la peine d’indiquer event.rc = true; car c’est l’état par défaut de la validation si on indique pas event.rc = false;. Ça fait une ligne de moins…

    Donc le event.rc = false; n’est pas nécessaire également?

    #74915
    bebarth
    Maître des clés

    bonjour,

    Donc le event.rc = false; n’est pas nécessaire également?

    Si, quand même ! Il faut bien pouvoir invalider la réponse, et donc conserver l’ancienne valeur. Tu doit par exemple entrer une valeur supérieure à 5. Admettons que l’ancienne valeur était 10, donc correcte et que tu entres un 3.
    Si tu écris ce scrpt :
    if (event.value>5) {
    app.alert("Valeur correcte",3);
    } else {
    app.alert("Valeur incorrect",3);
    }
    Tu auras le message “Valeur incorrecte”, mais la valeur indiquée dans ton champ sera 3, alors que si tu écris :
    if (event.value>5) {
    app.alert("Valeur correcte",3);
    } else {
    event.rc=false;
    app.alert("Valeur incorrect",3);
    }
    Tu auras le même message “Valeur incorrecte”, mais la valeur restera la précédente (donc 10).

    @+
    😎

    #74916
    jctremblay
    Participant

    Ah! Maintenant je saisis… 🙂

    #74925
    Nath65
    Participant

    Bonjour,

    J’ai reconstruit certains champs du formulaire qui semblaient ne plus intégrer les modifications…et cela fonctionne, merci 🙂 . Pour info, j’ai conservé la première syntaxe que je comprends mieux même si c’est plus long. Mais j’ai une nouvelle problématique : j’ai une 3ème case de date qui doit indiquer le début de la période de livraison avec par défaut la date de la commande en automatique et qui doit pouvoir être modifiée manuellement par une date postérieure et bloquée pour les date antérieure à la date de commande. j’espère être claire…

    J’avais le script suivant qui fonctionnait avant que je ne modifie le script de la date de commande et qui ne fonctionne plus…

    var date=util.scand(“dd/mm/yyyy”, this.getField(“StartDate”).value); var laDate=util.scand(“dd/mm/yyyy”, event.value); if (laDate.getTime()<date.getTime()) event.value=this.getField(“StartDate”).value;

    et dans calcul :

    if (event.source && event.source.name==”StartDate”) event.value=this.getField(“StartDate”).value;

    Pouvez-vous m’aider à résoudre ce problème ? Merci d’avance !

    Attachments:
    You must be logged in to view attached files.
    #74930
    Nath65
    Participant

    Bonjour,

    J’ai réussi à solutionner mon problème. Merci de votre aide

    Bonne journée

    #74931
    bebarth
    Maître des clés

    bonjour,

    J’ai réussi à solutionner mon problème.

    Si d’autres ont le même problème ils se débrouilleront ???

    @+
    😎

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