问题描述
我试图找到在AnyLogic中创建数据库条件过滤的最佳方法。该数据库如下所示:
我想做的是在AnyLogic主窗口中添加12个复选框:P1,P2,P3,...,T5,T6
如果用户参照上表检查P1,则需要显示A和B。
如果用户选中P2,则需要显示C
如果用户检查了P1和T2,则需要播放A
总而言之,这就像在Excel中通过“ x”过滤任何列集一样,注意到其他单元格具有空值。
首先,我使用以下代码仅对P1进行过滤(将条目添加到String类型的集合中):
collectionDescription.addAll(
selectFrom( data_base ).
where( data_base.P1.eq("x")).
list( data_base.Col1));
现在也要过滤P2,可以执行以下操作:
collectionDescription.addAll(
selectFrom( data_base ).
where( data_base.P1.eq("x")).
where( data_base.P2.eq("x")).
list( data_base.Col1));
按照上述逻辑,可以根据需要添加任意多个“ where”条件。但是,有太多可能的组合(例如P1 / P2,P1 / P2 / P3,P1 / P3等,您可以想象可能的组合数量)。
因此,我想到了一个可能的解决方案,其中我将添加与列数一样多的“ where”条件,但是我将添加“ .eq(varP1)”,而不是添加“ .eq(“ x”)“。 。如果勾选了一个复选框(例如P1),则varP1等于“ x”(varP1是String类型的变量)。但是,如果未选中该框,则理想情况下varP1应该采用表示“ where any”的值,以便该条件不会产生任何影响。我没有找到模仿这种行为的方法。
很抱歉,很长的帖子,但我想确保情况尽可能清楚。那么我在正确的轨道上吗?对于如何解决这个问题,有任何的建议吗?您的建议将不胜感激。
解决方法
假设您有一个与变量varP1关联的复选框,以定义所需的内容...然后就可以
selectFrom(db_table)
.where(varP1 ? db_table.db_column.eq("x") : db_table.db_column.isNotNull().or(db_table.db_column.isNull()))
.list();
我在这里所做的任何事情都是null或不为null的任何值...因此,如果选中此框,则将找到x,否则将找到任何东西