abracadabraPDF › Forums › PDF – Général › Valeur maximale
- Ce sujet contient 18 réponses, 3 participants et a été mis à jour pour la dernière fois par michel c., le il y a 1 année et 6 mois.
-
CréateurSujet
-
6 juin 2023 à 12:21 #72964michel c.Participant
Bonjour, je viens de créer un document comportant 150 chams : 15 lignes et 10 colonnes.
Les champs sont nommés a.1.1 (1ere ligne et 1ère colonne) à a.15.10 (15ème ligne et dixième colonne).
Dans chaque champ il y aura une valeur numérique. Je voudrais que sur chaque ligne, le champ comportant la valeur numérique la plus élevée de la ligne ait du vert comme couleur de fond et que celui qui a la valeur la plus faible du rouge. (les autres champs resteraient en blanc).
Je ne sais pas trop comment m’y prendre…
Merci
-
CréateurSujet
-
AuteurRéponses
-
6 juin 2023 à 19:08 #72965MerlinMaître des clés
Bonjour
Il faut pour chaque rangée mettre toutes les valeurs dans un tableau (array), et ensuite utiliser par exemple sort() pour classer les éléments.
Je n’ai pas plus de temps ce soir.
Je reviendrai pour les détails. 😉
6 juin 2023 à 22:14 #72966bebarthMaître des clésbonsoir,
Dans le principe, voici un script que l’on peut placer en script de calcul d’un seul champ :
for (var laLigne=1; laLigne<=15; laLigne++) {
var lesValeurs=[];
for (var i=1; i<=10; i++) {
lesValeurs.push([i,this.getField("a."+laLigne+"."+i).value]);
this.getField("a."+laLigne+"."+i).fillColor=["T"];
}
lesValeurs.sort(function(a,b){return a[1]-b[1]});
if (this.getField("a."+laLigne+"."+lesValeurs[0][0]).value!="") this.getField("a."+laLigne+"."+lesValeurs[0][0]).fillColor=color.green;
if (this.getField("a."+laLigne+"."+lesValeurs[9][0]).value!="") this.getField("a."+laLigne+"."+lesValeurs[9][0]).fillColor=color.red;
}
Ce script est exécuté après chaque évènement, ce qui risque de ralentir si il y a beaucoup d’autres calcul.
Si les valeur sont entrées manuellement pour chaque champ, il vaut mieux mettre une fonction en script de document :
function couleur() {
var ligne=event.target.name.split(".");
var laLigne=ligne[1];
var lesValeurs=[];
for (var i=1; i<=10; i++) {
lesValeurs.push([i,this.getField("a."+laLigne+"."+i).value]);
this.getField("a."+laLigne+"."+i).fillColor=["T"];
}
lesValeurs.sort(function(a,b){return a[1]-b[1]});
if (this.getField("a."+laLigne+"."+lesValeurs[0][0]).value!="") this.getField("a."+laLigne+"."+lesValeurs[0][0]).fillColor=color.green;
if (this.getField("a."+laLigne+"."+lesValeurs[9][0]).value!="") this.getField("a."+laLigne+"."+lesValeurs[9][0]).fillColor=color.red;
}
…et de l’appeler avec un script de champ désactivé :
couleur();
@+
😎Attachments:
You must be logged in to view attached files.7 juin 2023 à 14:26 #72969MerlinMaître des clés👍
Pas mieux.
7 juin 2023 à 16:25 #72970michel c.ParticipantBonjour et merci pour ces précisions, ça m’a permis de pas mal avancer.
J’ai bien réussi à faire fonctionner le script proposé par BB.
Ce fichier permettra de comparer différents produits (entre 2 et 10) en fonction de plusieurs critères. L’idée c’est que la meilleure caractéristique par critère s’affiche en vert et la plus mauvaise en rouge pour chaque critère.
Cependant la meilleure caractéristique est parfois la valeur la plus haute pour certains critères et la valeur la plus basse pour d’autres (par exemple le poids ou le prix)
J’ai apporté une première modification en ajoutant une liste déroulante (+ ou -) pour définir si c’est la valeur la plus haute qui définit si le produit est meilleur ou pas. ça fonctionne bien pour la meilleure caractéristique en vert mais pas pour la pire en rouge…
Je vais essayer aussi d’apporter une autre modif pour que la fonctionnalité fonctionne lorsque l’on a moins de 10 produits à comparer.
Pour l’instant je n’y arrive pas trop mais je cherche.
Merci
- Cette réponse a été modifiée le il y a 1 année et 6 mois par michel c..
Attachments:
You must be logged in to view attached files.7 juin 2023 à 20:00 #72973bebarthMaître des clésbonjour,
Sur le même principe, on écrit :
for (var laLigne=1; laLigne<=34; laLigne++) {
var lesValeurs=[];
for (var i=1; i<=10; i++) {
if (this.getField("a."+laLigne+"."+i).value!="") lesValeurs.push([i,this.getField("a."+laLigne+"."+i).value]);
this.getField("a."+laLigne+"."+i).fillColor=["T"];
}
try {
lesValeurs.sort(function(a,b){return a[1]-b[1]});
if (this.getField("a."+laLigne+"."+lesValeurs[0][0]).value!="") this.getField("a."+laLigne+"."+lesValeurs[0][0]).fillColor=color.green;
if (this.getField("a."+laLigne+"."+lesValeurs[lesValeurs.length-1][0]).value!="") this.getField("a."+laLigne+"."+lesValeurs[lesValeurs.length-1][0]).fillColor=color.red;
} catch(e) {}
}
@+
😎Attachments:
You must be logged in to view attached files.8 juin 2023 à 07:41 #72975michel c.ParticipantMerci pour la réponse. Cela fonctionne sauf pour la selection du + ou – dans la liste déroulante, cela ne change rien, c’est toujours la valeur mini qui apparait en vert.
J’essaye de modifier des trucs dans le code proposé, mais il y a des lignes que je ne comprend pas :
var laLigne=ligne[1];
var lesValeurs=[];this.getField("a."+laLigne+ "."+i).fillColor=["T"];
lesValeurs.sort(function(a,b){return a[1]-b[1]});
if (this.getField("a."+laLigne+ "."+lesValeurs[0][0]).value!= "") this.getField("a."+laLigne+ "."+lesValeurs[0][0]).fillColor=color.red;
if (this.getField("a."+laLigne+ "."+lesValeurs[9][0]).value!= "") this.getField("a."+laLigne+ "."+lesValeurs[9][0]).fillColor=color.green;
Merci
8 juin 2023 à 08:11 #72976michel c.ParticipantJ’ai essayé de modifier le 1er scipt proposé de cette manière :
function Color(indice) {
var nprod = Number(getField(“NProd”).value);
if (this.getField(“A.”+indice).value == “+”) {
var ligne=event.target.name.split(“.”);
var laLigne=ligne[1];
var lesValeurs=[];
for (var i=1; i<=nprod; i++) {
lesValeurs.push([i,this.getField(“a.”+laLigne+ “.”+i).value]);
this.getField(“a.”+laLigne+ “.”+i).fillColor=[“T”];
}
lesValeurs.sort(function(a,b){return a[1]-b[1]});
if (this.getField(“a.”+laLigne+ “.”+lesValeurs[0][0]).value!= “”) this.getField(“a.”+laLigne+ “.”+lesValeurs[0][0]).fillColor=color.red;
if (this.getField(“a.”+laLigne+ “.”+lesValeurs[9][0]).value!= “”) this.getField(“a.”+laLigne+ “.”+lesValeurs[9][0]).fillColor=color.green;
}if (this.getField(“A.”+indice).value == “-“) {
var ligne=event.target.name.split(“.”);
var laLigne=ligne[1];
var lesValeurs=[];
for (var i=1; i<=nprod; i++) {
lesValeurs.push([i,this.getField(“a.”+laLigne+ “.”+i).value]);
this.getField(“a.”+laLigne+ “.”+i).fillColor=[“T”];
}
lesValeurs.sort(function(a,b){return a[1]-b[1]});
if (this.getField(“a.”+laLigne+ “.”+lesValeurs[9][0]).value!= “”) this.getField(“a.”+laLigne+ “.”+lesValeurs[0][0]).fillColor=color.green;
if (this.getField(“a.”+laLigne+ “.”+lesValeurs[0][0]).value!= “”) this.getField(“a.”+laLigne+ “.”+lesValeurs[9][0]).fillColor=color.red;
}}
Mais ça ne fonctionne pas : message d’erreur →
Doc:Open:15: TypeError: lesValeurs[9] is undefined
8 juin 2023 à 11:37 #72977bebarthMaître des clésbonjour,Cela fonctionne sauf pour la selection du + ou – dans la liste déroulante, cela ne change rien, c’est toujours la valeur mini qui apparait en vert.
Les menus déroulants + ou – sont sensés faire quoi ?
@+
😎8 juin 2023 à 11:53 #72978michel c.ParticipantEn cliquant sur + ; la valeur maximale est la “meilleure” et s’affiche en vert sur la ligne (et la moins bonne est la plus basse s’affiche en rouge) ; par exemple si c’est une voiture, ce serait une caractéristique comme la puissance.
En cliquant sur – ; la valeur minimale est la “meilleure” et s’affiche en vert sur la ligne (et la moins bonne est la plus élevée s’affiche en rouge) ; par exemple ce pourrait être le prix (moins cher c’est mieux)
- Cette réponse a été modifiée le il y a 1 année et 6 mois par michel c..
8 juin 2023 à 19:37 #72980bebarthMaître des clésDu coup, le script d’un seul champ (ici ) doit être :
for (var laLigne=1; laLigne<=34; laLigne++) {
var lesValeurs=[];
for (var i=1; i<=10; i++) {
if (this.getField("a."+laLigne+"."+i).value!=="") lesValeurs.push([i,this.getField("a."+laLigne+"."+i).value]);
this.getField("a."+laLigne+"."+i).fillColor=["T"];
}
try {
lesValeurs.sort(function(a,b){return a[1]-b[1]});
if (this.getField("a."+laLigne+"."+lesValeurs[0][0]).value!=="") this.getField("a."+laLigne+"."+lesValeurs[0][0]).fillColor=this.getField("A."+laLigne).value=="+"?color.green:color.red;
if (this.getField("a."+laLigne+"."+lesValeurs[lesValeurs.length-1][0]).value!=="") this.getField("a."+laLigne+"."+lesValeurs[lesValeurs.length-1][0]).fillColor=this.getField("A."+laLigne).value=="-"?color.green:color.red;
} catch(e) {}
}
A noter que j’ai ajouté l’inégalité absolu “!==” pour renir compte des éventuels 0.@+
😎Attachments:
You must be logged in to view attached files.8 juin 2023 à 21:39 #72982michel c.ParticipantJ’ai testé le fichier joint, ça ne fonctionnait pas. J’ai apporté du coup une modif en essayant de comprendre mais ça ne fonctionne pas non plus. Je ne comprends pas tout dans le script. Je ne vois pas ou se trouvent les différences pour les valeurs des listes déroulantes (+ et -).
Merci
Attachments:
You must be logged in to view attached files.9 juin 2023 à 07:52 #72984michel c.ParticipantJe viens d’arriver à modifier légèrement le script proposé et ça fonctionne.
Ça ralentit pas mal mais je ne sais pas si on peut y faire quelque chose…
Merci beaucoup en tout cas.
Attachments:
You must be logged in to view attached files.9 juin 2023 à 08:01 #72986bebarthMaître des clésbonjour,J’ai testé le fichier joint, ça ne fonctionnait pas.
Tu as certainement testé le script de mon fichier avec ton fichier, car le miens fonctionne très bien… un peu long en script de calcul comme je l’ai expliqué précédemment. Si les valeurs sont entrées manuellement il vaut mieux utiliser un script de champ désactivé qui ne fera le calcul que sur la ligne.
Pour fonctionner correctement il faut supprimer tous tes autres scripts relatifs à ce calcul. Les menus déroulants doivent également afficher + ou – et ne doivent donc pas être vides.Je ne vois pas ou se trouvent les différences pour les valeurs des listes déroulantes (+ et -).
Il faut regarder les 2 lignes de ce type :
this.getField("a."+laLigne+"."+lesValeurs[0][0]).fillColor=this.getField("A."+laLigne).value=="+"?color.green:color.red;
@+
😎9 juin 2023 à 08:19 #72987michel c.ParticipantJe viens d’essayer ceci pour que cela soit plus rapide mais ça ne fonctionne pas…
Attachments:
You must be logged in to view attached files.9 juin 2023 à 08:30 #72989michel c.ParticipantJ’avais effectivement testé sur mon fichier car je ne trouvais plus le script et je voulais faire une petite modif (intervertir les couleurs rouge et vert)
Je viens de voir qu’il était dans le champs a.0.0. J’ai pu faire la modif et ça fonctionne nickel.
Merci
- Cette réponse a été modifiée le il y a 1 année et 6 mois par michel c..
Attachments:
You must be logged in to view attached files.9 juin 2023 à 13:47 #73001michel c.ParticipantBonjour, une dernière (j’espère) question :
Serait-il possible de modifier le script proposé :
for (var laLigne=1; laLigne<=34; laLigne++) {
var lesValeurs=[];
for (var i=1; i<=10; i++) {
if (this.getField("a."+laLigne+"."+i).value!=="") lesValeurs.push([i,this.getField("a."+laLigne+"."+i).value]);
this.getField("a."+laLigne+"."+i).fillColor=["T"];
}
try {
lesValeurs.sort(function(a,b){return a[1]-b[1]});
if (this.getField("a."+laLigne+"."+lesValeurs[0][0]).value!=="") this.getField("a."+laLigne+"."+lesValeurs[0][0]).fillColor=this.getField("A."+laLigne).value=="+"?color.red:color.green;
if (this.getField("a."+laLigne+"."+lesValeurs[lesValeurs.length-1][0]).value!=="") this.getField("a."+laLigne+"."+lesValeurs[lesValeurs.length-1][0]).fillColor=this.getField("A."+laLigne).value=="-"?color.red:color.green;
} catch(e) {}
}
pour que lorsque la valeur maximale et/ou la valeur minimale se retrouve dans plusieurs champs sur une même ligne, tous les champs concernés soient en vert ou en rouge suivant le cas et non pas seulement le dernier saisi?
Merci
9 juin 2023 à 20:18 #73003bebarthMaître des clés…deux petites mofifications :
for (var laLigne=1; laLigne<=34; laLigne++) {
var lesValeurs=[];
for (var i=1; i<=10; i++) {
if (this.getField("a."+laLigne+"."+i).value!=="") lesValeurs.push();
this.getField("a."+laLigne+"."+i).fillColor=["T"];
}
try {
lesValeurs.sort(function(a,b){return a[1]-b[1]});
for (var i=0; i<=10; i++) {
if (lesValeurs[1]==lesValeurs[0][1]) {
if (this.getField("a."+laLigne+"."+lesValeurs[0]).value!=="") this.getField("a."+laLigne+"."+lesValeurs[0]).fillColor=this.getField("A."+laLigne).value=="+"?color.green:color.red;
} else break;
}
for (var i=lesValeurs.length-1; i>=0; i--) {
if (lesValeurs[1]==lesValeurs[lesValeurs.length-1][1]) {
if (this.getField("a."+laLigne+"."+lesValeurs[0]).value!=="") this.getField("a."+laLigne+"."+lesValeurs[0]).fillColor=this.getField("A."+laLigne).value=="-"?color.green:color.red;
}
}
} catch(e) {}
}
@+
😎Attachments:
You must be logged in to view attached files.10 juin 2023 à 12:52 #73006michel c.ParticipantMerci, c’est parfait.
-
AuteurRéponses
- Vous devez être connecté pour répondre à ce sujet.