/** * 分析并计算各报表函数 返回一个计算后的表达式 * * @param f1string String * @param PO JParamObject * @param ConnObject Object * @param Scan IScanFunction * @param UserObject Object * @param OwnerObject Object * @return String * @throws Exception */ public String ScanFunctionFromF1( String f1string, JParamObject PO, Object ConnObject, IScanFunction Scan, Object UserObject, Object OwnerObject) throws Exception { Stack SourceStack = new Stack(); int i = 0, b = 0, f = 0; String sTmp1, sTmp2, FTag, FString, F1String; JFunctionStub FS = null; F1String = f1string; int itmp = 1; while (i < F1String.length()) { sTmp1 = F1String.substring(i, i + 1); // 如果等"("压栈 if (sTmp1.equals("(")) { SourceStack.push(String.valueOf(i)); } // 括号封闭 if (sTmp1.equals(")")) { sTmp2 = (String) SourceStack.pop(); b = Integer.valueOf(sTmp2).intValue(); f = b - 1; // 找出函数的左边的开始位置 while (f >= 0) { sTmp2 = F1String.substring(f, f + 1); if (FunctionTag.indexOf(sTmp2) != -1) { break; } else f--; } f++; FTag = F1String.substring(f, b); FString = F1String.substring(f, i + 1); /** * 将函数取TRIM,因为在函数两端可能存在空格,这样会导致函数计算不出来 如:KMJE(1001,JFFS) + KMJE(1002,JFFS) modified by * hufeng 2005.9.7 */ FTag = FTag.trim(); FS = getFunctionByID(FTag, OwnerObject); // if ( FS == null ) { // System.out.println("找不到函数的实现类"+FTag); // throw new Exception("找不到函数的实现类"+FTag); // } if (PO != null && FS != null && Scan instanceof JCalculateZbRequestObject) { PO.SetValueByParamName("TMP_NUM", String.valueOf(itmp)); itmp++; } FTag = (String) Scan.ScanReplace(FS, FString, PO, ConnObject, UserObject); // 第一条语句出处 // add by fsz 2004.5.`14 如果没有错误,返回SQL if (FS != null) Text += FS.Function.getErrText(); // end if (FTag != null) { F1String = F1String.substring(0, f) + FTag + F1String.substring(i + 1, F1String.length()); // i从替换后听位置处开始处理 i = f + FTag.length(); continue; } else { i = f + FString.length(); continue; } } i++; } if (SourceStack.size() != 0) { throw new Exception("公式定义错误,左右括号不匹配!"); } Boolean boo = false; while (b < F1String.length()) { sTmp2 = F1String.substring(b, b + 1); if (sTmp2.equals(";")) { boo = true; b = 0; break; } b++; } if (boo == true) { throw new Exception("公式定义中不允许包含字符 ';' !"); } return F1String; }