Jasper reports 带参数的请求报告

Jasper reports 带参数的请求报告,jasper-reports,report,Jasper Reports,Report,我想用JasperReports创建一个包含多个参数的报告,当用户传递所有参数时,报告会正确生成,但如果缺少一个参数,则不会生成任何内容。我使用此请求 选择 t、 *, u、 “名称”作为用户名, c、 “名称”作为组件名称, s、 “指定”作为状态名称, pr“name”作为priorityName, p、 “名称”作为项目名称 从…起 “组件”c内部连接“票证”t在c“id”=t“组件\U id” 内部连接“personne”u ON t“personne_id”=u“id” t上的内部联接

我想用JasperReports创建一个包含多个参数的报告,当用户传递所有参数时,报告会正确生成,但如果缺少一个参数,则不会生成任何内容。我使用此请求

选择
t、 *,
u、 “名称”作为用户名,
c、 “名称”作为组件名称,
s、 “指定”作为状态名称,
pr“name”作为priorityName,
p、 “名称”作为项目名称
从…起
“组件”c内部连接“票证”t在c“id”=t“组件\U id”
内部连接“personne”u ON t“personne_id”=u“id”
t上的内部联接“status”s“status_id”=s“id”
t上的内部联接“priority”pr“priority_id”=pr“id”
c上的内部联接“project”p“project_id”=p“id”
哪里
pr.name=$P{priority}
和u.login=$P{userLogin}
和s.designation=$P{status}
和t.creation_日期在$P{start}和$P{end}之间
和c.name=$P{componenet}

即使缺少一个参数,您也能帮助我生成报告吗?

是否需要外部联接?或者您可以选择如下结构:

and ( u.login = $P{userLogin} or $P{userLogin} is null )

对于每一行,您可以在生成报告之前控制java类中的where子句。

1.在java中,u可以检查参数是否为null,然后进行小型验证,如

StringBuffer sb = new StringBuffer();
if(StringUtils.isNotEmpty(priority)){
        sb.append(" AND pr.name = "+priority);
    }
2.对于
u.login,s.designation


3.之后,你可以传递
reportParam.put(“sqlQuery”,sb.toString())

4.在ireport中,只需更改您的查询即可

WHERE
pr.name = $P{priority}
and u.login = $P{userLogin}
and s.designation = $P{status}
and t.creation_date between $P{start} and $P{end}
and c.name = $P{componenet}


现在您不必担心
null
,因为它将忽略java类中的条件。

您可以为每个参数设置默认值或使用以下查询:-

     SELECT
 t.*,
 u."name" AS username,
 c."name" AS componentName,
 s."designation" AS statusName,
 pr."name" AS priorityName,
 p."name" AS projectName
FROM
 "component" c INNER JOIN "ticket" t ON c."id" = t."component_id"
 INNER JOIN "personne" u ON t."personne_id" = u."id"
 INNER JOIN "status" s ON t."status_id" = s."id"
 INNER JOIN "priority" pr ON t."priority_id" = pr."id"
 INNER JOIN "project" p ON c."project_id" = p."id"
WHERE
 (pr.name = $P{priority} or $P{priority}  is null)
  and (u.login = $P{userLogin} or $P{userLogin}  is null)
  and (s.designation = $P{status}  or $P{status} is null )
  and t.creation_date between $P{start}  and $P{end}
  and (c.name = $P{componenet} or $P{componenet}  is null)

感谢您的回复,我测试了它们,但是当用户没有选择一个参数时,报告现在生成为空,但我想要的是,当他没有通过我尝试的任何内容时,为该参数选择所有可能的情况,例如,WHERE pr.name,如(“%”,$P{priority},“%”)但是我有一个错误,请帮我想想你想要的
Where pr.name像(coalesce($P{priority},“%”)
这将查看$P{priority}为空,然后返回%感谢我测试的响应,但我没有得到我想要的结果。事实上,我有一个界面,默认情况下包含带过滤器的票证列表。当我不选择任何过滤器时,所有列表都会显示。我希望在提取此列表时与界面中显示的内容同步。但是我有一个问题:当我没有在报告中选择任何筛选器或其中一个筛选器时,我只有列的名称,报告中没有票证。请帮助meI思考您要找的是在报告上设置“无数据时”设置,以在空时显示“无数据”栏位(确保添加栏位),或者**所有部分,无数据**是的,我验证了它,我在报告中得到了列的标题,但我真正想要的是与我的应用程序的IHM中的过滤器同步以提取报告。事实上,在这个过滤器中,当用户默认情况下没有选择任何参数时,所有列表都会出现,我希望提取完全相同的数据但是在我的报告中,当我没有选择任何参数时,我使用的请求只显示列的名称。换句话说,如果用户没有输入任何参数,我希望为所有参数提供(%)以提取列表
     SELECT
 t.*,
 u."name" AS username,
 c."name" AS componentName,
 s."designation" AS statusName,
 pr."name" AS priorityName,
 p."name" AS projectName
FROM
 "component" c INNER JOIN "ticket" t ON c."id" = t."component_id"
 INNER JOIN "personne" u ON t."personne_id" = u."id"
 INNER JOIN "status" s ON t."status_id" = s."id"
 INNER JOIN "priority" pr ON t."priority_id" = pr."id"
 INNER JOIN "project" p ON c."project_id" = p."id"
WHERE
 (pr.name = $P{priority} or $P{priority}  is null)
  and (u.login = $P{userLogin} or $P{userLogin}  is null)
  and (s.designation = $P{status}  or $P{status} is null )
  and t.creation_date between $P{start}  and $P{end}
  and (c.name = $P{componenet} or $P{componenet}  is null)