如何在Web表单GUI中实现用户友好的布尔逻辑?

时间:2009-11-09 19:55:07

标签: user-interface boolean-logic

目前我有一个Web应用程序,用户可以使用下拉列表生成SQL SELECT语句,如下所示:

列选择下拉列表|运算符下拉(=!=><< => =)|值选择下拉列表

用户可以多次执行此操作,并且“过滤器”当前都已进行AND运算。

我想添加创建OR语句的可能性。在列相同的情况下,我可以很容易地添加OR,但是像

那样复杂的逻辑语句呢 <(>(或OR B或C)和(D或E))或(F和G)?

如何让用户以用户友好的方式创建此类语句?

编辑:为一般受众指定,方便用户使用。目前,我与开发人员合作,偶尔为需要我们数据库中特定信息的非技术客户端手动编写SQL查询。我们的目标是通过为客户提供一个易于使用的工具来自行完成,这个网络应用程序将无需我们手动编码。

EDIT2:目前最终用户尚未使用该应用。我使用的唯一数据是以前的手写SQL查询,因此客户端要求的查询类型。鉴于我可以简化它(例如限制用户为他们倾向于要求的查询类型生成查询的能力),但我想看看是否有人在GUI中简单而完整地传达布尔逻辑的经验。

感谢您的时间。

8 个答案:

答案 0 :(得分:24)

有一个jquery插件可以执行此操作,名为QueryBuilder,它以一种有趣的方式执行此操作:http://mistic100.github.io/jQuery-QueryBuilder/

Jquery QueryBuilder Screenshot

答案 1 :(得分:14)

Apple似乎找到了一种为嵌套布尔表达式设计GUI的方法:请参阅 UX.stackexchange 上接受的答案。

enter image description here

答案 2 :(得分:7)

当您需要处理( (A or B) and C) or (D or E or F)时,您正在使用树状数据结构。根据我的经验,没有简单的方法以“漂亮”或“直观”的方式向用户表示决策树。它在ASP.NET webforms中非常难。

但是,有一种经过验证的方法如下:单个文本框接受where子句。相信我,单输入法真的是最简单直观的用户界面,它还具有允许快速输入/修改查询过滤器的优势。

**从技术方面来说,另一个优势是可以编写自己的词法分析器/解析器和AST。你经常在一个基本的crud app中做到这一点:)*

您已经开始培训您的用户如何使用您的即席查询引擎,您也可以培训他们,键入(account.Balance < -2000 and account.Type == 'Checking') OR (account.Number = 123456)会完全返回它返回的内容。

如果您采用这种方法,请向用户提供可用列的下拉列表,以便双击项目将项目插入光标位置的文本框中。

答案 3 :(得分:2)

老实说,在编写自定义&#34;其中&#34;,&#34; select&#34;,&#34;来自&#34;时,我看不到商业价值。或任何其他SQL命令代理。特别是,在这个特定的上下文(数据库访问和自定义查询)中,客户端打开了地狱的安全门。

让&#34;假人&#34; (我认为他不能使用常规SQL工具)撰写&#34;直观&#34;查询是一场等待发生的灾难。我猜BJ在2003年或2004年的俱乐部信用卡信息泡沫在精神上非常接近这一点。我猜(这只是一个猜测!)一些大营销老板说&#34;我们将保存信用卡条带信息,以便我们以后可以利用这些信息。&#34; &#34;您是否只希望在一个表格中公开提供信息,并且PII在统计上会被删除&#34; - 询问开发人员.....&#34;不,我们还不知道我们想如何使用这些信息,开发一种工具来以一种自定义的方式查询它......&#34 ;是通往灾难之路的第一块踏脚石。 :(

与此同时,组合/解析表达式需要UI(安全策略分析工具,布尔/开关代数研究等)肯定有些地方我认为最好的UI尚未创建(总是:)) ,但如果它被创建,我设想它有可能:

  1. 解析表达式(因为用户可以逐个添加表达块,所以可以构建解析树,这应该是微不足道的)
  2. 以解析树形式显示表达式(绘制它应该很有趣)。
  3. 显示表达式
  4. 所呈现的BF的真/假表
  5. 绘制BF超立方体(特别适用于&#34;单调状态&#34;功能)
  6. 创建一个带拓扑链接的卡诺图(尽管有高维表达的好运)
  7. 动态生成表达式的维恩图。
  8. 突出显示非必要变量或&#34;表达块&#34;。
  9. 使用McCluskey或Petrick布尔表达式最小化方法。

答案 4 :(得分:1)

Mac OS X提供了非常好的GUI小部件来完成这类事情。您可以在此类布局/交互之后对GUI进行建模。

答案 5 :(得分:1)

即使在WinForms应用程序中也难以表示。

您需要做的是实现条件组的概念,该条件组由一个或多个语句和条件运算符组成。

我看到的最好的实现是来自GameSpy服务器过滤 - 我只是试图搜索以找到屏幕截图,但我出现了空(该程序是否仍然存在?)。从我记得,他们做了这样的事情:

(
    Condition 1
) OPERATOR
(
    Condition 2
) OPERATOR
(
    (
        Condition 3
    ) OPERATOR
    (
        Condition 4
    )
)

答案 6 :(得分:1)

当我看到这样的问题时,我不禁想到将它实现为堆栈,类似于RPN如何解决这个问题。

这里的问题是它看起来不太直观

示例用户界面:([按钮]&lt;用户输入的文本框&gt; {list}

价值:&lt; &GT; [推] [和] [或]

栈 {

} (HP RPN计算器将堆栈放在编辑区域上方)

所以,如果我想写表达式((A和B)或(C和D)),我会这样做: 一个[推送](堆栈将包含“A”) B [推送](堆栈将包含“B”,“A”) [和](堆栈将包含“(A和B)”) C [push](堆栈包含“C”,“(A和B)”) D [推送](堆栈将包含“D”,“C”,“(A和B)”) [和](堆栈将包含“(C和D)”,“(A和B)”) [或](堆栈将包含“((A和B)或(C和D)”)

如果您想添加其他运算符,并且没有太多,您可以添加其他按钮,或为运营商创建单独的文本框

价值:&lt; &GT; [推] 运算符&lt; &GT; [合并]

如果你想支持一元运算符,你需要跟踪它是前缀或后缀运算符,还是只假设前缀(布尔一元运算符“not”通常是前缀)。三元运算符通常有两个中缀标识符,因此如果要支持它们会更复杂。一些二进制(和n-ary)运算符有一个前缀,中缀和后缀组件“CallMethod(A,B)”所以它实际上取决于你想要的复杂程度。

只有一个想法。

答案 7 :(得分:0)

另一个选项类似于SQL Server Management Studio查询构建器接口 - 几个行和列,其中行表示AND,列OR(反之亦然,我不记得)。

您可以对结果查询进行实时更新以帮助用户(就像SQL Server更新生成的SQL一样)。