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