Java BIRT:如何以编程方式删除数据集参数

Java BIRT:如何以编程方式删除数据集参数,java,birt,Java,Birt,我想修改现有的*.rptdesign文件并以新名称保存它。 现有文件包含一个数据集,其中包含一个模板SQL select语句和几个DS参数。 我想使用一个实际的SQL select语句,它只使用DS参数的一部分 但是,以下代码会导致异常: Exception in thread "main" `java.lang.RuntimeException`: *The structure is floating, and its handle is invalid!* at org.eclipse.bi

我想修改现有的*.rptdesign文件并以新名称保存它。 现有文件包含一个
数据集
,其中包含一个模板SQL select语句和几个DS参数。 我想使用一个实际的SQL select语句,它只使用DS参数的一部分

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

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)
--

odadasethandle dsMaster=(odadasethandle)report.findDataSet(“Master”);
HashSet bindVarsUsed=新HashSet();
...
//找出实际使用的DS参数
HashSet bindVarsUsed=新HashSet();
...
ArrayList toRemove=新建ArrayList();
for(迭代器iter=dsMaster.parametersIterator();iter.hasNext();){
ODataSetParameterHandle dsPara=(ODataSetParameterHandle)iter.next();
字符串名称=dsPara.getName();
if(name.startsWith(“参数”)){
String bindVarName=name.substring(6);
如果(!bindVarsUsed.contains(bindVarName)){
删除。添加(dsPara);
}
}
}
PropertyHandle paramsHandle=dsMaster.getPropertyHandle(odatasethandle.PARAMETERS_PROP);
paramsHandle.removitems(toRemove);
这里怎么了?
是否有人使用DE API从现有数据集中删除参数?

我也有类似的问题。通过多次调用“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;
}
受保护的void updateDataSetParameters(ODataSetHandle dataSetHandle)抛出语义异常{
int countMatches=StringUtils.countMatches(dataSetHandle.getQueryText(),“?”;
int参数索引=0;
做{
参数指数=0;
PropertyHandle OdaDataSetParameterPertop=dataSetHandle.getPropertyHandle(OdaDataSetHandle.PARAMETERS_PROP);
迭代器parametersIterator=dataSetHandle.parametersIterator();
while(参数siterator.hasNext()){
Object next=参数siterator.next();
paramIndex++;
如果(paramIndex>countMatches){
ODatasetParameterPerpretop.removeItem(下一步);
打破
}
}
if(参数索引
那么,主要区别在于删除每个项目后重新计算ds.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;
}