private void parseStandardSqlParamBean(EditableReportParamBean paramBean, String reportTypeKey) { if (Tools.isDefineKey("@", paramBean.getParamname())) { if (this .isAutoReportdata()) { // 自动获取某列的数据进行保存操作(这个判断主要是针对配置更新脚本的<button/>,因为它的@{param}数据有可能是客户端传的,而不是从报表中获取的) String configproperty = Tools.getRealKeyByDefine("@", paramBean.getParamname()); String realproperty = configproperty; if (realproperty.endsWith("__old")) realproperty = realproperty.substring(0, realproperty.length() - "__old".length()); ColBean cbeanUpdateDest = this.owner.getReportBean().getDbean().getColBeanByColProperty(realproperty); if (cbeanUpdateDest == null) { throw new WabacusConfigLoadingException( "解析报表的更新语句失败,没有找到column/property属性为" + realproperty + "的列"); } if (cbeanUpdateDest.isNonValueCol() || cbeanUpdateDest.isSequenceCol() || cbeanUpdateDest.isControlCol()) { throw new WabacusConfigLoadingException( "加载报表" + this.owner.getReportBean().getPath() + "失败,列" + cbeanUpdateDest.getColumn() + "不是从数据库获取数据的列,不能取其数据"); } EditableReportColBean ercbeanDest = (EditableReportColBean) cbeanUpdateDest.getExtendConfigDataForReportType(reportTypeKey); if (ercbeanDest == null) { ercbeanDest = new EditableReportColBean(cbeanUpdateDest); cbeanUpdateDest.setExtendConfigDataForReportType(reportTypeKey, ercbeanDest); } else { paramBean.setDefaultvalue(ercbeanDest.getDefaultvalue()); } paramBean.setOwner(cbeanUpdateDest); ColBean cbeanUpdateSrc = cbeanUpdateDest; if (Consts.COL_DISPLAYTYPE_HIDDEN.equals(cbeanUpdateDest.getDisplaytype())) { ColBean cbSrcTmp = cbeanUpdateDest.getUpdateColBeanSrc(false); if (cbSrcTmp != null) cbeanUpdateSrc = cbSrcTmp; } setParamBeanInfoOfColBean(cbeanUpdateSrc, paramBean, configproperty, reportTypeKey); } else { ((EditableReportSQLButtonDataBean) this).setHasReportDataParams(true); } } else if (Tools.isDefineKey("#", paramBean.getParamname())) { String paramname = Tools.getRealKeyByDefine("#", paramBean.getParamname()); paramBean.setParamname(paramname); paramBean.setOwner(this.getExternalValueBeanByName(paramname, true)); } }
private void validRelateReports() { List<ReportBean> lstValidedMasterReport = new ArrayList<ReportBean>(); List<String> lstDetailReportidDependingListReports = new ArrayList<String>(); for (ReportBean rbeanSlave : this.mRelateReports.keySet()) { if (rbeanSlave == null || !rbeanSlave.isSlaveReport()) continue; ReportBean rbeanMaster = this.mRelateReports.get(rbeanSlave); if (!lstValidedMasterReport.contains(rbeanMaster)) { Map<String, Map<String, String>> mDependChildsTmp = rbeanMaster.getMDependChilds(); Map<String, String> mDynParamsValueAndName = new HashMap<String, String>(); for (Entry<String, Map<String, String>> entryTmp : mDependChildsTmp.entrySet()) { // 循环所有依赖此主报表的从报表 Map<String, String> mParams = entryTmp.getValue(); if (mParams.size() == 0) { throw new WabacusConfigLoadingException( "加载页面" + this.getPath() + "失败,依赖主报表" + rbeanMaster.getPath() + "的从报表" + entryTmp.getKey() + "没有配置dependsparams参数"); } boolean existDynParams = false; for (Entry<String, String> entryParams : mParams.entrySet()) { if (Tools.isDefineKey("@", entryParams.getValue())) { existDynParams = true; if (mDynParamsValueAndName.containsKey(entryParams.getValue()) && !entryParams .getKey() .equals(mDynParamsValueAndName.get(entryParams.getValue()))) { throw new WabacusConfigLoadingException( "加载页面" + this.getPath() + "失败,依赖主报表" + rbeanMaster.getPath() + "的从报表存在多个参数名从本主报表的列" + entryParams.getValue() + "中取参数值,必须保持相同的参数名"); } mDynParamsValueAndName.put(entryParams.getValue(), entryParams.getKey()); } } if (!existDynParams) { throw new WabacusConfigLoadingException( "加载页面" + this.getPath() + "失败,依赖主报表" + rbeanMaster.getPath() + "的从报表" + entryTmp.getKey() + "在dependsparams中没有配置动态参数"); } } lstValidedMasterReport.add(rbeanMaster); } if (rbeanMaster.isListReportType() && rbeanSlave.isDetailReportType()) { lstDetailReportidDependingListReports.add(rbeanSlave.getId()); } while (rbeanMaster != null) { if (rbeanMaster.getId().equals(rbeanSlave.getId())) { // 存在循环依赖 throw new WabacusConfigLoadingException("加载页面" + this.getPath() + "失败,其下报表存在循环依赖"); } rbeanMaster = this.mRelateReports.get(rbeanMaster); } } for (ReportBean rbeanSlave : this.mRelateReports.keySet()) { if (rbeanSlave == null || !rbeanSlave.isSlaveReport()) continue; ReportBean rbeanMaster = this.mRelateReports.get(rbeanSlave); if (lstDetailReportidDependingListReports.contains(rbeanMaster.getId())) { throw new WabacusConfigLoadingException( "加载页面" + this.getPath() + "失败,细览报表" + rbeanMaster.getPath() + "依赖于数据自动列表报表,因此不能再被其它报表依赖"); } } }
protected Object doGetResultSet( SPDataSetValueBean spBean, Object typeObj, StringBuffer systemParamsBuf) { log.debug(systemParamsBuf.toString()); String procedure = spBean.getProcedure(); if (rbean.getInterceptor() != null) { Object obj = rbean.getInterceptor().beforeLoadData(rrequest, rbean, typeObj, procedure); if (!(obj instanceof String)) { return obj; } procedure = (String) obj; } if (Config.show_sql) log.info("Execute sql: " + procedure); CallableStatement cstmt = null; try { cstmt = rrequest .getConnection(spBean.getOwnerSpProvider().getDatasource()) .prepareCall(procedure); AbsDatabaseType dbtype = rrequest.getDbType(spBean.getOwnerSpProvider().getDatasource()); VarcharType varcharObj = (VarcharType) Config.getInstance().getDataTypeByClass(VarcharType.class); int idx = 1; if (spBean.getLstStoreProcedureParams() != null && spBean.getLstStoreProcedureParams().size() > 0) { for (String paramTmp : spBean.getLstStoreProcedureParams()) { if (WabacusAssistant.getInstance() .isGetRequestContextValue(paramTmp)) { // 从request/session中取值 varcharObj.setPreparedStatementValue( idx, WabacusAssistant.getInstance().getRequestContextStringValue(rrequest, paramTmp, ""), cstmt, dbtype); } else if (Tools.isDefineKey("condition", paramTmp)) { setConditionValue( rrequest, spBean, cstmt, dbtype, idx, Tools.getRealKeyByDefine("condition", paramTmp), varcharObj); } else { varcharObj.setPreparedStatementValue(idx, paramTmp, cstmt, dbtype); } idx++; } } if (spBean.getOwnerSpProvider().isUseSystemParams()) { if (systemParamsBuf == null) systemParamsBuf = new StringBuffer(); cstmt.setString(idx++, systemParamsBuf.toString()); // 如果是查询报表数据,将系统参数传入 } if (dbtype instanceof Oracle) { cstmt.registerOutParameter(idx, OracleTypes.CURSOR); } rrequest.addUsedStatement(cstmt); cstmt.executeQuery(); ResultSet rs = null; if (dbtype instanceof Oracle) { rs = (ResultSet) cstmt.getObject(idx); } else { rs = cstmt.getResultSet(); } return rs; } catch (SQLException e) { throw new WabacusRuntimeException( "从数据库取报表" + rbean.getPath() + "数据时执行SQL:" + procedure + "失败", e); } }
private void processDependParams(ReportBean rbeanSlave, ReportBean rbeanMaster) { Map<String, Map<String, String>> mDependParams = rbeanMaster.getMDependChilds(); if (mDependParams == null) { mDependParams = new HashMap<String, Map<String, String>>(); rbeanMaster.setMDependChilds(mDependParams); } if (rbeanSlave.getDependparams() == null || rbeanSlave.getDependparams().trim().equals("")) { throw new WabacusConfigLoadingException( "加载页面" + this.getPath() + "失败,其下的报表" + rbeanSlave.getId() + "依赖其它报表,但不存在依赖的动态参数,无法完成依赖操作"); } List<String> lstParams = Tools.parseStringToList(rbeanSlave.getDependparams(), ";", false); List<String> lstTemp; Map<String, String> mParams = new HashMap<String, String>(); mDependParams.put(rbeanSlave.getId(), mParams); if (rbeanMaster.isDetailReportType()) rbeanSlave.setMDependsDetailReportParams( mParams); // 如果主报表是细览报表,则存放其所用到的参数,以便加载此从报表数据时可以知道要取哪些参数 for (String param : lstParams) { lstTemp = Tools.parseStringToList(param, "=", false); String paramname = lstTemp.get(0).trim(); String paramvalue = ""; if (lstTemp.size() == 2) { paramvalue = lstTemp.get(1).trim(); } else if (lstTemp.size() > 2) { throw new WabacusConfigLoadingException( "加载页面" + this.getPath() + "失败,其下报表" + rbeanSlave.getId() + "配置的dependsparams:" + rbeanSlave.getDependparams() + "不合法,出现多个=号"); } if (paramname.equals("")) { // 每个从报表的动态参数必须定义成@{<col/>的property}格式 throw new WabacusConfigLoadingException( "加载页面" + this.getPath() + "失败,其下报表" + rbeanSlave.getId() + "配置的dependsparams:" + rbeanSlave.getDependparams() + "不合法,参数名不能为空"); } ConditionBean conbeanTmp = rbeanSlave.getSbean().getConditionBeanByName(paramname); if (conbeanTmp != null) { if (!conbeanTmp.isConditionValueFromUrl()) { throw new WabacusConfigLoadingException( "加载从报表" + rbeanSlave.getPath() + "失败,在dependsparams中配置的" + paramname + "对应的查询条件<condition/>不是从URL中获取条件数据"); } } mParams.put(paramname, paramvalue); if (Tools.isDefineKey("@", paramvalue)) { paramvalue = Tools.getRealKeyByDefine("@", paramvalue); // 父报表的某个<col/>的property ColBean cb = rbeanMaster.getDbean().getColBeanByColProperty(paramvalue); if (cb == null) { throw new WabacusConfigLoadingException( "加载页面" + this.getPath() + "失败,其下报表" + rbeanSlave.getId() + "配置的dependsparams:" + rbeanSlave.getDependparams() + "中动态参数" + paramvalue + "在被依赖的父报表中不存在property为此值的<col/>"); } if (rbeanMaster.isListReportType()) { AbsListReportColBean alrcean = (AbsListReportColBean) cb.getExtendConfigDataForReportType(AbsListReportType.KEY); if (alrcean == null) { alrcean = new AbsListReportColBean(cb); cb.setExtendConfigDataForReportType(AbsListReportType.KEY, alrcean); } alrcean.setSlaveReportParamName(paramname); // 将此ColBean标识为参与刷新从报表的参数,并记下对应的参数名 rbeanSlave.addParamNameFromURL(paramname); cb.setDisplayNameValueProperty(true); } } } }