Umschaltknopffeld oder etwas ÄhnlichesHallo JMP-Community,
Ich versuche, ein Fenster einzurichten, in dem Benutzer verschiedene Monate oder Quartale oder das gesamte Jahr auswählen können, das auch Feedback dazu liefert, welche Schaltflächen ausgewählt (oder sogar abgewählt) wurden. Meine Absicht ist es, die Auswahl von Monat/Quartal/Jahr letztendlich zu verwenden, um eine Teilmenge einer Datentabelle basierend auf dem Monat zu erstellen (das Jahr ist derzeit immer auf das aktuelle Jahr eingestellt).
Hier ist ein Fenster mit meinen Gedanken:

Wenn ein Monat ausgewählt wird, definiert der Code eine Variable als „01“ für Jan, „05“ für Mai oder „1“ für Q1 usw. Ich möchte, dass die Schaltfläche entweder so aussieht, als wäre sie „angeklickt“, indem sie gedrückt erscheint, oder besser noch, dass sie eine hervorgehobene Farbe annimmt, beispielsweise blau. Etwas Ähnliches wie das, was in der Datenfilterplattform passiert, beispielsweise wenn Big Class verwendet und ein lokaler Datenfilter nach :name hinzugefügt wird, bei dem der Name hervorgehoben wird und mehrere Auswahlen gleichzeitig getroffen werden können. Neben der Anzeige, dass die Schaltfläche ausgewählt wurde, möchte ich, dass angezeigt wird, ob die Schaltfläche abgewählt wurde – ähnlich wie ein Kontrollkästchen, das anzeigt, ob sie markiert ist oder nicht –, aber ich möchte keine Kontrollkästchen verwenden, da dies optisch weniger ansprechend ist.

