【问题标题】:Unable to Pass Comma seperated values to Birt Report无法将逗号分隔值传递给 Birt 报告
【发布时间】:2020-12-08 09:03:41
【问题描述】:

我正在尝试将一个以逗号分隔的字符串值作为参数传递给 birt 报告但失败

Java 代码

    String userlist="\"a\",\"b\",\"c\"";
    task.setParameterValue("userlist", userlist);

BeforeOpen 有

params["userlist"].value.join("','");

SQL 查询是

select * from users where name in (?)

我已经将数据集参数链接到报告参数 param_1 即使数据库表有 3 个用户,它总是给我空报告。有什么建议吗?

【问题讨论】:

    标签: java birt


    【解决方案1】:

    了解您的工具! 在这种情况下:您必须了解 SQL 和绑定变量、Javascript 和 BIRT 的概念。 不幸的是,您发布的每一段代码都是错误的(或至少是不完整的)。

    但是你是在正确的轨道上:你可以在数据库的 beforeOpen 事件中修改 SQL 文本。我将在这里勾画出这个想法:

    在您的 SQL 中,替换 ?使用像“IN-LIST”这样的占位符(这样它就是有效的 SQL)。

    您仍然应该在 SQL 中使用绑定变量(以避免由 BIRT 的缓存机制引起的陷阱),但是以一种有效的无操作方式,例如“哪里?不为空”。

    在数据集的beforeOpen事件中,可以修改SQL文本:

    1. 获取原始 SQL 文本 (var query = this.queryText; IIRC)。
    2. 将您的报告参数拆分为单独的搜索词。具体如何执行取决于您的输入格式。在您的示例中,您在搜索词周围使用",这看起来过于复杂,除非个别搜索词可能包含逗号。您现在应该有一个搜索字符串列表,例如["a", "b", "c"].
    3. 将每个术语转换为有效的 SQL 字符串文字。谨防 SQL 注入攻击,因此请小心转义单引号等字符!您现在应该有一个有效的 SQL 字符串文字列表,例如["'a"', "'b'", "'c'"]
    4. 将 3) 中的 SQL 字符串文字列表加入到带有“,”的单个字符串中。 您现在应该有一个类似'a', 'b', 'c' 的字符串。
    5. 在查询中,将占位符字符串替换为 4) 中的字符串。
    6. 将修改后的 SQL 文本写回 DS 对象:this.queryText = query;

    在互联网的迷雾中可能还有一个例子。

    如果您再投入五分钟,您应该已经在堆栈溢出问题上找到了现有答案:How to create a BIRT dataset that accepts multiple (CSV) values that it can be used inside "IN" clause in select statement,唯一的区别是您正在搜索字符串列表,而该问题是关于数字列表的.

    【讨论】:

      猜你喜欢
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      • 2016-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-10
      相关资源
      最近更新 更多