0

問題:レポートテンプレートは、データのフィルターがビジネスユーザーによって指定されているため、表示するデータのみを決定する管理ユーザーによって作成されます。より簡単なSQL用語では、クエリは管理者ユーザーによって指定され、ビジネスユーザーはWHERE句を指定します。

Jasperを使用すると、ユーザーは$P{city}などのSQLクエリでパラメータを指定できます。リンクで指定されたメソッドを使用して、クエリを動的に取得しようとしました。

考えられる解決策は

  1. JRXMLでWHERE句のパラメーターを使用し、レポートの作成中にそれらを置き換えます-これによりSQLの解析が節約されますが、管理者ユーザーにこの複雑さを教えたくありません。構文解析は大きな問題ではありません。
  2. カスタムjdbcクエリエグゼキュータとファクトリを使用します。これは、jasperがSQLクエリを実行する前に拡張ポイントを許可するためにのみ作成されています。私はバニラジャスパーJDBCデータソースに完全に依存しますが、実行前にクエリを変更するだけです。JRAbstractQueryExecuterは、クエリを単純化し、クエリを実行する前にjasper関連のトークンを置き換えます-これは非常に汚く、実装固有である必要があります。
  3. アプリケーションコードベースのJRAbstractQueryExecuterで行われるのと同じ置換を行い、SQLクエリを解析し、変更して、リンクで指定されているように再設定します。

これを行うためのより良い方法を提案できますか?これは間違いなくよりクリーンな方法で行うことができると私は感じています。

ご協力いただきありがとうございます

4

1 に答える 1

1

入力コントロールを作成して目的のWHERE句を決定し、パラメータを使用してそのWHERE句の内容を保持することができます。デフォルト値の式は次のようになります。

 $P{theParameter} == "value_1" ?
     (" AND CONDITION_1 IN ('A', 'B', 'C') AND CONDITION_2 = 'Yes' "
     ) : " AND CONDITION_3 = 'Other' AND CONDITION_4 = 'No' "

次に、WHERE句で、次のように参照します。

 WHERE
      .... = .....
      AND .... = ....
      AND .... = ....
      $P!{theParameter}

制約列がWHERE句全体で同じである場合は、$Pを使用できます。パラメータ値を文字通り取り込み、クエリで参照するには:

 WHERE
      .... = .....
      AND .... = ....
      AND .... = ....
      AND thisValue = $P!{theParameter}
于 2012-09-13T12:06:37.420 に答える