IReport order by作为参数传递
随手记
问题背景:
ireport 打印人员信息,需要按照客户选择的排序方式来打印
客户可选 排序方式有5种

打印的人员:

尝试方案:
这种情况排序板块需要用子模版的方式实现
尝试零:
有五种排序方式,新建五个按照不同方式排序的子模版,然后主模板根据标注位,决定用哪个子模版。
尝试零结果:成功,但是直接否决
原因:4个类似的主模板要20个子模版,子模版众多,不能复用
尝试一:
主模板通过传递排序的字段到子模板,然后排序
传递参数orderBy,处理后获取排序的列传递给子模版:

子模版直接order by 参数

尝试一结果:失败
原因:传递的参数类型为字符串,不是列,即(order by 'xxxxx' 而非 order by 列)
----------- $P{orderBy} 换成 $P!{orderBy} 就行了
尝试二:主模板传递标志,子模版处理标志转化为需要排序的列
主模板传递标志:

子模版处理标志转化为需要排序的列:

这个方式基本已经可以了,但是还有一个小问题:
因为某些字段是varchar型,而存储的内容是数字,需要用到to_number来格式化字段(否则11会排到5前面)
但是case when end 中,所有的值似乎只能是一种类型,否则会报类型错误。
解决方法:用 lpad 函数代替 to_number

尝试二结果:成功
总结:
对sql和ireport的理解不到位,结合使用时出现的问题。此外,ireport虽然限制众多,但是在它的规则内还是可以翻出一些浪花的
浙公网安备 33010602011771号