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));
   }
 }
Пример #2
0
 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()
               + "依赖于数据自动列表报表,因此不能再被其它报表依赖");
     }
   }
 }
Пример #3
0
 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);
   }
 }
Пример #4
0
 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);
       }
     }
   }
 }