Donnez vie à vos documents numériques !
 

calculs conditionnels liste et tarif dégressif

abracadabraPDF Forums PDF – Général calculs conditionnels liste et tarif dégressif

  • Ce sujet est vide.
  • Créateur
    Sujet
  • #45704
    tofteuf
    Membre

    Bonjour à tous,
    j’avance sur un nouveau formulaire de bons de commande et je bloque sur un calcul, j’ai bien trouvé des posts sur le thème mais je ne parviens pas à les adapter à ma problématique, je m’explique : d’après le fichier pdf téléchargeable ici (https://we.tl/FMU1L5HlVR ) : en R1 (menu déroulant à 20 possibilités), je choisi une référence, cela alimente automatiquement la désignation en toutes lettres en D2. Parallèlement, je souhaiterais qu’en P1HT le prix unitaire monte automatiquement en fonction de la quantité saisie en Q1 par l’utilisateur conformément à la grille excel,téléchargeable là (https://we.tl/wcHne3brPk ) (quantité jusqu’à 20, entre 20 et 50…) SI un heureux vacancier avait une idée ! Merci par avance :jerisjaune:

Affichage de 19 réponses de 1 à 19 (sur un total de 19)
  • Auteur
    Réponses
  • #62790
    Merlin
    Maître des clés

    :joker:

    #62791
    tofteuf
    Membre

    Si Merlin jette l’éponge, ça se corse http://www.abracadabrapdf.net/forum/Smileys/classic/Doute.gif
    Merci quand même  :Smiley03:

    #62792
    Merlin
    Maître des clés

    En fait, je placerais les données dans un fichier joint (au format CSV) dans le formulaire PDF, je chargerais les données dans un tableau (array) et je pointerais sur les données en fonction de la rangée et la colonne pour les passer en variable.
    Pour l’idée c’est rapide à rédiger, mais de là à la transcrire en JavaScript…
    :geek:

    Sur le forum il y a des sujets avec des exemples d’importation de données en CSV, dans les messages d’Alex notamment.

    #62793
    tofteuf
    Membre

    Un peu chaud pour Bibi là :mur:, alors, j’ai commencé à élaborer un script de calcul du PUHT avec les différents tarifs en fonction de la quantité en Q1, affiliés à ma première variable de liste déroulante R1 (ici : “CAF_ACO_PB1” ), …erreur de syntaxe 1 à la ligne 2  :Ooops::

    if (this.getField(“R1″).value=”CAF_ACO_PB1”)&&(this.getField(“Q1”).value <20) {
    this.event.value = (this.getField(“Q1”).value)*10.00
    } else {
    (this.getField(“Q1”).value <50) {this.event.value = (this.getField("Q1").value)*8.00
    } else {
    (this.getField(“Q1”).value <100) {this.event.value = (this.getField("Q1").value)*6.50
    } else {
    (this.getField(“Q1”).value <200) {this.event.value = (this.getField("Q1").value)*6.00
    } else {
    (this.getField(“Q1”).value >200) {this.event.value = (this.getField(“Q1”).value)*5.50
    }
    }

    Je pensais continuer sur ma lancée pour les 19 autre variables en R1, pas gagné, je continue à creuser !

    #62794
    Merlin
    Maître des clés

    Oui, il y a des erreurs de syntaxe, et aussi trop d’accolades et de parenthèses, et pas assez de point-virgules.  :Smiley03:
    Attention aussi à l’opérateur d’égalité : == n’est pas identique à =

    Essaye ça :

    Code:
    if ((this.getField(“R1”).value == “CAF_ACO_PB1”) && (this.getField(“Q1”).value < 20)) {
    event.target.value = this.getField(“Q1”).value * 10;
    }
    else if ((this.getField(“R1”).value == “CAF_ACO_PB1”) && (this.getField(“Q1”).value < 50)) {
    event.target.value = this.getField(“Q1”).value * 8;
    }
    else if ((this.getField(“R1”).value == “CAF_ACO_PB1”) && (this.getField(“Q1”).value < 100)) {
    event.target.value = this.getField(“Q1”).value * 6.5;
    }
    else if ((this.getField(“R1”).value == “CAF_ACO_PB1”) && (this.getField(“Q1”).value < 200)) {
    event.target.value = this.getField(“Q1”).value * 6;
    }
    else if ((this.getField(“R1”).value == “CAF_ACO_PB1”) && (this.getField(“Q1”).value > 200)) {
    event.target.value = this.getField(“Q1”).value * 5.5;
    }
    else {
    event.target.value = “”;
    }
    #62795
    Merlin
    Maître des clés

    Qu’on peut aussi écrire ainsi, c’est plus facile à dupliquer :

    Code:
    var valeurListe = this.getField(“R1”).value;
    var valeurQuantite = this.getField(“Q1”).value;
    var chaineAchercher = “CAF_ACO_PB1”;
    //
    if (valeurListe == chaineAchercher) && (valeurQuantite < 20)) {
    event.target.value = valeurQuantite * 10;
    }
    else if (valeurListe == chaineAchercher) && (valeurQuantite < 50)) {
    event.target.value = valeurQuantite * 8;
    }
    else if (valeurListe == chaineAchercher) && (valeurQuantite < 100)) {
    event.target.value = valeurQuantite * 6.5;
    }
    else if (valeurListe == chaineAchercher) && (valeurQuantite < 200)) {
    event.target.value = valeurQuantite * 6;
    }
    else if (valeurListe == chaineAchercher) && (valeurQuantite > 200)) {
    event.target.value = valeurQuantite * 5.5;
    }
    else {
    event.target.value = “”;
    }
    #62796
    Merlin
    Maître des clés

    Ou bien comme ça pour éviter de répéter la première condition :

    Code:
    var valeurListe = this.getField(“R1”).value;
    var valeurQuantite = this.getField(“Q1”).value;
    var chaineAchercher = “CAF_ACO_PB1”;
    //
    if (valeurListe == chaineAchercher) {
    if (valeurQuantite < 20) {
    event.target.value = valeurQuantite * 10;
    }
    else if (valeurQuantite < 50) {
    event.target.value = valeurQuantite * 8;
    }
    else if (valeurQuantite < 100) {
    event.target.value = valeurQuantite * 6.5;
    }
    else if (valeurQuantite < 200) {
    event.target.value = valeurQuantite * 6;
    }
    else if (valeurQuantite > 200) {
    event.target.value = valeurQuantite * 5.5;
    }
    else {
    event.target.value = “”;
    }
    }

    :Smiley15:

    #62797
    tofteuf
    Membre

    :bravo: :bravo: :extra:
    Tout à fait ce que voulais (j’avais même un calcul de trop : la multiplication par la quantité, c’est évidemment pour le total HT !),
    Je vais dupliquer pour les 19 autres valeurs de ma liste déroulante !  Grand merci Merlin

    #62798
    tofteuf
    Membre

    Rebonjour à tous,
    un dernier loup pour aujourd’hui : je souhaite que mon champ HT51 (non existant sur ma maquette) récupère la valeur de “TP5HT”, seulement si le choix de la liste 1 est positionné sur une de ces trois valeurs, le script de clacul du champ HT51 est le suivant, pas d’erreur de syntaxe alarmiste mais inopérant, idéalement je souhaiterais aussi avoir l’inverse, , récupérer en HT71 la valeur de “TP5HT” si le choix de la liste 1 n’est pas sur une de ces trois valeurs, un tuyau ??? :

    // mise en variable du champs “menu déroulant de la liste 1 pour test 3 items
    var f = this.getField(“Liste1”);
    // teste le contenu de liste1
    if(f.value == “Jus de fruits BIO”)
    event.target.value = this.getField(“TP5HT”).value;
    else
    if (f.value == “Jus de fruits – Eaux -Sodas”)
    event.target.value = this.getField(“TP5HT”).value;
    else
    if (f.value == “Café et Thé pour mange-debout”)
    event.target.value = this.getField(“TP5HT”).value;
    //sinon, si différent
    else
    event.value = 0;

    #62799
    Merlin
    Maître des clés

    Il faudrait mettre les accolades, et surtout vérifier les items qui doivent être exactement les mêmes dans le script (Le 3e ne correspond pas à la liste).

    // mise en variable du champs “menu déroulant de la liste 1 pour test 3 items
    var f = this.getField(“Liste1”);
    // teste le contenu de liste1
    if (f.value == “Jus de fruits BIO”)
    {event.target.value = this.getField(“TP5HT”).value;}
    else
    if (f.value == “Jus de fruits – Eaux -Sodas”)
    {event.target.value = this.getField(“TP5HT”).value;}
    else
    if (f.value == “Café et Thé pour mange-debout“)
    {event.target.value = this.getField(“TP5HT”).value;}
    //sinon, si différent
    else
    {event.target.value = 0;}

    #62800
    tofteuf
    Membre

    Bonjour à tous,

    merci Merlin pour ce retour, j’ai utilisé ton script en prenant soin de corriger mes erreurs mais seule la valeur 0 apparait en 10HT5 quel que soit le choix fait en liste 1.
    Je continue mes recherches, à toutes fins utiles, voici le lien pour DL la dernière version du projet. https://we.tl/EVdUUXKnWK

    Je me disais par ailleurs qu’il serait judicieux de pouvoir paramétrer l’ordre des calculs mais je ne trouve pas de réglage en ce sens sur Adobe Arcobat 11 Pro (win)

    Bonne journée à tous.

    #62801
    Merlin
    Maître des clés

    Tu devrais utiliser la Console JavaScript : chaque changement de valeur provoque une liste d’erreurs longue comme une feuille A4…
    ==> https://www.abracadabrapdf.net/ressources-et-tutos/js-et-formulaires-ressources/console-javascript-d-acrobat/

    Dans le champ TP5HT on trouve ce script de calcul qui ne fonctionne pas :

    // mise en variable des champs
    var f = this.getField(“Q5”);
    var g = this.getField(“P5HT”);
    // teste si le champ PRIX HT est vide
    if (g.value == null || f.value == “”)
    // s il est vide
    event.value = 0;
    //sinon, si pas vide
    else
    event.value = f.value * g.value

    J’insiste encore sur l’importance de la syntaxe, des accolades, des parenthèses et du point-virgule qui marque la fin d’une instruction.
    Le même script corrigé fonctionne correctement :

    // mise en variable des champs
    var f = this.getField(“Q5”);
    var g = this.getField(“P5HT”);
    // teste si le champ PRIX HT est vide
    // s il est vide
    if (g.value == null || f.value == “”) {event.value = 0;}
    //sinon, si pas vide
    else {event.value = (f.value * g.value) * 1;}

    Astuce : sur la dernière ligne j’ai mis le calcul entre parenthèses et je l’ai multiplié par 1, c’est un moyen de forcer JavaScript à considérer toutes les valeurs calculées comme des nombres et non pas comme des chaines de caractères, ce qui bloque parfois les calculs.

    #62802
    Merlin
    Maître des clés

    Je me disais par ailleurs qu’il serait judicieux de pouvoir paramétrer l’ordre des calculs mais je ne trouve pas de réglage en ce sens sur Adobe Arcobat 11 Pro (win)

    Il y a bien longtemps que je n’ai pas utilisé Acrobat XI, tout ce dont je me souviens c’est que ça se trouve dans le panneau d’outils de formulaire.
    Le plus simple est de chercher “ordre de calcul” dans l’Aide d’Acrobat Pro (menu ?), pour la version DC ça donne ça :
    https://helpx.adobe.com/fr/acrobat/using/pdf-form-field-properties.html#set_the_calculation_order_of_form_fields

    #62803
    tofteuf
    Membre

    :Ooops:Merlin, merci pour cette mise au point, mais cela ne règle pas le fonctionnement du script en 10HT5 !
    Je vais corriger les autres erreurs dupliquées de P5HT !

    #62804
    Merlin
    Maître des clés

    merci pour cette mise au point, mais cela ne règle pas le fonctionnement du script en 10HT5 !

    Ce script n’a rien à faire là et il ne sert à rien, et ce champ ne me parait pas très utile non plus (mais je ne connais pas tout le formulaire).
    Si je comprend bien la logique le champ P5HT devrait calculer sa valeur en fonction du choix de la liste 1 et ensuite on devrait effectuer le calcul : prix * quantité.

    #62805
    tofteuf
    Membre

    L’utilité de ce champs est la suivante : je dois calculer des montant de TVA différents à 10 et 20 %, ces champs intermédiaires (10HT5 est le premier à paramétrer) qui seront invisibles à l’utilisateur me permettront de reprendre les montant HT en fin de ligne en fonction du type de produit (les valeurs de la liste 1, déterminant si le produit est taxé à 10 ou 20 %) pour calculer les sommes de TVA à 10 et à 20 %. Si le choix 1, 2 ou 3 est sélectionné (le choix 0=”Sélectionnez”) dans liste 1, alors 10HT5 doit reprendre la valeur de TP5HT, dans tous les autre cas, la valeur 0 est appliquée à 10HT5.

    #62806
    Merlin
    Maître des clés

    Dans ce cas c’est le champ liste qui devrait pousser les modifications vers le champ de texte, ça évitera des calculs inutiles.
    Il faudrait utiliser un script de ce genre en script de validation :

    var champCible = this.getField(“10HT5”);
    // teste le contenu de la liste cliquée
    if (event.value == “Jus de fruits BIO”)
    {champCible.value = 10;}
    else if (event.value == “Jus de fruits – Eaux -Sodas”)
    {champCible.value = 10;}
    else if (event.value == “Café et thé pour les mange-debout”)
    {champCible.value = 20;}
    // sinon, si différent
    else
    {champCible.value = 0;}

    Dans ton formulaire il y a beaucoup trop de scripts de partout pour que je comprenne tout.
    Ci-joint un exemple avec juste les deux champs concernés et débarrassés des autres scripts.

    Par ailleurs je ne comprend pas l’intérêt de remplir toutes les listes suivantes à chaque fois qu’on clique sur une puisque leur contenu est statique…
    :doute:

    #62807
    tofteuf
    Membre

    J’ai trouvé la solution ad-hoc,

    en calcul dans le champs cible(10HT5), mon HT à 10 % pour une ligne en testant la valeur affecté à chaque item dans la liste :

    // mise en variable du champs “menu déroulant de la liste 1 pour test 3 items
    var f = this.getField(“Liste1”);
    // teste le contenu de liste1
    if (f.value == 1)
    {event.target.value = this.getField(“TP5HT”).value*0.1;}
    else
    if (f.value == 2)
    {event.target.value = this.getField(“TP5HT”).value*0.1;}
    else
    if (f.value == 3)
    {event.target.value = this.getField(“TP5HT”).value*0.1;}
    //sinon, si différent
    else
    {event.target.value = 0;}

    et pour le taux à 20 % de la même ligne :

    // mise en variable du champs “menu déroulant de la liste 1 pour test 3 items
    var f = this.getField(“Liste1”);
    // teste le contenu de liste1
    if (f.value == 0)
    {event.target.value = 0;}
    else
    if (f.value == 1)
    {event.target.value = 0;}
    else
    if (f.value == 2)
    {event.target.value = 0;}
    else
    if (f.value == 3)
    {event.target.value = 0;}
    //sinon, si différent
    else
    {event.target.value = this.getField(“TP5HT”).value*0.2;}
    J’ai fait un peu de ménage dans les scripts et les calculs pour éliminer du superflu  :Ooops:

    Tu dis “Par ailleurs je ne comprend pas l’intérêt de remplir toutes les listes suivantes à chaque fois qu’on clique sur une puisque leur contenu est statique…
    :doute:”, là c’est moi qui ne comprend pas ta remarque  :Euuuh:

    À chaque ligne de mon bon de commande, je dois pouvoir choisir un article (ex.: liste2) qui est classé par famille (tri primaire en liste1).
    J’ai donc dupliqué ce binôme de champs pour commander jusqu’à 15 articles différents. La mise en tableau à chaque sélection de liste mère alourdi le process mais je n’ai pas trouvé d’autre solution. Encore merci.

    #62808
    Merlin
    Maître des clés

    là c’est moi qui ne comprend pas ta remarque

    Demande à la Console de te reporter les erreurs et tu vas comprendre.
    :Smiley03:

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