Der Code für das von mir erstellte Fenster sieht so aus (siehe unten), und wenn der Benutzer auf „OK“ klickt, erstellt der Code natürlich die Teildatentabelle und schließt dann auch das Auswahlfenster. Gibt es beim Festlegen der Variable für den ausgewählten Monat „mo#“ eine weniger umständliche Möglichkeit, ihr den Wert 01Jan2024 zuzuweisen, als den Code AsDate(Date DMY(dd,mm,yyyy))? Es funktioniert einwandfrei, es ist nur ein bisschen umständlich.
Names Default To Here( 1 );
yr = Year( Today() );
subwin = New Window( "Select Subset",
<<TYPE></TYPE>
<P>Jede Hilfe wird sehr geschätzt!</P>
<P> </P>
<P>Danke!,</P>
<P>DS</P><LINGO-LABS id="lingo-labs-809673" slang="en-US" mode="CREATE"><LINGO-LABEL>Automatisierung und Skripting</LINGO-LABEL><LINGO-LABEL>Datenzusammenführung und -bereinigung</LINGO-LABEL><LINGO-LABEL>Massenanpassung</LINGO-LABEL><LINGO-LABEL>Windows</LINGO-LABEL></LINGO-LABS>Betreff: Umschaltfläche oder ähnlichesHallo @jthi und @txnelson ,
Vielen Dank an Sie beide für das wertvolle Feedback. Alle Ihre Vorschläge gaben mir einige Ideen, woran ich arbeiten und wie ich den vorhandenen Code ändern könnte, um das zu bekommen, was ich brauchte. Mir gefiel @txnelsons Idee mit dem Start- und Enddatum, aber leider ist keine nicht fortlaufende Auswahl von Monaten und/oder Quartalen möglich. Ein Benutzer könnte beispielsweise Jan und Sep als Monate oder Q1 und Q4 als Quartale auswählen, um dann die Teilmenge daraus zu nehmen. Also musste ich das umschreiben, um nicht fortlaufende Daten zuzulassen. Ich habe sogar eine Prüfung eingebaut, ob der Benutzer Monate und Quartale oder YTD und eine beliebige Mischung auswählt, sodass er zurückgehen und nur die eine oder andere Gruppe auswählen muss.
Meine Lösung hierfür war eigentlich die Verwendung von assoziativen Arrays, und ich war mit dem Ergebnis sowie der Verwendung von AAs zufrieden, da ich nicht wirklich viel mit ihnen gearbeitet habe. Der Code, den ich erstellt habe, ist unten. Ich weiß, er ist nicht sehr elegant oder kompakt, aber er funktioniert und erledigt die Arbeit, und das ist manchmal alles, was nötig ist, oder?!;)
Vielen Dank für all die Hilfe und das schnelle Feedback. Ich liebe es, in diesem Forum ein Problem stellen zu können und dann weniger als 24 Stunden später ein funktionierendes Skript zu haben, das alle meine Probleme löst. Unten ist der Code, den ich letztendlich geschrieben habe:
Names Default To Here( 1 );
dt = Current Data Table();
yr = Year( Today() );
MonthAA = Associative Array( {"M1", "M2", "M3", "M4", "M5", "M6", "M7", "M8", "M9", "M10", "M11", "M12"}, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12} );
QAA = Associative Array( {"Q1", "Q2", "Q3", "Q4"}, {1, 2, 3, 4} );
YTDAA = Associative Array( {"YTD"}, {12} );
MonthList = {};
QList = {};
QMonths = {};
YTDList = {};
ClearExpr = Expr(
dt << Clear Select;
MonthList = {};
QList = {};
QMonths = {};
YTDList = {};
BB1 << Set( 0 );
BB2 << Set( 0 );
BB3 << Set( 0 );
BB4 << Set( 0 );
BB5 << Set( 0 );
BB6 << Set( 0 );
BB7 << Set( 0 );
BB8 << Set( 0 );
BB9 << Set( 0 );
BB10 << Set( 0 );
BB11 << Set( 0 );
BB12 << Set( 0 );
BB13 << Set( 0 );
BB14 << Set( 0 );
BB15 << Set( 0 );
BB16 << Set( 0 );
BB17 << Set( 0 );
);
OKExpr = Expr(
dt << Clear Select;
MonthList = {};
QList = {};
QMonths = {};
YTDList = {};
For( i = 1, i <= 17, i++,
tempBB = Eval( Parse( "BB" || Char( i ) ) ) << Get;
If( tempBB == 1,
If(
Substr( Eval( Parse( "Sel" || Char( i ) ) ), 1, 1 ) == "M", Insert Into( MonthList, Eval( Parse( "Sel" || Char( i ) ) ) ),
Substr( Eval( Parse( "Sel" || Char( i ) ) ), 1, 1 ) == "Q", Insert Into( QList, Eval( Parse( "Sel" || Char( i ) ) ) ),
Substr( Eval( Parse( "Sel" || Char( i ) ) ), 1, 1 ) == "Y", Insert Into( YTDList, Eval( Parse( "Sel" || Char( i ) ) ) )
)
);
);
If(
N Items( MonthList ) != 0 & N Items( QList ) != 0 | N Items( MonthList ) != 0 & N Items( YTDList ) != 0 | N Items( QList ) != 0 &
N Items( YTDList ) != 0,
ErrorWin = New Window( "Error Window",
<<TYPE></TYPE>
<P>Danke!,</P>
<P>DS</P>
<P> </P>Betreff: Umschaltfläche oder ähnlichesIch bin mir nicht sicher, wie Ihre Daten aussehen oder wie Sie die Auswahl treffen möchten, aber ich würde die Benutzeroberfläche und die Logik trennen. Ich habe Änderungen an Ihrer Benutzeroberfläche vorgenommen, aber das ist nicht notwendig. Dadurch wird es nur etwas einfacher, die Schaltflächen zu sammeln. Dies zeigt nur, wie Sie die Daten aus Monaten erstellen können. Für YTD oder Quartale funktioniert es nicht, da ich nicht sicher bin, wie Sie diese verwenden werden.
Names Default To Here(1);
get_dates = Expr(
months = Loc(m_buttons << get, 1);
qs = Loc(q_buttons << get, 1);
ys = Loc(y_buttons << get, 1);
// loop over as necessary to create the combinations
dates_to_find = Transform Each({month}, months,
Date DMY(01, month, yr);
);
);
yr = Year(Today());
subwin = New Window("Select Subset",
<<TYPE></TYPE>Betreff: Umschaltfläche oder ähnlichesHier ist eine Überarbeitung Ihres JSL.....es ist nicht wirklich getestet, sollte jedoch nahe genug herankommen, damit Sie es verwenden können, um Ihre Anfrage abzuschließen
Names Default To Here( 1 );
dt=current data table();
theYear = Year( Today() );
resetbb = Expr(
For( i = 1, i <= 17, i++,
Eval( Parse( "bb" || Char( i ) || "<< enable(1);" ) )
)
);
subwin = New Window( "Select Subset",
<<TYPE>= :Date < endDate );
dtSubset = dt << subset( selected columns( 0 ), selected rows( 1 ) );
subwin << Close Window;
),
Button Box( "Cancel/Exit", subwin << Close Window )
)
)
);
</TYPE>
Betreff: Umschaltfläche oder ähnlichesHallo @jthi ,
Dies hat definitiv das Umschaltproblem gelöst, nach dem ich gesucht habe. Die einzige Herausforderung besteht nun darin, die Logikstruktur so einzurichten, dass beim Klicken auf „OK“ nur die Zeilen MM/JJJJ in der Datentabelle für alle möglichen Kombinationen ausgewählter Monate oder Quartale usw. ausgewählt werden. Ich versuche, mir eine Möglichkeit auszudenken, wie dies nicht sehr schnell zu groß wird. Irgendwelche Ideen?
Danke!,
DS
Betreff: Umschaltfläche oder ähnlichesSie können Optionsfelder auch gruppieren, sodass immer nur eines aktiv ist:
Names Default To Here( 1 );
r1 = Radio Box( {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"} );
r2 = Radio Box( {"Q1", "Q2", "Q3", "Q4"} );
New Window( "Example", H List Box( r1, r2 ) );
r2 << Group( r1 );Betreff: Umschaltfläche oder ähnlichesButton Box unterstützt den Umschaltstil
Names Default To Here(1);
New Window("Toggle Button Example",
ex = Button Box("Start",
If(ex << Get,
ex << Set Button Name("Stop"),
ex << Set Button Name("Start")
)
)
);
ex << Style("Toggle");


Betreff: Umschaltfläche oder ähnlichesSie können zu diesem Zweck Optionsfelder verwenden. Sie können einen Satz verwenden, um festzulegen, ob der Zeitraum Monate oder Quartale umfasst. Sie können einen weiteren dynamischen Satz verwenden, um entweder die zwölf Monate oder die vier Quartale anzubieten. Beide Optionen können beim Öffnen des Fensters erstellt werden, aber ein Satz (nicht der Standardsatz) kann unsichtbar sein. Der erste Satz Optionsfelder würde die Sichtbarkeit des zweiten Satzes sowie die Logik verwalten.