用动态宏实现匹配where条件
DEMO来自三张物理表,一张存的是参数模板中的要查的日期时间,第二张存的是水表读数(始和终都来自这一个字段),第三张是报表中其它字段的值,井号做为主键。
客户需求:
客户希望当选择参数模板的时间时,可以读出相应时间的水表读数,没有的则显示为空。难点:
1、 参数模板的值客户在物理表中存的是字符串形式,而且时间后会有不定的空格,所以传到主报表过滤时要先转换成相应的日期时间型。
2、 当客户初次进到页面时,不进行选择时,“始”和“终”两项不显示数据;选择“始”时,要考虑到“终”为空的情况;选择“终”时,
要考虑到“始”为空的情况;选择两者时,“始”和“终”在此时的值只有一个。
考虑到这,参数模板已经不能达到我们的要求,我们需要用动态宏来解决此问题。
解决方法:
通过IF判断来决定每次点查询按钮后,刷新的SQL语句中where后跟随哪些条件从而取出相应的数据,并且在动态宏中直接转换字符类型。
“始”和“终”分别取变量名为 arg1 、arg2
在主报表的动态宏中定义如下:
宏表达式为:
if(@arg1==null && @arg2==null,”",@arg1!=null && @arg2==null,”and c.updatetime in (to_date(‘”+str(@arg1)+”‘,’yyyy-mm-dd HH24:MI:SS’))”,@arg1==null && @arg2!=null,”and c.updatetime in (to_date(‘”+str(@arg2)+”‘,’yyyy-mm-dd HH24:MI:SS’))”,”and c.updatetime in (to_date(‘”+str(@arg1)+”‘,’yyyy-mm-dd HH24:MI:SS’),to_date(‘”+str(@arg2)+”‘,’yyyy-mm-dd HH24:MI:SS’))”)
报表数据集DS1为:
select *
from cd_well_source t,PC_FLOODING_WELL_ANALYSIS a,pc_flooding_well_fluence
b,pc_flooding_well_motion c
where t.WELL_ID=b.well_id
and t.WELL_ID=a.well_id
and t.WELL_ID=c.well_id
${m1} //把动态宏表达式匹配进来,当满足IF条件时,判断where后加哪句表达式。
group by t.well_id,t.well_common_name,a.pro_time,a.inj_vol_daily,b.alloc_inj_vol_daily,c.pump_pressure,
c.tubing_pres,c.shutdown_tubing_pres,c.casing_pres,c.shutdown_casing_pres,c.meter_reading,c.instantaneous_water,c.updatetime
ORDER BY t.well_id
在报表模板中,
H列为时间列,I列为水表读数列。并把两列设为隐藏列。
在J、K中分别判断,
当H列等于选择参数“始”的时间,显示I列的数据。
当K列等于选择参数“终”的时间,显示I列的数据。