Indexsuche für Dispatch verwenden<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Hallo, Ich habe Probleme, einige Informationen an einen Bericht zu senden, nachdem er generiert wurde. Der Bericht enthält mehrere Distributionen, die in einer for-Schleife mit dem Index i erstellt werden. Jede Distribution ist in einer eigenen Gliederungsbox enthalten, so dass ich in jeder Gliederungsbox viele weitere Elemente hinzufügen und relevantes Material zusammenstellen kann. Ich speichere einen Verweis auf jede dieser Distributionen (distObj genannt) ), und ich kann sie ändern, indem ich sie als distObj [1] anspreche << ... etc, aber hier ist der Haken: Ich verwende Funkboxen innerhalb des Berichts, einen Satz von 3 Funkboxen pro Gliederungsbox (dh pro Verteilung). Durch Klicken auf verschiedene Optionsschaltflächen werden die Achsen für den i-ten Parameter nur auf eine von drei verschiedenen Arten skaliert. Nachdem das Skript abgeschlossen ist, wird die Variable i nicht mehr wie in jeder Iteration von for jeder Box zugeordnet, da sie auf ihren Endwert erhöht wurde. Ich muss herausfinden, welcher Satz von Schaltflächen angeklickt wurde (im Wesentlichen das, was "i" war) und die Grenzwertskalierungsinformationen nur an die entsprechende Verteilung senden. Ich habe bestätigt, dass es funktioniert, wenn ich das Index hart codiert, aber das funktioniert wirklich nicht.
Ich habe ein paar Dinge ausprobiert, wie z. B. das Schreiben eines Zahlenbearbeitungsfelds mit der Nummer i, sodass ich tatsächlich im Bericht gespeichert werde. Ich habe jedoch immer noch Probleme, diese bestimmte Variable zu erhalten (sie muss auch tiefgestellt werden). .
Es gibt etwas in dem Skript-Handbuch, von dem ich denke, dass es mir helfen kann, aber ich weiß nicht, wie ich es verwenden soll. Das Skripthandbuch für JMP 10, Kapitel „Bäume anzeigen“, Subskripte. Sie schlagen vor, dass JSL für ein Anzeigefeld db ein Objekt mit "text" finden kann, indem der Code db ["text"] oder db ["text?"] Mit dem? als Platzhalter. Der Grund, warum ich denke, dass dies mir helfen kann, ist, dass ich, anstatt sich auf einen Index für den i'ten Parameter zu verlassen, nur eine Übereinstimmung finden würde, die auf distObj basiert. Ich hoffe, es zu bekommen, also sendet der Radioknopf einen Befehl, um einen Knoten zum Umrissfeld zu finden (oder in demselben Knoten zu bleiben, wie es sein kann), die richtige Datenbankreferenz zu erhalten und den Befehl von dort aus zu senden. Ich habe versucht, dies zum Laufen zu bringen, aber ich muss mich fragen, ob ich mit diesem Baum den falschen Baum bellen kann.
Hier ist der relevante Teil meines Skripts. In der Radio-Box kann die Variable "gespeicherte_i" auch nur "i" sein. Es war ein Test, der nicht wirklich funktioniert hat.
Irgendwelche Ideen?
custRpt = Neues Fenster (titleString,
AnaNotesBox = Gliederungsfeld ("Analysis Notes")
Textfeld (textString1),
)
);
distObj = {};
rb1 = {};
rb2 = {};
rb3 = {};
paramBoxList = {};
Für (i = 1, i <= AdjNumParam, i ++,
custRpt << append (
ParamBoxList = Gliederungsfeld (newYparamName) .
V-Listenfeld (
hlistbox (
rb1 = radioBox ("Scale-Methode 1", show ("test1"); gespeicherte_i = numBox << Get (numerischer Wert); show (gespeicherte_i); // <- numbox ist gerade
distObj [gespeichert_i] << SendToReport (
Versand(
{},
"1",
ScaleBox,
{Min (newMin [gespeicherte_i], neueLSL [gespeicherte_i]), Max (neueMax [gespeicherte_i], neueUSL [gespeicherte_i]), Inc (2),
Nebenstriche (1), Gedrehte Beschriftungen ("Horizontal")}
));
)
rb2 = radioBox ("Scale-Methode 2", gespeicherte_i = numBox << Get (numerischer Wert);
distObj [gespeichert_i] << SendToReport (
Versand(
{},
"1",
ScaleBox,
{Min (newMin [gespeicherte_i]), Max (neueMax [gespeicherte_i]), Inc (2),
Nebenstriche (1), Gedrehte Beschriftungen ("Horizontal")}
));
)
rb3 = radioBox ("Scale-Methode 3", gespeicherte_i = numBox << Get (numerischer Wert);
distObj [gespeichert_i] << SendToReport (
Versand(
{},
"1",
ScaleBox,
{Min (newLSL [gespeicherte_i]), Max (neueUSL [gespeicherte_i]), Inc (2),
Nebenstriche (1), Gedrehte Beschriftungen ("Horizontal")}
));
)
numBox = Zahlenbearbeitungsfeld (i), // <- numBox nicht subskribiert, so dass dies nicht funktioniert
// gespeicherte_i = numBox << Get (numerischer Wert)
// numParam = numParamVal << Get (numerischer Wert);
)
rb1 << group (rb2 ) << group (rb3 )
H Listenfeld (
distObj = Verteilung (
Y (Eval List (neue Liste) (newYparamName) ))),
)
Seitenumbruchfeld ();
)
)
);
);
Betreff: Verwenden der Indexsuche für DispatchEin letztes Follow-up zu diesem Thread: Das oben erwähnte Problem, dass das Klicken auf Optionsfelder in einer alten Version des Berichts einen Fehler auslöst, weil die Variablen veraltet sind, stellt sich als kein Problem heraus, wenn das Skript als Add installiert wird -im. Ich habe "names default to here (1)" in der .jsl. Ich bin mir also nicht sicher, warum es fehlgeschlagen ist, indem ich die .jsl direkt ausführte. Aber auf jeden Fall dachte ich, ich würde diesen Thread für die Nachwelt aktualisieren.
Wenn jemand eine Antwort auf die allgemeine Fehlerbehandlung hat, wäre dies dankbar. Ich suche nach etwas, das ein generischer Fehler ist, Catch-All, für den Fall, dass ich einige ungerade Benutzereingaben nicht berücksichtigt habe. Ich hätte gerne, dass das Skript elegant beendet wird.
Vielen Dank.
Betreff: Verwenden der Indexsuche für DispatchIch habe ein potenzielles Problem in diesem Skript festgestellt, jedoch nur, wenn es mehr als einmal ausgeführt wurde und ein vorheriges Berichtsfenster geöffnet war. Die Optionsfelder einer vorherigen Instanz des Berichts senden Nachrichten an die neueste Instanz des Berichtsfensters. Es ist für mich sinnvoll, warum dies geschieht. Wenn der generierte Bericht jedoch auf 20 Diagramme und der zweite auf 3 Diagramme iteriert wird, senden die ersten drei Optionsschaltflächen im ersten Fenster Befehle an das neueste Fenster und die entsprechenden Sets 4 bis 20 Optionsfelder führen zu einem Fehler (in meinem Fall, dass distObj [4] ... distObj [20] ist nicht definiert). Ist es möglich, in diese lange Eval Insert () - Zeichenfolge zu codieren, worauf distObj verweist, oder ist dies zu viel, um von JSL nachzufragen?
Gibt es auch einen Fehler, der Catchall behandelt? Ich vermute, ich könnte etwas in die Eval Insert () - Zeichenfolge eingeben, um zu verhindern, dass der Fehler angezeigt wird. Ich weiß jedoch nicht, woran sich andere nicht behandelte Fehler befinden. In Excel-VBA zum Beispiel wird so etwas wie "on error goto errorHandler" und dann eine kleine "errorHandler:" -Routine am Ende verwendet, um den Vorgang ordnungsgemäß zu beenden.
Vielen Dank.
Betreff: Verwenden der Indexsuche für DispatchVielen Dank für alle Antworten, MS.
Ich habe hier und da ein paar Tage mit dem Code herumgespielt und fühle mich besser mit den Trennzeichen. Ich mag Ihren aktualisierten Code besser und stimme zu, dass Dispatch () unordentlich ist. Ich habe den neuen Code übernommen.
Ich dachte, es könnte möglich sein, "Achse umkehren" zu verwenden, da es zwar im Doppelklickdialogfeld nicht verfügbar ist, es jedoch eine Option gibt, wenn Sie mit der rechten Maustaste auf die Achse klicken. Ich denke, es wäre eher eine Funktion als eine boolesche Einstellung. Keine große Sache. Ich habe die Funktion gerade aus meinem Skript entfernt. Der Grund für diese Funktion ist, dass JMP die Achsen viel sauberer skalieren kann als ich. Ich habe verschiedene mathematische Methoden ausprobiert, aber nichts Konsequentes gefunden. (Ich habe viele Berechnungen von USL, LSL, Spezifikationsbreite zum Einstellen von min (), max (), inc ()) versucht.
Schneller Test zum Kopieren / Einfügen von JSL in Word, dann aus Word in FF (Win XP). Sieht gut aus, danke.
hlb_1 << anhängen (
Eval (
Parse (
Eval Insert (
"\ [^" rb1 ["|| char (i) ||"] "^ = radioBox (" Scale to Data + Limits ")
report (distObj [^ i ^]) [AxisBox (1)] << Min (^ minMinLSL_scale) ^) << Max (^ maxMaxUSL_scale ^) << Inc (^ inc1_scale ^);
if (Nitems (^ groupList ^)> = 1 & groupList [1]! = 0, für (k = 1, k <= Nitems (^ groupList ^), k ++,
bericht (oneObj [^ i ^]) [AxisBox (1)] << Min (^ minMinLSL_scale ^) << Max (^ maxMaxUSL_scale ^) << Inc (^ inc1_scale ^);
))
)
] \ "
)
)
)
) ;
Betreff: Verwenden der Indexsuche für DispatchQ & A
Warum erhält das i in Ihrem Skript die Trennzeichen '^', distObj jedoch nicht?
Es hat nicht mit Trennzeichen um distObj funktioniert. Wahrscheinlich, weil eine Variable benötigt wird, die auf das Objekt zeigt (zB distObj [1]). Vollständig ausgewertet erhalten wir das Listenelement im Klartext, dh Verteilung [], was für JMP keinen Sinn macht, wenn die Zeichenfolge analysiert wird.
Gibt es eine Möglichkeit, einen Abschnitt des obigen Codes (eines der Optionsfelder) zu ändern, um die Achse zurückzusetzen?
Nicht für die Vertriebsplattform. Es funktioniert nicht und wenn Sie auf die Achse doppelklicken, um das Dialogfeld "Achseneinstellungen" aufzurufen, sehen Sie, dass es kein Kontrollkästchen "Achse zurücksetzen" gibt.
Was ist auch Ihre Methode zum Einfügen von Code?
Ich kopiere einfach aus dem JSL-Editor in den Browser. In dem neuen Forum wird die meiste Formatierung beibehalten, die Einrückung geht jedoch teilweise verloren. Im alten Forum musste ich erst in MS Word und dann in den Browser einfügen, wenn ich mich recht erinnere. Ich verwende JMP 10 für Mac. Unter Windows kann es anders funktionieren.
Wo hast du das alles gelernt?
Selbststudium, jede Menge Versuch und Irrtum und Menschen hier im Forum zu helfen, hat mich wirklich sehr gelehrt.
Übrigens, ich verwende selten die Dispatch () -Methode. Die Syntax ist kompliziert und findet sich hauptsächlich in den automatisch generierten Skripten. Viel einfacher ist es, Nachrichten direkt an die interessierende Displaybox zu senden (der Befehl << Baumstruktur anzeigen ist hilfreich, um herauszufinden, wie eine bestimmte Datenbank adressiert werden soll; hier versuchen Sie es beispielsweise mit distObj [1] << Baumstruktur anzeigen).
Vergleichen Sie dies mit Ihrem obigen Skript (nur ein Auszug):
hlb_1 << anhängen (
Eval (
Parse (
Eval Insert (
"\ [rb1 [^ i ^] = radioBox (" Scale-Methode 3 ", Bericht (distObj [^ i ^]) [AxisBox (1)] << Min (^ newMin.) ^) << Max (^ newMax ^))] \ "
)
)
)
) ;
Betreff: Verwenden der Indexsuche für DispatchGibt es eine Möglichkeit, einen Abschnitt des obigen Codes (eines der Optionsfelder) zu ändern, um die Achse zurückzusetzen? Ich weiß, dass es einen Befehl zum Umkehren der Achse gibt, aber es scheint nicht, dass er funktioniert. Unten sind zwei Versuche.
Was ist auch Ihre Methode zum Einfügen von Code? Laden Sie eine JSL-Datei hoch? Ich konnte Ihre Formatierung nicht kopieren.
hlb_1 << anhängen (
Eval (
Parse (
Eval Insert (
"\ [^" rb4 ["|| char (i) ||"] "^ = radioBox (" Achse zurücksetzen ",
distObj [^ i ^] << SendToReport (
Versand(
{},
"1",
Achsenkasten (1),
Achse zurücksetzen
));
)] "
)
/ *
Eval Insert (
"\ [^" rb4 ["|| char (i) ||"] "^ = radioBox (" Achse zurücksetzen ",
distObj [^ i ^] [Achsenfeld (1)] << Achse umkehren;
)] "
) * /
)
)
);
Betreff: Verwenden der Indexsuche für DispatchHallo MS,
Zunächst einmal vielen Dank für Ihre Hilfe. numbox war ein Versuch, auf die Instanz von rbx zuzugreifen, auf die geklickt wurde. Es hat nicht funktioniert.
Ich musste Ihr Skript ein wenig ändern, da meine Listen in Ihrer J-Schleife tatsächlich unterschiedliche Namen haben. Ich brauche also die ganze Eingabe (siehe unten). Mit diesen Änderungen funktioniert alles (bis jetzt) perfekt. Wir werden sehen, wie gut JMP die Größenänderung für verschiedene Grenzwerte handhabt.
Ich habe ein paar Fragen. Warum erhält das i in Ihrem Skript die Trennzeichen '^', distObj jedoch nicht? Ich habe ein bisschen gebraucht, um herauszufinden, was diese Sonderzeichen getan haben, aber ich bin in diesem Punkt immer noch verwirrt.
Wo hast du das alles gelernt? Selbststudium oder formale JMP-Schulung durch SAS?
dtData = Open ("$ SAMPLE_DATA / Big Class.jmp");
dtData: Alter << Modellierungsart (kontinuierlich);
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 = {"Alter", "Größe", "Gewicht"};
adjNumParam = 3;
{distObj, paramBoxList, rb1, rb2, rb3} = {{}, {}, {}, {}, {}};
custRpt = Neues Fenster ("Titel",
AnaNotesBox = Gliederungsfeld ("Analysis Notes")
Textfeld ("Informationen ..."),
)
);
Für (i = 1, i <= AdjNumParam, i ++,
custRpt << append (
ParamBoxList = Gliederungsfeld (newYparamName) .
vlb = V List Box (
hlb_1 = H-Listenfeld (),
hlb_2 = H-Listbox (
distObj =
Verteilung (Y (Eval List) (newYparamName) ))),
)
Seitenumbruch ()
)
)
);
// For (j = 1, j <= 3, j ++,
hlb_1 << anhängen (
Eval (
Parse (
Eval Insert (
"\ [^" rb1 ["|| char (i) ||"] "^ = radioBox (" Scale-Methode 1 ")
distObj [^ i ^] << SendToReport (
Versand(
{},
"1",
ScaleBox,
{Min (^ newMin ^), Max (^ newMax ^)}
));
)] "
)
)
)
);
hlb_1 << anhängen (
Eval (
Parse (
Eval Insert (
"\ [^" rb2 ["|| char (i) ||"] "^ = radioBox (" Scale-Methode 2 ")
distObj [^ i ^] << SendToReport (
Versand(
{},
"1",
ScaleBox,
{Min (^ newLSL ^), Max (^ newUSL ^)}
));
)] "
)
)
)
);
hlb_1 << anhängen (
Eval (
Parse (
Eval Insert (
"\ [
^ "rb3 [" || char (i) || "]" ^ = radioBox ("Scale-Methode 3")
distObj [^ i ^] << SendToReport (
Versand(
{},
"1",
ScaleBox,
{Min (^ newLSL2 ^), Max (^ newUSL2 ^)}
));
)] "
)
)
)
);
//);
rb1 << group (rb2 ) << group (rb3 );
);
Betreff: Verwenden der Indexsuche für DispatchBeim schrittweisen Erstellen von Berichten in einer Schleife ist es wichtig, den Wert von "fest zu verdrahten" ich in Displayboxen und deren Aktionsskripten. Eine Möglichkeit, dies zu tun, besteht darin, Strings zu verwenden und dann in jeder Iteration Parse (Evalinsert ("code")) zu verwenden, um den Code zu aktualisieren und auszuwerten. Auch wenn sie nicht hübsch sind, erleichtern Code-Strings oft die Kontrolle über das Geschehen.
Es folgt ein Versuch, Ihren Beispielcode besser zu machen. Ich habe das numBox-Zeug übersprungen, weil ich nicht herausfinden konnte, warum es dort war.
dtData = Öffnen ( "$ SAMPLE_DATA / Big Class.jmp" ) ; dtData : Alter << Modellierungsart ( kontinuierlich ) ;
newMin = { 12 . fünfzehn . 64 } ;
newMax = { 17 . 70 . 172 } ;
newLSL = { 10 . 40 . 50 } ;
newUSL = { 20 . 80 . 200 } ;
newYparamName = { "Alter" . "Höhe" . "Gewicht" } ; adjNumParam = 3 ;
{ distObj . paramBoxList . rb1 . rb2 . rb3 } = {{} . {} . {} . {} . {}} ;
custRpt = Neues Fenster ( "Titel" .
AnaNotesBox = Umrissfeld ( "Analyse Notizen" .
Textfeld ( "Information..." ) .
)
) ;
Zum ( ich = 1 . ich <= AdjNumParam . ich ++
custRpt << anhängen (
ParamBoxList [ ich ] = Umrissfeld ( newYparamName [ ich ] .
vlb = V Listenfeld (
hlb_1 = H Listenfeld () .
hlb_2 = H Listenfeld (
distObj [ ich ] =
Verteilung ( Y ( Bewertungsliste ( newYparamName [ ich ] ) ) ) .
) .
Seitenumbruchfeld ()
)
)
) ;
Zum ( j = 1 . j <= 3 . j ++
hlb_1 << anhängen (
Eval ( Parse ( Eval Insert (
"\ [^" rb "|| char (j) ||" ["|| char (i) ||"] "^ = radioBox (" Scale-Methode "|| char (^ j ^),
distObj [^ i ^] << SendToReport (
Versand(
{},
"1",
ScaleBox,
{Min (^ newMin^), Max (^ newMax^)}
));
)] "
)))
)
) ;
rb1 [ ich ] << Gruppe ( rb2 [ ich ] ) << Gruppe ( rb3 [ ich ] ) ;
) ;
Betreff: Verwenden der Indexsuche für DispatchHier ist eine Version des obigen Codes, die unverändert ausgeführt wird und die große Klasse als Beispieldatei verwendet. Auch hier wird das gespeicherte_i nicht aktualisiert, und der Trick besteht darin, herauszufinden, welche SETs von Optionsfeldern den Befehl senden. Für Anregungen wäre ich dankbar.
Protokoll löschen();
Namen standardmäßig hier (1);
clear globals ();
dtData = Open ("$ SAMPLE_DATA / Big Class.jmp");
// dtData = Datentabelle ("Big Class.jmp");
// show (dtData);
newMin = {12, 15, 64};
newMax = {17, 70, 172};
newLSL = {10, 40, 50};
newUSL = {20, 80, 200};
newYparamName = {"Alter", "Größe", "Gewicht"};
adjNumParam = 3;
custRpt = Neues Fenster ("Titel",
AnaNotesBox = Gliederungsfeld ("Analysis Notes")
Textfeld ("Informationen ..."),
)
);
distObj = {};
rb1 = {};
rb2 = {};
rb3 = {};
paramBoxList = {};
Für (i = 1, i <= AdjNumParam, i ++,
custRpt << append (
ParamBoxList = Gliederungsfeld (newYparamName) .
V-Listenfeld (
hlistbox (
rb1 = radioBox ("Scale-Methode 1", show ("test1"); gespeicherte_i = numBox << Get (numerischer Wert); show (gespeicherte_i); // <- numbox ist gerade
distObj [gespeichert_i] << SendToReport (
Versand(
{},
"1",
ScaleBox,
{Min (newMin [gespeicherte_i], neueLSL [gespeicherte_i]), Max (neueMax [gespeicherte_i], neueUSL [gespeicherte_i]), Inc (2),
Nebenstriche (1), Gedrehte Beschriftungen ("Horizontal")}
));
)
rb2 = radioBox ("Scale-Methode 2", gespeicherte_i = numBox << Get (numerischer Wert);
distObj [gespeichert_i] << SendToReport (
Versand(
{},
"1",
ScaleBox,
{Min (newMin [gespeicherte_i]), Max (neueMax [gespeicherte_i]), Inc (2),
Nebenstriche (1), Gedrehte Beschriftungen ("Horizontal")}
));
)
rb3 = radioBox ("Scale-Methode 3", gespeicherte_i = numBox << Get (numerischer Wert);
distObj [gespeichert_i] << SendToReport (
Versand(
{},
"1",
ScaleBox,
{Min (newLSL [gespeicherte_i]), Max (neueUSL [gespeicherte_i]), Inc (2),
Nebenstriche (1), Gedrehte Beschriftungen ("Horizontal")}
));
)
numBox = Zahlenbearbeitungsfeld (i), // <- numBox nicht subskribiert, so dass dies nicht funktioniert
// gespeicherte_i = numBox << Get (numerischer Wert)
// numParam = numParamVal << Get (numerischer Wert);
)
rb1 << group (rb2 ) << group (rb3 )
H Listenfeld (
distObj = Verteilung (
Y (Eval List (neue Liste) (newYparamName) ))),
)
Seitenumbruchfeld ();
)
)
);
);