切换按钮框或类似的东西大家好,JMP 社区,
我正在尝试设置一个窗口,用户可以在其中选择不同的月份、季度或整个 YTD,同时该窗口还会提供有关已选择(甚至取消选择)哪些按钮框的反馈。我的目的是最终使用月份/季度/YTD 选择来创建基于月份的数据表子集(目前年份始终设置为当前年份)。
这是我正在思考的一个问题:

每当选择一个月份时,代码就会将变量定义为“01”代表一月、“05”代表五月或“1”代表第一季度等。我希望按钮看起来像是被“点击”了,或者最好变成高亮的颜色,比如蓝色。类似于数据过滤器平台中发生的情况,例如使用 Big Class 并按 :name 添加本地数据过滤器时,其中名称会高亮显示,并且可以一次进行多项选择。除了显示按钮已被选中之外,我还希望它显示按钮是否已被取消选中——就像显示按钮是否被选中的复选框一样——但我不想使用复选框,因为它的视觉吸引力较差。

我创建的窗口的代码如下所示(见下文),当然,当用户单击“确定”时,代码将创建子集数据表,然后关闭选择窗口。在设置所选月份“mo#”的变量时,有没有比代码 AsDate(Date DMY(dd,mm,yyyy)) 更简单的方法来为其分配 01Jan2024 值?它工作得很好,只是有点麻烦。
Names Default To Here( 1 );
yr = Year( Today() );
subwin = New Window( "Select Subset",
<<TYPE></TYPE>
<P>任何帮助都将不胜感激!</P>
<P> </P>
<P>谢谢!,</P>
<P>DS</P><LINGO-LABS id="lingo-labs-809673" slang="en-US" mode="CREATE"><LINGO-LABEL>自动化和脚本</LINGO-LABEL><LINGO-LABEL>数据混合和清理</LINGO-LABEL><LINGO-LABEL>大规模定制</LINGO-LABEL><LINGO-LABEL>视窗</LINGO-LABEL></LINGO-LABS>回复:切换按钮框或类似的东西你好@jthi和@txnelson ,
感谢你们两位的宝贵反馈。你们的所有建议都给了我一些想法,让我知道该做什么以及如何修改现有代码以获得我需要的东西。我喜欢@txnelson关于开始日期和结束日期的想法,但不幸的是,它不允许不连续地选择月份和季度。例如,用户可以选择 1 月和 9 月作为月份,或选择 Q1 和 Q4 作为季度,然后从中获取子集。所以,我不得不重写它以允许不连续的日期。我甚至还检查了用户是选择月份和季度还是 YTD 以及任何组合,这样他们就必须返回并选择一个组或另一个组。
我对此的解决方案实际上是使用关联数组,我对结果以及使用 AA 感到满意,因为我实际上并没有用过它们。我写的代码如下。我知道它不是很优雅或紧凑,但它可以工作并完成工作,有时这就是所需要的,对吧?!;)
感谢大家的帮助和快速反馈。我喜欢在这个论坛上提出问题,然后在不到 24 小时后就得到一个可以解决我所有问题的脚本。下面是我最终编写的代码:
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>谢谢!,</P>
<P>DS</P>
<P> </P>回复:切换按钮框或类似的东西我不确定您的数据是什么样子的,或者您希望如何执行选择,但我会将 UI 和逻辑分开。我对您的 UI 进行了修改,但这不是必要的,这只是让收集按钮变得更容易一些。这只会演示如何根据月份构建日期,它不会针对 YTD 或 Quarters 执行此操作,因为我不确定您将如何使用它们
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>回复:切换按钮框或类似的东西这是您的 JSL 的重新制作.....它确实没有经过测试,但它应该足够接近,您可以使用它来完成您的请求
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>
回复:切换按钮框或类似的东西嗨@jthi ,
这确实解决了我所追求的切换问题。现在,唯一的挑战是如何设置当有人点击“确定”时的逻辑结构,以便它只选择数据表中所有可能的月份或季度组合的 mm/yyyy 行等。试图想出一种方法,让它不会很快变得很大。有什么想法吗?
谢谢!,
DS
回复:切换按钮框或类似的东西您还可以对单选框进行分组,以便在任何给定时间只有一个处于活动状态:
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 );回复:切换按钮框或类似的东西按钮框支持 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");


回复:切换按钮框或类似的东西您可以使用单选按钮来实现此目的。您可以使用一组单选按钮来定义时间段是几个月还是几个季度。您可以使用另一个动态集来提供十二个月或四个季度。可以在打开窗口时创建这两个选项,但一组单选按钮(不是默认的)可能是不可见的。第一组单选按钮将管理第二组的可见性以及逻辑。