Как я могу реализовать удобную логическую логику в графическом интерфейсе веб-формы?

В настоящее время у меня есть веб-приложение, в котором пользователь может использовать раскрывающиеся списки для создания операторов SQL SELECT, например:

Выпадающий список выбора столбца | Выпадающий список операторов (= != > ‹ ‹= >=) | Выпадающее меню выбора значения

Пользователь может сделать это несколько раз, и в настоящее время все «фильтры» объединяются вместе.

Я хочу добавить возможность создания операторов ИЛИ. Я мог бы очень легко добавить ИЛИ в случае, когда столбцы одинаковы, но как насчет сложных логических операторов, таких как

((А ИЛИ В ИЛИ С) И (D ИЛИ Е)) ИЛИ (F И G)?

Как я могу позволить пользователям создавать такие заявления в удобной для пользователя форме?

РЕДАКТИРОВАТЬ: Чтобы указать, удобный для широкой аудитории. В настоящее время я работаю с разработчиками, которые иногда вручную пишут SQL-запросы для нетехнических клиентов, которым нужна конкретная информация из нашей базы данных. Цель состоит в том, чтобы это веб-приложение избавило нас от необходимости кодировать их вручную, предоставив клиенту простой в использовании инструмент, чтобы сделать это самостоятельно.

EDIT2: в настоящее время приложение не используется конечными пользователями. Единственные данные, которые у меня есть относительно его использования, - это предыдущие рукописные SQL-запросы и, следовательно, типы запросов, которые запрашивает клиент. Учитывая, что я мог бы упростить это (например, ограничить возможность пользователей генерировать запросы теми типами запросов, которые они склонны запрашивать), но я хочу посмотреть, есть ли у кого-нибудь опыт простого и полного сообщения логической логики в графических интерфейсах.

Спасибо за уделенное время.


person Miguel    schedule 09.11.2009    source источник
comment
Под удобным для пользователя вы подразумеваете удобный для широкой аудитории или удобный для людей, которые уже хотя бы немного знакомы с булевой логикой?   -  person Ben Dunlap    schedule 09.11.2009
comment
Извините, еще один вопрос: конечные пользователи уже используют текущую итерацию приложения? Просто интересно, обучены ли они уже распознавать и эффективно использовать триаду столбца/оператора/значения раскрывающихся списков.   -  person Ben Dunlap    schedule 10.11.2009


Ответы (8)


Когда вам нужно обработать ( (A or B) and C) or (D or E or F), вы работаете с древовидной структурой данных. По моему опыту, нет простого способа представить пользователям деревья решений в «красивом» или «интуитивном» виде. Это вдвойне сложно в веб-формах ASP.NET.

Тем не менее, один проверенный и верный подход заключается в следующем: одно текстовое поле, принимающее предложение where. Поверьте мне, подход с одним входом действительно является наиболее простым и интуитивно понятным пользовательским интерфейсом, а также имеет то преимущество*, что позволяет быстро вводить/модифицировать фильтры запросов.

** Еще одним преимуществом с технической стороны является возможность написать собственный лексер/парсер и AST. Как часто вы делаете это в простом crud-приложении :)*

Вы уже собираетесь обучать своих пользователей тому, как использовать ваш механизм специальных запросов, вы также можете научить их тому, что ввод (account.Balance < -2000 and account.Type == 'Checking') OR (account.Number = 123456) возвращает именно то, что он говорит, что возвращает.

Если вы выберете этот подход, предоставьте пользователю раскрывающийся список доступных столбцов, чтобы двойной щелчок по элементу вставлял элемент в текстовое поле в месте расположения курсора.

