Usando la ricerca pedice per Dispatch<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Ciao, sto avendo qualche problema ad inviare alcune informazioni a un report dopo che è stato generato. Il report contiene più distribuzioni, che vengono create in un ciclo for con indice i. Ogni distribuzione è contenuta all'interno della propria casella di contorno in modo che sia possibile aggiungere molte altre cose all'interno di ciascuna casella del riquadro e disporre di materiale pertinente raggruppato insieme. Conservo un riferimento a ciascuna di queste distribuzioni (chiamato distObj ), e posso cambiarli indirizzandoli come distObj [1] << ... ecc., ma ecco il trucco: sto usando le radio box situate all'interno del report, un set di 3 radio box per schema (ad es. per distribuzione). Facendo clic su diversi pulsanti di opzione si ridimensionano gli assi per il parametro i solo in 3 modi diversi. Una volta completato lo script, la variabile i non viene più mappata a ciascuna casella come era per ogni iterazione di for perché è stata incrementata al suo valore finale. Ho bisogno di capire quale gruppo di pulsanti è stato cliccato (in sostanza, cosa era 'i'), e inviare le informazioni di ridimensionamento limite solo alla distribuzione corrispondente. Ho verificato che funzioni se ho hardcode il subcript ma in realtà non funzionerà.
Ho provato alcune cose, come scrivere una casella di modifica numero con il numero i, in modo che io venga effettivamente memorizzato nel report., Ma continuo a riscontrare problemi nel tentativo di ottenere quella variabile specifica (deve essere anch'essa abbonata) .
C'è qualcosa nella guida allo scripting che penso possa aiutarmi, ma non so come usarlo. Pagina 335 della guida allo scripting di JMP 10, capitolo Visualizza alberi, Sottoscrizioni. Suggeriscono che per una finestra di visualizzazione db, JSL può trovare un oggetto con "testo" usando il codice db ["testo"] o db ["testo?"] Usando il? come un jolly. La ragione per cui penso che questo possa aiutarmi è che invece di fare affidamento su un pedice per il parametro i, potrei trovare una corrispondenza basata su distObj. Spero di ottenerlo in modo che il pulsante di opzione manda un comando per trovare e salire un nodo nella casella del profilo (o rimanere nello stesso nodo che può essere), ottenere il riferimento db corretto e inviare il comando da lì. Ho cercato di farlo funzionare, ma devo chiedermi se sto abbaiando dall'albero sbagliato con questo.
Ecco la parte rilevante del mio script. Nella sezione box radio, la variabile "stored_i" potrebbe anche essere "i". E 'stato un test che non ha funzionato davvero.
Qualche idea?
custRpt = New Window (titleString,
AnaNotesBox = Outline Box ("Note di analisi",
Casella di testo (textString1),
)
);
distObj = {};
rb1 = {};
rb2 = {};
rb3 = {};
paramBoxList = {};
Per (i = 1, i <= AdjNumParam, i ++,
custRpt << append (
ParamBoxList = Box di contorno (newYparamName ,
V List Box (
hlistbox (
RB1 = radioBox ("Scale method 1", show ("test1"); stored_i = numBox << Get (valore numerico); show (stored_i); // <- numbox è solo
distObj [stored_i] << SendToReport (
Spedizione(
{},
"1",
scalebox,
{Min (newMin [stored_i], newLSL [stored_i]), Max (newMax [stored_i], newUSL [stored_i]), Inc (2),
Tick secondari (1), etichette ruotate ("Horizontal")}
));
),
RB2 = radioBox ("Metodo di scala 2", stored_i = numBox << Get (valore numerico);
distObj [stored_i] << SendToReport (
Spedizione(
{},
"1",
scalebox,
{Min (newMin [stored_i]), Max (newMax [stored_i]), Inc (2),
Tick secondari (1), etichette ruotate ("Horizontal")}
));
),
RB3 = radioBox ("Metodo di scala 3", stored_i = numBox << Get (valore numerico);
distObj [stored_i] << SendToReport (
Spedizione(
{},
"1",
scalebox,
{Min (newLSL [stored_i]), Max (newUSL [stored_i]), Inc (2),
Tick secondari (1), etichette ruotate ("Horizontal")}
));
),
numBox = Numero casella di modifica (i), // <- numBox non subscripted quindi questo non funzionerà
// stored_i = numBox << Get (valore numerico)
// numParam = numParamVal << Get (valore numerico);
),
RB1 << gruppo (rb2 ) << gruppo (rb3 ),
H List Box (
distObj = Distribuzione (
Y (Eval List (newYparamName ))),
),
casella di interruzione di pagina ();
)
)
);
);
Ri: Utilizzando la ricerca di indice per DispatchUn ultimo follow-up su questo thread: il problema che ho notato sopra, in cui fare clic su radio box su una vecchia versione del report genera un errore perché le variabili sono obsolete, risulta non essere un problema quando lo script è installato come -nel. Ho "i nomi di default di qui (1)" nel file .jsl, quindi non sono sicuro del motivo per cui stava fallendo eseguendo direttamente .jsl. Ma in ogni caso, ho pensato di aggiornare questo thread per i posteri.
Se qualcuno ha una risposta per la gestione degli errori generali, sarebbe apprezzato. Sto cercando qualcosa che sia un errore generico, nel caso in cui non avessi preso in considerazione alcuni strani input da parte dell'utente. Mi piacerebbe che la sceneggiatura uscisse con grazia.
Grazie.
Ri: Utilizzando la ricerca di indice per DispatchHo notato un potenziale problema in questo script, ma solo quando lo si esegue più di una volta e lasciando aperta una finestra di report precedente. Le caselle radio di un'istanza precedente del report invieranno messaggi all'ultima istanza della finestra di report. Ha senso per me perché questo sta accadendo, ma se il report generato viene iterato a 20 grafici, e il secondo iterato a 3 grafici, i primi 3 gruppi di pulsanti di opzione nella prima finestra invieranno i comandi alla finestra più recente e set Da 4 a 20 pulsanti di opzione causeranno un errore (nel mio caso distobj [4] ... distObj [20] non è definito). È possibile codificare in quella lunga stringa di Eval Insert () a che cosa si riferisce distObj, o è troppo chiedere di JSL?
Inoltre, c'è un errore nella gestione di catchall? Suppongo di poter inserire un codice nella stringa Eval Insert () per impedire la visualizzazione dell'errore, ma non so quali altri errori non gestiti possano essere in agguato. Ad esempio, in Excel VBA si usa qualcosa come "error goto errorHandler" e poi un po '"errorHandler:" la routine alla fine per uscire con grazia farà bene il trucco.
Grazie.
Ri: Utilizzando la ricerca di indice per DispatchGrazie per tutte le risposte MS.
Ho giocato con il codice qua e là per un paio di giorni, e sto migliorando i delimitatori. Mi piace il tuo codice aggiornato meglio e sono d'accordo che Dispatch () è disordinato. Mi sono convertito al nuovo codice.
Ho pensato che fosse possibile utilizzare "revert axis" perché anche se non è disponibile nella finestra di dialogo doppio clic, c'è un'opzione per esso quando si fa clic con il tasto destro sull'asse. Penserei che sarebbe più una funzione piuttosto che un'impostazione booleana. Non un grande affare. Ho appena rimosso la funzione dal mio script. La ragione come questa funzione è dovuta al fatto che JMP può ridimensionare gli assi in modo molto più pulito di me. Ho provato diversi metodi matematici ma non ho trovato nulla per funzionare in modo coerente. (Ho provato molti calcoli di USL, LSL, larghezza delle specifiche per l'impostazione di min (), max (), inc ()).
Test rapido di copia / incolla JSL in Word, quindi senza parole in FF (Win XP). Sembra buono, grazie.
hlb_1 << aggiungere (
Eval (
analizzare (
Eval Insert (
"\ [^" rb1 ["|| char (i) ||"] "^ = radioBox (" Scala su dati + limiti ",
report (distObj [^ i ^]) [AxisBox (1)] << Min (^ minMinLSL_scale ^) << Max (^ maxMaxUSL_scale ^) << Inc (^ inc1_scale ^);
if (nitems (^ groupList ^)> = 1 & groupList [1]! = 0, per (k = 1, k <= nitim (^ groupList ^), k ++,
relazione (oneObj [^ i ^]) [AxisBox (1)] << Min (^ minMinLSL_scale ^) << Max (^ maxMaxUSL_scale ^) << Inc (^ inc1_scale ^);
))
)
] \"
)
)
)
) ;
Ri: Utilizzando la ricerca di indice per DispatchQ & A
Perché la i nello script ottiene delimitatori '^' ma distObj non lo fa?
Non ha funzionato con i delimitatori attorno a distObj. Probabilmente perché è necessaria una variabile che punta all'oggetto (es. DistObj [1]). Completamente valutati otterremmo la lista Item in clear text ie Distribution [] che non ha alcun senso per JMP quando la stringa viene analizzata.
C'è un modo per modificare una sezione del codice sopra (una delle radiobox) per ripristinare l'asse?
Sembra che non sia per la piattaforma di distribuzione. Non funziona, e se fai doppio clic sull'asse per richiamare la finestra di dialogo delle impostazioni dell'asse vedrai che non c'è alcuna casella di controllo Asse di Reverse.
Inoltre, qual è il tuo metodo per incollare il codice?
Ho appena copiato e incollato dall'editor JSL nel browser. Nel nuovo forum la maggior parte della formattazione viene mantenuta, ma il rientro è parzialmente perso. Nel vecchio forum ho dovuto prima incollare in MS Word e poi nel browser, se ricordo bene. Io uso JMP 10 per Mac. Su Windows potrebbe funzionare diversamente.
Dove hai imparato tutto questo?
Autodidatti, un sacco di prove ed errori, e aiutare le persone qui sul forum mi ha insegnato molto.
A proposito, raramente uso il metodo Dispatch (). La sintassi è complicata e si trova principalmente negli script autogenerati. Molto più semplice è inviare messaggi direttamente alla casella di visualizzazione di interesse (il comando << mostra la struttura ad albero è utile per scoprire come indirizzare un db specifico; qui prova ad esempio distObj [1] << mostra la struttura ad albero).
Confronta questo con il tuo script sopra (solo un estratto):
hlb_1 << aggiungere (
Eval (
analizzare (
Eval Insert (
"\ [rb1 [^ i ^] = radioBox (" Metodo di scala 3 ", rapporto (distObj [^ i ^]) [AxisBox (1)] << Min (^ nuovoMin ^) << Max (^ nuovoMax ^))] "
)
)
)
) ;
Ri: Utilizzando la ricerca di indice per DispatchC'è un modo per modificare una sezione del codice sopra (una delle radiobox) per ripristinare l'asse? So che c'è un comando di ritorno dell'asse ma non riesco a farlo funzionare, sotto ci sono due tentativi.
Inoltre, qual è il tuo metodo per incollare il codice? Carichi un file jsl? Non sono stato in grado di duplicare la tua formattazione.
hlb_1 << append (
Eval (
parse (
Eval Insert (
"\ [^" rb4 ["|| char (i) ||"] "^ = radioBox (" Revert Axis ",
distObj [^ i ^] << SendToReport (
Spedizione(
{},
"1",
scatola dell'asse (1),
ripristinare l'asse
));
)] \"
)
/ *
Eval Insert (
"\ [^" rb4 ["|| char (i) ||"] "^ = radioBox (" Revert Axis ",
distObj [^ i ^] [axis box (1)] << revert axis;
)] \"
) * /
)
)
);
Ri: Utilizzando la ricerca di indice per DispatchCiao MS,
Prima di tutto, grazie mille per il tuo aiuto. numbox è stato un tentativo di ottenere l'accesso a qualunque istanza di rbx è stato cliccato. Non ha funzionato.
Ho dovuto cambiare il tuo script un po 'perché i miei elenchi nel tuo j-loop hanno effettivamente nomi diversi, quindi ho bisogno che tutto sia digitato (vedi sotto). Con queste modifiche, tutto funziona perfettamente (finora). Vedremo quanto bene JMP gestisce il ridimensionamento per vari limiti.
Ho un paio di domande. Perché la i nello script ottiene delimitatori '^' ma distObj non lo fa? Mi ci è voluto un po 'per capire cosa stavano facendo quei personaggi speciali, ma sono ancora confuso su questo punto.
Dove hai imparato tutto questo? Studio personale o formazione JMP formale tramite SAS?
dtData = Open ("$ SAMPLE_DATA / Big Class.jmp");
dtData: age << modeling type (continuous);
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", "height", "weight"};
adjNumParam = 3;
{distObj, paramBoxList, rb1, rb2, rb3} = {{}, {}, {}, {}, {}};
custRpt = New Window ("Title",
AnaNotesBox = Outline Box ("Note di analisi",
Casella di testo ("Informazioni ..."),
)
);
Per (i = 1, i <= AdjNumParam, i ++,
custRpt << append (
ParamBoxList = Box di contorno (newYparamName ,
vlb = V List Box (
hlb_1 = H List Box (),
hlb_2 = H List Box (
distObj =
Distribuzione (Y (Eval List (newYparamName ))),
),
Page Break Box ()
)
)
);
// Per (j = 1, j <= 3, j ++,
hlb_1 << append (
Eval (
parse (
Eval Insert (
"\ [^" rb1 ["|| char (i) ||"] "^ = radioBox (" Metodo di scala 1 ",
distObj [^ i ^] << SendToReport (
Spedizione(
{},
"1",
scalebox,
{Min (^ nuovoMin ^), Max (^ newMax ^)}
));
)] \"
)
)
)
);
hlb_1 << append (
Eval (
parse (
Eval Insert (
"\ [^" rb2 ["|| char (i) ||"] "^ = radioBox (" Metodo di scala 2 ",
distObj [^ i ^] << SendToReport (
Spedizione(
{},
"1",
scalebox,
{Min (^ newLSL ^), Max (^ newUSL ^)}
));
)] \"
)
)
)
);
hlb_1 << append (
Eval (
parse (
Eval Insert (
"\ [
^ "rb3 [" || char (i) || "]" ^ = radioBox ("Metodo di scala 3",
distObj [^ i ^] << SendToReport (
Spedizione(
{},
"1",
scalebox,
{Min (^ newLSL2 ^), Max (^ newUSL2 ^)}
));
)] \"
)
)
)
);
//);
RB1 << gruppo (rb2 ) << gruppo (rb3 );
);
Ri: Utilizzando la ricerca di indice per DispatchQuando si costruiscono i report in modo incrementale in un loop, è importante "hard wire" il valore di io in displaybox e i loro script di azione. Un modo per farlo è usare le stringhe e quindi usare Parse (Evalinsert ("code")) in ogni iterazione per aggiornare e valutare il codice. Sebbene non siano belle, le stringhe di codice rendono spesso più facile controllare cosa sta succedendo.
Di seguito è riportato un tentativo di migliorare il funzionamento del codice di esempio. Ho saltato la roba del NumBox, ma non riuscivo a capire perché fosse lì.
dtData = Aperto ( "$ SAMPLE_DATA / Big Class.jmp" ) ; dtData : età << tipo di modellazione ( continuo ) ;
newMin = { 12 , 15 , 64 } ;
Newmax = { 17 , 70 , 172 } ;
newLSL = { 10 , 40 , 50 } ;
newUSL = { 20 , 80 , 200 } ;
newYparamName = { "età" , "altezza" , "peso" } ; adjNumParam = 3 ;
{ distObj , paramBoxList , RB1 , RB2 , RB3 } = {{} , {} , {} , {} , {}} ;
custRpt = Nuova finestra ( "Titolo" ,
AnaNotesBox = Scatola di contorno ( "Note di analisi" ,
Casella di testo ( "Informazione..." ) ,
)
) ;
Per ( io = 1 , io <= AdjNumParam , io ++,
custRpt << aggiungere (
ParamBoxList [ io ] = Scatola di contorno ( newYparamName [ io ] ,
vlb = V List Box (
hlb_1 = H List Box () ,
hlb_2 = H List Box (
distObj [ io ] =
Distribuzione ( Y ( Eval List ( newYparamName [ io ] ) ) ) ,
) ,
Page Break Box ()
)
)
) ;
Per ( j = 1 , j <= 3 , j ++,
hlb_1 << aggiungere (
Eval ( analizzare ( Eval Insert (
"\ [^" rb "|| char (j) ||" ["|| char (i) ||"] "^ = radioBox (" Metodo di scala "|| char (^ j ^),
distObj [^ i ^] << SendToReport (
Spedizione(
{},
"1",
scalebox,
{Min (^ nuovoMin^), Max (^ newMax^)}
));
)] \"
)))
)
) ;
RB1 [ io ] << gruppo ( RB2 [ io ] ) << gruppo ( RB3 [ io ] ) ;
) ;
Ri: Utilizzando la ricerca di indice per DispatchEcco una versione del codice sopra che verrà eseguita così com'è, utilizzando la classe grande come file di esempio. Di nuovo, il stored_i non viene aggiornato, e il trucco sta nel capire quale dei SET di radiobox sta inviando il comando. Sarei grato per qualsiasi suggerimento.
pulisci il registro();
i nomi sono predefiniti qui (1);
clear globals ();
dtData = Open ("$ SAMPLE_DATA / Big Class.jmp");
// dtData = data table ("Big Class.jmp");
// mostra (dtData);
newMin = {12, 15, 64};
newMax = {17, 70, 172};
newLSL = {10, 40, 50};
newUSL = {20, 80, 200};
newYparamName = {"age", "height", "weight"};
adjNumParam = 3;
custRpt = New Window ("Title",
AnaNotesBox = Outline Box ("Note di analisi",
Casella di testo ("Informazioni ..."),
)
);
distObj = {};
rb1 = {};
rb2 = {};
rb3 = {};
paramBoxList = {};
Per (i = 1, i <= AdjNumParam, i ++,
custRpt << append (
ParamBoxList = Box di contorno (newYparamName ,
V List Box (
hlistbox (
RB1 = radioBox ("Scale method 1", show ("test1"); stored_i = numBox << Get (valore numerico); show (stored_i); // <- numbox è solo
distObj [stored_i] << SendToReport (
Spedizione(
{},
"1",
scalebox,
{Min (newMin [stored_i], newLSL [stored_i]), Max (newMax [stored_i], newUSL [stored_i]), Inc (2),
Tick secondari (1), etichette ruotate ("Horizontal")}
));
),
RB2 = radioBox ("Metodo di scala 2", stored_i = numBox << Get (valore numerico);
distObj [stored_i] << SendToReport (
Spedizione(
{},
"1",
scalebox,
{Min (newMin [stored_i]), Max (newMax [stored_i]), Inc (2),
Tick secondari (1), etichette ruotate ("Horizontal")}
));
),
RB3 = radioBox ("Metodo di scala 3", stored_i = numBox << Get (valore numerico);
distObj [stored_i] << SendToReport (
Spedizione(
{},
"1",
scalebox,
{Min (newLSL [stored_i]), Max (newUSL [stored_i]), Inc (2),
Tick secondari (1), etichette ruotate ("Horizontal")}
));
),
numBox = Numero casella di modifica (i), // <- numBox non subscripted quindi questo non funzionerà
// stored_i = numBox << Get (valore numerico)
// numParam = numParamVal << Get (valore numerico);
),
RB1 << gruppo (rb2 ) << gruppo (rb3 ),
H List Box (
distObj = Distribuzione (
Y (Eval List (newYparamName ))),
),
casella di interruzione di pagina ();
)
)
);
);