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

企业管理

开发平台:

Visual Basic

  1. Attribute VB_Name = "XtsyModule"
  2. '系统私有模块用来放置一些子系统独有的过程与函数
  3. Public str_Code As String                               '存储列内容参数
  4. Public KjYear As Integer                                '当前会计年
  5. Public Period As Integer                                '当前会计月
  6. Public sParam As String
  7. Public sParam2 As String
  8. Public Const DATA_NUMERIC As Integer = 5 '数字行
  9. Public Const DATA_STRING As Integer = 0 '字符型
  10. Public Const DATA_DATE As Integer = 7 '日期型
  11. Const PRINTSTYLE_ONETITLE = 0 '每页打印表头
  12. Const PRINTSTYLE_ALLTITLE = 1 '每行打印表头
  13. Dim Sql As String
  14. Dim SqlField As String
  15. Dim Rsc As New ADODB.Recordset
  16. Public Function Item_Info(sys As Integer)   '项目查询连接
  17. 'sys=0,人事系统调用;sys=1,工资系统调用
  18.     Dim tmpRs As New Recordset
  19.     Dim sSql As String
  20.     If sys = 0 Then
  21.         Set tmpRs = Cw_DataEnvi.DataConnect.Execute("select * from Rs_Items WHERE SID='1' ")
  22.     Else
  23.         Set tmpRs = Cw_DataEnvi.DataConnect.Execute("select * from Rs_Items WHERE SID='2' OR Pm='1' ")
  24.     End If
  25.     With tmpRs
  26.         Do While Not .EOF
  27.             
  28.             If Trim(!CorTable) = "" Then                                               '非编码型的
  29.                 If Trim(!TableName) = "Rs_BasicInfo" Then
  30.                     sSql = sSql & ",B." & !FieldName
  31.                 Else
  32.                     sSql = sSql & ",E." & !FieldName
  33.                 End If
  34.             Else
  35.                 If Trim(tmpRs!CorTable) = "Rs_CorSub" Then                                  '这个字段是编码型的,并且相关项的字段在Rs_CorSub
  36.                     If Trim(!TableName) = "Rs_BasicInfo" Then
  37.                         sSql = sSql & ",N_" & !FieldName & "=(select ListName from Rs_CorSub c where convert(varchar(18),c.ListId)=B." & !FieldName & ")"
  38.                         sSql = sSql & ",B." & !FieldName
  39.                     Else
  40.                         sSql = sSql & ",N_" & !FieldName & "=(select ListName from Rs_CorSub c where convert(varchar(18),c.ListId)=E." & !FieldName & ")"
  41.                         sSql = sSql & ",E." & !FieldName
  42.                     End If
  43.                     '-----------------
  44.                 Else                                                                         '这个字段是编码型的,但是相关项的字段表不确定的情况
  45.                         If Trim(!TableName) = "Rs_BasicInfo" Then
  46.                             sSql = sSql & ",N_" & !FieldName & "=(select " & Trim(tmpRs!IndexName) & " from " & Trim(tmpRs!CorTable) & " c where c." & Trim(tmpRs!IndexCode) & "=B." & !FieldName & ")"
  47.                             sSql = sSql & ",B." & !FieldName
  48.                         Else
  49.                             sSql = sSql & ",N_" & !FieldName & "=(select " & Trim(tmpRs!IndexName) & " from " & Trim(tmpRs!CorTable) & " c where c." & Trim(tmpRs!IndexCode) & "=E." & !FieldName & ")"
  50.                             sSql = sSql & ",E." & !FieldName
  51.                         End If
  52.                 End If
  53.             End If
  54.             
  55.             
  56.             .MoveNext
  57.         Loop
  58.         sSql = "SELECT " & Mid(sSql, 2, Len(sSql) - 1) & " FROM Rs_ExtendInfo E,Rs_BasicInfo B"
  59.     End With
  60.     Item_Info = sSql
  61. End Function
  62. Public Sub Drxtztcs()                                   '读入系统帐套参数
  63.    
  64.     Dim Ztcsbrec As New ADODB.Recordset
  65.     Dim RecTemp As New ADODB.Recordset
  66.     Dim Sqlstr As String
  67.     
  68.     '读入本位币
  69.     Sqlstr = "SELECT ForeignCurrCode,ForeignCurrName FROM Gy_ForeignCurrency WHERE StandardFlag=1"
  70.     Set RecTemp = Cw_DataEnvi.DataConnect.Execute(Sqlstr)
  71.     XtSCurrCode = Trim(RecTemp.Fields("ForeignCurrCode"))
  72.     XtSCurrName = Trim(RecTemp.Fields("ForeignCurrName"))
  73.     
  74.     With Ztcsbrec
  75.         '金额总位数
  76.         .Open "SELECT * FROM Gy_AccInformation WHERE SystemCode='Cwzz'", Cw_DataEnvi.DataConnect, adOpenDynamic, adLockOptimistic
  77.         .MoveFirst
  78.         .Find "itemcode='cwjezws'"
  79.         If Not Ztcsbrec.EOF Then
  80.             Xtjezws = Val(Trim(Ztcsbrec.Fields("itemvalue")))
  81.         End If
  82.         
  83.         '数量总位数
  84.         .MoveFirst
  85.         .Find "itemcode='cwslzws'"
  86.         If Not Ztcsbrec.EOF Then
  87.             Xtslzws = Val(Trim(Ztcsbrec.Fields("itemvalue")))
  88.         End If
  89.    
  90.         '单价总位数
  91.         .MoveFirst
  92.         .Find "itemcode='cwdjzws'"
  93.         If Not Ztcsbrec.EOF Then
  94.             Xtdjzws = Val(Trim(Ztcsbrec.Fields("itemvalue")))
  95.         End If
  96.         
  97.         '金额小数位数
  98.         .MoveFirst
  99.         .Find "itemcode='cwjexsws'"
  100.         If Not Ztcsbrec.EOF Then
  101.             Xtjexsws = Val(Trim(Ztcsbrec.Fields("itemvalue")))
  102.         End If
  103.    
  104.         '数量小数位数
  105.         .MoveFirst
  106.         .Find "itemcode='cwslxsws'"
  107.         If Not Ztcsbrec.EOF Then
  108.             Xtslxsws = Val(Trim(Ztcsbrec.Fields("itemvalue")))
  109.         End If
  110.         
  111.         '单价小数位数
  112.         .MoveFirst
  113.         .Find "itemcode='cwdjxsws'"
  114.         If Not Ztcsbrec.EOF Then
  115.             Xtdjxsws = Val(Trim(Ztcsbrec.Fields("itemvalue")))
  116.         End If
  117.         .Close
  118.     End With
  119.   
  120. End Sub
  121. Public Sub CurrPeriod()
  122.     '读入当前会计期间
  123.     Dim Rsc As New ADODB.Recordset
  124.     Set Rsc = Cw_DataEnvi.DataConnect.Execute("SELECT * FROM gy_kjrlb WHERE pmjzbz=0 order by kjyear,period")
  125.     With Rsc
  126.         If Not Rsc.EOF Then
  127.            KjYear = Trim(!KjYear)
  128.            Period = Trim(!Period)
  129.         End If
  130.     End With
  131. End Sub
  132. Public Function DynaFillImageCombo(Combote As ImageCombo, ComboCode As String, AddType As Integer, SqlString As String) '填充列表框(ImageCombo)并定
  133.     '可在查询条件里加动态的条件
  134.     '函数参数:列表框(ImageCombo),ComboCode列表框分组编码
  135.     'AddType 项目填充类型(0-填充索引+内容,无空记录 1-仅填充内容,无空记录 2-填充索引+内容,有空记录 3-仅填充内容,有空记录)
  136.     'SqlString  补充条件
  137.     Dim Rec_Combo As ADODB.Recordset              '填充属性
  138.     Dim Rec_FillText As ADODB.Recordset           '填充内容
  139.     Dim ci As ComboItem
  140.     Dim jsqte As Integer                          '临时计数器
  141.     Dim Sql As String
  142.     Combote.ComboItems.Clear
  143.     jsqte = 1
  144.   
  145.     '填充列表框内容
  146.     Set Rec_Combo = Cw_DataEnvi.DataConnect.Execute("SELECT * FROM Xt_ImageCombo WHERE combo_code='" + Trim(ComboCode) + "'")
  147.     
  148.     With Rec_Combo
  149.         Combote.Locked = True
  150.         If AddType = 2 Or AddType = 3 Then
  151.             Set ci = Combote.ComboItems.Add(, "@")
  152.             jsqte = jsqte + 1
  153.         End If
  154.         Sql = Trim(.Fields("Sql_String")) & SqlString
  155.         Set Rec_FillText = Cw_DataEnvi.DataConnect.Execute(Sql)
  156.         
  157.         Do While Not Rec_FillText.EOF
  158.             Select Case AddType
  159.                 Case 0, 2                              '填充索引+内容
  160.                     Set ci = Combote.ComboItems.Add(, "@" + Trim(Rec_FillText.Fields(Trim(.Fields("ItemKey")))), Trim(Rec_FillText.Fields(Trim(.Fields("ItemKey")))) + " " + Trim(Rec_FillText.Fields(Trim(.Fields("ItemText")))))
  161.                 Case 1, 3                              '仅填充记录内容
  162.                     Set ci = Combote.ComboItems.Add(, "@" + Trim(Rec_FillText.Fields(Trim(.Fields("ItemKey")))), Trim(Rec_FillText.Fields(Trim(.Fields("ItemText")))))
  163.             End Select
  164.             jsqte = jsqte + 1
  165.             Rec_FillText.MoveNext
  166.         Loop
  167.         If Combote.ComboItems.Count <> 0 Then
  168.             Combote.ComboItems.Item(1).Selected = True
  169.         End If
  170.     End With
  171. End Function
  172. Public Sub CmdUP(CzxsGrid As vsFlexGrid) '向上移动网格中数据的上、下行序
  173.     Dim Temp As String
  174.     Dim i As Long
  175.     With CzxsGrid
  176.         For i = .FixedCols To .Cols - 1
  177.             Temp = .TextMatrix(.Row - 1, i)
  178.             .TextMatrix(.Row - 1, i) = .TextMatrix(.Row, i)
  179.             .TextMatrix(.Row, i) = Temp
  180.         Next
  181.         .Row = .Row - 1
  182.     End With
  183. End Sub
  184. Public Sub CmdDown(CzxsGrid As vsFlexGrid)    '向下移动网格中数据的上、下行序
  185.     Dim Temp As String
  186.     Dim i As Long
  187.     With CzxsGrid
  188.         For i = .FixedCols To .Cols - 1
  189.             Temp = .TextMatrix(.Row + 1, i)
  190.             .TextMatrix(.Row + 1, i) = .TextMatrix(.Row, i)
  191.             .TextMatrix(.Row, i) = Temp
  192.         Next
  193.         .Row = .Row + 1
  194.     End With
  195. End Sub
  196. Public Function StopDelItem(ItemId As Integer, FieldName As String, ChName As String, OpeStatus As String, SortId As String) As Boolean
  197.     '停用、删除项目必须符合以下条件,
  198.     'itemid--项目编号  FieldName--项目字段名  ChName--项目名称  OpeStatus--操作状态(停用、删除) SortId--工资类别
  199.     Dim Rsc As New ADODB.Recordset
  200.     Dim Sql As String
  201.        
  202.     With Rsc
  203.         If LCase(Trim(FieldName)) = "tax" Or LCase(Trim(FieldName)) = "paywage" Or LCase(Trim(FieldName)) = "taxitem" Then
  204.             If .State = 1 Then .Close
  205.             .Open "SELECT * FROM PM_Sort WHERE SortId='" & SortId & "'", Cw_DataEnvi.DataConnect, adOpenDynamic, adLockOptimistic
  206.             If Not .EOF Then
  207.                If !DeductTax = True Or (!AdmDeductTax = True And LCase(Trim(FieldName)) = "taxitem") Then
  208.                    Call Xtxxts("本工资类别是扣税类别,不能删除“" & ChName & "”!", 0, 1)
  209.                    StopDelItem = False
  210.                    Exit Function
  211.                End If
  212.             End If
  213.         End If
  214.         
  215.        '没有用在公式的字段中
  216.         If .State = 1 Then .Close
  217.         Sql = "SELECT * FROM PM_Formula WHERE ltrim(rtrim(FieldName)) ='" & _
  218.              FieldName & "' AND sortid='" & SortId & "'"
  219.         .Open Sql, Cw_DataEnvi.DataConnect, adOpenDynamic, adLockOptimistic
  220.         If Not .EOF Then
  221.             Call Xtxxts("公式的计算字段使用了“" & ChName & "”,不能" & OpeStatus & "!", 0, 1)
  222.             StopDelItem = False
  223.             Exit Function
  224.         End If
  225.         '没有用在公式的内容中
  226.         If .State = 1 Then .Close
  227.         Sql = "SELECT * FROM PM_Formula WHERE charindex('" & FieldName & _
  228.             "',Fcontent)<>0 AND sortid='" & SortId & "'"
  229.         .Open Sql, Cw_DataEnvi.DataConnect, adOpenDynamic, adLockOptimistic
  230.         If Not .EOF Then
  231.             Call Xtxxts("公式内容使用了“" & ChName & "”,不能" & OpeStatus & "!", 0, 1)
  232.             StopDelItem = False
  233.             Exit Function
  234.         End If
  235.         '没有用在公式的限定条件中
  236.         If .State = 1 Then .Close
  237.         Sql = "SELECT * FROM PM_Formula WHERE charindex('" & FieldName & _
  238.               "',FLimit)<>0 AND sortid='" & SortId & "'"
  239.         .Open Sql, Cw_DataEnvi.DataConnect, adOpenDynamic, adLockOptimistic
  240.         If Not .EOF Then
  241.             Call Xtxxts("公式的限定条件使用了“" & ChName & "”,不能" & OpeStatus & "!", 0, 1)
  242.             StopDelItem = False
  243.             Exit Function
  244.         End If
  245.         '没有用在标准表的字段中
  246.         If .State = 1 Then .Close
  247.         Sql = "SELECT * FROM PM_StandTbl WHERE ltrim(rtrim(BzbResuItem))='" & _
  248.               FieldName & "' AND sortid='" & SortId & "'"
  249.         .Open Sql, Cw_DataEnvi.DataConnect, adOpenDynamic, adLockOptimistic
  250.         If Not .EOF Then
  251.             Call Xtxxts("标准表的结果项目使用了“" & ChName & "”,不能" & OpeStatus & "!", 0, 1)
  252.             StopDelItem = False
  253.             Exit Function
  254.         End If
  255.         '没有用在标准表的限定条件中
  256.         If .State = 1 Then .Close
  257.         Sql = "SELECT * FROM PM_StandTbl WHERE charindex('" & FieldName & _
  258.                "',BzbCond)<>0 AND sortid='" & SortId & "'"
  259.         .Open Sql, Cw_DataEnvi.DataConnect, adOpenDynamic, adLockOptimistic
  260.         If Not .EOF Then
  261.             Call Xtxxts("标准表的限定条件使用了“" & ChName & "”,不能" & OpeStatus & "!", 0, 1)
  262.             StopDelItem = False
  263.             Exit Function
  264.         End If
  265.         '没有用在银行代发的项目中
  266.         If .State = 1 Then .Close
  267.         Sql = "SELECT * FROM PM_BankItem WHERE ltrim(rtrim(DataContent))='" & _
  268.               FieldName & "' AND sortid ='" & SortId & "'"
  269.         .Open Sql, Cw_DataEnvi.DataConnect, adOpenDynamic, adLockOptimistic
  270.         If Not .EOF Then
  271.             Call Xtxxts("“" & ChName & "”是银行代发文件项目,不能" & OpeStatus & "!", 0, 1)
  272.             StopDelItem = False
  273.             Exit Function
  274.         End If
  275.         '不是报表显示项目
  276.         If .State = 1 Then .Close
  277.         Sql = "SELECT * FROM PM_ReportItem WHERE ltrim(rtrim(FieldName))='" & FieldName & "'" & _
  278.               " AND PmSort='" & SortId & "'"
  279.         .Open Sql, Cw_DataEnvi.DataConnect, adOpenDynamic, adLockOptimistic
  280.         If Not .EOF Then
  281.             Call Xtxxts("“" & ChName & "”是报表显示项目,不能" & OpeStatus & "!", 0, 1)
  282.             StopDelItem = False
  283.             Exit Function
  284.         End If
  285.         '没有用在复制数据的清空项中
  286.         If .State = 1 Then .Close
  287.         Sql = "SELECT * FROM PM_SortItem WHERE ItemID=" & ItemId & _
  288.               " AND sortid='" & SortId & "' AND ClearFlag=1"
  289.         .Open Sql, Cw_DataEnvi.DataConnect, adOpenDynamic, adLockOptimistic
  290.         If Not .EOF Then
  291.             Call Xtxxts("“" & ChName & "”是清空项目,不能" & OpeStatus & "!", 0, 1)
  292.             StopDelItem = False
  293.             Exit Function
  294.         End If
  295. '
  296.         '不是计算月平均工资项目
  297.         If .State = 1 Then .Close
  298.         Sql = "SELECT * FROM PM_SortItem WHERE ItemID=" & ItemId & _
  299.               " AND sortid='" & SortId & "' AND EndMonth=1"
  300.         .Open Sql, Cw_DataEnvi.DataConnect, adOpenDynamic, adLockOptimistic
  301.         If Not .EOF Then
  302.             Call Xtxxts("“" & ChName & "”是计算月平均工资项目,不能" & OpeStatus & "!", 0, 1)
  303.             StopDelItem = False
  304.             Exit Function
  305.         End If
  306.         
  307.     End With
  308.     StopDelItem = True
  309.     Set Rsc = Nothing
  310. End Function
  311. Public Function DelRsItem(FieldName As String, ChName As String) As Boolean
  312.     '删除人事项目的限制
  313.     Dim Rsc As New ADODB.Recordset
  314.     Dim Sql As String
  315.     Const OpeStatus = "删除"
  316.     With Rsc
  317.         '没有用在公式的内容中
  318.         If .State = 1 Then .Close
  319.         Sql = "SELECT * FROM PM_Formula WHERE charindex('" & FieldName & _
  320.             "',Fcontent)<>0 "
  321.         .Open Sql, Cw_DataEnvi.DataConnect, adOpenDynamic, adLockOptimistic
  322.         If Not .EOF Then
  323.             Call Xtxxts("公式内容使用了“" & ChName & "”,不能" & OpeStatus & "!", 0, 1)
  324.             DelRsItem = False
  325.             Exit Function
  326.         End If
  327.         '没有用在公式的限定条件中
  328.         If .State = 1 Then .Close
  329.         Sql = "SELECT * FROM PM_Formula WHERE charindex('" & FieldName & _
  330.               "',FLimit)<>0 "
  331.         .Open Sql, Cw_DataEnvi.DataConnect, adOpenDynamic, adLockOptimistic
  332.         If Not .EOF Then
  333.             Call Xtxxts("公式的限定条件使用了“" & ChName & "”,不能" & OpeStatus & "!", 0, 1)
  334.             DelRsItem = False
  335.             Exit Function
  336.         End If
  337.         '没有用在标准表的字段中
  338.         If .State = 1 Then .Close
  339.         Sql = "SELECT * FROM PM_StandTbl WHERE ltrim(rtrim(BzbHxItem))='" & _
  340.               FieldName & "' OR ltrim(rtrim(BzbVxItem))='" & _
  341.               FieldName & "'"
  342.         .Open Sql, Cw_DataEnvi.DataConnect, adOpenDynamic, adLockOptimistic
  343.         If Not .EOF Then
  344.             Call Xtxxts("标准表的项目使用了“" & ChName & "”,不能" & OpeStatus & "!", 0, 1)
  345.             DelRsItem = False
  346.             Exit Function
  347.         End If
  348.         '没有用在标准表的限定条件中
  349.         If .State = 1 Then .Close
  350.         Sql = "SELECT * FROM PM_StandTbl WHERE charindex('" & FieldName & _
  351.                "',BzbCond)<>0 "
  352.         .Open Sql, Cw_DataEnvi.DataConnect, adOpenDynamic, adLockOptimistic
  353.         If Not .EOF Then
  354.             Call Xtxxts("标准表的限定条件使用了“" & ChName & "”,不能" & OpeStatus & "!", 0, 1)
  355.             DelRsItem = False
  356.             Exit Function
  357.         End If
  358.         '没有用在银行代发的项目中
  359.         If .State = 1 Then .Close
  360.         Sql = "SELECT * FROM PM_BankItem WHERE ltrim(rtrim(DataContent))='" & _
  361.               FieldName & "' "
  362.         .Open Sql, Cw_DataEnvi.DataConnect, adOpenDynamic, adLockOptimistic
  363.         If Not .EOF Then
  364.             Call Xtxxts("“" & ChName & "”是银行代发文件项目,不能" & OpeStatus & "!", 0, 1)
  365.             DelRsItem = False
  366.             Exit Function
  367.         End If
  368.         '不是报表显示项目
  369.         If .State = 1 Then .Close
  370.         Sql = "SELECT * FROM PM_ReportItem WHERE ltrim(rtrim(FieldName))='" & FieldName & "'"
  371.         .Open Sql, Cw_DataEnvi.DataConnect, adOpenDynamic, adLockOptimistic
  372.         If Not .EOF Then
  373.             Call Xtxxts("“" & ChName & "”是报表显示项目,不能" & OpeStatus & "!", 0, 1)
  374.             DelRsItem = False
  375.             Exit Function
  376.         End If
  377.         '不是工资表引用的人事项目
  378.         If .State = 1 Then .Close
  379.         Sql = "SELECT * FROM Rs_Items WHERE AddMinusItem=1 AND FieldName<>'deptcode'" & _
  380.               " AND FieldName<>'EmpNO' AND FieldName<>'EmpName' AND FieldName<>'EmpSort'" & _
  381.               " and ltrim(rtrim(FieldName))='" & FieldName & "'"
  382.         .Open Sql, Cw_DataEnvi.DataConnect, adOpenDynamic, adLockOptimistic
  383.         If Not .EOF Then
  384.             Call Xtxxts("“" & ChName & "”已在工资表中使用,不能" & OpeStatus & "!", 0, 1)
  385.             DelRsItem = False
  386.             Exit Function
  387.         End If
  388.         '在人事表中没有数据
  389.         If .State = 1 Then .Close
  390.         Sql = "select * from Rs_BasicInfo b inner join Rs_ExtendInfo e on b.EmpId=e.Empid " & _
  391.             " where " & FieldName & " is not  null and ltrim(rtrim(" & FieldName & "))<>''"
  392.         .Open Sql, Cw_DataEnvi.DataConnect, adOpenDynamic, adLockOptimistic
  393.         If Not .EOF Then
  394.             Call Xtxxts("“" & ChName & "”已在人事表中有数据,不能" & OpeStatus & "!", 0, 1)
  395.             DelRsItem = False
  396.             Exit Function
  397.         End If
  398.      End With
  399.      DelRsItem = True
  400. End Function
  401. Public Sub Print_EmpInfo() '人事档案打印
  402. Dim Max_y As Integer
  403. With DY_Tybbyldy.Tydy
  404.         '-----------------
  405.         .X1 = 0: .Y1 = 0: .X2 = 0: .Y2 = 0
  406.         '-----------------
  407.     .PaperSize = pprA3
  408.     .MarginLeft = "10mm"
  409.     .MarginRight = "10mm"
  410.     .MarginTop = "5mm"
  411.     .MarginBottom = "5mm"
  412.     
  413.      .StartDoc
  414.      .CurrentX = "3.5in"
  415.      .FontName = "宋体": .FontBold = True
  416.      .FontSize = 14
  417.      DY_Tybbyldy.Tydy = "人事档案"
  418.   
  419.      .FontSize = 10
  420.      .CurrentX = "1in": .CurrentY = "1.4in"
  421.      .FontBold = False
  422.      .FontSize = 10
  423.      '--------------------------
  424.       Dim r As Integer
  425.       Dim Height_Y As Integer
  426.       Height_Y = 2100
  427.       For r = 1 To Ed_EmpArInfoFrm.Lbl_ItmName.Count - 1
  428.          .CurrentX = 1600 + Ed_EmpArInfoFrm.Lbl_ItmName(r).Left
  429.          .CurrentY = Height_Y + Ed_EmpArInfoFrm.Lbl_ItmName(r).Top
  430.          DY_Tybbyldy.Tydy = Ed_EmpArInfoFrm.Lbl_ItmName(r).Caption & ":"
  431.          .CurrentX = 1600 + Ed_EmpArInfoFrm.Txt_RsItm(r).Left + 100
  432.          .CurrentY = Height_Y + Ed_EmpArInfoFrm.Lbl_ItmName(r).Top
  433.          DY_Tybbyldy.Tydy = Ed_EmpArInfoFrm.Txt_RsItm(r).Text
  434.          If .CurrentY > Max_y Then Max_y = .CurrentY
  435.       Next r
  436.     
  437.      .FontBold = True
  438.      .CurrentX = "1in": .CurrentY = .CurrentY + 200
  439.      .FontBold = False
  440.      '------------------
  441.       .CurrentX = .CurrentX + 100
  442.     If Ed_EmpArInfoFrm.Pic_Emp.Height + .CurrentY > .PageHeight - 1675 Then .NewPage
  443.     .CurrentY = Ed_EmpArInfoFrm.Pic_Emp.Top + Height_Y + 100 '               .CurrentY + 100
  444.     .CurrentX = Ed_EmpArInfoFrm.Pic_Emp.Left + 600
  445.     .X1 = .CurrentX
  446.     .Y1 = .CurrentY
  447.     .X2 = Ed_EmpArInfoFrm.Pic_Emp.Width + .CurrentX
  448.     .Y2 = Ed_EmpArInfoFrm.Pic_Emp.Height + .CurrentY
  449.     .CurrentY = .CurrentY + Ed_EmpArInfoFrm.Pic_Emp.Height
  450.     .Picture = Ed_EmpArInfoFrm.Pic_Emp.Picture
  451.      '----------------
  452.      .EndDoc
  453.      DY_Tybbyldy.Show 1
  454.  End With
  455. End Sub
  456. Public Sub initializtion()
  457.     '删除工资数据表
  458.     Sql = ""
  459.     Sql = "delete pm_payroll"                       '工资表
  460.     Sql = Sql & " delete pm_AttendRecord"            '考勤表
  461.     Sql = Sql & " delete pm_OpeDept"                 '操作员部门权限
  462.     Sql = Sql & " delete pm_OpeSort"                 '操作员类别权限
  463.     Sql = Sql & " delete pm_TaxRate"                 '税率表
  464.     Sql = Sql & " delete pm_TaxData"                 '税率数据表
  465.     Sql = Sql & " delete pm_BankItem"                '银行代发项目
  466.     Sql = Sql & " delete pm_BankPara"                '银行代发路径
  467.     Sql = Sql & " delete pm_StandTblData"            '标准表数据
  468.     Sql = Sql & " delete pm_StandTbl"                '标准表
  469.     Sql = Sql & " delete pm_SortEmp"                 '类别人员
  470.     Sql = Sql & " delete pm_SortItem"                '类别项目
  471.     Sql = Sql & " delete pm_ReportItem"              '报表项目
  472.     Sql = Sql & " delete pm_Formula"                 '公式
  473.     Sql = Sql & " delete pm_Bank"                    '银行信息
  474.     Sql = Sql & " delete pm_Sort"                    '工资类别
  475.     '删除工资表、考勤表中的自定义字段,首先删除缺省值。用DropColumn函数
  476.     
  477.     '将选用的人事字段的addminusitem置0
  478.     Sql = Sql & " update rs_items set addminusitem=0 WHERE (sid=1 OR sid=2 ) AND ltrim(rtrim(fieldname))<>'deptcode' AND ltrim(rtrim(fieldname))<>'empsort'" & _
  479.           " AND ltrim(rtrim(fieldname))<>'empno' AND ltrim(rtrim(fieldname))<>'empname'"
  480.     '将rs_items的工资项目、考勤项目删除。
  481.     Sql = Sql & " delete rs_items WHERE (sid=3 OR sid =4) AND ynroot=0 "
  482.     '将会计日历表复原
  483.     Sql = Sql & " update gy_kjrlb set pmjzbz=0 "
  484.     SqlField = DropColumn
  485.     On Error GoTo Err1
  486.     Cw_DataEnvi.DataConnect.BeginTrans
  487.     If Trim(SqlField) <> "" Then
  488.       Cw_DataEnvi.DataConnect.Execute SqlField
  489.     End If
  490.     Cw_DataEnvi.DataConnect.Execute Sql
  491.     Call Xtxxts("数据初始化成功!", 0, 4)
  492.     Cw_DataEnvi.DataConnect.CommitTrans
  493.     Exit Sub
  494. Err1:
  495.    Cw_DataEnvi.DataConnect.RollbackTrans
  496.    Call Xtxxts("数据初始化不成功!", 0, 1)
  497. End Sub
  498. Private Function DropColumn() As String
  499.   '删除工资表
  500.    SqlField = ""
  501.    If Rsc.State = 1 Then Rsc.Close
  502.    Set Rsc = Cw_DataEnvi.DataConnect.Execute("SELECT * FROM rs_items WHERE sid=3  AND ynroot=0 ")
  503.    With Rsc
  504.      Do While Not .EOF
  505.        SqlField = SqlField & " alter table pm_Payroll drop CONSTRAINT df_" & Trim(!FieldName)
  506.        SqlField = SqlField & " alter table pm_payroll drop column " & Trim(!FieldName)
  507.        .MoveNext
  508.      Loop
  509.    End With
  510.    '删除考勤表
  511.    If Rsc.State = 1 Then Rsc.Close
  512.    Set Rsc = Cw_DataEnvi.DataConnect.Execute("SELECT * FROM rs_items WHERE sid=4 ")
  513.    With Rsc
  514.      Do While Not .EOF
  515.        SqlField = SqlField & " alter table pm_attendRecord drop CONSTRAINT df_" & Trim(!FieldName)
  516.        SqlField = SqlField & " alter table pm_attendRecord drop column " & Trim(!FieldName)
  517.        .MoveNext
  518.      Loop
  519.    End With
  520.    '删除工资表中的人事项目
  521.    If Rsc.State = 1 Then Rsc.Close
  522.    Set Rsc = Cw_DataEnvi.DataConnect.Execute("SELECT FieldName FROM rs_Items WHERE (Sid=1 OR Sid=2) AND addminusItem=1 AND " & _
  523.            " FieldName<>'DeptCode' AND FieldName<>'EmpNO' AND FieldName<>'EmpName' AND FieldName<>'Empsort' ")
  524.    With Rsc
  525.         Do While Not .EOF
  526.             SqlField = SqlField & " alter table PM_Payroll drop column " & Trim(Rsc!FieldName)
  527.             .MoveNext
  528.         Loop
  529.    End With
  530.    
  531.    DropColumn = SqlField
  532. End Function
  533. '******************************************************************
  534. '*    模 块 名 称 :私有模块
  535. '*    功 能 描 述 :
  536. '*    程序员姓名  :苗鹏
  537. '*    最后修改人  :苗鹏
  538. '*    最后修改时间:2002/01/10
  539. '*    备        注:
  540. '******************************************************************
  541. Public Function GetTableField(sExec As String, sTableName As String, sFieldName As String, s As String) As Integer '分离表名和字段名,s为分隔符
  542.     On Error GoTo ErrCtrl
  543.     
  544.     Dim i As Integer
  545.     
  546.     For i = 1 To Len(sExec)
  547.         If Mid(sExec, i, 1) = s Then
  548.             sTableName = Left(sExec, i - 1)
  549.             sFieldName = Right(sExec, Len(sExec) - i)
  550.             Exit For
  551.         End If
  552.     Next i
  553.     If i <= Len(sExec) Then
  554.         GetTableField = 1
  555.     Else
  556.         GetTableField = 0
  557.     End If
  558.     Exit Function
  559. ErrCtrl:
  560.     GetTableField = -1
  561. End Function
  562. Public Function InitView(tv As TreeView, Optional sSql As String = " 1=1 ")    '初始化字段树
  563.     On Error GoTo ErrCtrl
  564.     
  565.     Dim rs As New ADODB.Recordset
  566.     Dim s As String
  567.     Dim nodx As Node
  568.     
  569.     If sSql = "" Then
  570.         sSql = " 1=1  "
  571.     End If
  572.     tv.Nodes.Clear
  573.     tv.Enabled = False
  574.     Set nodx = tv.Nodes.Add(, , "R", "备选项目")
  575.     '读取表
  576.     s = "SELECT DISTINCT TableName AS TableFrom FROM Rs_Items WHERE SID<10 AND " & sSql
  577.     Set rs = Cw_DataEnvi.DataConnect.Execute(s)
  578.     With rs
  579.         If .EOF() Then
  580.             Exit Function
  581.         End If
  582.         Do While Not .EOF()
  583.             Set nodx = tv.Nodes.Add("R", tvwChild, UCase(Trim(!TableFrom)), GetTableNameC(Trim(!TableFrom)))
  584.             nodx.EnsureVisible
  585.             .MoveNext
  586.         Loop
  587.         .Close
  588.     End With
  589.     
  590.     '读取字段
  591.     s = "SELECT FieldName  AS FieldName,CHName AS FieldNameC,TableName AS TableFrom " & Chr(10) _
  592.         & ",Correlation AS FieldRelation,CorTable AS CorTable ,IndexCode AS TCode,IndexName AS TName,AddMinusItem " & Chr(10) _
  593.         & " FROM Rs_Items WHERE SID<10 AND " & sSql  'TableName is not Null "
  594.     Set rs = Cw_DataEnvi.DataConnect.Execute(s)
  595.     With rs
  596.         If .EOF() Then
  597.             Exit Function
  598.         End If
  599.         Do While Not .EOF()
  600.             '末级节点的Tag值为此字段的英文全名
  601.             If !AddMinusItem = 1 And Trim(sSql) = Trim("1=1") Then
  602.                 '如果是选入工资表的字段,添加工资表节点
  603.                 Set nodx = tv.Nodes.Add(UCase("PM_PayRoll"), tvwChild, UCase("PM_PayRoll") & "." & UCase(Trim(!FieldName)), UCase(Trim(!FieldNameC)))
  604.                 If Trim(!CorTable & "") <> "" And Trim(!TCode & "") <> "" And Trim(!TName & "") <> "" Then
  605.                     nodx.Tag = Trim(!FieldRelation & "") & "@" & Trim(!CorTable & "") & "@" & Trim(!TCode & "") & "@" & Trim(!TName & "")
  606.                 End If
  607.                 
  608.             End If
  609.             Set nodx = tv.Nodes.Add(UCase(Trim(!TableFrom)), tvwChild, UCase(Trim(!TableFrom) & "." & Trim(!FieldName)), UCase(Trim(!FieldNameC)))
  610.             If Trim(!CorTable & "") <> "" And Trim(!TCode & "") <> "" And Trim(!TName & "") <> "" Then
  611.                 nodx.Tag = Trim(!FieldRelation & "") & "@" & Trim(!CorTable & "") & "@" & Trim(!TCode & "") & "@" & Trim(!TName & "")
  612.             End If
  613.             .MoveNext
  614.         Loop
  615.         .Close
  616.     End With
  617.     
  618.     '添加会计年,会计期间,工资类别到工资表节点
  619.     If IsNodeExist("PM_PayRoll", tv) Then
  620.         Set nodx = tv.Nodes.Add(UCase("PM_PayRoll"), tvwChild, UCase("PM_PayRoll.KjYear"), "会计年")
  621.         Set nodx = tv.Nodes.Add(UCase("PM_PayRoll"), tvwChild, UCase("PM_PayRoll.Period"), "会计月")
  622.         Set nodx = tv.Nodes.Add(UCase("PM_PayRoll"), tvwChild, UCase("PM_PayRoll.SortID"), "工资类别")
  623.         nodx.Tag = "0@PM_Sort@SortID@SortName"
  624.     End If
  625.     
  626.     '添加会计年,会计期间到考勤表节点
  627.     If IsNodeExist("PM_AttendRecord", tv) Then
  628.         Set nodx = tv.Nodes.Add(UCase("PM_AttendRecord"), tvwChild, UCase("PM_AttendRecord.KjYear"), "会计年")
  629.         Set nodx = tv.Nodes.Add(UCase("PM_AttendRecord"), tvwChild, UCase("PM_AttendRecord.Period"), "会计月")
  630.     End If
  631.       
  632.     Set rs = Nothing
  633.     tv.Enabled = True
  634.     Exit Function
  635. ErrCtrl:
  636.     If rs.State = 1 Then
  637.         rs.Close
  638.     End If
  639.     Set rs = Nothing
  640.     tv.Enabled = True
  641.     Dim smsg As String
  642.     Dim smsgSys As String
  643.     smsg = GetError(Err.Number)
  644.     smsgSys = Err.Number & Err.Description & "!"
  645.     MsgBox IIf(smsg = "", smsgSys, smsg), vbOKOnly + vbCritical
  646. End Function
  647. Public Function GetFieldHelp(sExp As String, sID As String, sTable As String, sCode As String, sName As String) '读取字段帮助信息
  648.     
  649.     Dim i As Integer
  650.     Dim j As Integer
  651.     Dim k As Integer
  652.     Dim s(3) As String
  653.     
  654.     If sExp = "" Then
  655.         Exit Function
  656.     End If
  657.     j = 1
  658.     k = 0
  659.     '取ID,关联表,编码,名称
  660.     Do While i <= Len(sExp)
  661.         For i = j To Len(sExp)
  662.             If Mid(sExp, i, 1) = "@" Then
  663.                 s(k) = Mid(sExp, j, i - j)
  664.                 j = i + 1
  665.                 k = k + 1
  666.                 Exit For
  667.             End If
  668.         Next i
  669.         If i > Len(sExp) Then
  670.             sName = Mid(sExp, j, i - j)
  671.         End If
  672.     Loop
  673.     sID = s(0)
  674.     sTable = s(1)
  675.     sCode = s(2)
  676.         
  677. End Function
  678. Public Function GetError(iNum As Long) As String '返回错误描述
  679.     Dim msg As String
  680.     Select Case iNum
  681.         Case -2147217873
  682.             msg = "违反唯一性或者编码已经使用!"
  683.         Case -2147217913
  684.             msg = "录入了错误的日期格式,正确格式为 2001-09-12" & Chr(10) _
  685.                 & "或者录入了错误的数字格式,正确格式为 123456789.12"
  686.         Case -2147217900
  687.             msg = "语法错误!"
  688.         Case Else
  689.             msg = ""
  690.     End Select
  691.     GetError = msg
  692. End Function
  693. Public Function ReplByPos(sExepress As String, sReplace As String, Optional iStart As Integer = 0, Optional iEnd As Integer = 0) As String '把sExepress的第iStart字起到iEnd结束的字符替换成sReplace
  694.   
  695.   Dim i As Integer
  696.   Dim j As Integer
  697.   Dim sLeft As String
  698.   Dim sRight As String
  699.   
  700.   If iStart > Len(sExepress) Then
  701.     MsgBox "开始位置超出字符长度", vbOKOnly + vbCritical
  702.     Exit Function
  703.   End If
  704.   If iStart > iEnd Then
  705.     MsgBox "开始位置超出结束位置", vbOKOnly + vbCritical
  706.     Exit Function
  707.   End If
  708.   
  709.   sLeft = Left(sExepress, iStart - 1)
  710.   sRight = Right(sExepress, Len(sExepress) - iEnd + 1)
  711.   
  712.   ReplByPos = sLeft & sReplace & sRight
  713.   
  714. End Function
  715. Public Function IsItemExist(sName As String, coll As Collection, Optional iType As Integer = 0) As Integer 'coll中是否包涵sName的项目
  716.     'itype=0 不区分大小写 1 区分大小写
  717.     '返回sName的位置或-1
  718.     Dim i As Integer
  719.     With coll
  720.         If .Count = 0 Then
  721.             IsItemExist = -1
  722.             Exit Function
  723.         End If
  724.         If iType = 0 Then
  725.             For i = 1 To .Count
  726.                 If UCase(sName) = UCase(.Item(i)) Then
  727.                     Exit For
  728.                 End If
  729.             Next i
  730.         Else
  731.             For i = 1 To .Count
  732.                 If sName = .Item(i) Then
  733.                     Exit For
  734.                 End If
  735.             Next i
  736.         End If
  737.         If i > .Count Then
  738.             IsItemExist = -1
  739.         Else
  740.             IsItemExist = i
  741.         End If
  742.     End With
  743. End Function
  744. Public Function GetSQLFrom(coll As Collection, sPriTableName As String) As String '根据所提供的表名,连接成From语句
  745.     On Error GoTo ErrCtrl
  746.     
  747.     Dim s As String
  748.     Dim st As String
  749.     Dim i As Integer
  750.     Dim j As Integer
  751.     Dim k As Integer
  752.     
  753.     If sPriTableName = "" Then
  754.         MsgBox "请输入主表名!", vbOKOnly + vbInformation
  755.         Exit Function
  756.     End If
  757.     
  758.     s = ""
  759.     With coll
  760.         If .Count = 0 Then
  761.             s = " " & sPriTableName & Chr(10) & " "
  762.             GetSQLFrom = s
  763.             Exit Function
  764.         End If
  765.         '判断主表,因为每个表的连接字段不同,所以要分开处理
  766.         Select Case UCase(sPriTableName)
  767.             Case UCase("PM_PayRoll")    '工资表
  768.                 s = " PM_PayRoll left outer join  PM_AttendRecord  " & Chr(10) _
  769.                     & " on  PM_PayRoll.EmpID=PM_AttendRecord.EmpID AND PM_PayRoll.Period=PM_AttendRecord.Period AND PM_PayRoll.KjYear=PM_AttendRecord.KjYear " & Chr(10) _
  770.                     & " Left Outer Join PM_TaxData " & Chr(10) _
  771.                     & " on PM_PayRoll.EmpID=PM_TaxData.EmpID AND PM_PayRoll.Period=PM_TaxData.Period AND PM_PayRoll.KjYear=PM_TaxData.KjYear AND PM_PayRoll.SortID=PM_TaxData.SortID " & Chr(10)
  772.             Case UCase("PM_AttendRecord")   '考勤表
  773.                 i = IsItemExist("PM_PayRoll", coll)
  774.                 If i <> -1 Then
  775.                     s = " PM_AttendRecord left outer join  PM_PayRoll  " & Chr(10) _
  776.                         & " on  PM_PayRoll.EmpID=PM_AttendRecord.EmpID AND PM_PayRoll.Period=PM_AttendRecord.Period AND PM_PayRoll.KjYear=PM_AttendRecord.KjYear " & Chr(10) _
  777.                         & " Left Outer Join PM_TaxData " & Chr(10) _
  778.                         & " on PM_AttendRecord.EmpID=PM_TaxData.EmpID AND PM_AttendRecord.Period=PM_TaxData.Period AND PM_AttendRecord.KjYear=PM_TaxData.KjYear  " & Chr(10)
  779.                 Else
  780.                     s = " PM_AttendRecord  " & Chr(10)
  781.                 End If
  782.             Case UCase("PM_TaxData")    '所得税表
  783.                 i = IsItemExist("PM_PayRoll", coll)
  784.                 If i <> -1 Then
  785.                     s = " PM_TaxData left outer join  PM_AttendRecord  " & Chr(10) _
  786.                         & " on  PM_TaxData.EmpID=PM_AttendRecord.EmpID AND PM_TaxData.Period=PM_AttendRecord.Period AND PM_TaxData.KjYear=PM_AttendRecord.KjYear " & Chr(10) _
  787.                         & " Left Outer Join PM_PayRoll " & Chr(10) _
  788.                         & " on PM_PayRoll.EmpID=PM_TaxData.EmpID AND PM_PayRoll.Period=PM_TaxData.Period AND PM_PayRoll.KjYear=PM_TaxData.KjYear AND PM_PayRoll.SortID=PM_TaxData.SortID " & Chr(10)
  789.                 Else
  790.                     s = "PM_TaxData"
  791.                 End If
  792.             Case Else
  793.                 s = sPriTableName
  794.         End Select
  795.                 
  796.         '连接剩下的表
  797.         For k = 1 To .Count
  798.             If UCase(sPriTableName) <> UCase(.Item(k)) And _
  799.                 Trim(UCase(.Item(k))) <> "" And _
  800.                 Trim(UCase(.Item(k))) <> UCase("PM_PayRoll") And _
  801.                 Trim(UCase(.Item(k))) <> UCase("PM_AttendRecord") And _
  802.                 Trim(UCase(.Item(k))) <> UCase("PM_TaxData") Then
  803.                 s = s & " left outer join " & Trim(.Item(k)) & " on " & Trim(.Item(k)) & ".EmpID=" & sPriTableName & ".EmpID " & Chr(10)
  804.             End If
  805.         Next k
  806.         
  807.     End With
  808.     GetSQLFrom = s
  809.     Exit Function
  810.     
  811. ErrCtrl:
  812.     Dim smsg As String
  813.     Dim smsgSys As String
  814.     smsg = GetError(Err.Number)
  815.     smsgSys = Err.Number & Err.Description & "!"
  816.     MsgBox IIf(smsg = "", smsgSys, smsg), vbOKOnly + vbCritical
  817. End Function
  818. Public Function AddTableFrom(coll As Collection, sName As String) '添加用户查询必须的表
  819.     On Error GoTo ErrCtrl
  820.     
  821.     Dim i As Integer
  822.     '如果没有定义查询条件,简单添加表名
  823.     '如果表名集合第一项为“”,则删除第一项
  824.     
  825.     With coll
  826.         If coll.Count = 0 Then
  827.             .Add UCase(sName)
  828.             Exit Function
  829.         End If
  830.         If Trim(.Item(1)) = "" Then
  831.             .Remove (1)
  832.         End If
  833.         For i = 1 To .Count
  834.             If UCase(.Item(i)) = UCase(sName) Then
  835.                 Exit For
  836.             End If
  837.         Next
  838.         If i > .Count Then
  839.             .Add UCase(sName)
  840.         End If
  841.     End With
  842.     Exit Function
  843. ErrCtrl:
  844.     Dim smsg As String
  845.     Dim smsgSys As String
  846.     smsg = GetError(Err.Number)
  847.     smsgSys = Err.Number & Err.Description & "!"
  848.     MsgBox IIf(smsg = "", smsgSys, smsg), vbOKOnly + vbCritical
  849. End Function
  850. Public Function IsNodeExist(skey As String, tv As TreeView) As Boolean '测试树是否包含Key为skey的节点
  851.     On Error GoTo ErrCtrl
  852.     
  853.     Dim i As Integer
  854.     With tv
  855.         For i = 1 To .Nodes.Count
  856.             If UCase(.Nodes(i).Key) = UCase(skey) Then
  857.                 IsNodeExist = True
  858.                 Exit Function
  859.             End If
  860.         Next
  861.     End With
  862.     IsNodeExist = False
  863.     Exit Function
  864. ErrCtrl:
  865.     Dim smsg As String
  866.     Dim smsgSys As String
  867.     smsg = GetError(Err.Number)
  868.     smsgSys = Err.Number & Err.Description & "!"
  869.     MsgBox IIf(smsg = "", smsgSys, smsg), vbOKOnly + vbCritical
  870. End Function
  871. Public Function FillValue2TV(sCond As String, tv As TreeView)    '填充字段的可能值,sCond 的格式为 数字@表名@编码@名称
  872.     On Error GoTo ErrCtrl
  873.     
  874.     '如果没有条件,退出
  875.     tv.Nodes.Clear
  876.     If Trim(sCond) = "" Then
  877.         Exit Function
  878.     End If
  879.     
  880.     Dim sID As String
  881.     Dim sTable As String
  882.     Dim sCode As String
  883.     Dim sName As String
  884.     Dim rs As New ADODB.Recordset
  885.     Dim s As String
  886.     tv.Nodes.Clear
  887.     
  888.     '取得字段帮助
  889.     GetFieldHelp sCond, sID, sTable, sCode, sName
  890. '    填充值
  891.     With tv
  892.         If UCase(sTable) = UCase("GY_Department") Then
  893.             '如果是部门帮助,调用填充部门帮助
  894.             FillDept2TV "RsPmFlag", tv, Cw_DataEnvi.DataConnect
  895.         Else
  896.             '判断字段帮助
  897.             If Trim(sID) = "" Or Trim(sTable) = "" Or Trim(sCode) = "" Or Trim(sName) = "" Then
  898.                 MsgBox "字段帮助出现错误!", vbOKOnly + vbCritical
  899.                 GoTo ErrCtrl
  900.             End If
  901.             If Trim(sID) = "0" Then
  902.                 s = "SELECT " & sCode & " AS TCode, " & sName & " AS TName FROM " & sTable
  903.             Else
  904.                 s = "SELECT " & sCode & " AS TCode, " & sName & " AS TName FROM " & sTable & " WHERE SortID='" & sID & "'"
  905.             End If
  906.            
  907.             Set rs = Cw_DataEnvi.DataConnect.Execute(s)
  908.             If Not rs.EOF() Then
  909.                 .Nodes.Add , , "R", "备选值"
  910.                 Do While Not rs.EOF()
  911.                     .Nodes.Add "R", tvwChild, "R" & Trim(rs!TCode), Trim(rs!TName)
  912.                     rs.MoveNext
  913.                 Loop
  914.                 rs.Close
  915.             End If
  916.             Set rs = Nothing
  917.         End If
  918.     End With
  919.     Exit Function
  920.     
  921. ErrCtrl:
  922.     If rs.State = 1 Then
  923.         rs.Close
  924.     End If
  925.     Set rs = Nothing
  926.     Dim smsg As String
  927.     Dim smsgSys As String
  928.     smsg = GetError(Err.Number)
  929.     smsgSys = Err.Number & Err.Description & "!"
  930.     MsgBox IIf(smsg = "", smsgSys, smsg), vbOKOnly + vbCritical
  931. End Function
  932. Public Function FillDept2TV(sSysCode As String, tv As TreeView, cn As Connection) '填充部门树
  933.     On Error GoTo ErrCtrl
  934.     
  935.     Dim s As String
  936.     Dim rs As New ADODB.Recordset
  937.     Dim nod As Node
  938.     
  939.     '初始化树
  940.     tv.Enabled = False
  941.     tv.Nodes.Clear
  942.     tv.Nodes.Add , , "R", "部门"
  943.     s = "SELECT DeptCode,DeptName ,ParentCode FROM GY_Department WHERE " & sSysCode & "=1 order by CodeLevel"
  944.     Set rs = Cw_DataEnvi.DataConnect.Execute(s)
  945.     With rs
  946.         Do While Not .EOF()
  947.             Set nod = tv.Nodes.Add("R" & Trim(!ParentCode & ""), tvwChild, "R" & Trim(!DeptCode & ""), Trim(!DeptName & ""))
  948.             nod.Tag = Trim(!DeptCode & "")
  949.             '展开第一行
  950.             If Trim(!ParentCode & "") = "" Then
  951.                 nod.EnsureVisible
  952.             End If
  953.             .MoveNext
  954.         Loop
  955.         .Close
  956.     End With
  957.     
  958.     Set rs = Nothing
  959.     Set nod = Nothing
  960.     tv.Enabled = True
  961.     Exit Function
  962.     
  963. ErrCtrl:
  964.     If rs.State = 1 Then
  965.         rs.Close
  966.     End If
  967.     Set nod = Nothing
  968.     Set rs = Nothing
  969.     tv.Enabled = True
  970.     Dim smsg As String
  971.     Dim smsgSys As String
  972.     smsg = GetError(Err.Number)
  973.     smsgSys = Err.Number & Err.Description & "!"
  974.     MsgBox IIf(smsg = "", smsgSys, smsg), vbOKOnly + vbCritical
  975. End Function
  976. Public Function GetTableNameC(sTableName As String) As String '设置表的汉语名称
  977.     
  978.     Dim s As String
  979.     
  980.     Select Case UCase(sTableName)
  981.         Case UCase("PM_PayRoll")
  982.             s = "工资"
  983.         Case UCase("Rs_BasicInfo")
  984.             s = "基本"
  985.         Case UCase("Rs_ExtendInfo")
  986.             s = "扩展"
  987.         Case UCase("PM_AttendRecord")
  988.             s = "考勤"
  989.         Case Else
  990.             MsgBox "不存在此表!", vbOKOnly + vbCritical
  991.     End Select
  992.     GetTableNameC = s
  993. End Function
  994. Public Function GetCol(sFields() As CFieldValue, iNoCol As Integer, iNameCol As Integer, Optional iBeginCol As Integer = 0) As Integer '查找工号列和姓名列
  995.     '成功找到工号或者姓名返回1,没有找到返回0,错误返回-1
  996.     On Error GoTo ErrCtrl
  997.     Dim i As Integer
  998.     
  999.     iNoCol = -1
  1000.     iNameCol = -1
  1001.     GetCol = -1
  1002.     
  1003.     For i = LBound(sFields) To UBound(sFields)
  1004.         If Len(sFields(i).FieldName) >= 5 Then
  1005.             If UCase(Right(sFields(i).FieldName, 5)) = UCase("EmpNo") Then
  1006.                 iNoCol = i + iBeginCol
  1007.             Else
  1008.                 If Len(sFields(i).FieldName) >= 7 Then
  1009.                     If UCase(Right(sFields(i).FieldName, 7)) = UCase("EmpName") Then
  1010.                         iNameCol = i + iBeginCol
  1011.                     End If
  1012.                 End If
  1013.             End If
  1014.         End If
  1015.         If iNameCol >= 0 And iNoCol >= 0 Then
  1016.             Exit For
  1017.         End If
  1018.     Next i
  1019.     If iNameCol >= 0 Or iNoCol >= 0 Then
  1020.         GetCol = 1
  1021.     Else
  1022.         GetCol = 0
  1023.     End If
  1024.     Exit Function
  1025.     
  1026. ErrCtrl:
  1027.     GetCol = -1
  1028. End Function
  1029. Public Function LenByte(s As String) As Long '计算字符串的字节数
  1030.   '返回字符串长度
  1031.     Dim i As Long
  1032.     Dim ch As String
  1033.     
  1034.     LenByte = 0
  1035.     s = Trim(s)
  1036.     For i = 1 To Len(s)
  1037.         ch = Mid(s, i, 1)
  1038.         If Asc(ch) >= 0 And Asc(ch) <= 255 Then
  1039.             LenByte = LenByte + 1
  1040.         ElseIf Asc(ch) < 0 Then   '汉字
  1041.             LenByte = LenByte + 2
  1042.         End If
  1043.     Next
  1044. End Function
  1045. Public Function PrintGrid(vs As vsFlexGrid, iVsBeginCol As Integer, iVsSumEndCol As Integer, sRCode As String, frmSetup As DY_Dyymsz, sSubTitle As String, Optional bPrint As Boolean = False) '打印网格
  1046.     On Error GoTo ErrCtrl
  1047.     
  1048.     Dim i As Long
  1049.     Dim j As Long
  1050.     Dim k As Long
  1051.     Dim m As Long
  1052.     Dim n As Long
  1053.     Dim s As String
  1054.     Dim bNext As Boolean '临时变量
  1055.     Dim bSumRow As Boolean '是否是合计行
  1056.     Dim iStartCol As Long '打印数据开始列
  1057.     Dim rs As New ADODB.Recordset
  1058.     '--------------------------------------------------控制信息-------------------------------------------------
  1059.     Dim iPrintStyle As Integer '打印方式 0每页输出一个表头 1每行输出一个表头
  1060.     Dim iSumPerPage As Integer '1每页输出合计
  1061.     Dim iSplitPage As Integer '1分页打印
  1062.     Dim sRTitle As String '标题
  1063.     Dim iShowAllCols As Integer '1 显示所有可见网格列
  1064.     
  1065.     s = "SELECT * FROM PM_ReportSort WHERE RCode='" & sRCode & "'"
  1066.     Set rs = Cw_DataEnvi.DataConnect.Execute(s)
  1067.     With rs
  1068.         If Not .EOF() Then
  1069.             iPrintStyle = !PrintStyle
  1070.             iSumPerPage = !SumPerPage
  1071.             iSplitPage = !SplitPage
  1072.             iShowAllCols = !ShowAllCols
  1073.             sRTitle = Trim(!RTitle)
  1074.         Else
  1075.             MsgBox "当前报表已被删除,无法读取格式!", vbOKOnly + vbCritical
  1076.             Exit Function
  1077.         End If
  1078.         rs.Close
  1079.     End With
  1080.     Set rs = Nothing
  1081.     
  1082.     '--------------------------------------------------控制信息完成-------------------------------------------------
  1083.     
  1084.     '--------------------------------------------------打印参数-------------------------------------------------
  1085.     '设置打印参数
  1086.     If Not SetupPage(frmSetup, DY_Tybbyldy) Then
  1087.         MsgBox "打印设置失败!", vbOKOnly + vbCritical
  1088.         Exit Function
  1089.     End If
  1090.     
  1091.     '读取打印设置
  1092.     Dim sDataFontName As String '数据字体名称
  1093.     Dim sTitleFontName As String '表头字体名称
  1094.     Dim iDataFontSize As Long '数据字体大小
  1095.     Dim iTitleFontSize As Long '表头字体大小
  1096.     Dim iRowsPerPage As Long '每行显示数据行数
  1097.     Dim bLimitRowPerPage As Boolean '是否每页限制行数
  1098.     Dim iLimitRowsPerPage As Long '每页限制行数
  1099.     Dim iClientHeight As Long '页面可用高度
  1100.     Dim iPageLeft As Long '左边界
  1101.     Dim iClientWidth As Long '页面可用宽度
  1102.     Dim iPageTop As Long '上边界
  1103.     Dim iTitleFontHeight As Long '标题高度
  1104.     Dim iDataFontHeight As Long '数据高度
  1105.     
  1106.     With frmSetup
  1107.         sTitleFontName = .Btztlabel.Caption
  1108.         sDataFontName = .SjztLabel.Caption
  1109.         iTitleFontSize = Val(.Btzhlabel.Caption)
  1110.         iDataFontSize = Val(.Sjzhlabel.Caption)
  1111.         bLimitRowPerPage = .ZdhsCheck.Value
  1112.         iLimitRowsPerPage = Val(.BbhsText)
  1113.     End With
  1114.     With DY_Tybbyldy.Tydy
  1115.         .StartDoc
  1116.             .FontName = sTitleFontName
  1117.             .FontSize = iTitleFontSize
  1118.             .CalcText = "测试"
  1119.             iTitleFontHeight = .TextHei
  1120.             .FontName = sDataFontName
  1121.             .FontSize = iDataFontSize
  1122.             .CalcText = "测试"
  1123.             iDataFontHeight = .TextHei
  1124.         .EndDoc
  1125.         .KillDoc
  1126.         iPageHeight = .PageHeight
  1127.         iClientHeight = .PageHeight - .MarginBottom - .MarginTop
  1128.         iPageTop = .MarginTop
  1129.         iClientWidth = .PageWidth - .MarginLeft - .MarginRight
  1130.         iPageLeft = .MarginLeft
  1131.     End With
  1132.     
  1133.     '--------------------------------------------------打印参数完成-------------------------------------------------
  1134.     
  1135.     
  1136.     '--------------------------------------------------读取数据信息-------------------------------------------------
  1137.     '定义打印开始列
  1138.     If iShowAllCols = 1 Then
  1139.         iStartCol = iVsBeginCol
  1140.     Else
  1141.         iStartCol = iVsSumEndCol + 1
  1142.     End If
  1143.     
  1144.     '读取有效数据
  1145.     Dim sData() As String '网格表体数据
  1146.     Dim sTitle() As String '表头数据
  1147.     Dim iPages() As Long '打印分页信息,第i页结束行在sData()中的位置是iPages(i)
  1148.     Dim iTitleRows() As String '打印的表头行值
  1149.     Dim iDataRows() As String '打印的数据行值
  1150.     Dim iColsPerPage() As Long '每行在页面上的折行信息 第i行的结束列对应sData()中的iColsPerPage(i)列
  1151.     Dim iCols() As Long '需要打印的列值
  1152.     Dim iColWidth() As Long '需要打印的列款
  1153.     Dim iColType() As Long '需要打印的列数据类型
  1154.     Dim iColFormat() As String '需要打印的列格式
  1155.     With vs
  1156.         '读取有效列
  1157.         ReDim iCols(0)
  1158.         iCols(0) = 0
  1159.         ReDim iColWidth(0)
  1160.         iColWidth(0) = 0
  1161.         ReDim iColType(0)
  1162.         iColType(0) = 0
  1163.         ReDim iColFormat(0)
  1164.         iColFormat(0) = ""
  1165.         For i = 0 To .Cols - 1
  1166.             If Not .ColHidden(i) Then
  1167.                 ReDim Preserve iCols(UBound(iCols) + 1)
  1168.                 iCols(UBound(iCols)) = i
  1169.                 ReDim Preserve iColWidth(UBound(iColWidth) + 1)
  1170.                 If .ColWidth(i) >= iClientWidth Then
  1171.                     MsgBox "纸张宽度太小不能输出报表,请重新设置!", vbOKOnly + vbCritical
  1172.                     Exit Function
  1173.                 End If
  1174.                 iColWidth(UBound(iColWidth)) = .ColWidth(i)
  1175.                 ReDim Preserve iColType(UBound(iColType) + 1)
  1176.                 iColType(UBound(iColType)) = Val(.TextMatrix(0, i))
  1177.                 ReDim Preserve iColFormat(UBound(iColFormat) + 1)
  1178.                 iColFormat(UBound(iColFormat)) = .ColFormat(i)
  1179.             End If
  1180.         Next i
  1181.         If UBound(iCols) = 0 Then
  1182.             
  1183.             Exit Function
  1184.         End If
  1185.         '读取有效表头行
  1186.         ReDim iTitleRows(0)
  1187.         iTitleRows(0) = 0
  1188.         For i = 0 To .FixedRows - 1
  1189.             If .RowHidden(i) = False Then
  1190.                 ReDim Preserve iTitleRows(UBound(iTitleRows) + 1)
  1191.                 iTitleRows(UBound(iTitleRows)) = i
  1192.             End If
  1193.         Next i
  1194.         If UBound(iTitleRows) = 0 Then
  1195.             Exit Function
  1196.         End If
  1197.         
  1198.         '读取有效数据行
  1199.         ReDim iDataRows(0)
  1200.         iDataRows(0) = 0
  1201.         For i = .FixedRows To .Rows - 1
  1202.             If .RowHidden(i) = False Then
  1203.                 ReDim Preserve iDataRows(UBound(iDataRows) + 1)
  1204.                 iDataRows(UBound(iDataRows)) = i
  1205.             End If
  1206.         Next i
  1207.         If UBound(iDataRows) = 0 Then
  1208.             Exit Function
  1209.         End If
  1210.         
  1211.         '读取表头数据
  1212.         ReDim sTitle(UBound(iTitleRows) - 1, UBound(iCols) - 1)
  1213.         For i = LBound(iTitleRows) + 1 To UBound(iTitleRows)
  1214.             For j = LBound(iCols) + 1 To UBound(iCols)
  1215.                 sTitle(i - LBound(iTitleRows) - 1, j - LBound(iCols) - 1) = .TextMatrix(iTitleRows(i), iCols(j))
  1216.             Next j
  1217.         Next i
  1218.         '读取表体数据
  1219.         ReDim sData(UBound(iDataRows) - 1, UBound(iCols) - 1)
  1220.         For i = LBound(iDataRows) + 1 To UBound(iDataRows)
  1221.             For j = LBound(iCols) + 1 To UBound(iCols)
  1222.                 sData(i - LBound(iDataRows) - 1, j - LBound(iCols) - 1) = .TextMatrix(iDataRows(i), iCols(j))
  1223.             Next j
  1224.         Next i
  1225.         
  1226.         '--------------------------------------------------读取数据信息完成-------------------------------------------------
  1227.         
  1228.         '--------------------------------------------------计算打印信息-------------------------------------------------
  1229.         '计算数据行折行信息
  1230.         ReDim iColsPerPage(0)
  1231.         iColsPerPage(0) = iStartCol
  1232.         Dim iWidth As Long
  1233.         iWidth = 0
  1234.         For i = LBound(iColWidth) + 1 + iStartCol To UBound(iColWidth)
  1235.             
  1236.             iWidth = iWidth + iColWidth(i)
  1237.             If iWidth > iClientWidth Then
  1238.                 iWidth = 0
  1239.                 i = i - 1
  1240.                 ReDim Preserve iColsPerPage(UBound(iColsPerPage) + 1)
  1241.                 iColsPerPage(UBound(iColsPerPage)) = i
  1242.             End If
  1243.         Next i
  1244.         If iWidth <> 0 Then
  1245.             ReDim Preserve iColsPerPage(UBound(iColsPerPage) + 1)
  1246.             iColsPerPage(UBound(iColsPerPage)) = UBound(sData, 2) + 1
  1247.         End If
  1248.         
  1249.         '计算每页可以打印的行数
  1250.         If iSumPerPage = 1 Then
  1251.             i = 1
  1252.         Else
  1253.             i = 0
  1254.         End If
  1255.         j = UBound(sTitle) + 2
  1256.         If iPrintStyle = PRINTSTYLE_ONETITLE Then
  1257.             iRowsPerPage = (iClientHeight - iTitleFontHeight - iDataFontHeight - 1000)  (UBound(iColsPerPage) * (iDataFontHeight + 100)) - i
  1258.         Else
  1259.             j = UBound(sTitle) + 2
  1260.             iRowsPerPage = (iClientHeight - iTitleFontHeight - iDataFontHeight - 1000)  (UBound(iColsPerPage) * j * (iDataFontHeight + 250)) - i
  1261.         End If
  1262.         If bLimitRowPerPage = True Then
  1263.             If iRowsPerPage > iLimitRowsPerPage Then
  1264.                 iRowsPerPage = iLimitRowsPerPage
  1265.             End If
  1266.         End If
  1267.         
  1268.         '计算分页信息
  1269.         ReDim iPages(0)
  1270.         iPages(0) = -1
  1271.         If iVsSumEndCol = -1 Or iSplitPage = 0 Then '如果没有分页情况,只需判断本页最多能够打印的行数
  1272.             For i = LBound(sData) To UBound(sData)
  1273.                 If i Mod iRowsPerPage = iRowsPerPage - 1 Then
  1274.                     ReDim Preserve iPages(UBound(iPages) + 1)
  1275.                     iPages(UBound(iPages)) = i
  1276.                 End If
  1277.             Next i
  1278.         Else
  1279.         '如果有分页情况,则首先判断是否是分页行,然后循环判断下边的行
  1280.         '如果是合计行则加入本页(在数据行数小于可打印行数的情况下)
  1281.             For i = LBound(sData) To UBound(sData) '数据行数达到最大行
  1282.                 
  1283.                 If (i - iPages(UBound(iPages))) Mod iRowsPerPage = 0 And i <> 0 Then
  1284.                     ReDim Preserve iPages(UBound(iPages) + 1)
  1285.                     iPages(UBound(iPages)) = i
  1286.                     If Len(sData(i, iVsSumEndCol)) >= 3 Then
  1287.                         s = Right(sData(i, iVsSumEndCol), 3)
  1288.                     Else
  1289.                         s = ""
  1290.                     End If
  1291.                         
  1292.                     If s = "合计:" Or s = "小计:" Then
  1293.                         bSumRow = True
  1294.                     End If
  1295.                 Else '合计分页
  1296.                     If Len(sData(i, iVsSumEndCol)) >= 3 Then
  1297.                         s = Right(sData(i, iVsSumEndCol), 3)
  1298.                     Else
  1299.                         s = ""
  1300.                     End If
  1301.                     If s = "合计:" Or s = "小计:" Or bSumRow = True Then
  1302.                         bNext = False
  1303.                         bSumRow = False
  1304.                         If iVsSumEndCol = 0 Then
  1305.                             ReDim Preserve iPages(UBound(iPages) + 1)
  1306.                             iPages(UBound(iPages)) = i
  1307.                         Else
  1308.                             
  1309.                             For j = iVsSumEndCol To iVsBeginCol + 1 Step -1
  1310.                                 If Len(sData(i + 1, j - 1)) >= 3 Then
  1311.                                     s = Right(sData(i + 1, j - 1), 3)
  1312.                                 Else
  1313.                                     s = ""
  1314.                                 End If
  1315.                                 If s = "合计:" Or s = "小计:" Then
  1316.                                     bNext = True
  1317.                                     i = i + 1
  1318.                                     '如果当前行达到最大行,分页
  1319.                                     If (i - iPages(UBound(iPages))) Mod iRowsPerPage = 0 Then
  1320.                                         ReDim Preserve iPages(UBound(iPages) + 1)
  1321.                                         iPages(UBound(iPages)) = i
  1322.                                         bNext = False
  1323.                                     End If
  1324.                                 End If
  1325.                             Next j
  1326.                             '如果到了第0列,分页
  1327.                             If j = iVsBeginCol Then
  1328.                                 ReDim Preserve iPages(UBound(iPages) + 1)
  1329.                                 iPages(UBound(iPages)) = i
  1330.                             End If
  1331.                         End If
  1332.                         '因为如果bNext=true 则数据行多移动了一行,减去
  1333.                         If bNext = True Then
  1334.                             i = i - 1
  1335.                         End If
  1336.                         '判断起始列的合计情况
  1337.                         bNext = False
  1338.                         Do While True
  1339.                             If i < UBound(sData) Then
  1340.                                 If Len(sData(i + 1, iVsBeginCol)) >= 3 Then
  1341.                                     s = Right(sData(i + 1, iVsBeginCol), 3)
  1342.                                 Else
  1343.                                     s = ""
  1344.                                 End If
  1345.                                 If s = "小计:" Or s = "合计:" Then
  1346.                                     i = i + 1
  1347.                                     bNext = True
  1348.                                 Else
  1349.                                     Exit Do
  1350.                                 End If
  1351.                             Else
  1352.                                 Exit Do
  1353.                             End If
  1354.                         Loop
  1355.                         If bNext = True Then
  1356.                             ReDim Preserve iPages(UBound(iPages) + 1)
  1357.                             iPages(UBound(iPages)) = i
  1358.                         End If
  1359.                     End If
  1360.                 End If
  1361.             Next i
  1362.         End If
  1363.         '剩下的行也要占一页
  1364.         If iPages(UBound(iPages)) <> UBound(sData) Then
  1365.             ReDim Preserve iPages(UBound(iPages) + 1)
  1366.             iPages(UBound(iPages)) = UBound(sData)
  1367.         End If
  1368.             
  1369.     End With
  1370. '    如果某页的行数为0则删除列,上面的分页程序繁琐,有时候会造成某页的数据行为0
  1371. '    的情况,在此进行处理,有必要重新考虑分页的程序结构???
  1372.     Dim iPagesB() As Long
  1373.     ReDim iPagesB(0)
  1374.     iPagesB(0) = iPages(0)
  1375.     For i = 1 To UBound(iPages)
  1376.         If iPages(i) <> iPages(i - 1) Then
  1377.             ReDim Preserve iPagesB(UBound(iPagesB) + 1)
  1378.             iPagesB(UBound(iPagesB)) = iPages(i)
  1379.         End If
  1380.     Next i
  1381.     ReDim iPages(UBound(iPagesB))
  1382.     iPages = iPagesB
  1383.     '合计每行的数据形成本页合计
  1384.     Dim sTotal() As String
  1385.     ReDim sTotal(0, 0)
  1386.     If iSumPerPage = 1 Then
  1387.         If UBound(iPages) >= 1 Then
  1388.             ReDim sTotal(UBound(iPages) - 1, UBound(sData, 2))
  1389.             For i = 0 To UBound(sTotal) '行
  1390.                 For j = LBound(iCols) + 1 To UBound(iCols) '列
  1391.                     If iColType(j) = DATA_NUMERIC Then
  1392.                         For n = iPages(i) + 1 To iPages(i + 1)
  1393.                             bNext = False
  1394.                             '合计行的信息不加入本页合计
  1395.                             For m = iVsBeginCol To IIf(iVsSumEndCol = -1, 0, iVsSumEndCol)
  1396.                                 If Len(sData(n, m)) >= 3 Then
  1397.                                     s = Right(sData(n, m), 3)
  1398.                                 Else
  1399.                                     s = ""
  1400.                                 End If
  1401.                                 If s = "合计:" Or s = "小计:" Then
  1402.                                     bNext = True
  1403.                                     Exit For
  1404.                                 End If
  1405.                             Next m
  1406.                             If bNext = False Then
  1407.                                 sTotal(i, j - 1) = Val(sTotal(i, j - 1)) + Val(Replace(sData(n, j - 1), ",", ""))
  1408.                             End If
  1409.                         Next n
  1410.                     End If
  1411.                 Next j
  1412.             Next i
  1413.         End If
  1414.     End If
  1415.     
  1416.     '格式化合计信息
  1417.     bNext = False
  1418.     If iShowAllCols = 0 Then
  1419.         
  1420.         For i = LBound(sData) To UBound(sData)
  1421.             If bNext = True Then
  1422.                 Exit For
  1423.             End If
  1424.             For j = iVsSumEndCol To LBound(sData, 2) Step -1
  1425.                 
  1426.                 If Len(sData(i, j)) >= 3 Then
  1427.                     s = Right(sData(i, j), 3)
  1428.                 Else
  1429.                     s = ""
  1430.                 End If
  1431.                 If s = "小计:" Then
  1432.                    
  1433.                     If i - 1 >= 0 Then
  1434.                         sData(i, iVsSumEndCol + 1) = Replace(sData(i - 1, j), s, "") & s
  1435.                     Else
  1436.                         bNext = True
  1437.                         Exit For
  1438.                     End If
  1439.                 End If
  1440.                 If sData(i, j) = "合计:" Then
  1441.                     sData(i, iVsSumEndCol + 1) = "合计:"
  1442.                 End If
  1443.                 
  1444.             Next j
  1445.         Next i
  1446.     End If
  1447.     
  1448.     If bNext = True Then
  1449.         For i = LBound(sData) To UBound(sData)
  1450.             For j = iVsSumEndCol To LBound(sData, 2) Step -1
  1451.                 If sData(i, j) <> "" Then
  1452.                     If sData(i, j) = "合计:" Then
  1453.                         sData(i, iVsSumEndCol + 1) = sData(i, j)
  1454.                     Else
  1455.                         sData(i, iVsSumEndCol + 1) = Replace(sData(i, j), "小计:", "") & "小计:"
  1456.                     End If
  1457.                     Exit For
  1458.                 End If
  1459.             Next j
  1460.         Next i
  1461.     End If
  1462.     '--------------------------------------------------计算打印信息完毕-------------------------------------------------
  1463.     
  1464.     
  1465.     '--------------------------------------------------打印数据-------------------------------------------------
  1466.     '输送数据
  1467.     Dim dy As Long
  1468.     dy = 0
  1469.     With DY_Tybbyldy.Tydy
  1470.         .StartDoc
  1471.             For i = LBound(iPages) + 1 To UBound(iPages)
  1472.                 .FontName = sTitleFontName
  1473.                 .FontSize = iTitleFontSize
  1474.                 .CalcText = sRTitle
  1475.                 .CurrentX = (iClientWidth - .TextWid) / 2 + iPageLeft
  1476.                 .CurrentY = iPageTop
  1477.                 DY_Tybbyldy.Tydy = sRTitle
  1478.                 .CurrentX = (iClientWidth - .TextWid) / 2 + iPageLeft - 500
  1479.                 .CurrentY = .CurrentY + 100
  1480.                 .CalcText = sRTitle
  1481.                 .DrawLine .CurrentX, .CurrentY, (iClientWidth + .TextWid) / 2 + iPageLeft + 500, .CurrentY
  1482.                 .CurrentY = .CurrentY + 200
  1483.                 .CurrentX = .MarginLeft
  1484.                 .FontName = sDataFontName
  1485.                 .FontSize = iDataFontSize
  1486.                 dy = .CurrentY
  1487.                 '打印分组信息
  1488.                 If iSplitPage = 1 And iVsSumEndCol <> -1 Then
  1489.                     If Len(sData(iPages(i - 1) + 1, iVsSumEndCol)) >= 3 Then
  1490.                         If Right(sData(iPages(i - 1) + 1, iVsSumEndCol), 3) = "小计:" Then
  1491.                             If iPages(i - 1) >= 0 Then
  1492.                                 DY_Tybbyldy.Tydy = sTitle(UBound(sTitle), iVsSumEndCol) & ":" & sData(iPages(i - 1) + 1 - 1, iVsSumEndCol) & Space(10) & sSubTitle
  1493.                             End If
  1494.                         Else
  1495.                             DY_Tybbyldy.Tydy = sTitle(UBound(sTitle), iVsSumEndCol) & ":" & sData(iPages(i - 1) + 1, iVsSumEndCol) & Space(10) & sSubTitle
  1496.                         End If
  1497.                     Else
  1498.                         DY_Tybbyldy.Tydy = sTitle(UBound(sTitle), iVsSumEndCol) & ":" & sData(iPages(i - 1) + 1, iVsSumEndCol) & Space(10) & sSubTitle
  1499.                     End If
  1500.                 Else
  1501.                     DY_Tybbyldy.Tydy = sSubTitle
  1502.                 End If
  1503.                 .CurrentX = .PageWidth - .MarginRight - .TextWidth("第100页 共100页 ")
  1504.                 .CurrentY = dy
  1505.                 DY_Tybbyldy.Tydy = "第" & i & "页 共" & UBound(iPages) & "页 "
  1506.                 If iPrintStyle = PRINTSTYLE_ONETITLE Then '只输出一个表头
  1507.                     For j = LBound(iColsPerPage) + 1 To UBound(iColsPerPage)
  1508.                         .CurrentX = .MarginLeft
  1509.                         .CurrentY = .CurrentY + 100
  1510.                         
  1511.                         .StartTable
  1512.                             '设置表格属性
  1513.                             .TableCell(tcRows) = iPages(i) - iPages(i - 1) + UBound(sTitle) + 1
  1514.                             .TableCell(tcCols) = iColsPerPage(j) - iColsPerPage(j - 1)
  1515.                             
  1516.                             For m = 1 To .TableCell(tcRows) '行高
  1517.                                 .TableCell(tcRowHeight, m) = iDataFontHeight + 100
  1518.                             Next m
  1519.                             For m = 1 To .TableCell(tcCols) '列宽
  1520.                                 .TableCell(tcColWidth, , m) = iColWidth(m + iColsPerPage(j - 1))
  1521.                             Next m
  1522.                             '填充表头
  1523.                             For m = 1 To UBound(sTitle) + 1
  1524.                                 For k = 1 To .TableCell(tcCols)
  1525.                                     .TableCell(tcAlign, m, k) = 6
  1526.                                     .TableCell(tcText, m, k) = Trim(sTitle(m - 1, k + iColsPerPage(j - 1) - 1))
  1527.                                     .CalcText = .TableCell(tcText, m, k)
  1528.                                     If (.TableCell(tcColWidth, , k) - .TextWid - 100) > 0 Then
  1529.                                         .TableCell(tcText, m, k) = Space((.TableCell(tcColWidth, , k) - .TextWid - 100) / .TextWidth("测试")) & .TableCell(tcText, m, k)
  1530.                                     End If
  1531.                                 Next k
  1532.                             Next m
  1533.                             '填充数据
  1534.                             For m = UBound(sTitle) + 1 + 1 To .TableCell(tcRows)
  1535.                                 For k = 1 To .TableCell(tcCols)
  1536.                                     If iColType(k + iColsPerPage(j - 1)) = DATA_NUMERIC Then
  1537.                                         .TableCell(tcAlign, m, k) = 8 'RightMiddle
  1538.                                     Else
  1539.                                         .TableCell(tcAlign, m, k) = 6 'LeftMiddle
  1540.                                     End If
  1541.                                     If Len(sData(m + iPages(i - 1) - 1, k + iColsPerPage(j - 1) - 1)) >= 3 Then
  1542.                                         If Right(sData(m + iPages(i - 1) - 1, k + iColsPerPage(j - 1) - 1), 3) <> "小计:" And _
  1543.                                             Right(sData(m + iPages(i - 1) - 1, k + iColsPerPage(j - 1) - 1), 3) <> "合计:" Then
  1544.                                             s = sData(m + iPages(i - 1) - 1, k + iColsPerPage(j - 1) - 1)
  1545.                                         End If
  1546.                                     End If
  1547.                                     If Trim(iColFormat(k + iColsPerPage(j - 1))) = "" Then
  1548.                                         .TableCell(tcText, m, k) = sData(m + iPages(i - 1) - 1, k + iColsPerPage(j - 1) - 1)
  1549.                                     Else
  1550.                                         .TableCell(tcText, m, k) = Format(sData(m + iPages(i - 1) - 1, k + iColsPerPage(j - 1) - 1), iColFormat(k + iColsPerPage(j - 1)))
  1551.                                     End If
  1552.                                 Next k
  1553.                             Next m
  1554.                             '填充合计信息
  1555.                             If iSumPerPage = 1 And UBound(sTotal) > 0 Then
  1556.                                 .TableCell(tcRows) = .TableCell(tcRows) + 1
  1557.                                 .TableCell(tcRowHeight, .TableCell(tcRows)) = iDataFontHeight + 100
  1558.                                 For k = 1 To .TableCell(tcCols)
  1559.                                     If iColType(k + iColsPerPage(j - 1)) = DATA_NUMERIC Then
  1560.                                         .TableCell(tcAlign, .TableCell(tcRows), k) = 8 'RightMiddle
  1561.                                     Else
  1562.                                         .TableCell(tcAlign, .TableCell(tcRows), k) = 6 'LeftMiddle
  1563.                                     End If
  1564.                                     .TableCell(tcText, .TableCell(tcRows), k) = Format(sTotal(i - 1, k + iColsPerPage(j - 1) - 1), iColFormat(k + iColsPerPage(j - 1)))
  1565.                                 Next k
  1566.                                 If j = 1 Then
  1567.                                     .TableCell(tcText, .TableCell(tcRows), 1) = "本页小计:"
  1568.                                 End If
  1569.                             End If
  1570.                         .EndTable
  1571.                     Next j
  1572.                 Else '每行数据输出表头
  1573.                     For n = iPages(i - 1) + 1 To iPages(i) 'n为数据行
  1574.                         For j = LBound(iColsPerPage) + 1 To UBound(iColsPerPage) 'j为一个数据行分的断
  1575.                             .CurrentX = .MarginLeft
  1576.                             .CurrentY = .CurrentY + 100
  1577.                             
  1578.                             .StartTable
  1579.                                 '设置表格属性
  1580.                                 .TableCell(tcRows) = UBound(sTitle) + 1 + 1
  1581.                                 .TableCell(tcCols) = iColsPerPage(j) - iColsPerPage(j - 1)
  1582.                                 
  1583.                                 For m = 1 To .TableCell(tcRows) '行高
  1584.                                     .TableCell(tcRowHeight, m) = iDataFontHeight + 100
  1585.                                 Next m
  1586.                                 For m = 1 To .TableCell(tcCols) '列宽
  1587.                                     .TableCell(tcColWidth, , m) = iColWidth(m + iColsPerPage(j - 1))
  1588.                                 Next m
  1589.                                 '填充表头
  1590.                                 For m = 1 To UBound(sTitle) + 1
  1591.                                     For k = 1 To .TableCell(tcCols)
  1592.                                         .TableCell(tcAlign, m, k) = 6
  1593.                                         .TableCell(tcText, m, k) = Trim(sTitle(m - 1, k + iColsPerPage(j - 1) - 1))
  1594.                                         .CalcText = .TableCell(tcText, m, k)
  1595.                                         If (.TableCell(tcColWidth, , k) - .TextWid - 100) > 0 Then
  1596.                                             .TableCell(tcText, m, k) = Space((.TableCell(tcColWidth, , k) - .TextWid - 100) / .TextWidth("测试")) & .TableCell(tcText, m, k)
  1597.                                         End If
  1598.                                     Next k
  1599.                                 Next m
  1600.                                 '填充数据
  1601.                                 For k = 1 To .TableCell(tcCols)
  1602.                                     If iColType(k + iColsPerPage(j - 1)) = DATA_NUMERIC Then
  1603.                                         .TableCell(tcAlign, m, k) = 8 'RightMiddle
  1604.                                     Else
  1605.                                         .TableCell(tcAlign, m, k) = 6 'LeftMiddle
  1606.                                     End If
  1607.                                     If Trim(iColFormat(k + iColsPerPage(j - 1) - 1)) = "" Then
  1608.                                         .TableCell(tcText, .TableCell(tcRows), k) = sData(n, k + iColsPerPage(j - 1) - 1)
  1609.                                     Else
  1610.                                         .TableCell(tcText, .TableCell(tcRows), k) = Format(sData(n, k + iColsPerPage(j - 1) - 1), iColFormat(k + iColsPerPage(j - 1) - 1))
  1611.                                     End If
  1612.                                 Next k
  1613.                                 
  1614.                             .EndTable
  1615.                         Next j
  1616.                         '如果不是本页的最后一行并且后边没有本业合计,添加分隔线
  1617.                         If n <> iPages(i) Or iSumPerPage = 1 Then
  1618.                             .CurrentY = .CurrentY + 200
  1619.                             .CurrentX = .MarginLeft
  1620.                             .PenStyle = psDash
  1621.                             .DrawLine .CurrentX, .CurrentY, .PageWidth - .MarginRight, .CurrentY
  1622.                             .PenStyle = psSolid
  1623.                         End If
  1624.                     Next n
  1625.                     
  1626.                     '添加本页合计信息
  1627.                     If iSumPerPage = 1 Then
  1628.                         For j = LBound(iColsPerPage) + 1 To UBound(iColsPerPage) 'j为一个数据行分的断
  1629.                             .CurrentX = .MarginLeft
  1630.                             .CurrentY = .CurrentY + 100
  1631.                             .StartTable
  1632.                                 '设置表格属性
  1633.                                 .TableCell(tcRows) = UBound(sTitle) + 1 + 1
  1634.                                 .TableCell(tcCols) = iColsPerPage(j) - iColsPerPage(j - 1)
  1635.                                 
  1636.                                 For m = 1 To .TableCell(tcRows) '行高
  1637.                                     .TableCell(tcRowHeight, m) = iDataFontHeight + 100
  1638.                                 Next m
  1639.                                 For m = 1 To .TableCell(tcCols) '列宽
  1640.                                     .TableCell(tcColWidth, , m) = iColWidth(m + iColsPerPage(j - 1))
  1641.                                 Next m
  1642.                                 '填充表头
  1643.                                 For m = 1 To UBound(sTitle) + 1
  1644.                                     For k = 1 To .TableCell(tcCols)
  1645.                                         .TableCell(tcAlign, m, k) = 6
  1646.                                         .TableCell(tcText, m, k) = Trim(sTitle(m - 1, k + iColsPerPage(j - 1) - 1))
  1647.                                         .CalcText = .TableCell(tcText, m, k)
  1648.                                         If (.TableCell(tcColWidth, , k) - .TextWid - 100) > 0 Then
  1649.                                             .TableCell(tcText, m, k) = Space((.TableCell(tcColWidth, , k) - .TextWid - 100) / .TextWidth("测试")) & .TableCell(tcText, m, k)
  1650.                                         End If
  1651.                                     Next k
  1652.                                 Next m
  1653.                                 '填充数据
  1654.                                 For k = 1 To .TableCell(tcCols)
  1655.                                     If iColType(k + iColsPerPage(j - 1)) = DATA_NUMERIC Then
  1656.                                         .TableCell(tcAlign, m, k) = 8 'RightMiddle
  1657.                                     Else
  1658.                                         .TableCell(tcAlign, m, k) = 6 'LeftMiddle
  1659.                                     End If
  1660.                                     .TableCell(tcText, .TableCell(tcRows), k) = Format(sTotal(i - 1, k + iColsPerPage(j - 1) - 1), iColFormat(k + iColsPerPage(j - 1)))
  1661.                                 Next k
  1662.                                 If j = LBound(iColsPerPage) + 1 Then
  1663.                                     .TableCell(tcText, .TableCell(tcRows), 1) = "本页小计:"
  1664.                                 End If
  1665.                             .EndTable
  1666.                         Next j
  1667.                     End If
  1668.                     
  1669.                 End If
  1670.                 If i <> UBound(iPages) Then
  1671.                     .NewPage
  1672.                 End If
  1673.             Next i
  1674.         .EndDoc
  1675.         DY_Tybbyldy.PageHScroll.Max = .Pagecount
  1676.         DY_Tybbyldy.PageHScroll.Min = 1
  1677.         DY_Tybbyldy.PageHScroll.Value = 1
  1678.     End With
  1679.     If bPrint = False Then
  1680.         DY_Tybbyldy.Show 1
  1681.     Else
  1682.         DY_Tybbyldy.Tydy.PrintDoc
  1683.     End If
  1684.     
  1685.     Exit Function
  1686. ErrCtrl:
  1687.     If rs.State = 1 Then
  1688.         rs.Close
  1689.     End If
  1690.     Set rs = Nothing
  1691. End Function
  1692. Public Function SetupPage(frmSetup As DY_Dyymsz, frmPrint As DY_Tybbyldy) As Boolean '打印设置
  1693.     Dim Tsxx As String
  1694.     Dim Papername(1 To 70) As String
  1695.   
  1696.     Papername(1) = "Letter, 8 1/2 x 11 英寸"
  1697.     Papername(2) = "Letter Small, 8