Donnez vie à vos documents numériques !
 

Valeur maximale

abracadabraPDF Forums PDF – Général Valeur maximale

  • Créateur
    Sujet
  • #72964
    michel 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

Affichage de 18 réponses de 1 à 18 (sur un total de 18)
  • Auteur
    Réponses
  • #72965
    Merlin
    Maî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. 😉

    #72966
    bebarth
    Maître des clés

    bonsoir,
    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.
    #72969
    Merlin
    Maître des clés

    👍

    Pas mieux.

    #72970
    michel c.
    Participant

    Bonjour 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.
    #72973
    bebarth
    Maître des clés

    bonjour,
    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.
    #72975
    michel c.
    Participant

    Merci 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

    #72976
    michel c.
    Participant

    J’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

     

     

    #72977
    bebarth
    Maître des clés
    bonjour,

    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 ?

    @+
    😎

    #72978
    michel c.
    Participant

    En 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..
    #72980
    bebarth
    Maître des clés

    Du 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.
    #72982
    michel c.
    Participant

    J’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.
    #72984
    michel c.
    Participant

    Je 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.
    #72986
    bebarth
    Maître des clés
    bonjour,

    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;

    @+
    😎

    #72987
    michel c.
    Participant

    Je 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.
    #72989
    michel c.
    Participant

    J’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.
    #73001
    michel c.
    Participant

    Bonjour, 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

    #73003
    bebarth
    Maî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.
    #73006
    michel c.
    Participant

    Merci, c’est parfait.

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