person Juliet    schedule 09.11.2009
comment
Я хотел бы согласиться с принципами пользовательского интерфейса, но произвольный ввод «ГДЕ» звучит как кошмар безопасности. Есть ли надежный способ фильтрации такого рода входных данных? - person Ben Dunlap; 10.11.2009
comment
вы можете попытаться провести санитарную обработку, такую ​​как удаление ; и других злых вещей.. но говорить клиенту, чтобы он изучал SQL, я не думаю, что это хорошее решение - person Earlz; 10.11.2009
comment
На самом деле это не говорит клиенту изучать SQL, а просто говорит клиенту научиться выражать эти требования в письменной форме, которая, вероятно, более проста, чем визуальная, основанная на раскрывающемся списке. - person Ben Dunlap; 10.11.2009
comment
На самом деле, чем больше я думаю об этом, тем больше мне это нравится. Чтобы сделать это безопасно, вам придется токенизировать ввод и разрешить только короткий, строго обязательный список операторов. Но это, вероятно, НАМНОГО проще, чем пытаться создать пользовательский интерфейс, который скрывает все это от неспециалиста. +1 - person Ben Dunlap; 10.11.2009
comment
@ Бен Данлэп: да, надежный способ проверки ввода - написать простой лексер / синтаксический анализатор, который пытается построить AST для ввода. Если ввод не анализируется (что происходит, когда он содержит недопустимый символ, неопознанный токен или недопустимую грамматику), отклоните его. - person Juliet; 10.11.2009
comment
я голосую против. Я попробовал этот подход с нашей командой по работе с клиентами (поддержка), им потребовались месяцы, чтобы реализовать тонкие изменения в синтаксисе, которые имеют огромный эффект. когда использовать точку, а когда нет? когда нужны цитаты? почему иногда скобки нужны, а иногда нет? и так далее. действительно не рекомендуется в качестве графического интерфейса для конечных пользователей. - person oriadam; 25.01.2021

Для этого существует подключаемый модуль jquery, называемый QueryBuilder, который делает это интересным способом: http://mistic100.github.io/jQuery-QueryBuilder/

Снимок экрана Jquery QueryBuilder

person dryobs    schedule 22.03.2016

Кажется, Apple нашла способ разработать графический интерфейс для вложенных логических выражений: см. принятый ответ на UX.stackexchange.

введите здесь описание изображения

person mb21    schedule 03.02.2013

Честно говоря, я не вижу коммерческой ценности в написании пользовательских «где», «выбрать», «от» или любых других прокси-команд SQL. В частности, в этом конкретном контексте (доступ к БД и пользовательский запрос «на лету») клиент открывает ворота безопасности ада.

Позволить «чайникам» (которые, как я полагаю, не способны использовать обычные инструменты SQL) составлять «интуитивный» запрос — это катастрофа, ожидающая своего часа. Я предполагаю, что крах информации о клубных кредитных картах Би Джея в 2003 или 2004 году был довольно близок к этому по духу. Я предполагаю (и это только предположение!!!), какой-то крупный босс отдела маркетинга сказал: «Мы сохраним информацию о полосе кредитной карты, чтобы мы могли использовать эту информацию позже». «Хотите ли вы, чтобы в одной таблице была только общедоступная информация, а PII была статистически разделена?» — спросил разработчик… «Нет, мы еще не знаем, как мы хотим использовать эту информацию, разработайте нам инструмент для запроса ТАМОЖЕННЫЙ ПУТЬ…» был первым шагом на пути к катастрофе. :(

Между тем, определенно есть места, когда пользовательский интерфейс необходим для составления/парсинга выражений (инструменты анализа политики безопасности, исследования булевой/переключательной алгебры и т. д.). Я считаю, что лучший пользовательский интерфейс еще не создан (всегда:)), но если он был создан, я бы предположил, что у него есть возможность:

  1. Разобрать выражение (должно быть тривиальным, так как можно построить дерево синтаксического анализа, когда пользователь добавляет фрагменты выражения по частям)
  2. Покажите выражение в виде дерева синтаксического анализа (это должно быть интересно рисовать).
  3. Показать таблицу true/false для BF, представленного выражением
  4. Нарисуйте гиперкуб BF (особенно полезно для «монотонных» функций)
  5. Создайте карту Карно с топологической связью (хотя удачи с многомерными выражениями)
  6. Динамически сгенерируйте диаграмму Венна для выражения.
  7. Выделите несущественные переменные или «фрагменты выражений».
  8. Используйте метод МакКласки или Петрика для минимизации логических выражений.
