abracadabraPDF › Forums › PDF – Général › calculs conditionnels liste et tarif dégressif
- Ce sujet est vide.
-
CréateurSujet
-
9 août 2017 à 16:05 #45704tofteufMembre
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: -
CréateurSujet
-
AuteurRéponses
-
10 août 2017 à 09:24 #62790MerlinMaître des clés
:joker:
10 août 2017 à 12:53 #62791tofteufMembreSi Merlin jette l’éponge, ça se corse http://www.abracadabrapdf.net/forum/Smileys/classic/Doute.gif
Merci quand même :Smiley03:10 août 2017 à 13:38 #62792MerlinMaître des clésEn 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.
10 août 2017 à 15:44 #62793tofteufMembreUn 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 !
10 août 2017 à 16:29 #62794MerlinMaître des clésOui, 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 = “”;
}10 août 2017 à 16:48 #62795MerlinMaître des clésQu’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 = “”;
}10 août 2017 à 17:09 #62796MerlinMaître des clésOu 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:
11 août 2017 à 07:33 #62797tofteufMembre: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 Merlin11 août 2017 à 14:45 #62798tofteufMembreRebonjour à 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;11 août 2017 à 22:44 #62799MerlinMaître des clésIl 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;}14 août 2017 à 08:09 #62800tofteufMembreBonjour à 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/EVdUUXKnWKJe 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.
14 août 2017 à 09:15 #62801MerlinMaître des clésTu 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.valueJ’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.
14 août 2017 à 09:25 #62802MerlinMaître des clésJe 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_fields14 août 2017 à 09:28 #62803tofteufMembre: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 !14 août 2017 à 10:12 #62804MerlinMaître des clésmerci 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é.14 août 2017 à 11:49 #62805tofteufMembreL’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.
14 août 2017 à 12:41 #62806MerlinMaître des clésDans 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:14 août 2017 à 15:52 #62807tofteufMembreJ’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.14 août 2017 à 18:07 #62808MerlinMaître des cléslà c’est moi qui ne comprend pas ta remarque
Demande à la Console de te reporter les erreurs et tu vas comprendre.
:Smiley03: -
AuteurRéponses
- Vous devez être connecté pour répondre à ce sujet.