【问题标题】:Request report with parameters请求带有参数的报告
【发布时间】:2013-07-15 21:00:58
【问题描述】:

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

  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}
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}

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

【问题讨论】:

  • 我认为您正在寻找的是在报告上设置 When No Data 设置以在为空时显示 no data 带(确保你添加乐队),或者可能**所有部分,没有数据**
  • 是的,我验证了它我在 rapport 中获得了列的标题,但我真正想要的是与我的应用程序的 IHM 中的过滤器同步以提取报告。事实上,在这个过滤器中当用户默认没有选择任何参数时,所有列表都会出现,我想提取完全相同的东西,但是在我的报告中,当我没有选择任何参数时,我使用的请求只显示列的名称
  • 换句话说,我希望用户没有输入任何参数,我给所有参数(%)以提取列表

标签: jasper-reports report


【解决方案1】:

你想要外部连接吗?或者你可以选择这样的结构:

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

每一行

【讨论】:

    【解决方案2】:

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

         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)
    

    【讨论】:

      【解决方案3】:

      您可以在生成报告之前控制 java 类中的 where 子句。

      1.在java中你可以检查参数是否为空,然后做一些小的验证,比如

      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}
      

      WHERE 1=1 $P!{sqlQuery}
      

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

      【讨论】:

      • 感谢您的回复,我对它们进行了测试,但是当用户不选择一个参数时,现在生成的报告为空,但我想要的是在他没有选择此参数的所有可能的情况下' t传递我尝试过的任何东西,例如 WHERE pr.name like('%', $P{priority},'%') 但我有一个错误请帮助我
      • 我认为你想要Where pr.name like(coalesce($P{priority},'%') 这将查看 $P{priority} 是否为 null 然后返回 %
      • 感谢我测试的响应,但我没有得到我想要的结果。事实上,当我不选择时,我有一个界面,默认包含带有过滤器的票证列表任何过滤器,所有列表都会出现我希望在提取此列表时与界面中出现的内容同步。但我有一个问题:当我没有选择任何过滤器或报告中的一个过滤器时,我只有列的名称,报告中没有票请帮助我
      猜你喜欢
      • 2012-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多