web-dev-qa-db-ja.com

WebフォームGUIでユーザーフレンドリーなブールロジックを実装するにはどうすればよいですか?

現在、ユーザーがドロップダウンリストを使用して次のようなSQLSELECTステートメントを生成できるWebアプリケーションがあります。

列選択ドロップダウン|演算子のドロップダウン(=!=> << => =)|値選択ドロップダウン

ユーザーはこれを複数回行うことができ、「フィルター」は現在すべて一緒にANDされています。

ORステートメントを作成する可能性を追加したいと思います。列が同じ場合は非常に簡単にORを追加できますが、次のような複雑なロジックステートメントについてはどうでしょうか。

((A OR B OR C)AND(D OR E))OR(F AND G)?

ユーザーがユーザーフレンドリーな方法でそのようなステートメントを作成できるようにするにはどうすればよいですか?

編集:指定するには、一般の聴衆にとってユーザーフレンドリーです。現在、私は、データベースからの特定の情報を必要とする非技術的なクライアントのSQLクエリを時折ハンドコーディングする開発者と協力しています。目標は、このWebアプリが、クライアントにそれを自分で行うための使いやすいツールを提供することにより、それらを手動でコーディングする必要をなくすことです。

EDIT2:現在、アプリはエンドユーザーによって使用されていません。その使用に関して私が持っている唯一のデータは、以前の手書きのSQLクエリであり、したがって、クライアントが要求する種類のクエリです。単純化できることを考えると(たとえば、クエリを生成するユーザーの能力を、ユーザーが求める傾向のある種類のクエリに制限するなど)、GUIでブール論理を単純かつ完全に伝達した経験がある人がいるかどうかを確認したいと思います。

お時間をいただきありがとうございます。

33
Miguel

( (A or B) and C) or (D or E or F)を処理する必要がある場合は、ツリーのようなデータ構造を使用しています。私の経験では、決定木を「きれい」または「直感的」な方法でユーザーに表現する簡単な方法はありません。 ASP.NETWebフォームでは2倍難しいです。

ただし、試行錯誤されたアプローチの1つは、次のとおりです。where句を受け入れる単一のテキストボックス。私を信じてください。単一入力アプローチは、実際には最もシンプルで直感的なユーザーインターフェイスであり、クエリフィルターの迅速な入力/変更を可能にするという利点*もあります。

**技術的な側面からのもう1つの利点は、独自のレクサー/パーサーとASTを記述できることです。基本的なcrudアプリでそれを行う頻度はどれくらいですか:)*

アドホッククエリエンジンの使用方法をユーザーにトレーニングする予定です。(account.Balance < -2000 and account.Type == 'Checking') OR (account.Number = 123456)と入力すると、返される内容が正確に返されるようにトレーニングすることもできます。

このアプローチを使用する場合は、使用可能な列のドロップダウンリストをユーザーに提供して、アイテムをダブルクリックすると、カーソル位置のテキストボックスにアイテムが挿入されるようにします。

7
Juliet

これを行うためのjqueryプラグインがあります。これはQueryBuilderと呼ばれ、興味深い方法でこれを行います: http://mistic100.github.io/jQuery-QueryBuilder/

Jquery QueryBuilder Screenshot

24
dryobs

Appleは、ネストされたブール式のGUIを設計する方法を見つけたようです。X.stackexchangeで受け入れられた回答を参照してください。

enter image description here

14
mb21

正直なところ、カスタムの「where」、「select」、「from」、またはその他のSQLコマンドプロキシを作成することにビジネス上の価値はありません。特に、この特定のコンテキスト(DBアクセスとカスタムオンザフライクエリ)では、クライアントは地獄のセキュリティゲートを開きます。

