用动态宏实现匹配where条件

DEMO来自三张物理表,一张存的是参数模板中的要查的日期时间,第二张存的是水表读数(始和终都来自这一个字段),第三张是报表中其它字段的值,井号做为主键。

demo.jpg

客户需求:

客户希望当选择参数模板的时间时,可以读出相应时间的水表读数,没有的则显示为空。难点:

1、              参数模板的值客户在物理表中存的是字符串形式,而且时间后会有不定的空格,所以传到主报表过滤时要先转换成相应的日期时间型。

2、              当客户初次进到页面时,不进行选择时,“始”和“终”两项不显示数据;选择“始”时,要考虑到“终”为空的情况;选择“终”时,

        要考虑到“始”为空的情况;选择两者时,“始”和“终”在此时的值只有一个。

考虑到这,参数模板已经不能达到我们的要求,我们需要用动态宏来解决此问题。

解决方法:

   通过IF判断来决定每次点查询按钮后,刷新的SQL语句中where后跟随哪些条件从而取出相应的数据,并且在动态宏中直接转换字符类型。

   “始”和“终”分别取变量名为 arg1 arg2

   在主报表的动态宏中定义如下:

1.jpg

宏表达式为:

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列为水表读数列。并把两列设为隐藏列。

JK中分别判断,

H列等于选择参数“始”的时间,显示I列的数据。

K列等于选择参数“终”的时间,显示I列的数据。

2.jpg

热门文章