【问题标题】:Multiple parameter values多个参数值
【发布时间】:2014-09-09 13:19:29
【问题描述】:

当我尝试从报告参数传递多个值时,我遇到了 BIRT 问题。

我正在使用 BIRT 2.6.2 和 eclipse。

我正在尝试从级联参数组的最后一个参数“JDSuser”中放入多个值。参数允许有多个值,我使用的是列表框。

为了能够做到这一点,我正在使用 where-in 语句编写我的 sql 查询,其中我用 javascript 替换文本。否则 BIRT sql 无法从报告参数中获取多个值。

我的sql查询是

select jamacomment.createdDate, jamacomment.scopeId,
jamacomment.commentText, jamacomment.documentId,
jamacomment.highlightQuote, jamacomment.organizationId,
jamacomment.userId, 
organization.id, organization.name,
userbase.id, userbase.firstName, userbase.lastName,
userbase.organization, userbase.userName,
document.id, document.name, document.description,
user_role.userId, user_role.roleId,
role.id, role.name

from jamacomment jamacomment left join
userbase on userbase.id=jamacomment.userId
left join organization on
organization.id=jamacomment.organizationId
left join document on
document.id=jamacomment.documentId
left join user_role on
user_role.userId=userbase.id
right join role on
role.id=user_role.roleId

where jamacomment.scopeId=11
and role.name in ( 'sample grupa' )
and userbase.userName in ( 'sample' )

我在 beforeOpen 状态下的那个数据集的 javascript 代码是:

if( params["JDSuser"].value[0] != "(All Users)" ){
this.queryText=this.queryText.replaceAll('sample grupa', params["JDSgroup"]);
var users = params["JDSuser"];
//var userquery = "'";
var userquery = userquery + users.join("', '");
//userquery = userquery + "'";
this.queryText=this.queryText.replaceAll('sample', userquery);
}

我尝试了许多不同的报价变体,使用这个我没有收到错误消息,但如果我选择 1 个值,我不会从数据库中获得任何数据,但如果我选择至少 2 个值,我会获得最后选择的值数据。

如果我取消注释其中一个额外的引用脚本行,则会收到如下语法错误:

以下项目有错误: 表(id = 597): + 处理过程中发生异常。有关详细信息,请参阅以下消息:无法为 数据集:组织 无法获取结果集元数据。 org.eclipse.birt.report.data.oda.jdbc.JDBCException:SQL 语句不返回 ResultSet 对象。 SQL 错误 #1:You have an error in 你的 SQL 语法;检查与您的 MySQL 对应的手册 在“rudolfs.sviklis”附近使用正确语法的服务器版本, 'sample' )' 在第 25 行; com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:您的 SQL 语法有错误;检查对应的手册 您的 MySQL 服务器版本,以便在附近使用正确的语法 'rudolfs.sviklis', 'sample' )' 在第 25 行

另外,我应该告诉您,我正在通过查看工作示例来执行此操作。一切都是一样的,前面的代码导致了同样的语法错误,我把它改成了这个脚本,它的作用是一样的。 该示例可在此处获得: http://developer.actuate.com/community/forum/index.php?/files/file/593-default-value-all-with-multi-select-parsmeter/

如果有人能给我一个线索,让我知道我应该做什么,那就太好了。

【问题讨论】:

    标签: sql eclipse birt


    【解决方案1】:

    您应该始终使用参数的 value 属性,即:

    var users = params["JDSuser"].value;
    

    没有必要用引号将“userquery”括起来,因为这些引号已经放在“sample”周围的 SQL 查询中。此外还有一个错误,因为 userquery 尚未定义在行:

    var userquery = userquery + users.join("', '");
    

    这可能会在您的查询中引入诸如“null”之类的字符串。因此删除所有对 userquery 变量的引用,最后使用这个表达式:

    this.queryText=this.queryText.replaceAll('sample', users.join("','"));
    

    请注意,我删除了连接表达式中的空格。最后,一旦它正常工作,您可能需要通过测试该值是否为空来使您的报告输入更加健壮:

    if( params["JDSuser"].value!=null && params["JDSuser"].value[0] != "(All Users)" ){
      //Do stuff...
    
    }
    

    【讨论】:

    • 感谢您的回复,尽管这对我没有帮助。我没有得到任何数据,我选择 1 个值或 2 个值。以为您为我节省了几行代码,而不是 null 值也很好。还有其他想法吗?
    • 嗯,它应该可以工作。我建议将最终“this.queryText”的内容保存在全局变量中,并在报告的动态文本中临时显示此变量。因此,您将看到生成的查询,并且可能很容易找出问题所在。
    • 感谢 Dominique,您对全局变量的建议帮助了我,我发现,我为组参数留下了不同的名称来替换,所以它没有改变。这行得通。现在我必须弄清楚如何解决问题以显示所有用户,因为它不起作用。
    • 我很高兴它有帮助。处理“所有值”的一种简单方法是添加一个“OR”子句,检查数据集参数的值是否等于特定的常量值。否则,当且仅当参数值不是“所有值”时,应修改您的脚本以包含查询的最后一个“AND”子句。
    • 不幸的是,我无法让“所有值”工作,它只能将它作为简单的所有用户文本,尽管我已经计算了列,它应该为所有用户选项创建条目。我假设它不会以某种方式将这些值提供给所有用户?你有什么想法吗?
    猜你喜欢
    • 1970-01-01
    • 2018-07-02
    • 2020-09-11
    • 2018-04-06
    • 1970-01-01
    • 2023-01-03
    • 2014-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多