Remplir zones de texte à partir de la ligne sélectionnée dans une zone de liste  (Lu 182 fois) Partager ce sujet Imprimer

1 B


yalec38  14 novembre 2020 : 17:41

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.

IP archivée


bebarth  14 novembre 2020 : 19:01

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:

IP archivée


yalec38  15 novembre 2020 : 09:28

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.length ; i++) {COLONNES = LIGNES.split(";")}
var TABLEAU = new Array() ;
for (var j = 0 ; j < COLONNES.length ; j++) { TABLEAU[j] = [COLONNES[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:

IP archivée


Merlin  15 novembre 2020 : 14:48

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).

IP archivée


yalec38  15 novembre 2020 : 17:21

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.

IP archivée


Merlin  15 novembre 2020 : 19:07

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…

IP archivée


bebarth  15 novembre 2020 : 21:09

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:

IP archivée


bebarth  16 novembre 2020 : 18:24

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

IP archivée


yalec38  16 novembre 2020 : 19:14

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.

IP archivée


bebarth  16 novembre 2020 : 19:25

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:

IP archivée


Merlin  16 novembre 2020 : 20:35

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.

IP archivée


yalec38  19 novembre 2020 : 18:21

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<LIGNES.length; i++) COLONNES.push(LIGNES.split("\t"));
var TABLEAU=new Array() ;
for (var j=0 ; j<COLONNES.length ; j++) TABLEAU.push([COLONNES[j][0],COLONNES[j][1]]);
this.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


IP archivée


bebarth  19 novembre 2020 : 21:09

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:

IP archivée


yalec38  20 novembre 2020 : 09:29

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

IP archivée


bebarth  20 novembre 2020 : 12:14

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 :
var donnees="Tu colles ici le texte de ton fichier txt";
et bien sûr, tu retires la lignes :
var donnees=this.getField("DONNEES").value;
@+
 :bonjour:

IP archivée


yalec38  20 novembre 2020 : 12:34

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:

IP archivée