【问题标题】:Updating Data Set query after parameter input in BIRT在 BIRT 中输入参数后更新数据集查询
【发布时间】:2015-01-21 15:26:01
【问题描述】:

在BIRT报表设计中传递参数后如何更改或更新数据集的查询?

细节:

我有一个如下所示的查询:

WHERE ? 

该参数标记可以保存不同的值,用户输入参数后,它看起来像这样,例如:

WHERE column_name = 1

WHERE column_name = 2

甚至

WHERE column_name IN (1,2)

我为该数据集参数 (DSP) 创建了一个报告参数 (RP),尝试了几个小时后,我无法更改它。

我试过了:

  • 在 RP 和 DSP 上创建各种 javascript 表达式
  • 创建将更改第一个 RP 的值并返回上一步的 RP
  • 编辑属性绑定,虽然我不知道应该如何完成。 为了清楚起见,我正在设计一个报告,而不是将运行时集成到现有应用程序中。 我希望这已经足够清楚了,我仍在编辑问题,所以如果您需要更多信息,请告诉我。

谢谢

【问题讨论】:

    标签: javascript mysql birt


    【解决方案1】:

    假设您在 Oracle DB 上(其他系统的行为可能不同),您应该知道绑定变量(在 JDBC 语音中:问号)只能替换 标量值,例如字符串或数字。

    但是你想要一个像 list 这样的数字作为输入。 因此,在这种情况下,绑定变量对您没有帮助。

    可能实现您想要的最简单的方法是:

    在您的查询中,写:

    WHERE column_name in (1) -- $REPLACE_THIS$
    

    请注意,我在查询中使用注释作为标记。 然后,在查询的beforeOpen 事件中,像这样修改查询文本:

    // construct a comma-separated string representation of your list
    // based on your report parameter (exercise left to the reader)
    // var replacement = my_to_sql_csv(params["my_report_parameter"].value);
    
    // for demonstration use:
    var replacement = "1,2";
    
    // modify the `IN` expression inside the SQL
    this.queryText = this.queryText.replaceAll("(1) -- $REPLACE_THIS$", "(" + replacement + ")";
    

    就是这样。

    【讨论】:

    • 我想我没有准确地阅读你的问题。您的 RP 似乎已经包含一个 WHERE 表达式,例如“columnA like 'Blah' and columnB in (1,2,3)”。在这种情况下,请在查询中写入 WHERE 1=0 -- $REPLACE_THIS$ 并相应地更改脚本代码。
    • stackoverflow.com/questions/18607429/… 已经回答了一个类似的问题,正如我在一分钟前看到的那样。请注意那里关于 SQL 注入攻击风险的评论。这意味着,请确保正确转义 SQL 中具有特殊含义的所有字符。
    • 感谢您的帮助,您最后的评论让我找到了正确的方向。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-07
    • 1970-01-01
    • 2023-02-23
    • 2022-11-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多