person Wanted by FBI.... Sexually LOL    schedule 16.06.2014

Это сложно представить даже в приложении WinForms.

Что вам нужно сделать, так это реализовать концепцию группы условий, которая состоит из одного или нескольких операторов и условного оператора.

Лучшей реализацией этого, которую я видел, была фильтрация сервера GameSpy — я просто пытался найти скриншот, но ничего не нашел (эта программа все еще существует?). Насколько я помню, они делали что-то вроде этого:

(
    Condition 1
) OPERATOR
(
    Condition 2
) OPERATOR
(
    (
        Condition 3
    ) OPERATOR
    (
        Condition 4
    )
)
person Jon Seigel    schedule 09.11.2009

Когда я вижу подобную проблему, я не могу не думать о реализации ее в виде стека, аналогично тому, как RPN решит эту проблему.

Проблема здесь в том, что это не кажется слишком интуитивным

Пример пользовательского интерфейса: ([Кнопка] ‹текстовое поле для ввода пользователем› {список}

Значение: ‹ › [Нажать] [И] [Или]

Куча {

} (калькуляторы HP RPN помещают стек над областью редактирования)

Итак, если бы я хотел написать выражение ((A и B) или (C и D)), я бы сделал это: A [push] (стек будет содержать «A») B [push] (стек будет содержать «B ", "A") [и] (стек будет содержать "(A и B)") C [push] (стек будет содержать "C", "(A и B)") D [push] (стек будет содержать " D", "C", "(A и B)") [и] (стек будет содержать "(C и D)", "(A и B)") [или] (стек будет содержать "((A и Б) или (С и Г)")

если вы хотели добавить других операторов, а их было не слишком много, то можно было просто добавить дополнительные кнопки, или сделать отдельное текстовое поле для оператора

Значение: ‹ › Оператор [Push] ‹ › [Объединить]

Если вы хотите поддерживать унарные операторы, вам нужно отслеживать, является ли это префиксным или постфиксным оператором, или просто принимать префикс (логический унарный оператор «не» обычно является префиксом). Тернарные операторы обычно имеют два инфиксных указателя, поэтому их поддержка усложняется. Некоторые бинарные (и n-арные) операторы имеют компонент префикса, инфикса и суффикса «CallMethod(A,B)». Так что все сводится к тому, насколько сложным вы хотите его сделать.

Всего одна идея.

person McKay    schedule 09.11.2009

Mac OS X предлагает очень удобные виджеты с графическим интерфейсом для выполнения именно таких задач. Вы можете смоделировать свой графический интерфейс после этого типа макета/взаимодействия.

person Matt Ball    schedule 09.11.2009
comment
Из снимка экрана не очевидно, что есть какой-либо способ сделать то, о чем просит ОП (сложная логическая логика, связывающая несколько критериев), и если ОП не развивается на Mac, этот снимок экрана - все, что у него есть. - person Ben Dunlap; 09.11.2009
comment
Моя интерпретация вопроса заключалась в том, что он ищет способ представить понятный пользовательский интерфейс, который позволяет пользователям более или менее составлять списки операторов логической логики. Я не думаю, что он спрашивал о том, как написать код, который действительно интерпретировал бы ввод пользователя. - person Matt Ball; 09.11.2009
comment
Извините, я перефразирую свой комментарий как вопрос: как вводить что-то вроде ((A OR B OR C) AND (D OR E)) ИЛИ (F AND G) (цитата из вопроса OP) в скриншот пользовательского интерфейса выше? - person Ben Dunlap; 09.11.2009
comment
@Matt спасибо за редактирование. Я никогда не понимал, что imagehack использует 404 как возможность показывать рекламу. Вот это рывок. - person Matt Ball; 24.08.2015

Другой вариант - что-то вроде интерфейса построителя запросов SQL Server Management Studio - несколько строк и столбцов, где строки представляют И, а столбцы ИЛИ (или наоборот, я не помню).

Вы можете выполнять обновление результирующего запроса в режиме реального времени, чтобы помочь пользователям (точно так же, как SQL Server обновляет результирующий SQL).

person queen3    schedule 09.11.2009