JasperReports(ジャスパーレポート)のSQL文でWHERE条件にINを使用して、その中にリスト等で動的に条件を指定する方法について調査及び研究し、その成果をまとめています。
WHERE条件にINを使用する方法
Jaspersoft Studio(旧iReport)のQuery Dialogで、WHERE条件にINを使用して、INの中を動的に変更したい場合があります。
例えば、iDempiereでは、検索ウィンドウで複数選択された売上請求伝票の請求書を発行する場合などです。
この例の場合、WHERE句の条件に次のように記述します。
SELECT * FROM C_Invoice WHERE $X{IN ,C_Invoice_ID,RECORD_IDS}
このSQLは、SELECT * FROM C_Invoice WHERE C_Invoice_ID IN(?,?,?...)と同じ意味です。
パラメータの"RECORD_IDS"は名称的にはなんでも良いです。iDempiereからそのパラメータの名称で、ジャスパーレポートに値を渡される事が重要です。
Jasper Reports側のパラメータの設定で"RECORD_IDS"というArrayListを設定していますので、iDempiere側でそのようにプロセスのパラメーターを作る必要があります。
ArrayList<ProcessInfoParameter> list = new ArrayList<ProcessInfoParameter>();
ArrayList<Integer> integerList = new ArrayList<Integer> ();
if(p_Record_ID > 0)//ウィンドウから呼び出されていると判断
{
integerList.add(new Integer (p_Record_ID));
}else {//検索ウィンドウから呼び出されていると判断
String sql = " SELECT T_Selection_ID FROM T_Selection WHERE AD_PInstance_ID=? ORDER BY T_Selection_ID ASC";
PreparedStatement pstmt = null;
ResultSet rs = null;
try
{
pstmt = DB.prepareStatement(sql, get_TrxName());
pstmt.setInt(1, getAD_PInstance_ID());
rs = pstmt.executeQuery();
while (rs.next())
integerList.add(new Integer (rs.getInt(1)));
}
catch (Exception e)
{
log.log(Level.SEVERE, sql, e);
}
finally
{
DB.close(rs, pstmt);
rs = null;
pstmt = null;
}
}
if(integerList.size()>0)
list.add (new ProcessInfoParameter("RECORD_IDS", integerList, null, null, null ));
else
return "プリントアウトするデータが選択されていません";
上記のサンプルコードは、通常のウィンドウと検索ウィンドウの両方から使いまわせるように書いてみました。