Donnez vie à vos documents numériques !
 

Permutation de contenu de champs

abracadabraPDF Forums PDF – Général Permutation de contenu de champs

  • Créateur
    Sujet
  • #70945
    michel c.
    Participant

    Bonjour, j’ai un document qui me servira de base pour faire mes plans de salle de classe. L’idée c’est qu’en cliquant sur le nom d’un élève j’arrive sur une page qui lui est dédiée dans laquelle je pourrais inscrire quelques observations.

    Il y aura dans le futur une page d’observation par élève. Donc ce document comportera 17 pages (le plan de salle sur la 1ère).

    Dans le cas ou je change de place 2 élèves j’aimerais ne pas avoir à copier / coller leurs noms et les observations qui les concernent.

    J’aimerais donc au travers de 2 listes déroulantes et un bouton pouvoir permuter le contenu des champs contenants les noms des élèves ainsi que les champs des observations qui les concernent.

    Mais je ne sais pas trop comment m’y prendre.

    Merci

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

    bonsoir,
    Voilà pour la permutation.
    function permutation(x,y) {
    var lesChamps=["eleve","observations"];
    for (var i=0; i<lesChamps.length; i++) {
    var temp=this.getField(lesChamps+"."+x).value;
    this.getField(lesChamps+"."+x).value=this.getField(lesChamps+"."+y).value;
    this.getField(lesChamps+"."+y).value=temp;
    }
    }
    permutation(this.getField("place1").value,this.getField("place2").value);

    @+
    😎

    Attachments:
    You must be logged in to view attached files.
    #70949
    michel c.
    Participant

    J’ai trouvé une solution plus simple que de permuter les champs :

    Je saisis les noms des élèves dans la liste au centre et j’affecte le n° de place dans la liste déroulante attenante.

    La position des élèves dans la liste centrale ne changeant pas, je n’ai plus ce problème de permutation.

    Cela a fonctionné au début mais je ne comprends pas pourquoi ça ne marche plus…

    Le problème vient peut être du fait qu’il y a la possibilité d’affecter 2 fois la même place à un élève.

    Je ne sais pas trop comment remédier à cela.

     

    Merci

    Attachments:
    You must be logged in to view attached files.
    #70951
    michel c.
    Participant

    J’ai pensé à permuter les champs “eleves” grâce à leur position mais je coince aussi, il faudrait qu’il y ait une “détection” du nom des champs qu’il faut permuter.

    Dans l’exemple, j’ai fait un bouton qui permet de permuter les champs “eleve.1” et “eleve.2” mais ça ne va pas, il faudrait permuter le champ qui se trouve à la position x avec le champ qui se trouve à la position y….

    Il y a certainement une fonction que je ne connais pas qui pourrait m’aider à faire ce que je souhaite.

    • Cette réponse a été modifiée le il y a 1 année et 11 mois par michel c..
    Attachments:
    You must be logged in to view attached files.
    #70954
    bebarth
    Maître des clés

    bonjour,
    Je ne comprends pas pourquoi déplacer la position des champs plutôt que permuter les valeurs !

    @+
    😎

    #70957
    michel c.
    Participant

    En fait lorsque je suis en classe, je me base sur mon plan de classe pour plusieurs choses :

    • faire l’appel plus rapidement (si une place est libre, l’élève est absent)
    • me permettre d’avoir un suivi de l’élève : lorsque je clique sur le nom d’un élève dans un champ “eleve.i”, cela me renvoie directement à la page qui le concerne. Là je peux inscrire si il a été en retard, absent, si il a besoin d’une aide particulière, ses difficultés….

    Le souci c’est que sur une année scolaire, il y a parfois des changements de place.

    Si je permute les valeurs des champs eleve.1 avec eleve.5 par exemple, lorsque je vais cliquer sur sur le champ élève.1 cela va me renvoyer à la page de suivi de l’élève.5 qui était à cette place auparavant.

    Il faut aussi que je permute les contenus des champs que j’ai nommé _motif.i et amotif.i.

    Je pourrais donc faire cela sauf que je n’y arrive pas non plus…

     

    Mais je cherche…

    #70958
    bebarth
    Maître des clés

    bonjour,
    Il suffit de permuter également l’action sur champ.
    https://opensource.adobe.com/dc-acrobat-sdk-docs/acrobatsdk/html2015/index.html#t=Acro12_MasterBook%2FJS_API_AcroJS%2FField_methods.htm%23TOC_setAction2bc-17&rhtocid=_6_1_8_31_2_16

    Attention : on ne peut pas lire les actions des champs (avec un “get” par exemple) mais uniquement les écrire avec la méthode setAction. Mais lorsqu’on connait l’action qu’on veut définir, c’est tout à fait faisable !

    @+
    😎

    #70963
    michel c.
    Participant

    Je n’ai pas encore essayé le setAction car je galère déjà à permuter les contenus de mes champs élèves.i

    Je ne sais pas si j’ai la bonne approche, ça marche pour certains champs mais pas tous….

    Le script ne me renvoie pas d’erreur mais il y a un truc qui cloche…

    J’ai l’impression d’avoir fait une usine à gaz ….

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

    Bonjour

     

    Pour moi ce document devrait ne contenir que deux pages : le plan et la “page élève”.

    Les champs de la “page élève” étant remplis dynamiquement en fonction du nom sélectionné à partir d’un fichier texte placé en pièce jointe contenant les données.

    Ça résoudrait la plupart des problèmes.

     

     

    #70967
    michel c.
    Participant

    Je vais me pencher là dessus, je ne sais pas trop encore comment faire. Dans l’immédiat, mon script permettant d’attribuer chaque élève à une place ne fonctionne toujours pas (sauf pour 3 élèves).

    Je l’ai simplifié mais je ne vois pas ou est le problème…

     

    for (var l=1 ; l<18 ; l++){
    this.getField("place."+l).fillColor=color.white;}

    for (var i=1 ; i<18 ; i++){
    if (this.getField("place."+i).value < 1 | this.getField("place."+i).value>17) {
    app.alert({cMsg:"La valeur est hors de la plage", nIcon:1});}
    }
    for (var j=1 ; j<17 ; j++){
    var k = j+1
    if (this.getField("place."+j).value == this.getField("place."+k).value)
    {app.alert({cMsg:"Attention, deux élèves ne peuvent pas partager la même place", nIcon:1});
    this.getField("place."+j).fillColor=["RGB", 255, 255/255, 0];
    this.getField("place."+k).fillColor=["RGB", 255, 255/255, 0];
    }
    }

    for (var m=1 ; m<18 ; m++) {
    if (this.getField("place."+m).value == this.getField("El."+m).name.substring(3,5)) {this.getField("eleve."+m).value = this.getField("El."+m).value;}}

     

    Merci

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

    Bonjour

     

    Il y a une erreur dans ces deux lignes, donc le script doit s’arrêter quand il arrive dessus :

    this.getField("place."+j).fillColor=["RGB", 255, 255/255, 0];
    this.getField("place."+k).fillColor=["RGB", 255, 255/255, 0];

     

    Il faudrait l’écrire ainsi :

    this.getField("place."+j).fillColor=["RGB", 255/255, 255/255, 0/255];
    this.getField("place."+k).fillColor=["RGB", 255/255, 255/255, 0/255];

    #70973
    Merlin
    Maître des clés

    Tu gagnerais en rapidité d’exécution si tu remplaçais :

    for (var l=1 ; l<18 ; l++){
    this.getField("place."+l).fillColor=color.white;}

    for (var i=1 ; i<18 ; i++){
    if (this.getField("place."+i).value < 1 | this.getField("place."+i).value>17) {
    app.alert({cMsg:"La valeur est hors de la plage", nIcon:1});}
    }

     

    Par :

    for (var i=1 ; i<18 ; i++){
    this.getField("place."+i).fillColor=color.white;}
    if (this.getField("place."+i).value < 1 | this.getField("place."+i).value>17) {
    app.alert({cMsg:"La valeur est hors de la plage", nIcon:1});}
    }

     

    Par ailleurs, de façon générale il est inutile de changer la lettre qui représente la valeur de l’index (l, i, j, m) car chaque boucle est indépendante. Tu peux donc utiliser le “i” à chaque fois.

    #70974
    michel c.
    Participant

    Bonjour, j’ai corrigé ces erreurs, malgré tout j’ai le même problème :

    Lorsque je clique sur le bouton, seul l’élève affecté à la place 13 s’inscrit dans le champ “eleve.13”

    Lorsque je clique une seconde fois, l’élève affecté à la place 14 s’inscrit dans le champ “eleve.14”

    Et lorsque je clique encore, plus rien…

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

    bonjour,
    S’il n’est pas permis d’entrer un numéro <1 et >17, ce n’est plus la peine de vérifier ce numéro !
    Je te propose donc un script de touches personnalisé avec une expression régulière. Les plus curieux essayeront de comprendre, et peuvent demander s’ils ne comprennent pas.
    Voici une version de ton fichier avec quelques modifications de scripts.

    @+
    😎

    Attachments:
    You must be logged in to view attached files.
    #70979
    michel c.
    Participant

    Merci,

    J’ai effectivement quelques questions sur la solution que tu proposes.

    • La 1ère est sur la forme : pourquoi sur cette ligne : for (var i=1; i<=nbPlaces; i++) posEleve=[this.getField("El."+i).value,this.getField("place."+i).value]; il n’y a pas d’accolades ?
    • Ensuite celle ci : posEleve=[this.getField("El."+i).value,this.getField("place."+i).value]; je ne comprends pas trop le rôle de la virgule
    • Et globalement, je ne connais pas les tableaux. Celui ci possède 18 lignes et 2 colonnes si je comprend bien avec pour la 1ère colonne : this.getField("El."+i).value et pour la 2ème : this.getField("place."+i).value ?
    • La fonction placement possède 2 paramètres (indice et position) ?
    • for (var i=1; i<=nbPlaces; i++) : pour les valeurs i comprises entre 1 et 17 :
    • if (pos==posEleve[1] && ind!=i) : si le paramètre pos égale à la place i et l’indice différent de i ? (pas sûr du tout)
    • app.alert(posEleve[ind][0]+" et "+posEleve[0]+" ont le même numéro de place : "+posEleve[1],3); : afficher le message d’alerte…pas bien compris posEleve[1],3

    Bref, il y a pas mal de trucs que je ne maîtrise pas ici. Il faudrait que je m’exerce sur des tableaux plus basiques.

     

    Sinon, j’avais réussi à arriver à mes fins cette nuit d’une autre manière :

    for (var i=1 ; i<17 ; i++){
    var k = i+1
    if (this.getField("place."+i).value == this.getField("place."+k).value)
    {app.alert({cMsg:"Plusieurs élèves partagent la même place", nIcon:1});
    this.getField("place."+i).fillColor=["RGB", 255/255, 255/255, 0/255];
    this.getField("place."+k).fillColor=["RGB", 255/255, 255/255, 0/255];
    }
    }
    for (var i=1 ; i<18 ; i++){
    this.getField("eleve."+i).value = this.getField("El."+this.getField("place."+i).value).value;}

     

    Je me demandais si il était possible dans le cas ou le même numéro est attribué que la boite de dialogue affiche en plus du message les n° de places disponibles restantes.

     

    • Cette réponse a été modifiée le il y a 1 année et 11 mois par michel c..
    • Cette réponse a été modifiée le il y a 1 année et 11 mois par michel c..
    • Cette réponse a été modifiée le il y a 1 année et 11 mois par michel c..
    Attachments:
    You must be logged in to view attached files.
    #70984
    Merlin
    Maître des clés

    “Pour moi ce document devrait ne contenir que deux pages : le plan et la « page élève ».”

    Je pensais à certains documents que j’avais déjà fait, je viens de regarder mais ça ne va pas aller. Il y a une mini base de données mais avec une seule fiche affichée à la fois, pas 16…

     

    #70985
    michel c.
    Participant

    Mon fichier a des bugs, celui de BB marche bien.

    J’ai apporté une modif pour éviter la saisie en double d’un élève.

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

    bonjour,
    Voici quelques réponses :

    nbPlaces=17; // Nombre de places
    posEleve=new Array(nbPlaces+1); // Définition d'une table à 18 éléments (de 0 à 17)
    function noPlace() {
    // S'il n'y a qu'une seule ligne pour une boucle "for" ou une condition "if else"
    // il n'y a pas besoin d'accolades qui définissent l'ensemble des lignes à exécuter
    for (var i=1; i<=nbPlaces; i++) posEleve=[this.getField("El."+i).value,this.getField("place."+i).value];
    // posEleve=[this.getField("El."+i).value,this.getField("place."+i).value];
    // L'élément i de la table posEleve est une table [] de 2 éléments et la virgule indique la séparation des éléments
    }
    noPlace();
    // Fonction "placement" selon 2 paramètres "ind" -> indice et "pos" -> position
    function placement(ind,pos) {
    // Boucle pour vérifier toutes les positions
    for (var i=1; i<=nbPlaces; i++) {
    // So la position indiquée est identique à la position dans la table posEleve
    // mais que l'indice du champs est différent de l'indice de la table posEleve
    if (pos==posEleve[1] && ind!=i) {
    // Message d'alerte
    app.alert(posEleve[ind][0]+" et "+posEleve[0]+" ont le même numéro de place : "+posEleve[1],3);
    break;
    } else if (ind==i) {
    posEleve[ind][1]=pos;
    }
    }
    }

    Les tables et les boucles permettent de réduire beaucoup les lignes de scripts.
    Les expressions régulières sont assez compliquées à comprendre, mais sont très efficaces !

    @+
    😎

    #70989
    michel c.
    Participant

    Merci beaucoup pour ces précisions, ça va bien m’aider à comprendre.

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