【问题标题】:IF-ELSE Alternative for Multiple SQL criteria for use in BIRT用于 BIRT 的多个 SQL 标准的 IF-ELSE 替代方案
【发布时间】:2014-01-12 09:36:15
【问题描述】:

我想使用 BIRT 创建报告。我有 5 个 SQL 条件作为报告的参数。通常当我有 3 个条件时,我会使用嵌套的 if-else 作为带有 javascript 的 WHERE 语句。

由于现在我有更多标准,因此编写代码和检查可能性变得更加困难,尤其是出于调试目的。

例如表员工的条件,有这 5 个条件:年龄、城市、部门、职称和教育。所有条件都是动态的,您可以将其留空以显示所有内容。

有人知道这种方法的替代方法吗?

【问题讨论】:

    标签: sql if-statement birt


    【解决方案1】:

    有一种无需任何脚本即可处理此问题的神奇方法,这使报告更易于维护!我们可以使用这种 SQL 查询:

    SELECT *
    FROM mytable
    WHERE (?='' OR city=? )
    AND (?=-1 OR age>? )
    AND (?='' OR department=? )
    AND (?='' OR title=? )
    

    因此,每个条件都有两个数据集参数,带有“OR”子句允许在参数获取特定值、空值或空值时忽略条件。所有这些“OR”子句都使用一个常数值进行评估,因此不会影响查询的性能。

    在这个例子中,我们应该有 4 个报表参数,8 个数据集参数(每个报表参数绑定到 2 个数据集参数)和 0 个脚本。查看使用此方法的报告的实时示例here

    如果有更多标准,我建议使用存储过程,因此我们可以对每个标准只使用一个数据集参数来做同样的事情。

    整数参数处理

    如果我们需要处理诸如 age 这样的整数列的“all”值:我们可以将报告参数“age”声明为字符串类型,将数据集参数“age”声明为整数。然后,在数据集的参数选项卡中使用值表达式而不是“链接到报告参数”。例如,如果我们喜欢一个健壮的输入来处理“所有”、“null”和空值,这里是要输入的表达式:

    (params["age"].value=="all" || params["age"].value=="" || params["age"].value==null)?-1:params["age"].value
    

    样本报告可以下载here(v 4.3.1)

    【讨论】:

    • 你是对的 James,我的错误是我们必须先测试常量值。我已经编辑了答案。
    • 当我们想要返回所有值时,可能更容易使用特定值,例如“all”作为文本参数或使用-1 作为数字。使用组合框参数,我们可以通过添加虚构项目“所有值”来透明地做到这一点
    • @dom:如何替换整数值 - 例如年龄 - 以将“全部”显示为默认值。因为我使用的是基于数据集的报表参数。
    • 现在,我可以使用您的方法显示所有价值,但如果有办法将 -1 替换为 All会好很多。 :)
    • @y2a 是的,我们可以做到这一点,但仍然没有脚本 :) 我编辑了答案,为了说明它,现在有一个指向更新的示例报告的链接:现在参数“年份” dataset 是一个整数,但它处理“_all”、null 和空值。这是基于经典模型数据库,因此它在 Eclipse 设计器中运行
    【解决方案2】:

    根据报告要求和受众,您可能会发现这很有帮助。

    使用文本框参数并设置默认值 %(这是一个通配符)

    SELECT *
    FROM mytable
    WHERE city like ? 
      AND age like ?
      AND department like ?
      AND title like ?
    

    这还允许您的用户搜索部分名称。如果城市文本框中的值为 %ville%,它将返回城市名称中任何位置带有“ville”的所有城市。

    【讨论】:

    • 感谢您的回复。我没有使用文本框参数,只使用了包含数据集中字段的列表框。
    【解决方案3】:

    如果要包含在 SQL-WHERE 子句中的报告参数将根据某种命名约定命名,例如 query_employee_[表列名称],您可以以通用方式编写 Java-Script 代码,这样您就不会添加新记者时更改它。

    对于 params { 中的每个参数 如果 param.name 以 query_employee_ { where_clause += " and " + param.name.substring(在 query_employee 之后) + " == '" + param.value + "'"; } }

    您必须检查参数的类型才能决定是否必须引用参数值。

    事件处理程序可能如下所示(在 Java 中实现,但如果您确实需要它在 JavaScript 中,应该可以将其移植到 JavaScript):

    public class WhereConditionEventHandler extends DataSetEventAdapter {
    
        @Override
        public void beforeOpen(IDataSetInstance dataSet,
                IReportContext reportContext) throws ScriptException {
            super.beforeOpen(dataSet, reportContext);
            String whereClause = " where 1 = 1 ";
            SlotHandle prms = reportContext.getDesignHandle().getParameters();
            for (int i = 0; i < prms.getCount(); i++) {
                if (prms.get(i) instanceof ScalarParameterHandle) {
                    ScalarParameterHandle prm = (ScalarParameterHandle) prms.get(i);
                    int n = prm.getName().indexOf("sql_customer_");
                    if (n > -1) {
                        String prmValue = "" + reportContext.getParameterValue(prm.getName());
                        if (DesignChoiceConstants.PARAM_TYPE_STRING.equals(prm.getDataType())) {
                            prmValue = "'" + prmValue + "'";
                        }
                        whereClause += " and " + prm.getName().substring("sql_customer_".length()) + " = " + prmValue;
                    }
                }
            }
            System.out.println("sql: " + whereClause);
            dataSet.setQueryText(dataSet.getQueryText() + whereClause);
        }
    }
    

    顺便说一下,在BIRT报表设计中可以传入没有注册为报表参数的参数。尽管如此,BIRT 还是会将它们放入“params”数组中。

    【讨论】:

    • 我需要更多细节,因为我也是 JavaScripst 的新手。假设我有3个报表参数(rpAge、rpCity、rpTitle),上面代码中的where语句怎么写?
    猜你喜欢
    • 1970-01-01
    • 2010-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-13
    • 1970-01-01
    • 2014-05-22
    • 1970-01-01
    相关资源
    最近更新 更多