Cuadro de botones de alternancia o algo similarHola comunidad JMP,
Estoy intentando configurar una ventana en la que los usuarios puedan seleccionar diferentes meses, trimestres o el acumulado anual completo, que también proporcione información sobre qué casillas de botones se han seleccionado (o incluso deseleccionado). Mi intención es utilizar en última instancia la selección de mes/trimestre/Acumulado anual como una forma de crear un subconjunto de una tabla de datos basada en el mes (por ahora, el año siempre se establece en el año actual).
Aquí hay una ventana de lo que estoy pensando:

Siempre que se selecciona un mes, el código definirá una variable como "01" para enero, "05" para mayo o "1" para el primer trimestre, etc. Lo que me gustaría es que el botón parezca que se "hizo clic" al aparecer presionado, o mejor aún, que se vuelva de un color resaltado, como el azul. Algo similar a lo que sucede en la plataforma Data Filter, como cuando se usa Big Class y se agrega un Data Filter local por :name, donde se resalta el nombre y se puede hacer más de una selección a la vez. Además de mostrar que el botón ha sido seleccionado, me gustaría que se muestre si el botón ha sido deseleccionado, como una casilla de verificación que muestra si está marcada o no, pero no quiero usar casillas de verificación ya que es menos atractivo visualmente.

El código para la ventana que he creado se ve así (ver abajo) y, por supuesto, cuando el usuario hace clic en "Aceptar", el código creará la tabla de datos del subconjunto y luego también cerrará la ventana de selección. Al configurar la variable para el mes seleccionado "mo#", ¿hay una forma menos complicada de asignarle el valor 01Jan2024 que el código AsDate(Date DMY(dd,mm,yyyy))? Funciona bien, solo es un poco complicado.
Names Default To Here( 1 );
yr = Year( Today() );
subwin = New Window( "Select Subset",
<<TYPE></TYPE>
<P>¡Cualquier ayuda será muy apreciada!</P>
<P> </P>
<P>¡Gracias!,</P>
<P>DS</P><LINGO-LABS id="lingo-labs-809673" slang="en-US" mode="CREATE"><LINGO-LABEL>Automatización y scripting</LINGO-LABEL><LINGO-LABEL>Combinación y limpieza de datos</LINGO-LABEL><LINGO-LABEL>Personalización masiva</LINGO-LABEL><LINGO-LABEL>Ventanas</LINGO-LABEL></LINGO-LABS>Re: Cuadro de botones de alternancia o algo similarHola @jthi y @txnelson ,
Gracias a ambos por los valiosos comentarios. Todas sus sugerencias me dieron algunas ideas sobre en qué trabajar y cómo modificar el código existente para obtener lo que necesitaba. Me gustó la idea de @txnelson sobre la fecha de inicio y la fecha de finalización, pero desafortunadamente, no permite la selección no continua de meses o trimestres. Por ejemplo, un usuario podría seleccionar enero y septiembre como meses o trimestre 1 y trimestre 4 como trimestres para luego tomar el subconjunto. Entonces, tuve que reescribir eso para permitir fechas no continuas. Incluso incluí una marca de verificación si el usuario estaba seleccionando meses y trimestres o YTD y cualquier combinación para que tuvieran que volver atrás y seleccionar solo un grupo u otro.
Mi solución a este problema fue utilizar matrices asociativas y quedé satisfecho con el resultado, además de utilizar matrices asociativas, ya que no había trabajado mucho con ellas. El código que se me ocurrió se encuentra a continuación. Sé que no es muy elegante ni compacto, pero funciona y cumple su función, que a veces es todo lo que se necesita, ¿no?;)
Gracias por toda la ayuda y los comentarios rápidos. Me encanta poder plantear un problema en este foro y, menos de 24 horas después, tener un script que funcione y resuelva todos los problemas que necesitaba. A continuación, se muestra el código que terminé escribiendo:
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>¡Gracias!,</P>
<P>DS</P>
<P> </P>Re: Cuadro de botones de alternancia o algo similarNo estoy seguro de cómo se ven sus datos o cómo desea realizar las selecciones, pero separaría la interfaz de usuario y la lógica. Hice modificaciones en su interfaz de usuario, pero no es necesario, esto solo hace que sea un poco más fácil recopilar los botones. Esto solo demostrará cómo puede crear las fechas a partir de meses, no lo hará para YTD o trimestres, ya que no estoy seguro de cómo los usará.
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>Re: Cuadro de botones de alternancia o algo similarAquí hay una nueva versión de su JSL... realmente no está probado, sin embargo, debería ser lo suficientemente parecido para que pueda usarlo para completar su solicitud.
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>
Re: Cuadro de botones de alternancia o algo similarHola @jthi ,
Esto definitivamente resolvió el problema de alternancia que buscaba. Ahora, el único desafío es cómo configurar la estructura lógica cuando alguien hace clic en "Aceptar" para que seleccione solo las filas mm/aaaa en la tabla de datos para todas las posibles combinaciones de meses seleccionados o trimestres, etc. Estoy tratando de pensar en una manera de que esto no se vuelva demasiado grande muy rápido. ¿Alguna idea?
¡Gracias!,
DS
Re: Cuadro de botones de alternancia o algo similarTambién puedes agrupar casillas de radio para que solo una esté activa en un momento dado:
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 );Re: Cuadro de botones de alternancia o algo similarButton Box admite el estilo Toggle
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");


Re: Cuadro de botones de alternancia o algo similarPuede utilizar botones de opción para este propósito. Puede utilizar un conjunto para definir si el período es de meses o trimestres. Puede tener otro conjunto dinámico para ofrecer los doce meses o los cuatro trimestres. Ambas opciones se pueden crear cuando se abre la ventana, pero un conjunto (no el predeterminado) puede ser invisible. El primer conjunto de botones de opción administraría la visibilidad del segundo conjunto, así como la lógica.