Utilisation de la recherche en indice pour Dispatch<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Bonjour, j'ai des difficultés à envoyer des informations à un rapport après sa génération. Le rapport contient plusieurs distributions créées dans une boucle for avec l'index i. Chaque distribution est contenue dans sa propre boîte de plan afin que je puisse ajouter beaucoup d'autres éléments dans chaque boîte de plan et regrouper le matériel pertinent. Je stocke une référence à chacune de ces distributions (appelée distObj ), et je peux les changer en les adressant comme distObj [1] << ... etc, mais voici le piège: J'utilise des boîtes radio situées dans le rapport, un ensemble de 3 boîtes radio par boîte hiérarchique (c'est-à-dire par distribution). En cliquant sur différents boutons radio, les axes du paramètre i'th ne sont redimensionnés que de 1 à 3 manières différentes. Une fois le script terminé, la variable i n'est plus mappée à chaque case comme à chaque itération de for car elle a été incrémentée à sa valeur finale. Je dois déterminer quel ensemble de boutons a été cliqué (essentiellement, ce qui était 'i') et envoyer des informations de mise à l'échelle de limite à la distribution correspondante uniquement. J'ai vérifié que cela fonctionnait si je codais le sous-script en dur mais cela ne fonctionnerait vraiment pas.
J'ai essayé quelques choses, comme écrire une boîte d'édition de nombre avec le nombre i, afin que je sois réellement stocké dans le rapport., Mais j'ai toujours des problèmes pour obtenir cette variable spécifique (elle doit également être souscrite) .
Il y a quelque chose dans le guide de script qui, à mon avis, peut m'aider, mais je ne sais pas comment l'utiliser. Page 335 du guide de script de JMP 10, Chapitre Afficher les arbres, Indices. Ils suggèrent que pour une boîte d'affichage db, JSL puisse trouver un objet avec "text" en utilisant le code db ["text"] ou db ["text?"] En utilisant le? comme un joker. La raison pour laquelle je pense que cela peut m'aider est qu'au lieu de compter sur un indice pour le paramètre i'th, je voudrais simplement trouver une correspondance basée sur distObj. J'espère l'obtenir de sorte que le bouton radio envoie une commande pour rechercher un nœud dans la zone de plan (ou rester dans le même nœud), obtenir la référence de base de données appropriée et envoyer la commande à partir de là. J'ai essayé de faire en sorte que cela fonctionne, mais je me demande si je n'aboie pas le mauvais arbre avec celui-ci.
Voici la partie pertinente de mon script. Dans la section boîte radio, la variable "stockée_i "peut aussi bien être" i ". C'était un test qui n'a pas vraiment fonctionné.
Des idées?
custRpt = New Window (titleString,
AnaNotesBox = Outline Box ("Notes d'analyse",
Zone de texte (textString1),
)
)
distObj = {};
rb1 = {};
rb2 = {};
rb3 = {};
paramBoxList = {};
Pour (i = 1, i <= AdjNumParam, i ++,
custRpt << append (
ParamBoxList = Zone de contour (newYparamName ,
Zone de liste V (
hlistbox (
rb1 = radioBox ("Méthode d'échelle 1", show ("test1"); stocké_i = numBox << Get (valeur numérique); show (stocké_i); // <- numbox est juste
distObj [storage_i] << SendToReport (
Envoi(
{},
"1",
ScaleBox,
{Min (newMin [stockée_i], newLSL [stockéei]), Max (newMax [stockéei], newUSL [stockéei]), Inc (2),
Tiques mineures (1), étiquettes pivotées ("horizontales")}
));
),
rb2 = radioBox ("Méthode d'échelle 2", storage_i = numBox << Get (valeur numérique);
distObj [storage_i] << SendToReport (
Envoi(
{},
"1",
ScaleBox,
{Min (newMin [storage_i]), Max (newMax [stock_i]), Inc (2),
Tiques mineures (1), étiquettes pivotées ("horizontales")}
));
),
rb3 = radioBox ("Méthode d'échelle 3", storage_i = numBox << Get (valeur numérique);
distObj [storage_i] << SendToReport (
Envoi(
{},
"1",
ScaleBox,
{Min (newLSL [storage_i]), Max (newUSL [stock_i]), Inc (2),
Tiques mineures (1), étiquettes pivotées ("horizontales")}
));
),
numBox = Zone d'édition numérique (i), // <- numBox non souscrit, donc cela ne fonctionnera pas
// jour_stocké = numBox << Get (valeur numérique)
// numParam = numParamVal << Get (valeur numérique);
),
rb1 << groupe (rb2 ) << groupe (rb3 ),
Zone de liste H (
distObj = Distribution (
Y (Liste d'évaluation (newYparamName ))),
),
boîte de saut de page ();
)
)
)
)
Re: Utilisation de la recherche en indice pour DispatchUn dernier suivi sur ce sujet: le problème que j'ai noté ci-dessus, où cliquer sur des cases d'option sur une ancienne version du rapport génère une erreur, car les variables sont obsolètes, ne s'avère pas être un problème lorsque le script est installé en tant qu'add -dans. J'ai "noms par défaut à here (1)" dans le fichier .jsl, donc je ne sais pas pourquoi il échouait en exécutant le fichier .jsl directement. Mais dans tous les cas, je pensais mettre à jour ce fil pour la postérité.
Si quelqu'un a une réponse pour la gestion d'erreur générale, ce serait apprécié. Je cherche quelque chose qui soit une erreur générique fourre-tout, au cas où je ne tiendrais pas compte de certaines entrées utilisateur étranges. Je voudrais que le script se termine gracieusement.
Merci.
Re: Utilisation de la recherche en indice pour DispatchJ'ai remarqué un problème potentiel dans ce script, mais uniquement lorsque vous l'exécutez plusieurs fois et que vous laissez une fenêtre de rapport précédente ouverte. Les boîtes radio d'une instance précédente du rapport enverront des messages à la dernière instance de la fenêtre du rapport. Cela me semble logique, mais si le rapport généré est itéré sur 20 tracés, et le second sur 3 tracés, les 3 premiers ensembles de boutons radio de la première fenêtre enverront des commandes à la dernière fenêtre et 4 à 20 boutons radio entraîneront une erreur (dans mon cas, cela distObj [4] ... distObj [20] n'est pas défini). Est-il possible de coder dans cette longue chaîne Eval Insert () à laquelle distObj se réfère, ou est-ce trop demander à JSL?
En outre, y at-il un fourre-tout de gestion d'erreur Je suppose que je pourrais coder quelque chose dans la chaîne Eval Insert () pour empêcher l’erreur de s’afficher, mais je ne sais pas quelles autres erreurs non gérées peuvent se cacher. Dans Excel VBA, par exemple, utiliser quelque chose comme "sur erreur", puis une petite routine "errorHandler:" à la fin pour sortir correctement fera l'affaire.
Merci.
Re: Utilisation de la recherche en indice pour DispatchMerci pour toutes les réponses MS.
Cela fait quelques jours que je joue avec le code ici et là et je me sens mieux pour les délimiteurs. J'aime mieux votre code mis à jour et je conviens que Dispatch () est compliqué. J'ai converti le nouveau code.
Je pensais qu'il était possible d'utiliser "Revert axis" car même s'il n'était pas disponible dans la boîte de dialogue de double-clic, il y avait une option pour cela quand vous faites un clic droit sur l'axe. Je penserais que ce serait plus une fonction qu'un cadre booléen. Pas un gros problème. Je viens de supprimer la fonctionnalité de mon script. Cette fonctionnalité s’explique par le fait que JMP peut redimensionner les axes de manière beaucoup plus propre que moi. J'ai essayé plusieurs méthodes mathématiques mais je n'ai rien trouvé qui puisse fonctionner de manière cohérente. (J'ai essayé de nombreux calculs USL, LSL, largeur spéc. Pour définir min (), max (), inc ()).
Test rapide de copier / coller JSL en mot, puis hors mot en FF (Win XP). Ça a l'air bien, merci.
hlb_1 << ajouter (
Eval (
Analyser (
Eval Insert (
"\ [^" rb1 ["|| char (i) ||"] "^ = radioBox (" Echelle en données + limites ",
rapport (distObj [^ i ^]) [AxisBox (1)] << Min (^ minMinLSL_scale ^) << Max (^ maxMaxUSL_scale ^) << Inc (^ inc1_scale ^);
if (nitems (^ groupList ^)> = 1 & groupList [1]! = 0, pour (k = 1, k <= nitems (^ groupList ^), k ++,
report (oneObj [^ i ^]) [AxisBox (1)] << Min (^ minMinLSL_scale ^) << Max (^ maxMaxUSL_scale ^) << Inc (^ inc1_scale ^);
))
)
] \ "
)
)
)
) ;
Re: Utilisation de la recherche en indice pour DispatchQ & A
Pourquoi le i dans votre script reçoit-il les délimiteurs '^' mais pas DistObj?
Cela ne fonctionnait pas avec les délimiteurs autour de distObj. Probablement parce qu'une variable pointant sur l'objet est nécessaire (par exemple, distObj [1]). Entièrement évalué, nous obtiendrions l'élément de liste en texte clair, c’est-à-dire Distribution [], ce qui n’a aucun sens pour JMP lors de l’analyse de la chaîne.
Existe-t-il un moyen de modifier une section du code ci-dessus (l'une des cases d'option) pour inverser l'axe?
Pas pour la plate-forme de distribution semble-t-il. Cela ne fonctionne pas, et si vous double-cliquez sur l’axe pour appeler la boîte de dialogue des paramètres de l’axe, vous verrez qu’il n’ya pas de case à cocher Rétablir l’axe.
Aussi, quelle est votre méthode pour coller du code?
Je viens de copier et coller de l'éditeur JSL dans le navigateur. Dans le nouveau forum, la mise en forme est en grande partie conservée, mais l'indentation est en partie perdue. Dans l'ancien forum, je devais d'abord coller dans MS Word, puis dans le navigateur, si je me souviens bien. J'utilise JMP 10 pour Mac. Sous Windows, cela peut fonctionner différemment.
Où avez-vous appris tout cela?
Les études personnelles, de nombreux essais et erreurs, et aider les gens ici sur le forum m’ont beaucoup appris.
Btw, j'utilise rarement la méthode Dispatch (). La syntaxe est compliquée et se trouve principalement dans les scripts générés automatiquement. Il est beaucoup plus simple d’envoyer des messages directement à la zone d’affichage qui vous intéresse (la commande << afficher l’arborescence est utile pour savoir comment adresser une base de données spécifique; essayez ici par exemple distObj [1] << afficher l’arborescence).
Comparez ceci avec votre script ci-dessus (juste un extrait):
hlb_1 << ajouter (
Eval (
Analyser (
Eval Insert (
"\ [rb1 [^ i ^]] = radioBox (" Méthode d'échelle 3 ", rapport (distObj [^ i ^]) [AxisBox (1)] << Min (^ newMin ^) << Max (^ newMax ^))] \ "
)
)
)
) ;
Re: Utilisation de la recherche en indice pour DispatchExiste-t-il un moyen de modifier une section du code ci-dessus (l'une des cases d'option) pour inverser l'axe? Je sais qu’il existe une commande d’inversion d’axe, mais je n'arrive pas à le faire fonctionner. Deux tentatives sont décrites ci-dessous.
Aussi, quelle est votre méthode pour coller du code? Téléchargez-vous un fichier jsl? Je n'ai pas été capable de dupliquer votre mise en forme.
hlb_1 << append (
Eval (
Parse (
Eval Insert (
"\ [^" rb4 ["|| char (i) ||"] "^ = radioBox (" Inverser l’axe ",
distObj [^ i ^] << SendToReport (
Envoi(
{},
"1",
boîte d'axe (1),
axe de retour
));
)] \ "
)
/ *
Eval Insert (
"\ [^" rb4 ["|| char (i) ||"] "^ = radioBox (" Inverser l’axe ",
distObj [^ i ^] [boîte d'axes (1)] << axe de retour;
)] \ "
) * /
)
)
)
Re: Utilisation de la recherche en indice pour DispatchSalut MS,
Tout d'abord, merci beaucoup pour votre aide. numbox était une tentative d'accès à n'importe quelle instance de rbx sur laquelle l'utilisateur avait cliqué. Ça n'a pas marché.
J'ai dû modifier un peu votre script car mes listes dans votre boucle j portent en fait des noms différents, de sorte que j'ai besoin que tout soit dactylographié (voir ci-dessous). Avec ces modifications, tout fonctionne parfaitement (jusqu'à présent). Nous verrons dans quelle mesure JMP gère le redimensionnement pour différentes limites.
J'ai quelques questions. Pourquoi le i dans votre script reçoit-il les délimiteurs '^' mais pas DistObj? Il m'a fallu un peu de temps pour comprendre ce que faisaient ces caractères spéciaux, mais je suis toujours confus sur ce point.
Où avez-vous appris tout cela? Auto-apprentissage ou formation JMP formelle via SAS?
dtData = Open ("$ SAMPLE_DATA / Big Class.jmp");
dtData: age << type de modélisation (continu);
newMin = {12, 50, 64};
newMax = {17, 70, 172};
newLSL = {10, 40, 50};
newUSL = {20, 80, 200};
newLSL2 = {5, 20, 0};
newUSL2 = {25, 100, 300};
newYparamName = {"age", "taille", "poids"};
adjNumParam = 3;
{distObj, paramBoxList, rb1, rb2, rb3} = {{}, {}, {}, {}, {}};
custRpt = New Window ("Title",
AnaNotesBox = Outline Box ("Notes d'analyse",
Zone de texte ("Information ..."),
)
)
Pour (i = 1, i <= AdjNumParam, i ++,
custRpt << append (
ParamBoxList = Zone de contour (newYparamName ,
vlb = Zone de liste V (
hlb_1 = Zone de liste H (),
hlb_2 = Zone de liste H (
distObj =
Distribution (Y (Liste d'évaluation) (newYparamName ))),
),
Boîte de saut de page ()
)
)
)
// Pour (j = 1, j <= 3, j ++,
hlb_1 << append (
Eval (
Parse (
Eval Insert (
"\ [^" rb1 ["|| char (i) ||"] "^ = radioBox (" Méthode d'échelle 1 ",
distObj [^ i ^] << SendToReport (
Envoi(
{},
"1",
ScaleBox,
{Min (^ newMin ^), Max (^ newMax ^)}
));
)] \ "
)
)
)
)
hlb_1 << append (
Eval (
Parse (
Eval Insert (
"\ [^" rb2 ["|| char (i) ||"] "^ = radioBox (" Méthode d'échelle 2 ",
distObj [^ i ^] << SendToReport (
Envoi(
{},
"1",
ScaleBox,
{Min (^ newLSL ^), Max (^ newUSL ^)}
));
)] \ "
)
)
)
)
hlb_1 << append (
Eval (
Parse (
Eval Insert (
"\ [
^ "rb3 [" || char (i) || "]" ^ = radioBox ("Méthode d'échelle 3",
distObj [^ i ^] << SendToReport (
Envoi(
{},
"1",
ScaleBox,
{Min (^ newLSL2 ^), Max (^ newUSL2 ^)}
));
)] \ "
)
)
)
)
//);
rb1 << groupe (rb2 ) << groupe (rb3 )
)
Re: Utilisation de la recherche en indice pour DispatchLors de la création de rapports incrémentiels dans une boucle, il est important de "cerner" la valeur de je dans les boîtes d'affichage et leurs scripts d'action. Une façon de procéder consiste à utiliser des chaînes, puis à utiliser Parse (Evalinsert ("code")) à chaque itération pour mettre à jour et évaluer le code. Bien que pas jolies, les chaînes de code facilitent souvent le contrôle de ce qui se passe.
Vous trouverez ci-dessous une tentative visant à améliorer le fonctionnement de votre exemple de code. J'ai omis les choses numBox car je ne pouvais pas comprendre pourquoi c'était là.
dtData = Ouvrir ( "$ SAMPLE_DATA / Big Class.jmp" ) ; dtData : âge << type de modélisation ( continu ) ;
newMin = { 12 , 15 , 64 } ;
newMax = { 17 , 70 , 172 } ;
nouveauLSL = { dix , 40 , 50 } ;
nouveauUSL = { 20 , 80 , 200 } ;
newYparamName = { "âge" , "la taille" , "poids" } ; adjNumParam = 3 ;
{ distObj , paramBoxList , rb1 , rb2 , rb3 } = {{} , {} , {} , {} , {}} ;
client = Nouvelle fenetre ( "Titre" ,
AnaNotesBox = Contour Box ( "Notes d'analyse" ,
Zone de texte ( "Information..." ) ,
)
) ;
Pour ( je = 1 , je <= AdjNumParam , je ++,
client << ajouter (
ParamBoxList [ je ] = Contour Box ( newYparamName [ je ] ,
vlb = Zone de liste V (
hlb_1 = Zone de liste H () ,
hlb_2 = Zone de liste H (
distObj [ je ] =
Distribution ( Y ( Liste d'évaluation ( newYparamName [ je ] ) ) ) ,
) ,
Boîte de saut de page ()
)
)
) ;
Pour ( j = 1 , j <= 3 , j ++,
hlb_1 << ajouter (
Eval ( Analyser ( Eval Insert (
"\ [^" rb "|| char (j) ||" ["|| char (i) ||"] "^ = radioBox (" Méthode d'échelle "|| char (^ j ^),
distObj [^ i ^] << SendToReport (
Envoi(
{},
"1",
ScaleBox,
{Min (^ newMin^), Max (^ newMax^)}
));
)] \ "
)))
)
) ;
rb1 [ je ] << groupe ( rb2 [ je ] ) << groupe ( rb3 [ je ] ) ;
) ;
Re: Utilisation de la recherche en indice pour DispatchVoici une version du code ci-dessus qui s'exécutera telle quelle, en utilisant big class comme fichier exemple. Là encore, la mémoire storage_i n'est pas mise à jour et l'astuce consiste à déterminer lequel des SET de boîtes radio envoie la commande. Je serais reconnaissant pour toute suggestion.
effacer le journal ();
les noms par défaut ici (1);
globaux clairs ();
dtData = Open ("$ SAMPLE_DATA / Big Class.jmp");
// dtData = table de données ("Big Class.jmp");
// show (dtData);
newMin = {12, 15, 64};
newMax = {17, 70, 172};
newLSL = {10, 40, 50};
newUSL = {20, 80, 200};
newYparamName = {"age", "taille", "poids"};
adjNumParam = 3;
custRpt = New Window ("Title",
AnaNotesBox = Outline Box ("Notes d'analyse",
Zone de texte ("Information ..."),
)
)
distObj = {};
rb1 = {};
rb2 = {};
rb3 = {};
paramBoxList = {};
Pour (i = 1, i <= AdjNumParam, i ++,
custRpt << append (
ParamBoxList = Zone de contour (newYparamName ,
Zone de liste V (
hlistbox (
rb1 = radioBox ("Méthode d'échelle 1", show ("test1"); stocké_i = numBox << Get (valeur numérique); show (stocké_i); // <- numbox est juste
distObj [storage_i] << SendToReport (
Envoi(
{},
"1",
ScaleBox,
{Min (newMin [stockée_i], newLSL [stockéei]), Max (newMax [stockéei], newUSL [stockéei]), Inc (2),
Tiques mineures (1), étiquettes pivotées ("horizontales")}
));
),
rb2 = radioBox ("Méthode d'échelle 2", storage_i = numBox << Get (valeur numérique);
distObj [storage_i] << SendToReport (
Envoi(
{},
"1",
ScaleBox,
{Min (newMin [storage_i]), Max (newMax [stock_i]), Inc (2),
Tiques mineures (1), étiquettes pivotées ("horizontales")}
));
),
rb3 = radioBox ("Méthode d'échelle 3", storage_i = numBox << Get (valeur numérique);
distObj [storage_i] << SendToReport (
Envoi(
{},
"1",
ScaleBox,
{Min (newLSL [storage_i]), Max (newUSL [stock_i]), Inc (2),
Tiques mineures (1), étiquettes pivotées ("horizontales")}
));
),
numBox = Zone d'édition numérique (i), // <- numBox non souscrit, donc cela ne fonctionnera pas
// jour_stocké = numBox << Get (valeur numérique)
// numParam = numParamVal << Get (valeur numérique);
),
rb1 << groupe (rb2 ) << groupe (rb3 ),
Zone de liste H (
distObj = Distribution (
Y (Liste d'évaluation (newYparamName ))),
),
boîte de saut de page ();
)
)
)
)