Comment créer une fenêtre modale de saisie utilisateur à deux colonnes où la deuxième colonne est remplie en fonction d'une seule entrée sur la première colonne ?Je voudrais créer une fenêtre modale de saisie utilisateur à deux colonnes dans laquelle la saisie utilisateur va dans la première colonne (zone de saisie unique) pour un "ID de pièce parent", en fonction des entrées de fenêtre adjacentes de la deuxième colonne (ID de pièce enfant) qui sont renseignées.
- Les entrées de la deuxième colonne proviennent d'une requête de base de données (pour laquelle j'ai déjà un script). Un « ID de pièce parent » peut avoir un ou plusieurs « ID de pièce enfant »
- Ce script de requête doit être exécuté lorsqu'une case est cochée à côté de la zone de saisie de l'ID de la pièce parent après la saisie.
- Une fois qu'un ou plusieurs ID de pièce enfant (selon le cas) sont sélectionnés dans la deuxième colonne (encore une fois en utilisant la case à cocher), appuyez sur le bouton OK en bas de la fenêtre modale pour rendre disponibles les entrées sélectionnées dans la deuxième colonne. (sous forme de liste) pour un script de suivi à utiliser.
- Une option Sélectionner tout pour les entrées de la deuxième colonne serait un avantage supplémentaire.
J'apprécierais si je pouvais avoir quelques idées sur la façon de procéder avec cela en JSL ?
Automatisation et scriptsles fenêtresRe : Comment créer une fenêtre modale de saisie utilisateur à deux colonnes où la deuxième colonne est remplie en fonction d'une seule entrée sur la première colonne ?Pourriez-vous créer une sorte de maquette de l'interface utilisateur et fournir des exemples de données ?
Re : Comment créer une fenêtre modale de saisie utilisateur à deux colonnes où la deuxième colonne est remplie en fonction d'une seule entrée sur la première colonne ?@jthi Veuillez trouver ci-joint. L'utilisateur entre par exemple 9098 et coche la case (coche rouge, pas besoin de couleur rouge d'ailleurs) sous ID de pièce parent. Cocher cette case exécute un script en arrière-plan qui génère un tableau de données à une seule colonne ou une liste (j'ai ce script, je peux donc le faire si nécessaire). Les valeurs de ligne de ce tableau à colonne unique ou des valeurs de liste remplissent les lignes sur le côté droit de la fenêtre de saisie utilisateur, sous ID de pièce enfant. L'utilisateur sélectionne ensuite les ID de partie du graphique comme il le souhaite à l'aide de la case à cocher (les options "tout sélectionner" et "tout décocher" seraient formidables).
En appuyant sur Récupérer, l'ID de pièce parent et les ID de pièce enfant doivent être mis à disposition sous forme de deux listes distinctes pour qu'un script de suivi puisse les utiliser.
J'espère avoir pu expliquer assez clairement.

