Donnez vie à vos documents numériques !
 

Remplir zones de texte à partir de la ligne sélectionnée dans une zone de liste

abracadabraPDF Forums PDF – Général Remplir zones de texte à partir de la ligne sélectionnée dans une zone de liste

  • Ce sujet est vide.
  • Créateur
    Sujet
  • #46453
    yalec38
    Membre

    Bonjour,

    Je cherche à remplir deux zones de texte en fonction de la valeur d’une ligne d’une zone de liste sélectionnée par un clic. Le zone de liste contient pour chaque ligne le code PCS-ESE (ex : 333A) et le libellé du code (ex : MAGISTRAT) séparé par une tabulation.
    Je voudrais que la première zone de texte contienne le code PCS-ESE et la deuxième le libellé correspondant au code.

    Ma zone de liste est remplie par code (récupéré ici) depuis une pièce jointe en .txt

    J’ai eu beau chercher sur le forum, je ne vois pas comment récupérer la valeur de la ligne sélectionnée dans la zone de liste.

    Merci d’avance si une âme charitable pouvait m’indiquer un début de solution.

Affichage de 15 réponses de 1 à 15 (sur un total de 15)
  • Auteur
    Réponses
  • #68311
    bebarth
    Maître des clés

    bonjour,
    Ce serait plus pratique de partager un fichier avec la pièce jointe… même si il n’est pas complet pour voir exactement comment est ton fichier .txt.
    Une zone de liste permet une sélection multiple. Ne serait-ce pas plutôt un menu déroulant ?
    @+
    :bonjour:

    #68312
    yalec38
    Membre

    Il s’agit bien d’une zone de liste (l’option “sélection multiple” n’a pas été activée). J’importe donc lors de l’activation de la première zone de texte les données de la pièce jointe dans la zone de liste avec le code suivant :

    this.getField(“LISTE-PCS”).clearItems();
    var PJOINTE = this.getDataObject(this.dataObjects[0].name)
    var fi = this.getDataObjectContents(PJOINTE.name)
    var fit = util.stringFromStream(fi)
    var LIGNES = fit.split(“n”);
    var COLONNES = new Array();
    for (var i = 0 ; i = LIGNES.split(“;”)}
    var TABLEAU = new Array() ;
    for (var j = 0 ; j
    this.getField(“LISTE-PCS”).setItems(TABLEAU); // champ liste déroulante
    [this.getField(“LISTE-PCS”).setFocus();

    Je voudrais que lorsque l’utilisateur sélectionne une ligne dans la zone de liste (par clic), que son contenu soit scindé en deux parties et s’inscrive dans deux zones de texte.

    Chaque ligne du fichier .txt est constituée d’une chaine de 4 caractères (3 chiffres et 1 lettre) suivie d’une tabulation puis d’une chaine de caractères de longueur variable et terminée par un “;”.

    Je ne sais pas comment récupérer dans une variable la valeur de la ligne sélectionnée dans la zone de liste pour pouvoir la scinder en deux et inscrire chaque partie dans la zone de texte correspondante.

    En VB.net j’aurai ajouté sur une procédure “OnClick” de la zone de liste le code suivant :

    Dim Code as String = SubString(LISTE-PCS.SelectedValue, 0, 3)
    Dim Libelle as String = SubString(LISTE-PCS.SelectedValue, 5, LISTE-PCS.SelectedValue.Lenght – 5)
    CODE-PCS.Value = Code
    LIB-PCS.Value = Libelle

    Avec LISTE-PCS le nom de la zone de liste, CODE-PCS le nom de la première zone de texte et LIB-PCS le nom de la deuxième.

    Malheureusement, je ne maitrise pas du tout le JavaScript. :Smiley02:

    #68313
    Merlin
    Maître des clés

    Le script de base :

    cTexte = this.getField(“ZoneDeListe“).valueAsString;
    // exemple de valeur attendue : “621A CHEF D’EQUIPE DU GROS OEUVRE ET DES TRAVAUX PUBLICS”
    aTexte = cTexte.split(“t”); // découpage de la chaine de caractères sur la TAB
    this.getField(“code“).value = aTexte.shift(); // premier élément de l’array
    this.getField(“libelle“).value = aTexte.pop(); // dernier élément de l’array

    Qu’on peut utiliser ainsi en action “champ désactivé” dans la zone de liste :

    cTexte = event.target.valueAsString;
    // exemple de valeur attendue : “621A CHEF D’EQUIPE DU GROS OEUVRE ET DES TRAVAUX PUBLICS”
    aTexte = cTexte.split(“t”); // découpage de la chaine de caractères sur la TAB
    this.getField(“code“).value = aTexte.shift(); // premier élément de l’array
    this.getField(“libelle“).value = aTexte.pop(); // dernier élément de l’array

    Ne pas oublier d’ajuster les noms des champs (en orange).

    #68314
    yalec38
    Membre

    Merci Merlin.

    J’avais mis ça dans l’onglet “Changement de sélection” :

    this.getField(“CODE-PCS1”).value = event.value.substring(0,4)
    this.getField(“LIB-PCS1”).value = event.value.substring(5)

    Et ça fonctionne pour remplir les zones de texte mais je voudrai que la validation soit faite par un double click sur la ligne sélectionnée de la zone de liste.

    Cependant le fonctionnement des zones de liste sous Acrobat ne me convient pas (l’ascenseur n’est pas visible systématiquement et le défilement est trop lent). Il va falloir que je fasse une usine à gaz avec des zones de texte et deux boutons de déplacement.

    #68315
    Merlin
    Maître des clés

    Cependant le fonctionnement des zones de liste sous Acrobat ne me convient pas (l’ascenseur n’est pas visible systématiquement et le défilement est trop lent). Il va falloir que je fasse une usine à gaz avec des zones de texte et deux boutons de déplacement.

    Tu devrais peut-être utiliser des listes déroulantes…

    #68316
    bebarth
    Maître des clés

    bonjour,

    …je voudrai que la validation soit faite par un double click sur la ligne sélectionnée de la zone de liste.

    J’ai déjà fait ça, mais il faut que je retrouve et que je me remémore le fonctionnement, car de ce que je me souviens ce n’était pas évident.
    @+
    :bonjour:

    #68317
    bebarth
    Maître des clés

    bonjour,
    Voici le résultat en simple et double-clic !
    @+
    :bonjour:

    #68318
    yalec38
    Membre

    Merci bebarth

    Il va falloir que je décortique ton code avec autre chose que l’éditeur d’Acrobat X. En tous cas sur ton fichier joint ça à l’air de fonctionner parfaitement et de correspondre à ce que je voulais.

    La prochaine étape va être de pouvoir filtrer la liste en fonction du premier chiffre du code PCS (1, 2, 3, 4, 5 ou 6) et éventuellement de pouvoir faire une recherche par mot clé.

    Est-ce que l’équivalent de string.StartsWith(“1”) existe en javascript ?

    Et est-ce que l’équivalent de string.Contains(“chaine”) existe aussi ?

    Merci en tous cas pour vos réponses qui vont m’aider à avancer sur ce projet.

    #68319
    bebarth
    Maître des clés

    Est-ce que l’équivalent de string.StartsWith(“1”) existe en javascript ?
    Et est-ce que l’équivalent de string.Contains(“chaine”) existe aussi ?

    Ces fonctions existent mais je sais qu’elles ne fonctionnent pas correctement sur tous les OS. Je n’ai jamais eu de problèmes avec des utilisateurs Mac, mais j’en ai eu avec des utilisateurs PC.
    https://www.w3schools.com/jsref/jsref_startswith.asp
    https://www.w3schools.com/jsref/jsref_includes.asp
    Ce n’est pas grave, il y a moyen d’utiliser d’autres fonctions…
    @+
    :bonjour:

    #68320
    Merlin
    Maître des clés

    La prochaine étape va être de pouvoir filtrer la liste en fonction du premier chiffre du code PCS (1, 2, 3, 4, 5 ou 6)

    C’est une fonctionnalité native dans Acrobat (Reader, Pro, Standard).
    Quand on saisit un caractère au clavier la liste déroulante se positionne automatiquement sur le premier item correspondant dans la liste.

    Sur MacOS je n’en jurerais pas, mais sur Windows ça fonctionne très bien.

    #68321
    yalec38
    Membre

    Bebarth,

    J’ai essayé d’adapter le code dans le script “init” du formulaire que tu as créé pour ne pas avoir de pièce jointe au formulaire en me servant d’un champs “zone de texte” dans lequel j’ai copié les données du fichier PCS-ESE.txt.
    Je n’ai rien qui s’affiche dans le champs LISTE-PCS  :Ooops:

    Voici le code modifié :

    this.getField(“LISTE-PCS”).clearItems();
    var DONNEES=this.getField(“DONNEES”).value;
    var DONNEES=DONNEES.replace(/;/g, “”);
    var LIGNES=DONNEES.split(“r”);
    var COLONNES=new Array();
    for (var i=0; i.split(“t”));
    var TABLEAU=new Array() ;
    for (var j=0 ; jthis.getField(“LISTE-PCS”).setItems(TABLEAU); // champ liste déroulante
    this.getField(“LISTE-PCS”).setFocus();
    this.getField(“CODE-PCS1”).value=this.getField(“LISTE-PCS”).getItemAt(0,false);
    this.getField(“LIB-PCS1”).value=this.getField(“LISTE-PCS”).getItemAt(0,true);
    this.getField(“CODE-PCS2″).value=””;
    this.getField(“LIB-PCS2″).value=””;

    Y’a t’il un moyen de déboguer le code en pas-à-pas (de façon à voir le contenu des variables et si oui, comment faire ?
    A quoi correspond la commande .push ?
    Comment afficher dans le champs “LISTE-PCS” le code PCS et le libellé séparés d’une tabulation ?

    Je suis désolé de revenir sur le sujet mais je suis vraiment une quiche en javascript alors que je me débrouille en peu mieux en VB.Net

    #68322
    bebarth
    Maître des clés

    bonsoir,
    Si tu fais un copier/coller de ton fichier txt dans un champ, le souci est que tes tabulations ne seront pas reconnues. Elles seront interprétées comme un espace !
    Si tous tes codes ont le même nombre de caractères, on peut s’en sortir sinon ça sera entre plus compliqué et impossible…
    Mais il semble qu’ils ont tous 4 caractères, correct ?Pour afficher une valeur dans la console tu écris :
    console.println(“Variable DONNEES : “+DONNEES);
    @+
    :bonjour:

    #68323
    yalec38
    Membre

    Effectivement, tous les codes font le même nombre de caractères : 3 chiffres suivi d’une lettre.

    #68324
    bebarth
    Maître des clés

    bonjour,
    Voilà ce que ça donne.
    Si tu n’as pas spécialement besoin du champ “DONNEES”, tu peux coller ton fichier txt en variable du script d’ouverture :

    Code:
    var donnees=”Tu colles ici le texte de ton fichier txt”;

    et bien sûr, tu retires la lignes :

    Code:
    var donnees=this.getField(“DONNEES”).value;

    @+
    :bonjour:

    #68325
    yalec38
    Membre

    Bebarth,

    Je me suis permis de t’envoyer un message privé. En fait j’ai besoin du champ Zone de texte pour importer les données car l’utilisateur final doit pouvoir modifier ces données indirectement. Je t’explique cela de manière plus claire dans mon MP.

    Merci de ta patience  :Ooops:

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