C_RsPm.cls
上传用户:zhpu1995
上传日期:2013-09-06
资源大小:61151k
文件大小:21k
源码类别:

企业管理

开发平台:

Visual Basic

  1. VERSION 1.0 CLASS
  2. BEGIN
  3.   MultiUse = -1  'True
  4.   Persistable = 0  'NotPersistable
  5.   DataBindingBehavior = 0  'vbNone
  6.   DataSourceBehavior  = 0  'vbNone
  7.   MTSTransactionMode  = 0  'NotAnMTSObject
  8. END
  9. Attribute VB_Name = "CQuery"
  10. Attribute VB_GlobalNameSpace = False
  11. Attribute VB_Creatable = True
  12. Attribute VB_PredeclaredId = False
  13. Attribute VB_Exposed = False
  14. '******************************************************************
  15. '*    模 块 名 称 :验证用户条件并返回SQL语句
  16. '*    功 能 描 述 :
  17. '*    程序员姓名  :苗鹏
  18. '*    最后修改人  :苗鹏
  19. '*    最后修改时间:2002/01/01
  20. '*    备        注:
  21. '******************************************************************
  22. Dim iPosSys As Integer '取得一个单词的结束位置
  23. Dim iPosOldSys As Integer '取得一个单词的开始位置
  24. Dim Formula As String   '用户录入的条件或公式
  25. Public FormulaSys As String '查询返回
  26. Public FormulaSQL As String '公式返回
  27. Public FormulaOld As String
  28. Dim sItem() As New CCode '用以返回公式的数组
  29. Dim sFieldWhere() As New CField '字段数组
  30. Dim sFunction() As New CCode '公式数组
  31. Dim sOperate() As New CCode '操作符
  32. Dim sCode() As New CCode '编码
  33. Dim sTableName() As String '用到的表
  34. Dim bChecking As Boolean '公式验证正在进行
  35. Public PB_CheckStatus As ProgressBar '公式验证过程
  36. Private Function ChangeStatus(iValue As Integer, iMax As Integer) '显示当前验证的过程
  37.     With PB_CheckStatus
  38.         If .Visible = False Then
  39.             .Visible = True
  40.         End If
  41.         .Max = iMax
  42.         .Value = iValue
  43.     End With
  44. End Function
  45. Private Function GetNextField() As String '取得下一个单词
  46.     Dim i As Integer
  47.     
  48.     '通过空格取下一个单词
  49.     For i = iPosSys + 1 To Len(Formula)
  50.         If Mid(Formula, i, 1) = " " Then
  51.             GetNextField = Mid(Formula, iPosSys + 1, i - iPosSys - 1)
  52.             iPosOldSys = iPosSys
  53.             iPosSys = i
  54.             Exit For
  55.         End If
  56.     Next i
  57. End Function
  58. Private Function IsFunction(s As String) As Integer '判断是否函数
  59.     '判断是否函数,如果是,返回s的位置
  60.     Dim i As Integer
  61.     If Trim(s) = "" Then
  62.         IsFunction = -1
  63.         Exit Function
  64.     End If
  65.     For i = 0 To UBound(sFunction, 1)
  66.         If sFunction(i).Include(s) Then
  67.             Exit For
  68.         End If
  69.     Next i
  70.     
  71.     If i > UBound(sFunction, 1) Then
  72.         IsFunction = -1
  73.     Else
  74.         IsFunction = i
  75.     End If
  76. End Function
  77. Private Function IsField(s As String) As Integer '判断是否是字段名
  78.   '判断是否是字段名,如果是返回位置,并添加表名
  79.   '同时判断此字段是否在多个表中存在,如果是则要求用户添加表名
  80.   '返回 -1 不是字段 -2 此字段在多个表中存在 >=0 此字段在数组中的位置
  81.     Dim i As Integer
  82.     Dim j As Integer
  83.     j = -1
  84.     
  85.     If Trim(s) = "" Then
  86.         IsField = -1
  87.         Exit Function
  88.     End If
  89.     
  90.     For i = 0 To UBound(sFieldWhere, 1)
  91.         If sFieldWhere(i).Include(s) Then
  92.             If j > 0 Then
  93.                 MsgBox "请录入字段:" & s & "的表名"
  94.                 IsField = -2
  95.                 Exit Function
  96.             Else
  97.                 j = i
  98.             End If
  99.         End If
  100.     Next i
  101.     
  102.     If j = -1 Then
  103.         IsField = -1
  104.     Else
  105.         IsField = j
  106.         AddTableName Trim(sFieldWhere(j).TableName)
  107.     End If
  108. End Function
  109. Private Function AddTableName(s As String) '添加表名
  110.     '如果表在数组中不存在则添加表名到数组
  111.     Dim j As Integer
  112.     For j = 0 To UBound(sTableName, 1)
  113.         If UCase(sTableName(j)) = UCase(s) Then
  114.             Exit For
  115.         End If
  116.     Next j
  117.     '没有找到表名,则添加表名
  118.     If j > UBound(sTableName, 1) Then
  119.         If Trim(sTableName(0)) <> "" Then
  120.             ReDim Preserve sTableName(UBound(sTableName, 1) + 1)
  121.             sTableName(UBound(sTableName, 1)) = UCase(s)
  122.         Else
  123.             sTableName(0) = UCase(s)
  124.         End If
  125.     End If
  126. End Function
  127. Private Function IsOperater(s As String) As Boolean '判断是否操作符
  128.     '判断是否操作符,如果是,返回s的位置
  129.     Dim i As Integer
  130.     If Trim(s) = "" Then
  131.         IsOperater = False
  132.         Exit Function
  133.     End If
  134.     For i = 0 To UBound(sOperate, 1)
  135.         If sOperate(i).Include(s) Then
  136.             IsOperater = True
  137.             Exit For
  138.         End If
  139.     Next i
  140. End Function
  141. Private Function IsCode(s As String) As Integer '判断是否是相关项、工资类别、部门等
  142.      '判断是否是相关项、工资类别、部门等,如果是,返回s的位置
  143.     Dim i As Integer
  144.     If Trim(s) = "" Then
  145.         IsCode = -1
  146.         Exit Function
  147.     End If
  148.     For i = 0 To UBound(sCode, 1)
  149.         If UCase(sCode(i).Name) = UCase(s) Or UCase(sCode(i).Code) = UCase(s) Then
  150.             Exit For
  151.         End If
  152.     Next i
  153.     
  154.     If i > UBound(sCode, 1) Then
  155.         IsCode = -1
  156.     Else
  157.         IsCode = i
  158.     End If
  159. End Function
  160. Private Function ReplaceByPos(sExepress As String, sReplace As String, Optional iStart As Integer = 0, Optional iEnd As Integer = 0) As String '通过位置替换单词
  161.     '通过位置替换单词
  162.     '参数:sExepress,要替换的表达式 ;sReplace替换为的表达式;iStart开始位置;iEnd,结束位置
  163.     '把sExepress中从iStart开始到iEnd结束的字符替换为sReplace
  164.     Dim i As Integer
  165.     Dim j As Integer
  166.     Dim sLeft As String
  167.     Dim sRight As String
  168.     
  169.     If iStart > Len(sExepress) Then
  170.         Err.Raise vbObjectError + 100, "ReplaceByPos", "开始位置超出字符长度"
  171.         Exit Function
  172.     End If
  173.     If iStart > iEnd Then
  174.         Err.Raise vbObjectError + 101, "ReplaceByPos", "开始位置超出结束位置"
  175.         Exit Function
  176.     End If
  177.     
  178.     sLeft = Left(sExepress, iStart - 1)
  179.     sRight = Right(sExepress, Len(sExepress) - iEnd + 1)
  180.     ReplaceByPos = sLeft & sReplace & sRight
  181.     iPosSys = Len(sReplace) + iStart
  182.     Formula = ReplaceByPos
  183. End Function
  184. Public Function CheckFormula(sF As String, Optional sUpdateField As String = "") As Boolean '验证公式
  185.     'sUpdateField="" 查询条件 ,其他 计算公式
  186. '    On Error GoTo ErrCtrl
  187.     
  188.     If bChecking = True Then
  189.         Exit Function
  190.     Else
  191.         bChecking = True
  192.     End If
  193.     '如果是空,返回Ture
  194.     If sF = "" Then
  195.         CheckFormula = True
  196.         Me.FormulaSQL = ""
  197.         Me.FormulaSys = ""
  198.         FormulaOld = ""
  199.         Set Me.PB_CheckStatus = Nothing
  200.         Exit Function
  201.     End If
  202.     
  203.     Dim i As Integer
  204.     Dim j As Integer
  205.     Dim B As Boolean
  206.     Dim s As String
  207.     Dim st As String
  208.     Dim iDataType As Integer
  209.     
  210.     Dim bBeginTrans As Boolean '是否已经开始事务
  211.     
  212.     '初始化表名表和条件表,以及各种变量
  213.     ReDim sTableName(0)
  214.     sTableName(0) = ""
  215.     ReDim sItem(0)
  216.     sItem(0).Code = ""
  217.    
  218.     bBeginTrans = False
  219.     sF = Format(sF)
  220.     FormulaOld = sF
  221.     Formula = sF
  222.     iPosSys = 1
  223.     iPosOldSys = 1
  224.     Me.FormulaSQL = ""
  225.     Me.FormulaSys = ""
  226.     iDataType = DATA_NUMERIC
  227.   '把用户录入转换为数据库格式
  228.   '(中文字段—>数据字段,并且添加数据表名到数组sTableName中,操作符不变,值加单引号)
  229.     
  230.     Do While iPosSys < Len(Formula)
  231.         DoEvents
  232.         s = GetNextField
  233.         i = IsField(s)
  234.         If i = -2 Then
  235.             '如果字段名在多个表中,要求用户添加表名
  236.             bChecking = False
  237.             Exit Function
  238.         End If
  239.         
  240.         If i >= 0 Then '字段
  241.             Formula = ReplaceByPos(Formula, UCase(sFieldWhere(i).GetFullName), iPosOldSys + 1, iPosSys)
  242.             AddItem UCase(sFieldWhere(i).GetFullName), sFieldWhere(i).DataType
  243.             AddTableName sFieldWhere(i).TableName
  244.             iDataType = sFieldWhere(i).DataType
  245.         Else
  246.             If Not IsOperater(s) Then
  247.                 B = False
  248.                 '单独处理%
  249.                 If Mid(s, Len(s), 1) = "%" Then
  250.                     s = Mid(s, 1, Len(s) - 1)
  251.                     B = True
  252.                 End If
  253.                 If s = "人劳科工资" Then
  254.                     Debug.Print s
  255.                 End If
  256.                 i = IsCode(s)
  257.                 If i >= 0 Then '相关项、部门、工资类别等
  258.                     
  259.                     If B = False Then
  260.                         Formula = ReplaceByPos(Formula, "'" & UCase(sCode(i).Code) & "'", iPosOldSys + 1, iPosSys)
  261.                         AddItem "'" & UCase(sCode(i).Code) & "'", 0
  262.                     Else
  263.                         Formula = ReplaceByPos(Formula, "'" & UCase(sCode(i).Code) & "%'", iPosOldSys + 1, iPosSys)
  264.                         AddItem "'" & UCase(sCode(i).Code) & "%'", 0
  265.                     End If
  266.                 Else
  267.                     i = IsFunction(s)
  268.                     If i >= 0 Then ' 公式
  269.                         Formula = ReplaceByPos(Formula, UCase(sFunction(i).Code), iPosOldSys + 1, iPosSys)
  270.                         AddItem UCase(sFunction(i).Code), 0
  271.                     Else
  272.                         If B = False Then
  273.                             If IsNumeric(s) And iDataType = DATA_NUMERIC Then
  274.                                 '区分数字的“.”和字段限定符的“.”
  275.                                 Formula = ReplaceByPos(Formula, Replace(s, ".", "@"), iPosOldSys + 1, iPosSys)
  276.                                 AddItem s
  277.                             Else
  278.                                 Formula = ReplaceByPos(Formula, "'" & Replace(s, ".", "@") & "'", iPosOldSys + 1, iPosSys)
  279.                                 AddItem "'" & s & "'"
  280.                             End If
  281.                             
  282.                         Else
  283.                             Formula = ReplaceByPos(Formula, "'" & s & "%'", iPosOldSys + 1, iPosSys)
  284.                             AddItem "'" & s & "%'"
  285.                         End If
  286.                     End If
  287.                 End If
  288.             Else
  289.                 AddItem s
  290.             End If
  291.             
  292.         End If
  293.         '进度
  294.         ChangeStatus iPosSys, Len(Formula)
  295.     Loop
  296.     FormulaSys = Replace(Formula, "@", ".")
  297.     
  298.     '验证公式格式是否正确
  299.     s = Formula
  300.     s = Replace(s, "'", Chr(34))
  301.     s = Replace(s, UCase("like"), "=")
  302.     s = Replace(s, UCase("."), "a") '控件不支持“.”
  303.     s = Replace(s, UCase(" GetDate() "), UCase(" Today "))
  304.     s = Replace(s, UCase("%"), "a") '控件不支持“%”
  305.     s = Replace(s, "@", ".") '替换原来的数字“.”
  306.     s = "c=" & s
  307.     
  308.     Dim SC_Formula As New MSScriptControl.ScriptControl
  309.     SC_Formula.Language = "VBScript"
  310.     SC_Formula.ExecuteStatement (s)
  311.     
  312.     '验证公式字段名称、数据类型是否正确,更新数据库,如果有错误则不正确
  313.     
  314.     If sTableName(0) <> "" Then
  315.         st = ""
  316.         For i = 0 To UBound(sTableName, 1)
  317.             st = st & "," & Trim(sTableName(i))
  318.         Next i
  319.         st = Mid(st, 2, Len(st) - 1)
  320.     End If
  321.     
  322.     If sUpdateField = "" Then '是查询条件
  323.         If sTableName(0) = "" Then
  324.             s = " select top 1 * from PM_PayRoll where " & FormulaSys
  325.         Else
  326.             s = " select top 1 * from " & st & " where " & FormulaSys
  327.         End If
  328.         Cw_DataEnvi.DataConnect.Execute (s)
  329.     Else '是计算公式
  330.         If Trim(st) = "" Then
  331.             st = " PM_PayRoll "
  332.         End If
  333.         
  334.         s = "update PM_PayRoll set " & sUpdateField & "= " & FormulaSys & Chr(10) _
  335.             & " from " & st & Chr(10) & " where PM_PayRoll.Period=0 "
  336.         With Cw_DataEnvi.DataConnect
  337.             .BeginTrans
  338.                 bBeginTrans = True
  339.                 .Execute (s)
  340.             .RollbackTrans
  341.         End With
  342.     End If
  343.     '验证正确,计算公式加 IsNull 函数
  344.     FormulaSQL = GetFormulaSQL
  345.     CheckFormula = True
  346.     Set SC_Formula = Nothing
  347.     Me.PB_CheckStatus.Visible = False
  348.     bChecking = False
  349.     
  350.     Exit Function
  351.     
  352. ErrCtrl:
  353.     Set SC_Formula = Nothing
  354.     bChecking = False
  355.     Me.PB_CheckStatus.Visible = False
  356.     If bBeginTrans = True Then
  357.         Cw_DataEnvi.DataConnect.RollbackTrans
  358.     End If
  359.     
  360.     Dim smsg As String
  361.     Dim smsgSys As String
  362.     smsg = GetError(Err.Number)
  363.     smsgSys = Err.Number & Err.Description & "!"
  364.     MsgBox IIf(smsg = "", smsgSys, smsg), vbOKOnly + vbCritical
  365. End Function
  366. Public Function ResetPos(iPos As Integer)
  367.   iPosSys = iPos
  368. End Function
  369. Public Function ResetPosOld(iPosSys As Integer)
  370.   iPosOldSys = iPosSys
  371. End Function
  372. Private Sub Class_Initialize() '类初始化,包括初始化字段、公式、编码、操作符、其他等
  373.     On Error GoTo ErrCtrl
  374.     
  375.     '初始化变量
  376.     iPosSys = 1
  377.     iPosOldSys = 1
  378.     Dim rs As New ADODB.Recordset
  379.     Dim s As String
  380.     ReDim sTableName(0)
  381.     sTableName(0) = ""
  382.     ReDim sItem(0)
  383.     sItem(0).Code = ""
  384.     ReDim sCode(0)
  385.     sCode(0).Code = ""
  386.     
  387.     '读取字段属性
  388.     With Cw_DataEnvi.DataConnect
  389.         If .State = 0 Then
  390.             .Open
  391.         End If
  392.     End With
  393.     s = "select distinct FieldName as FieldName ,ChName as FieldNameC ,FieldType as DataType ,TableName  as TableFrom,AddMinusItem  from Rs_Items WHERE SID<10 "
  394.     Set rs = Cw_DataEnvi.DataConnect.Execute(s)
  395.     With rs
  396.         If Not .EOF() Then
  397.             ReDim sFieldWhere(.RecordCount - 1)
  398.         End If
  399.         i = 0
  400.         Do While Not .EOF()
  401.             sFieldWhere(i).NewCByValue Trim(!FieldName & ""), Trim(!FieldNameC & ""), Trim(!TableFrom & ""), !DataType
  402.             If !AddMinusItem Then
  403.                 '如果是选入工资表的字段,添加工资表
  404.                 i = i + 1
  405.                 ReDim Preserve sFieldWhere(UBound(sFieldWhere, 1) + 1)
  406.                 sFieldWhere(i).NewCByValue Trim(!FieldName & ""), Trim(!FieldNameC), "PM_PayRoll", !DataType
  407.             End If
  408.             i = i + 1
  409.             .MoveNext
  410.         Loop
  411.         .Close
  412.     End With
  413.     '添加会计年,会计期间,工资类别到工资表,会计年,会计期间到考勤表
  414.     ReDim Preserve sFieldWhere(UBound(sFieldWhere, 1) + 5)
  415.     sFieldWhere(UBound(sFieldWhere, 1)).NewCByValue "KjYear", "会计年", "PM_PayRoll", "1"
  416.     sFieldWhere(UBound(sFieldWhere, 1) - 1).NewCByValue "Period", "会计期间", "PM_PayRoll", "1"
  417.     sFieldWhere(UBound(sFieldWhere, 1) - 2).NewCByValue "SortID", "工资类别", "PM_PayRoll", "1"
  418.     sFieldWhere(UBound(sFieldWhere, 1) - 3).NewCByValue "KjYear", "会计年", "PM_AttendRecord", "1"
  419.     sFieldWhere(UBound(sFieldWhere, 1) - 4).NewCByValue "KjYear", "会计期间", "PM_AttendRecord", "1"
  420.     
  421.     '添加相关项
  422.     s = "Select Distinct CorTable as CorTable,IndexCode as IndexCode ,IndexName as IndexName from Rs_Items " _
  423.        & " where IsNull(CorTable,'')<>'' and SID<10 "
  424.     Set rs = Cw_DataEnvi.DataConnect.Execute(s)
  425.     s = ""
  426.     With rs
  427.         Do While Not .EOF()
  428.             s = s & " Select " & Trim(!IndexCode & "") & " as TCode ," & Trim(!IndexName & "") & " as TName from " & Trim(!CorTable & "") & " Union "
  429.             .MoveNext
  430.         Loop
  431.     End With
  432.     
  433.     If Trim(s) <> "" Then
  434.             s = UCase(Trim(s))
  435.             s = Mid(s, 1, Len(s) - 5)
  436.     End If
  437.     If Trim(s) <> "" Then
  438.         Set rs = Cw_DataEnvi.DataConnect.Execute(s)
  439.         With rs
  440.             If Not .EOF() Then
  441.                 ReDim sCode(.RecordCount - 1)
  442.                 i = 0
  443.                 Do While Not .EOF()
  444.                     sCode(i).Code = Trim(!TCode & "")
  445.                     sCode(i).Name = Trim(!TName & "")
  446.                     .MoveNext
  447.                     i = i + 1
  448.                 Loop
  449.             End If
  450.             .Close
  451.         End With
  452.     End If
  453.     '添加工资类别
  454.     s = "Select SortID as SortID ,SortName as SortName from PM_Sort"
  455.     Set rs = Cw_DataEnvi.DataConnect.Execute(s)
  456.     With rs
  457.         Do While Not .EOF()
  458.             ReDim Preserve sCode(UBound(sCode, 1) + 1)
  459.             sCode(UBound(sCode, 1)).Code = Trim(!sortId & "")
  460.             sCode(UBound(sCode, 1)).Name = Trim(!SortName & "")
  461.             .MoveNext
  462.         Loop
  463.     End With
  464.     '添加公式数组
  465.     ReDim sFunction(21)
  466.     sFunction(0).Name = "今天"
  467.     sFunction(0).Code = "GetDate()"
  468.     sFunction(1).Name = "日"
  469.     sFunction(1).Code = "DAY"
  470.     sFunction(2).Name = "月"
  471.     sFunction(2).Code = "MONTH"
  472.     sFunction(3).Name = "年"
  473.     sFunction(3).Code = "YEAR"
  474.     sFunction(4).Name = "TODAY"
  475.     sFunction(4).Code = "GETDATE()"
  476.     '添加操作符
  477.     ReDim sOperate(22)
  478.     sOperate(0).Name = "等于"
  479.     sOperate(0).Code = "="
  480.     sOperate(1).Name = "大于"
  481.     sOperate(1).Code = ">"
  482.     sOperate(2).Name = "小于"
  483.     sOperate(2).Code = "<"
  484.     sOperate(3).Name = "不大于"
  485.     sOperate(3).Code = "<="
  486.     sOperate(4).Name = "不小于"
  487.     sOperate(4).Code = ">="
  488.     sOperate(5).Name = "包含于"
  489.     sOperate(5).Code = "Like"
  490.     sOperate(6).Name = "不等于"
  491.     sOperate(6).Code = "<>"
  492.     
  493.     sOperate(7).Name = "加"
  494.     sOperate(7).Code = "+"
  495.     sOperate(8).Name = "减"
  496.     sOperate(8).Code = "-"
  497.     sOperate(9).Name = "乘以"
  498.     sOperate(9).Code = "*"
  499.     sOperate(10).Name = "除以"
  500.     sOperate(10).Code = "/"
  501.     sOperate(11).Name = "加"
  502.     sOperate(11).Code = "+"
  503.     sOperate(12).Name = "乘以"
  504.     sOperate(12).Code = "×"
  505.     sOperate(13).Name = "除以"
  506.     sOperate(13).Code = "÷"
  507.     
  508.     sOperate(14).Name = "("
  509.     sOperate(14).Code = "("
  510.     sOperate(15).Name = "("
  511.     sOperate(15).Code = "("
  512.     sOperate(16).Name = ")"
  513.     sOperate(16).Code = ")"
  514.     sOperate(17).Name = ")"
  515.     sOperate(17).Code = ")"
  516.     
  517.     sOperate(18).Name = "And"
  518.     sOperate(18).Code = "And"
  519.     sOperate(19).Name = "并且"
  520.     sOperate(19).Code = "And"
  521.     sOperate(20).Name = "Or"
  522.     sOperate(20).Code = "Or"
  523.     sOperate(21).Name = "或者"
  524.     sOperate(21).Code = "Or"
  525.     
  526.     sOperate(22).Name = "-"
  527.     sOperate(22).Code = "-"
  528.     Set rs = Nothing
  529.    
  530.     Exit Sub
  531.     
  532. ErrCtrl:
  533.     If rs.State = 1 Then
  534.         rs.Close
  535.     End If
  536.     Set rs = Nothing
  537.     Dim smsg As String
  538.     Dim smsgSys As String
  539.     smsg = GetError(Err.Number)
  540.     smsgSys = Err.Number & Err.Description & "!"
  541.     MsgBox IIf(smsg = "", smsgSys, smsg), vbOKOnly + vbCritical
  542.     
  543. End Sub
  544. Private Function Format(sFormula As String) As String '格式化数据,单词之间有一个空格
  545.      Dim i As Integer
  546.      Dim j As Integer
  547.      Dim B As Boolean
  548.      
  549.      If sFieldWhere(0).IsEmpty() Then
  550.         MsgBox "初始化错误!", vbOKOnly + vbCritical
  551.         Exit Function
  552.      End If
  553.      
  554.     '格式化字符串,把操作符两端加空格
  555.      
  556.      sFormula = UCase(" " & sFormula & " ")
  557.      sFormula = Replace(sFormula, "'", " ")
  558.      sFormula = Replace(sFormula, "‘", " ")
  559.      sFormula = Replace(sFormula, "’", " ")
  560.      
  561.      sFormula = Replace(sFormula, "(", " ( ")
  562.      sFormula = Replace(sFormula, ")", " ) ")
  563.      sFormula = Replace(sFormula, "*", " * ")
  564.      sFormula = Replace(sFormula, "+", " + ")
  565.      sFormula = Replace(sFormula, "(", " ( ")
  566.      sFormula = Replace(sFormula, ")", " ) ")
  567.      sFormula = Replace(sFormula, "×", " * ")
  568.      sFormula = Replace(sFormula, "+", " + ")
  569.      sFormula = Replace(sFormula, "-", " - ")
  570.      sFormula = Replace(sFormula, "÷", " / ")
  571.      sFormula = Replace(sFormula, "/", " / ")
  572.      
  573.      sFormula = Replace(sFormula, "并且", " AND ")
  574.      sFormula = Replace(sFormula, "或者", " OR ")
  575.      
  576.      sFormula = Replace(sFormula, "小于", " < ")
  577.      sFormula = Replace(sFormula, "<", " < ")
  578.      sFormula = Replace(sFormula, "不大于", " <= ")
  579.      sFormula = Replace(sFormula, "<=", " <= ")
  580.      
  581.      sFormula = Replace(sFormula, "=", " = ")
  582.      sFormula = Replace(sFormula, "=", " = ")
  583.      sFormula = Replace(sFormula, "等于", " = ")
  584.      
  585.      sFormula = Replace(sFormula, ">", " > ")
  586.      sFormula = Replace(sFormula, "大于", " > ")
  587.      sFormula = Replace(sFormula, ">=", " >= ")
  588.      sFormula = Replace(sFormula, "不小于", " > ")
  589.      
  590.      sFormula = Replace(sFormula, Chr(13), "")
  591.      sFormula = Replace(sFormula, Chr(10), "")
  592.      
  593.      '应该单独处理日期,因为日期格式中有“-”,同减号相同,没有完成
  594.      '现在只是要求用户录入日期时不空格,比如'2001-01-01',减号空格,比如 ( 10 - 3 )
  595.      
  596.     '去掉多余空格
  597.      
  598.      B = True
  599.      i = 1
  600.      Do While B
  601.         If InStr(1, sFormula, Space(i)) = 0 Then
  602.             B = False
  603.         Else
  604.             i = i + 1
  605.         End If
  606.      Loop
  607.      j = 0
  608.      For j = i To 1 Step -1
  609.         sFormula = Replace(sFormula, "  ", " ")
  610.      Next j
  611.      
  612.      sFormula = Replace(sFormula, "< =", "<=")
  613.      sFormula = Replace(sFormula, "> =", ">=")
  614.      sFormula = Replace(sFormula, "< >", "<>")
  615.      sFormula = Replace(sFormula, "< =", "<=")
  616.      sFormula = Replace(sFormula, "> =", ">=")
  617.      sFormula = Replace(sFormula, "< >", "<>")
  618.      
  619.      Format = sFormula
  620. End Function
  621. Public Function GetTableName(collTable As Collection) '读取查询条件用到的表名
  622.     If collTable Is Nothing Then
  623.         Exit Function
  624.     End If
  625.     Dim i As Integer
  626.     For i = 1 To collTable.count
  627.         collTable.Remove (i)
  628.     Next
  629.     For i = 0 To UBound(sTableName, 1)
  630.         collTable.Add sTableName(i)
  631.     Next i
  632. End Function
  633. Private Function AddItem(sValue As String, Optional iType As Integer = -1) '添加项目
  634.     '添加项目,以便取得公式内容
  635.     If sItem(0).Code = "" Then
  636.         sItem(0).Code = sValue
  637.         sItem(0).Name = iType
  638.     Else
  639.         ReDim Preserve sItem(UBound(sItem, 1) + 1)
  640.         sItem(UBound(sItem, 1)).Code = sValue
  641.         sItem(UBound(sItem, 1)).Name = iType
  642.     End If
  643. End Function
  644. Private Function GetFormulaSQL() As String '取得计算公式的可执行SQL
  645.     '取得计算公式的可执行SQL,并替换数字型字段名为IsNull(字段名,0)
  646.     Dim i As Integer
  647.     Dim s As String
  648.     If sItem(0).Code = "" Then
  649.         Exit Function
  650.     End If
  651.     s = ""
  652.     For i = 0 To UBound(sItem)
  653.         If sItem(i).Name = DATA_NUMERIC Then
  654.             s = s + " Convert(Numeric(18,2),IsNull(" & Trim(sItem(i).Code) & ",0) )"
  655.         Else
  656.             s = s + " " + Trim(sItem(i).Code) & " "
  657.         End If
  658.     Next i
  659.     GetFormulaSQL = s
  660. End Function
  661. Private Sub Class_Terminate()
  662.     Set PB_CheckStatus = Nothing
  663. End Sub