Re : Comment créer une fenêtre modale de saisie utilisateur à deux colonnes où la deuxième colonne est remplie en fonction d'une seule entrée sur la première colonne ?D'accord. Quelques suggestions pour remplacer les cases à cocher par des boutons. Pour l'ID de pièce parent, cela pourrait être quelque chose comme "Obtenir les ID de pièce enfant" et pour les boutons d'ID de pièce enfant pour "Sélectionner tout" et "Désélectionner tout". L'utilisateur peut effectuer ses sélections dans la zone de liste.
Cela pourrait vous donner quelques idées sur ce que vous pourriez faire
Names Default To Here(1);
aa_parents = ["123" => {"111", "222", "333"}, "345" => {"555", "777", "999"}];
aa_parents << Set Default Value({});
get_childids = function({this}, {Default Local},
new_childids = aa_parents[(this << prev sib) << get text];
lb_child << Set items(new_childids);
);
nw = New Window("", /*<< modal*/
H List Box(
Panel Box("Parent ID",
Lineup Box(N Col(2),
Text Edit Box("", << Set Width(150)),
Button Box("Get Child Ids", << set function(function({this},
get_childids(this);
)))
)
),
Panel Box("Child ID",
H List Box(
lb_child = List Box({}),
Lineup Box(N Col(1),
Button Box("Select All",
For Each({item, idx}, lb_child << get items,
lb_child << Set Selected(idx);
);
wait(0);
),
Button Box("Unselect All",
lb_child << Clear selection;
),
)
)
),
Panel Box("Actions",
Lineup Box(N Col(1),
Button Box("OK"),
Button Box("Cancel")
)
)
)
);Re : Comment créer une fenêtre modale de saisie utilisateur à deux colonnes où la deuxième colonne est remplie en fonction d'une seule entrée sur la première colonne ?@jthi Merci. Cela devrait faire l'affaire. Les boutons à la place de la case à cocher conviennent. J'ai changé votre script en fonction mais j'ai du mal à placer correctement get selected () pour obtenir les valeurs sélectionnées sous forme de liste (par exemple mon instruction Return commentée au bas de la fonction) lorsque l'utilisateur clique sur OK. S'il vous plaît, puis-je obtenir des indications sur l'endroit où placer correctement la sélection () ?
Names Default To Here (1);
getUserInput = Function ({aa_parent}, {return_selectionAslist},
aa_parents << Set Default Value({});
get_childids = function({this}, {Default Local},
new_childids = aa_parents[(this << prev sib) << get text];
lb_child << Set items(new_childids);
);
nw = New Window("",
H List Box(
Panel Box("[1] Enter Parent ID",
Lineup Box(N Col(2),
Text Edit Box("", << Set Width(150)),
Button Box("Get Child Ids", << set function(function({this},
get_childids(this);
)))
)
),
Panel Box("[2] Select Child ID",
H List Box(
lb_child = List Box({}),
Lineup Box(N Col(1),
Button Box("Select All",
For Each({item, idx}, lb_child << get items,
lb_child << Set Selected(idx);
);
wait(0);
),
Button Box("Unselect All",
lb_child << Clear selection;
),
)
)
),
Panel Box("[3] Fetch Test Data",
Lineup Box(N Col(1),
Button Box("OK"),
Button Box("Cancel")
)
)
)
);
// return_selectionAslist = As List [Parent ID, selected_Child_ID(s) ];
Return (return_selectionAslist);
);
//Test
clear log ();
aa_parent_1 = ["123" => {"111", "222", "333"}]; aa_parent_2 = ["345" => {"555", "777", "999"}];
myList= getUserInput (aa_parent_1);Re : Comment créer une fenêtre modale de saisie utilisateur à deux colonnes où la deuxième colonne est remplie en fonction d'une seule entrée sur la première colonne ?Placez-le dans le bouton OK afin qu'il soit exécuté lorsque l'utilisateur appuie sur ce bouton.
Re : Comment créer une fenêtre modale de saisie utilisateur à deux colonnes où la deuxième colonne est remplie en fonction d'une seule entrée sur la première colonne ?@jthi Merci. Je viens de réaliser qu'un élément clé qui manque dans la fonction ci-dessus est qu'un script (que j'ai) doit s'exécuter (en arrière-plan) lorsque l'utilisateur clique sur "Obtenir les identifiants enfants", ce qui générera les identifiants enfants en fonction de l'identifiant parent. entré. Ces identifiants enfants sont affichés dans le deuxième panneau. L'utilisateur choisit ensuite un ou plusieurs identifiants enfants.
Dans l'exemple présenté ici, les ID parent et enfant sont déjà disponibles, ce qui ne serait pas le cas dans le cas réel.
Comment exécuter un script lorsque l'utilisateur clique sur « Obtenir les identifiants enfants », dont la sortie remplit les identifiants enfants ?
Re : Comment créer une fenêtre modale de saisie utilisateur à deux colonnes où la deuxième colonne est remplie en fonction d'une seule entrée sur la première colonne ?Je vous ai donné une idée sur la façon de gérer cela avec get_childids, remplacez-la par votre propre fonction qui récupère les données puis définit les valeurs (aa_parents "simule" simplement la base de données dans ce cas).
Re : Comment créer une fenêtre modale de saisie utilisateur à deux colonnes où la deuxième colonne est remplie en fonction d'une seule entrée sur la première colonne ?@jthi Oui merci. J'ai besoin d'aide pour exécuter un script (en fait une fonction avec l'ID parent en entrée) lorsque le Le bouton Obtenir les identifiants des enfants est cliqué.
Re : Comment créer une fenêtre modale de saisie utilisateur à deux colonnes où la deuxième colonne est remplie en fonction d'une seule entrée sur la première colonne ?L'exemple est déjà là. Y a-t-il quelque chose que vous ne pouvez pas convertir pour fonctionner avec votre script ? ce peut-être, ce qui peut prêter à confusion même s'il ne s'agit que d'un nom d'argument/paramètre qui fait référence à l'élément qui appelle la fonction ?
Re : Comment créer une fenêtre modale de saisie utilisateur à deux colonnes où la deuxième colonne est remplie en fonction d'une seule entrée sur la première colonne ?@jthi Mes compétences JMP ne sont pas encore bonnes (j'ai été un utilisateur Matlab jusqu'à présent), donc j'ai toujours du mal avec la façon de penser JMP. J'essaie ce côté mais jusqu'à présent sans succès. Jamais utilisé ce avant.
Ce que j'essayais, c'était d'utiliser Get Selected Indices (), quelque chose que j'avais déjà utilisé, pour capturer le clic de l'utilisateur sur Obtenez les identifiants des enfants, sur la base de laquelle l'appel de fonction se déclenche et obtient les identifiants des enfants. Encore une fois, aucun succès jusqu'à présent.
Re : Comment créer une fenêtre modale de saisie utilisateur à deux colonnes où la deuxième colonne est remplie en fonction d'une seule entrée sur la première colonne ?@jthi . Il semble que j'ai fait quelques progrès, mais j'ai encore besoin d'aide.
Je suis revenu au script (à la place de la fonction dans le message 5 de ce fil).
Vous trouverez ci-dessous un script en partie fonctionnel. J'ai du mal à saisir l'ID parent (par exemple "715" ci-dessous) à partir de la saisie de l'ID parent des utilisateurs dans ma fonction fetchChildIds. Besoin d'aide ici.
J'ai essentiellement besoin d'insérer l'entrée dans la zone d'édition de texte dans mon argument de fonction pour remplacer "715".
Names Default To Here (1);
clear log ();
include ("_fetchChildIds.jsl");
//aa_parents << Set Default Value({});
get_childids = function({this}, {Default Local},
//new_childids = aa_parents[(this << prev sib) << get text];
new_childids = fetchChildIds ("715");
lb_child << Set items(new_childids);
);
nw = New Window("",
H List Box(
Panel Box("[1] Enter Parent ID", //sets outside panel
Lineup Box(N Col(2),
pid = Text Edit Box("", << Set Width(150)),
Button Box("Get Child ID(s)", << set function(function({this},
get_childids(this);
)))
)
),
Panel Box("[2] Select Child ID",
H List Box(
lb_child = List Box({}),
Lineup Box(N Col(1),
Button Box("Select All",
For Each({item, idx}, lb_child << get items,
lb_child << Set Selected(idx);
);
wait(0);
),
Button Box("Unselect All",
lb_child << Clear selection;
),
)
)
),
Panel Box("[3] Fetch Test Data",
Lineup Box(N Col(1),
Button Box("OK"),
Button Box("Cancel")
)
)
)
);
Re : Comment créer une fenêtre modale de saisie utilisateur à deux colonnes où la deuxième colonne est remplie en fonction d'une seule entrée sur la première colonne ?@jthi
Pourquoi cela n'affiche-t-il pas l'ID parent saisi par l'utilisateur ? Il continue avec 715. Une valeur mise à jour n’est pas prise/utilisée. Est-ce que je place au mauvais endroit, c'est-à-dire sous la zone d'édition de texte ?
pid = Text Edit Box("715", << Set Width(150)),
ParentID = nw["pid" ]; show (ParentID);le ParentID mis à jour par l'utilisateur est disponible en dehors de la Nouvelle fenêtre (), mais je pense que j'en ai besoin lorsque vous appuyez sur la boîte à boutons.
Button Box("Get Child ID(s)", << set function(function({this},
get_childids(this); Re : Comment créer une fenêtre modale de saisie utilisateur à deux colonnes où la deuxième colonne est remplie en fonction d'une seule entrée sur la première colonne ?Vous devez utiliser << Get Text pour obtenir la valeur de la zone d'édition de texte
Re : Comment créer une fenêtre modale de saisie utilisateur à deux colonnes où la deuxième colonne est remplie en fonction d'une seule entrée sur la première colonne ?@jthi oui, j'ai essayé << Obtenir du texte. Je peux obtenir la valeur en dehors de la nouvelle fenêtre()
Je pense que mon problème est le placement correct du Get Text.
Je ne parviens pas à transmettre correctement l'ID parent à partir de la saisie de l'utilisateur lorsque le bouton "Obtenir l'ID enfant" est placé.
En appuyant sur "Obtenir l'ID de l'enfant", je devrais exécuter ma fonction de récupération de l'ID de l'enfant avec l'ID du parent à partir de l'entrée de l'utilisateur.
J'apprécierais de l'aide ici.
Re : Comment créer une fenêtre modale de saisie utilisateur à deux colonnes où la deuxième colonne est remplie en fonction d'une seule entrée sur la première colonne ?Vous utilisez la valeur d'entrée codée en dur de "715" et non l'entrée de l'utilisateur
Re : Comment créer une fenêtre modale de saisie utilisateur à deux colonnes où la deuxième colonne est remplie en fonction d'une seule entrée sur la première colonne ?@jthi
>> Vous utilisez la valeur d'entrée codée en dur de "715" et non l'entrée de l'utilisateur
C'était juste pour montrer ce que je fais. Je souhaite remplacer "715" par la saisie de l'utilisateur.
L'ID parent doit être transmis à l'argument de la fonction lorsque vous appuyez sur le bouton Obtenir les identifiants enfants.
fetchChildIds ()
Le cas codé en dur fonctionne comme prévu, mais je ne parviens pas à obtenir la saisie de l'utilisateur comme argument pour ma fonction mentionnée ci-dessus.
Re : Comment créer une fenêtre modale de saisie utilisateur à deux colonnes où la deuxième colonne est remplie en fonction d'une seule entrée sur la première colonne ?Le script ne contient aucune indication de votre utilisation par exemple
pid << get text
ma méthode d'utilisation pour utiliser ceci pour voyager dans des boîtes d'affichage est plus compliquée (mais peut parfois être plus robuste), la simple utilisation d'une référence devrait suffire.
Commencez également par un script très simple et faites-le fonctionner en premier. Commencez par un exemple d'index de script :
Names Default To Here(1);
win = New Window("Example", fontobj = text = Text Edit Box("Example Text"));
Print(text << Get Text());
modifiez-le pour avoir une boîte à boutons
Names Default To Here(1);
win = New Window("Example",
teb = Text Edit Box("Example Text"),
Button Box("Get Text")
);
ajouter une fonction/expression au bouton
Names Default To Here(1);
win = New Window("Example",
teb = Text Edit Box("Example Text"),
Button Box("Get Text",
show(teb << get text)
);
);
déplacer la fonction/expression hors de la boîte à boutons
Names Default To Here(1);
get_my_text = function({}, {Default Local},
show(teb << get text)
);
win = New Window("Example",
teb = Text Edit Box("Example Text"),
Button Box("Get Text",
get_my_text();
);
);
faire en sorte que la fonction renvoie quelque chose
Names Default To Here(1);
get_my_text = function({}, {Default Local},
teb_txt = teb << get text;
return(teb_txt);
);
win = New Window("Example",
teb = Text Edit Box("Example Text"),
Button Box("Get Text",
user_txt = get_my_text();
show(user_txt);
);
);
et ainsi de suite. Il est très difficile d'essayer de faire fonctionner l'ensemble du script en une seule fois, alors travaillez sur des problèmes beaucoup plus petits, un à la fois.
Re : Comment créer une fenêtre modale de saisie utilisateur à deux colonnes où la deuxième colonne est remplie en fonction d'une seule entrée sur la première colonne ?@jthi Merci beaucoup pour vos contributions. J'ai maintenant réduit le script, ce qui, je l'espère, aidera à mettre en évidence le problème que je rencontre.
Mon commentaire en majuscule ci-dessous (à côté de returnPid = pid << get text; show (returnedPid)) est l'endroit où j'ai besoin d'aide.
L'entrée de l'utilisateur sur l'ID parent n'est pas transmise à l'appel de fonction get_childids.Mon <
Names Default To Here (1);
// function inclusion to fetch child IDs from data base for a given Parent ID.
include ("_fetchChildIds.jsl"); // function called below.
get_childids = function({this}, {Default Local},
new_childids = fetchChildIds (returnedPid);
//lb_child << Set items(new_childids);
);
nw = New Window("FetchData ", //<< Modal, <<RETURN result=""></RETURN>
Re : Comment créer une fenêtre modale de saisie utilisateur à deux colonnes où la deuxième colonne est remplie en fonction d'une seule entrée sur la première colonne ?Il doit se trouver à l'intérieur de la zone de boutons, et non quelque part entre la zone d'édition de texte et la zone de boutons.
Names Default To Here(1);
nw = New Window("FetchData ",
H List Box(
Panel Box("[1] Enter Parent ID",
Lineup Box(N Col(2),
pid = Text Edit Box("", <<SET width=""></SET>Re : Comment créer une fenêtre modale de saisie utilisateur à deux colonnes où la deuxième colonne est remplie en fonction d'une seule entrée sur la première colonne ?@jthi Merci, je n'aurais jamais compris ça.
Cependant, le script mis à jour ci-dessous ne transmet pas la valeur de returnPid comme argument à ma fonction fetchChildIds ( :
Names Default To Here (1);
clear log ();
include ("_fetchChildIds.jsl");
//aa_parents << Set Default Value({});
get_childids = function({this}, {Default Local},
//new_childids = aa_parents[(this << prev sib) << get text];
new_childids = fetchChildIds (returnedPid);
lb_child << Set items(new_childids);
);
nw = New Window("Fetch Summary Data ", << Modal, <<RETURN result=""></RETURN>Re : Comment créer une fenêtre modale de saisie utilisateur à deux colonnes où la deuxième colonne est remplie en fonction d'une seule entrée sur la première colonne ?Vous devriez vraiment lire le guide de script et consulter l'index de script pour comprendre ce qui se passe.
Names Default To Here (1);
get_childids = function({user_input}, {Default Local},
show(user_input);
// do something
// get return value...
retval = user_input; // for demo purposes
return(retval);
);
nw = New Window("Fetch Summary Data ",
H List Box(
Panel Box("[1] Enter Parent ID", //sets outside panel
Lineup Box(N Col(2),
pid = Text Edit Box("", << Set Width(150)),
Button Box("Get Child ID(s)",
user_input = pid << get text;
childids = get_childids(user_input);
// do something with childids (or do it outside within the function but change the function name)
);
)
)
)
);