Jasper iReport - 如何使用变量表达式调用带参数的子数据集?

时间:2012-07-18 15:07:19

标签: sql dataset jasper-reports ireport

我需要一个变量表达式来调用附加了参数的子数据集。

我有一个数据集,它返回了所购买的杂货清单。类似的东西:

Milk, NJ, $1.23

Chicken, DE, $5.45

Milk, NY, $1.44

我可以使用购买价格的总和变量获得价格总和。但是,我需要考虑州税的总额。在上面的例子中,假设新泽西州的销售税乘数为1.06,纽约州的销售税为1.08。而不是我的牛奶总和是2.76(= 1.44 + 1.23),我需要它是2.859(= 1.23 * 1.06 + 1.44 * 1.08)。

我有一个带有查询的子数据集SALES_TAX

SELECT tax_multiplier FROM mydb.sales_tax WHERE state=$P{STATE}

我基本上需要:

Sum($F{PURCHASE_PRICE} * $V{getTax($F{PURCHASE_STATE)})

我怎样才能做到这一点?我的getTax变量需要在主数据集中使用购买状态字段查询SALES_TAX子数据集吗?

1 个答案:

答案 0 :(得分:2)

玛丽安娜

您可以在查询中建立税收字段吗?您可以创建一个案例陈述来评估购买的状态。您的查询可能会吐出税前价格,税收价值和税后价格。 case语句看起来像(我正在使用Oracle,你可能需要调整你的数据库):

 CASE
 WHEN PURCHASE_STATE = 'NY' THEN 1.08          
 WHEN PURCHASE_STATE = 'NJ' THEN 1.06     
 WHEN PURCHASE_STATE = 'DE' THEN 1.00    
 ELSE 1.05                               /** default value **/
 END AS TAX_RATE

如果您想在iReport中执行此操作,我建议您创建一个变量来应用税率。变量表达式类似于:

 $F{PURCHASE_STATE} == "NY" ? "1.08" : 
   $F{PURCHASE_STATE} == "NJ" ? "1.06" :
     $F{PURCHASE_STATE} == "DE" ? "1.00" : "1.05"

然后,您的iReport详细信息区域应输出一个带有文本字段表达式的文本字段 $ F {PURCHASE_PRICE},一个带有文本字段表达式$ V {TAX_RATE}的文本字段,以及一个带有文本字段表达式$ F {PURCHASE_PRICE} * $ V {TAX_RATE}的文本字段。

如果要在SQL查询中使用子查询来查找销售税,可以:

 SELECT P.PURCHASE_ITEM                   AS ITEM, 
      P.PURCHASE_PRICE                    AS PRICE, 
      P.PURCHASE_STATE                    AS STATE, 
      (SELECT T.TAX_RATE 
           FROM TAX_TABLE T 
           WHERE T.STATE = P.PURCHASE_STATE
      )                                   AS TAX_RATE, 
      PURCHASE_OTHER_INFO                 AS OTHER
 FROM PURCHASE_TABLE P