【问题标题】:BIRT: How to remove a dataset parameter programmaticallyBIRT:如何以编程方式删除数据集参数
【发布时间】:2014-02-20 12:38:39
【问题描述】:

我想修改现有的 *.rptdesign 文件并将其保存为新名称。 现有文件包含一个Data Set,带有一个模板 SQL 选择语句和几个 DS 参数。 我想使用只使用部分 DS 参数的实际 SQL 选择语句。

但是,下面的代码会导致异常:

Exception in thread "main" `java.lang.RuntimeException`: *The structure is floating, and its handle is invalid!*
at org.eclipse.birt.report.model.api.StructureHandle.getStringProperty(StructureHandle.java:207)
at org.eclipse.birt.report.model.api.DataSetParameterHandle.getName(DataSetParameterHandle.java:143)
at org.eclipse.birt.report.model.api.DataSetHandle$DataSetParametersPropertyHandle.removeParamBindingsFor(DataSetHandle.java:851)
at org.eclipse.birt.report.model.api.DataSetHandle$DataSetParametersPropertyHandle.removeItems(DataSetHandle.java:694)

--

    OdaDataSetHandle dsMaster = (OdaDataSetHandle) report.findDataSet("Master");

    HashSet<String> bindVarsUsed = new HashSet<String>();
    ...
    // find out which DS parameters are actually used
    HashSet<String> bindVarsUsed = new HashSet<String>();
    ...
    ArrayList<OdaDataSetParameterHandle> toRemove = new ArrayList<OdaDataSetParameterHandle>();
    for (Iterator iter = dsMaster.parametersIterator(); iter.hasNext(); ) {
        OdaDataSetParameterHandle dsPara = (OdaDataSetParameterHandle)iter.next();
        String name = dsPara.getName();
        if (name.startsWith("param_")) {
            String bindVarName = name.substring(6);
            if (!bindVarsUsed.contains(bindVarName)) {
                toRemove.add(dsPara);
            }
        }
    }
    PropertyHandle paramsHandle = dsMaster.getPropertyHandle( OdaDataSetHandle.PARAMETERS_PROP );
    paramsHandle.removeItems(toRemove);

这里有什么问题? 有没有人使用 DE API 从现有数据集中删除参数?

【问题讨论】:

    标签: java birt


    【解决方案1】:

    我有类似的问题。通过多次调用“removeItem”来解决它,并且每次都必须重新评估 parametersIterator。

    protected void updateDataSetParameters(OdaDataSetHandle dataSetHandle) throws SemanticException {
        int countMatches = StringUtils.countMatches(dataSetHandle.getQueryText(), "?");
        int paramIndex = 0;
        do {
            paramIndex = 0;
            PropertyHandle odaDataSetParameterProp = dataSetHandle.getPropertyHandle(OdaDataSetHandle.PARAMETERS_PROP);   
            Iterator parametersIterator = dataSetHandle.parametersIterator();
            while(parametersIterator.hasNext()) {
                Object next = parametersIterator.next();
                paramIndex++;
                if(paramIndex > countMatches) {
                    odaDataSetParameterProp.removeItem(next);
                    break;
                }
            }
            if(paramIndex < countMatches) {
                paramIndex++;
                OdaDataSetParameter dataSetParameter = createDataSetParameter(paramIndex);
                odaDataSetParameterProp.addItem(dataSetParameter);
            }
        } while(countMatches != paramIndex);
    }
    
    private OdaDataSetParameter createDataSetParameter(int paramIndex) {
        OdaDataSetParameter dataSetParameter = StructureFactory.createOdaDataSetParameter();
        dataSetParameter.setName("param_" + paramIndex);
        dataSetParameter.setDataType(DesignChoiceConstants.PARAM_TYPE_INTEGER);
        dataSetParameter.setNativeDataType(1);
        dataSetParameter.setPosition(paramIndex);
        dataSetParameter.setIsInput(true);
        dataSetParameter.setIsOutput(false);
        dataSetParameter.setExpressionProperty("defaultValue", new Expression("<evaluation script>", ExpressionType.JAVASCRIPT));
        return dataSetParameter;
    }
    

    【讨论】:

    • 所以主要区别在于您在删除每个项目后重新评估 ds.parametersIterator() 而我的代码使用相同的迭代器来删除多个参数?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-15
    • 2017-01-11
    • 2011-11-03
    • 1970-01-01
    • 2011-05-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多