「ダミー」(通常のSQLツールを使用できないと思います)に「直感的な」クエリを作成させることは、起こるのを待っている災害です。 2003年または2004年のBJのクラブクレジットカード情報バストは、精神的にはこれにかなり近いと思います。ある大手マーケティングボスは、「クレジットカードのストライプ情報を保存して、後でその情報を活用できるようにする」と言ったと思います(これは単なる推測です!!!)。 「1つのテーブルで公開されている情報のみを取得し、PIIを統計的にバケット化しますか?」-開発者に尋ねました.....「いいえ、その情報をどのように使用するかはまだわかりません。クエリを実行するツールを開発してください。 CUSTOM WAY .....」は、災害への道の最初の足がかりでした。 :(

一方、式の作成/解析にUIが必要な場所は間違いなくあります(セキュリティポリシー分析ツール、ブール/スイッチ代数の調査など)。最高のUIはまだ作成されていないと思います(常に:))。作成されたので、次の可能性があると思います。

  1. 式を解析します(ユーザーが式のチャンクを1つずつ追加すると、解析ツリーを構築できるため、簡単なはずです)
  2. 式を解析ツリー形式で表示します(描画するのは楽しいはずです)。
  3. 式で表されるBFの真/偽の表を表示する
  4. BFハイパーキューブを描画します(特に「単調な」関数に役立ちます)
  5. トポロジカルリンクを使用してカルノー図を作成します(ただし、高次元の表現で頑張ってください)
  6. 式のベン図を動的に生成します。
  7. 必須ではない変数または「式チャンク」を強調表示します。
  8. ブール式を最小化するMcCluskeyまたはPetrickメソッドを使用します。

これは、WinFormsアプリでも表現するのが困難です。

実行する必要があるのは、1つ以上のステートメントで構成される条件グループと条件演算子の概念を実装することです。

私が見たこれの最良の実装は、GameSpyサーバーフィルタリングからのものでした-スクリーンショットを見つけるために検索しようとしましたが、空になりました(そのプログラムはまだ存在しますか?)。私が覚えていることから、彼らはこのようなことをしました:

(
条件1 
)演算子
(
条件2 
)演算子
(
(
条件3 
)演算子
(
条件4 
)
)
1
Jon Seigel

このような問題が発生した場合、RPNがこの問題を解決するのと同じように、スタックとして実装することを考えずにはいられません。

ここでの問題は、直感的すぎないように見えることです

サンプルUI:([ボタン] <ユーザー入力用のテキストボックス> {リスト}

値:<> [プッシュ] [および] [または]

スタック{

}(HP RPN計算機は、スタックを編集領域の上に配置します)

したがって、式((AとB)または(CとD))を記述したい場合は、次のようにします。A[プッシュ](スタックには「A」が含まれます)B [プッシュ](スタックには「B」が含まれます"、" A ")[and](スタックには"(A and B) "が含まれます)C [Push](スタックには" C "、"(A and B) "が含まれます)D [Push](スタックには"が含まれますD "、" C "、"(A and B) ")[and](スタックには"(C and D) "、"(A and B) "が含まれます)[または](スタックには"((A and B) " B)または(CおよびD) ")

他の演算子を追加したいが、あまり多くない場合は、ボタンを追加するか、演算子用に別のテキストボックスを作成することができます。

値:<> [プッシュ]演算子<> [結合]

単項演算子をサポートしたい場合は、それが接頭辞か後置演算子かを追跡するか、単に接頭辞を想定する必要があります(ブール単項演算子「not」は通常接頭辞です)。三項演算子には通常、2つの中置指定子があるため、それらをサポートする場合はさらに複雑になります。一部のバイナリ(およびn項)演算子には、接頭辞、中置辞、および接尾辞のコンポーネント「CallMethod(A、B)」があります。したがって、実際には、どの程度複雑にするかによって決まります。

たった1つのアイデア。

1
McKay

Mac OS Xは、まさにこの種のことを行うための非常に優れたGUIウィジェットを提供します。このタイプのレイアウト/相互作用の後にGUIをモデル化できます。

1
Matt Ball

もう1つのオプションは、SQL Server Management Studioクエリビルダーインターフェイスのようなものです。いくつかの行と列。行はANDを表し、列はORを表します(またはその逆、私は覚えていません)。

結果のクエリをリアルタイムで更新して、ユーザーを支援することができます(SQL Serverが結果のSQLを更新するのと同じように)。

0
queen3