2014-02-20 135 views
4

我想修改現有的* .rptdesign文件並將其保存爲新名稱。 現有文件包含帶有模板SQL select語句和多個DS參數的Data Set。 我想使用僅使用部分DS參數的實際SQL select語句。BIRT:如何以編程方式刪除數據集參數

但是,下面的代碼產生異常:

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從現有數據集中刪除參數?

回答

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; 
} 
+0

所以主要的區別是,你刪除每個項目後重新評估ds.parametersIterator(),而我的代碼是使用相同的迭代器刪除多個參數? – hvb

相關問題