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

企业管理

开发平台:

Visual Basic

  1. Attribute VB_Name = "XtsyModule"
  2. '系统私有模块用来放置一些子系统独有的过程与函数
  3. Public str_Code As String                               '存储列内容参数
  4. Public sParam As String
  5. Public Const DATA_NUMERIC As Integer = 5 '数字行
  6. Public Const DATA_STRING As Integer = 0 '字符型
  7. Public Const DATA_DATE As Integer = 7 '日期型
  8. Const PRINTSTYLE_ONETITLE = 0 '每页打印表头
  9. Const PRINTSTYLE_ALLTITLE = 1 '每行打印表头
  10. Public Sub Drxtztcs()                                   '读入系统帐套参数
  11.    
  12.     Dim Ztcsbrec As New ADODB.Recordset
  13.     Dim RecTemp As New ADODB.Recordset
  14.     Dim Sqlstr As String
  15.   
  16.     With Ztcsbrec
  17.         '金额总位数
  18.         .Open "Select * From Gy_AccInformation Where SystemCode='Cwzz'", Cw_DataEnvi.DataConnect, adOpenDynamic, adLockOptimistic
  19.         .MoveFirst
  20.         .Find "itemcode='cwjezws'"
  21.         If Not Ztcsbrec.EOF Then
  22.             Xtjezws = Val(Trim(Ztcsbrec.Fields("itemvalue")))
  23.         End If
  24.         
  25.         '数量总位数
  26.         .MoveFirst
  27.         .Find "itemcode='cwslzws'"
  28.         If Not Ztcsbrec.EOF Then
  29.             Xtslzws = Val(Trim(Ztcsbrec.Fields("itemvalue")))
  30.         End If
  31.    
  32.         '单价总位数
  33.         .MoveFirst
  34.         .Find "itemcode='cwdjzws'"
  35.         If Not Ztcsbrec.EOF Then
  36.             Xtdjzws = Val(Trim(Ztcsbrec.Fields("itemvalue")))
  37.         End If
  38.         
  39.         '金额小数位数
  40.         .MoveFirst
  41.         .Find "itemcode='cwjexsws'"
  42.         If Not Ztcsbrec.EOF Then
  43.             Xtjexsws = Val(Trim(Ztcsbrec.Fields("itemvalue")))
  44.         End If
  45.    
  46.         '数量小数位数
  47.         .MoveFirst
  48.         .Find "itemcode='cwslxsws'"
  49.         If Not Ztcsbrec.EOF Then
  50.             Xtslxsws = Val(Trim(Ztcsbrec.Fields("itemvalue")))
  51.         End If
  52.         
  53.         '单价小数位数
  54.         .MoveFirst
  55.         .Find "itemcode='cwdjxsws'"
  56.         If Not Ztcsbrec.EOF Then
  57.             Xtdjxsws = Val(Trim(Ztcsbrec.Fields("itemvalue")))
  58.         End If
  59.         .Close
  60.     End With
  61.   
  62. End Sub
  63. '******************************************************************
  64. '*    模 块 名 称 :私有模块
  65. '*    功 能 描 述 :
  66. '*    程序员姓名  :苗鹏
  67. '*    最后修改人  :苗鹏
  68. '*    最后修改时间:2002/01/01
  69. '*    备        注:
  70. '******************************************************************
  71. Public Function GetTableField(sExec As String, sTableName As String, sFieldName As String, s As String) As Integer
  72.     '分离表名和字段名,s为分隔符
  73.     On Error GoTo ErrCtrl
  74.     Dim i As Integer
  75.     For i = 1 To Len(sExec)
  76.         If Mid(sExec, i, 1) = s Then
  77.             sTableName = Left(sExec, i - 1)
  78.             sFieldName = Right(sExec, Len(sExec) - i)
  79.             Exit For
  80.         End If
  81.     Next i
  82.     If i <= Len(sExec) Then
  83.         GetTableField = 1
  84.     Else
  85.         GetTableField = 0
  86.     End If
  87.     Exit Function
  88. ErrCtrl:
  89.     GetTableField = -1
  90. End Function
  91. Public Function InitView(tv As TreeView, Optional Ssql As String = " 1=1 ")
  92.     '初始化字段树
  93. '    On Error GoTo ErrCtrl
  94.     
  95.     Dim rs As New ADODB.Recordset
  96.     Dim s As String
  97.     Dim nodX As Node
  98.     
  99.     If Ssql = "" Then
  100.         Ssql = " 1=1  "
  101.     End If
  102.     tv.Nodes.Clear
  103.     Set nodX = tv.Nodes.Add(, , "R", "备选项目")
  104.     '读取表
  105.     s = "select distinct TableName as TableFrom from Rs_Items where " & Ssql
  106.     
  107.     Set rs = Cw_DataEnvi.DataConnect.Execute(s)
  108.        
  109.     With rs
  110.         If .EOF() Then
  111.             Exit Function
  112.         End If
  113.         Do While Not .EOF()
  114.             Set nodX = tv.Nodes.Add("R", tvwChild, UCase(Trim(!TableFrom)), GetTableNameC(Trim(!TableFrom)))
  115.             nodX.EnsureVisible
  116.             .MoveNext
  117.         Loop
  118.     End With
  119.     
  120.     '读取字段
  121.     s = "select FieldName  as FieldName,CHName as FieldNameC,TableName as TableFrom " & Chr(10) _
  122.         & ",Correlation as FieldRelation,CorTable as CorTable ,IndexCode as TCode,IndexName as TName,AddMinusItem " & Chr(10) _
  123.         & " from Rs_Items where " & Ssql  'TableName is not Null "
  124.     Set rs = Cw_DataEnvi.DataConnect.Execute(s)
  125.     With rs
  126.         If .EOF() Then
  127.             Exit Function
  128.         End If
  129.         Do While Not .EOF()
  130.             '末级节点的Tag值为此字段的英文全名
  131.             If !AddMinusItem = 1 And Trim(Ssql) = Trim("1=1") Then
  132.                 '如果是选入工资表的字段,添加工资表节点
  133.                 Set nodX = tv.Nodes.Add(UCase("PM_PayRoll"), tvwChild, UCase("PM_PayRoll") & "." & UCase(Trim(!FieldName)), UCase(Trim(!FieldNameC)))
  134.                 If Trim(!CorTable & "") <> "" And Trim(!TCode & "") <> "" And Trim(!TName & "") <> "" Then
  135.                     nodX.Tag = Trim(!FieldRelation & "") & "@" & Trim(!CorTable & "") & "@" & Trim(!TCode & "") & "@" & Trim(!TName & "")
  136.                 End If
  137.                 
  138.             End If
  139.             Set nodX = tv.Nodes.Add(UCase(Trim(!TableFrom)), tvwChild, UCase(Trim(!TableFrom) & "." & Trim(!FieldName)), UCase(Trim(!FieldNameC)))
  140.             If Trim(!CorTable & "") <> "" And Trim(!TCode & "") <> "" And Trim(!TName & "") <> "" Then
  141.                 nodX.Tag = Trim(!FieldRelation & "") & "@" & Trim(!CorTable & "") & "@" & Trim(!TCode & "") & "@" & Trim(!TName & "")
  142.             End If
  143.             
  144.             .MoveNext
  145.         Loop
  146.     End With
  147.     
  148.         '添加会计年,会计期间,工资类别到工资表节点
  149.         If IsNodeExist("PM_PayRoll", tv) Then
  150.             Set nodX = tv.Nodes.Add(UCase("PM_PayRoll"), tvwChild, UCase("PM_PayRoll.KjYear"), "会计年")
  151.             Set nodX = tv.Nodes.Add(UCase("PM_PayRoll"), tvwChild, UCase("PM_PayRoll.Period"), "会计月")
  152.             Set nodX = tv.Nodes.Add(UCase("PM_PayRoll"), tvwChild, UCase("PM_PayRoll.SortID"), "工资类别")
  153.             nodX.Tag = "0@PM_Sort@SortID@SortName"
  154.         End If
  155.         
  156.         '添加会计年,会计期间到考勤表节点
  157.         If IsNodeExist("PM_AttendRecord", tv) Then
  158.             Set nodX = tv.Nodes.Add(UCase("PM_AttendRecord"), tvwChild, UCase("PM_AttendRecord.KjYear"), "会计年")
  159.             Set nodX = tv.Nodes.Add(UCase("PM_AttendRecord"), tvwChild, UCase("PM_AttendRecord.Period"), "会计月")
  160.         End If
  161.       
  162.     Set rs = Nothing
  163.     
  164.     Exit Function
  165. ErrCtrl:
  166.     Set rs = Nothing
  167.     
  168.     Dim smsg As String
  169.     Dim smsgSys As String
  170.     smsg = GetError(Err.Number)
  171.     smsgSys = Err.Number & Err.Description & "!"
  172.     MsgBox IIf(smsg = "", smsgSys, smsg), vbOKOnly + vbCritical
  173. End Function
  174. Public Function GetFieldHelp(sExp As String, sID As String, sTable As String, sCode As String, sName As String)
  175.     Dim i As Integer
  176.     Dim j As Integer
  177.     Dim k As Integer
  178.     Dim s(3) As String
  179.     
  180.     If sExp = "" Then
  181.         Exit Function
  182.     End If
  183.     j = 1
  184.     k = 0
  185.     '取ID,关联表,编码,名称
  186.     Do While i <= Len(sExp)
  187.         For i = j To Len(sExp)
  188.             If Mid(sExp, i, 1) = "@" Then
  189.                 s(k) = Mid(sExp, j, i - j)
  190.                 j = i + 1
  191.                 k = k + 1
  192.                 Exit For
  193.             End If
  194.         Next i
  195.         If i > Len(sExp) Then
  196.             sName = Mid(sExp, j, i - j)
  197.         End If
  198.     Loop
  199.     sID = s(0)
  200.     sTable = s(1)
  201.     sCode = s(2)
  202.         
  203. End Function
  204. Public Function GetError(iNum As Long) As String
  205. '    On Error Resume Next
  206.     Dim msg As String
  207.     Select Case iNum
  208.         Case -2147217873
  209.             msg = "违反唯一性或者编码已经使用!"
  210.         Case -2147217913
  211.             msg = "录入了错误的日期格式,正确格式为 2001-09-12" & Chr(10) _
  212.                 & "或者录入了错误的数字格式,正确格式为 123456789.12"
  213.         Case -2147217900
  214.             msg = "语法错误!"
  215.         Case Else
  216.             msg = ""
  217.     End Select
  218.     GetError = msg
  219. End Function
  220. Public Function ReplByPos(sExepress As String, sReplace As String, Optional iStart As Integer = 0, Optional iEnd As Integer = 0) As String
  221.   '把sExepress的第iStart字起到iEnd结束的字符替换成sReplace
  222.   Dim i As Integer
  223.   Dim j As Integer
  224.   Dim sLeft As String
  225.   Dim sRight As String
  226.   
  227.   If iStart > Len(sExepress) Then
  228.     MsgBox "开始位置超出字符长度", vbOKOnly + vbCritical
  229.     Exit Function
  230.   End If
  231.   If iStart > iEnd Then
  232.     MsgBox "开始位置超出结束位置", vbOKOnly + vbCritical
  233.     Exit Function
  234.   End If
  235.   
  236.   sLeft = Left(sExepress, iStart - 1)
  237.   sRight = Right(sExepress, Len(sExepress) - iEnd + 1)
  238.   
  239.   ReplByPos = sLeft & sReplace & sRight
  240.   
  241. End Function
  242. Public Function IsItemExist(sName As String, coll As Collection, Optional iType As Integer = 0) As Integer
  243.     'itype=0 不区分大小写 1 区分大小写
  244.     '返回sName的位置或-1
  245.     Dim i As Integer
  246.     With coll
  247.         If .count = 0 Then
  248.             IsItemExist = -1
  249.             Exit Function
  250.         End If
  251.         If iType = 0 Then
  252.             For i = 1 To .count
  253.                 If UCase(sName) = UCase(.Item(1)) Then
  254.                     Exit For
  255.                 End If
  256.             Next i
  257.         Else
  258.             For i = 1 To .count
  259.                 If sName = .Item(1) Then
  260.                     Exit For
  261.                 End If
  262.             Next i
  263.         End If
  264.         If i > .count Then
  265.             IsItemExist = -1
  266.         Else
  267.             IsItemExist = i
  268.         End If
  269.     End With
  270. End Function
  271. Public Function GetSQLFrom(coll As Collection, sPriTableName As String) As String
  272.     '根据所提供的表名,连接成From语句
  273.     Dim s As String
  274.     Dim st As String
  275.     Dim i As Integer
  276.     Dim j As Integer
  277.     Dim k As Integer
  278. '    On Error GoTo ErrCtrl
  279.     If sPriTableName = "" Then
  280.         MsgBox "请输入主表名"
  281.         Exit Function
  282.     End If
  283.     
  284.     s = ""
  285.     With coll
  286.         If .count = 0 Then
  287.             s = " " & sPriTableName & Chr(10) & " "
  288.             GetSQLFrom = s
  289.             Exit Function
  290.         End If
  291.         
  292.         Select Case UCase(sPriTableName)
  293.             Case UCase("PM_PayRoll")
  294.                 s = " PM_PayRoll left outer join  PM_AttendRecord  " & Chr(10) _
  295.                     & " on  PM_PayRoll.EmpID=PM_AttendRecord.EmpID and PM_PayRoll.Period=PM_AttendRecord.Period and PM_PayRoll.KjYear=PM_AttendRecord.KjYear " & Chr(10) _
  296.                     & " Left Outer Join PM_TaxData " & Chr(10) _
  297.                     & " 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)
  298.             Case UCase("PM_AttendRecord")
  299.                 s = " PM_AttendRecord left outer join  PM_PayRoll  " & Chr(10) _
  300.                     & " on  PM_PayRoll.EmpID=PM_AttendRecord.EmpID and PM_PayRoll.Period=PM_AttendRecord.Period and PM_PayRoll.KjYear=PM_AttendRecord.KjYear " & Chr(10) _
  301.                     & " Left Outer Join PM_TaxData " & Chr(10) _
  302.                     & " on PM_AttendRecord.EmpID=PM_TaxData.EmpID and PM_AttendRecord.Period=PM_TaxData.Period and PM_AttendRecord.KjYear=PM_TaxData.KjYear  " & Chr(10)
  303.             Case UCase("PM_TaxData")
  304.                 s = " PM_TaxData left outer join  PM_AttendRecord  " & Chr(10) _
  305.                     & " on  PM_TaxData.EmpID=PM_AttendRecord.EmpID and PM_TaxData.Period=PM_AttendRecord.Period and PM_TaxData.KjYear=PM_AttendRecord.KjYear " & Chr(10) _
  306.                     & " Left Outer Join PM_PayRoll " & Chr(10) _
  307.                     & " 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)
  308.             Case Else
  309.                 s = sPriTableName & " Left Outer Join PM_PayRoll on " & Chr(10) _
  310.                     & sPriTableName & ".EmpID=PM_PayRoll.EmpID " & Chr(10) _
  311.                     & " left outer join  PM_AttendRecord  " & Chr(10) _
  312.                     & " on  PM_PayRoll.EmpID=PM_AttendRecord.EmpID and PM_PayRoll.Period=PM_AttendRecord.Period and PM_PayRoll.KjYear=PM_AttendRecord.KjYear " & Chr(10) _
  313.                     & " Left Outer Join PM_TaxData " & Chr(10) _
  314.                     & " 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)
  315.         End Select
  316.                 
  317.         '连接剩下的表
  318.         For k = 1 To .count
  319.             If UCase(sPriTableName) <> UCase(.Item(k)) And _
  320.                 Trim(UCase(.Item(k))) <> "" And _
  321.                 Trim(UCase(.Item(k))) <> UCase("PM_PayRoll") And _
  322.                 Trim(UCase(.Item(k))) <> UCase("PM_AttendRecord") And _
  323.                 Trim(UCase(.Item(k))) <> UCase("PM_TaxData") Then
  324.                 s = s & " left outer join " & Trim(.Item(k)) & " on " & Trim(.Item(k)) & ".EmpID=" & sPriTableName & ".EmpID " & Chr(10)
  325.             End If
  326.         Next k
  327.         
  328.     End With
  329.     GetSQLFrom = s
  330.     Exit Function
  331. ErrCtrl:
  332.     Dim smsg As String
  333.     Dim smsgSys As String
  334.     smsg = GetError(Err.Number)
  335.     smsgSys = Err.Number & Err.Description & "!"
  336.     MsgBox IIf(smsg = "", smsgSys, smsg), vbOKOnly + vbCritical
  337. End Function
  338. Public Function AddTableFrom(coll As Collection, sName As String)
  339.     '添加用户查询必须的表
  340.     On Error GoTo ErrCtrl
  341.     Dim i As Integer
  342.     '如果没有定义查询条件,简单添加表名
  343.     '如果表名集合第一项为“”,则删除第一项
  344.     
  345.     With coll
  346.         If coll.count = 0 Then
  347.             .Add UCase(sName)
  348.             Exit Function
  349.         End If
  350.         If Trim(.Item(1)) = "" Then
  351.             .Remove (1)
  352.         End If
  353.         For i = 1 To .count
  354.             If UCase(.Item(i)) = UCase(sName) Then
  355.                 Exit For
  356.             End If
  357.         Next
  358.         If i > .count Then
  359.             .Add UCase(sName)
  360.         End If
  361.     End With
  362.     Exit Function
  363. ErrCtrl:
  364.     Dim smsg As String
  365.     Dim smsgSys As String
  366.     smsg = GetError(Err.Number)
  367.     smsgSys = Err.Number & Err.Description & "!"
  368.     MsgBox IIf(smsg = "", smsgSys, smsg), vbOKOnly + vbCritical
  369. End Function
  370. Public Function IsNodeExist(skey As String, tv As TreeView) As Boolean
  371.     '测试树是否包含Key为skey的节点
  372.     On Error GoTo ErrCtrl
  373.     Dim i As Integer
  374.     With tv
  375.         For i = 1 To .Nodes.count
  376.             If UCase(.Nodes(i).Key) = UCase(skey) Then
  377.                 IsNodeExist = True
  378.                 Exit Function
  379.             End If
  380.         Next
  381.     End With
  382.     IsNodeExist = False
  383.     Exit Function
  384. ErrCtrl:
  385.     Dim smsg As String
  386.     Dim smsgSys As String
  387.     smsg = GetError(Err.Number)
  388.     smsgSys = Err.Number & Err.Description & "!"
  389.     MsgBox IIf(smsg = "", smsgSys, smsg), vbOKOnly + vbCritical
  390. End Function
  391. Public Function FillValue2TV(sCond As String, tv As TreeView)
  392.     '填充字段的可能值,sCond 的格式为 数字@表名@编码@名称
  393.     On Error GoTo ErrCtrl
  394.     tv.Nodes.Clear
  395.     If Trim(sCond) = "" Then
  396.         Exit Function
  397.     End If
  398.     Dim sID As String
  399.     Dim sTable As String
  400.     Dim sCode As String
  401.     Dim sName As String
  402.     
  403.     Dim rs As New ADODB.Recordset
  404.     Dim s As String
  405.     tv.Nodes.Clear
  406.     
  407.     GetFieldHelp sCond, sID, sTable, sCode, sName
  408.     With tv
  409.         If UCase(sTable) = UCase("GY_Department") Then
  410.             FillDept2TV "RsPmFlag", tv, Cw_DataEnvi.DataConnect
  411.         Else
  412.             If Trim(sID) = "" Or Trim(sTable) = "" Or Trim(sCode) = "" Or Trim(sName) = "" Then
  413.                 Set rs = Nothing
  414.                 MsgBox "字段帮助出现错误!", vbOKOnly + vbCritical
  415.                 Exit Function
  416.             End If
  417.             If Trim(sID) = "0" Then
  418.                 s = "select " & sCode & " as TCode, " & sName & " as TName from " & sTable
  419.             Else
  420.                 s = "select " & sCode & " as TCode, " & sName & " as TName from " & sTable & " where SortID='" & sID & "'"
  421.             End If
  422.             
  423.             Set rs = Cw_DataEnvi.DataConnect.Execute(s)
  424.             If Not rs.EOF() Then
  425.                 .Nodes.Add , , "R", "备选值"
  426.                 Do While Not rs.EOF()
  427.                     .Nodes.Add "R", tvwChild, "R" & Trim(rs!TCode), Trim(rs!TName)
  428.                     rs.MoveNext
  429.                 Loop
  430.             End If
  431.             
  432.         End If
  433.     End With
  434.     
  435.     Exit Function
  436. ErrCtrl:
  437.     
  438.     Set rs = Nothing
  439.     Dim smsg As String
  440.     Dim smsgSys As String
  441.     smsg = GetError(Err.Number)
  442.     smsgSys = Err.Number & Err.Description & "!"
  443.     MsgBox IIf(smsg = "", smsgSys, smsg), vbOKOnly + vbCritical
  444. End Function
  445. Public Function FillDept2TV(sSysCode As String, tv As TreeView, cn As Connection)
  446.     '填充部门树
  447.     On Error GoTo ErrCtrl
  448.     Dim s As String
  449.     Dim rs As New ADODB.Recordset
  450.     Dim nod As Node
  451.     tv.Enabled = False
  452.     tv.Nodes.Clear
  453.     tv.Nodes.Add , , "R", "部门"
  454.     s = "Select DeptCode,DeptName ,ParentCode from GY_Department where " & sSysCode & "=1 order by CodeLevel"
  455.     Set rs = Cw_DataEnvi.DataConnect.Execute(s)
  456.     With rs
  457.         Do While Not .EOF()
  458.             Set nod = tv.Nodes.Add("R" & Trim(!ParentCode & ""), tvwChild, "R" & Trim(!DeptCode & ""), Trim(!DeptName & ""))
  459.             nod.Tag = Trim(!DeptCode & "")
  460.             If Trim(!ParentCode & "") = "" Then
  461.                 nod.EnsureVisible
  462.             End If
  463.             .MoveNext
  464.         Loop
  465.     End With
  466.     Set rs = Nothing
  467.     Set nod = Nothing
  468.     tv.Enabled = True
  469.     Exit Function
  470. ErrCtrl:
  471.     Set nod = Nothing
  472.     Set rs = Nothing
  473.     tv.Enabled = True
  474.     Dim smsg As String
  475.     Dim smsgSys As String
  476.     smsg = GetError(Err.Number)
  477.     smsgSys = Err.Number & Err.Description & "!"
  478.     MsgBox IIf(smsg = "", smsgSys, smsg), vbOKOnly + vbCritical
  479. End Function
  480. Public Function GetTableNameC(sTableName As String) As String
  481.     '设置表的汉语名称
  482.     Dim s As String
  483.     Select Case UCase(sTableName)
  484.         Case UCase("PM_PayRoll")
  485.             s = "工资"
  486.         Case UCase("Rs_BasicInfo")
  487.             s = "基本"
  488.         Case UCase("Rs_ExtendInfo")
  489.             s = "扩展"
  490.         Case UCase("PM_AttendRecord")
  491.             s = "考勤"
  492.         Case Else
  493.             MsgBox "不存在此表"
  494.     End Select
  495.     GetTableNameC = s
  496. End Function
  497. Public Function GetCol(sFields() As CFieldValue, iNoCol As Integer, iNameCol As Integer, Optional iBeginCol As Integer = 0) As Integer
  498.     '成功找到工号或者姓名返回1,没有找到返回0,错误返回-1
  499.     On Error GoTo ErrCtrl
  500.     Dim i As Integer
  501.     iNoCol = -1
  502.     iNameCol = -1
  503.     GetCol = -1
  504.     
  505.     For i = LBound(sFields) To UBound(sFields)
  506.         If Len(sFields(i).FieldName) >= 5 Then
  507.             If UCase(Right(sFields(i).FieldName, 5)) = UCase("EmpNo") Then
  508.                 iNoCol = i + iBeginCol
  509.             Else
  510.                 If Len(sFields(i).FieldName) >= 7 Then
  511.                     If UCase(Right(sFields(i).FieldName, 7)) = UCase("EmpName") Then
  512.                         iNameCol = i + iBeginCol
  513.                     End If
  514.                 End If
  515.             End If
  516.         End If
  517.         If iNameCol >= 0 And iNoCol >= 0 Then
  518.             Exit For
  519.         End If
  520.     Next i
  521.     If iNameCol >= 0 Or iNoCol >= 0 Then
  522.         GetCol = 1
  523.     Else
  524.         GetCol = 0
  525.     End If
  526.     Exit Function
  527.     
  528. ErrCtrl:
  529.     GetCol = -1
  530.         
  531. End Function
  532. Public Function LenByte(str1 As String) As Long
  533.   '计算字符串的字节数
  534.   Dim i As Long
  535.   Dim chr1 As String
  536.   LenByte = 0
  537.   str1 = Trim(str1)
  538.   For i = 1 To Len(str1)
  539.     chr1 = Mid(str1, i, 1)
  540.     If Asc(chr1) >= 0 And Asc(chr1) <= 255 Then
  541.       LenByte = LenByte + 1
  542.     ElseIf Asc(chr1) < 0 Then   '汉字
  543.       LenByte = LenByte + 2
  544.     End If
  545.   Next
  546. End Function
  547. Public Function PrintGrid(vs As vsFlexGrid, iVsBeginCol As Integer, iVsSumEndCol As Integer, sRCode As String, frmSetup As DY_Dyymsz, Optional bPrint As Boolean = False)
  548.     '打印网格
  549.     On Error GoTo ErrCtrl
  550.     
  551.     Dim i As Long
  552.     Dim j As Long
  553.     Dim k As Long
  554.     Dim m As Long
  555.     Dim n As Long
  556.     Dim s As String
  557.     Dim bNext As Boolean '临时变量
  558.     Dim bSumRow As Boolean '是否是合计行
  559.     Dim iStartCol As Long '打印数据开始列
  560.     Dim rs As New ADODB.Recordset
  561.     '--------------------------------------------------控制信息-------------------------------------------------
  562.     Dim iPrintStyle As Integer '打印方式 0每页输出一个表头 1每行输出一个表头
  563.     Dim iSumPerPage As Integer '1每页输出合计
  564.     Dim iSplitPage As Integer '1分页打印
  565.     Dim sRTitle As String '标题
  566.     Dim iShowAllCols As Integer '1 显示所有可见网格列
  567.     
  568.     s = "select * from PM_ReportSort where RCode='" & sRCode & "'"
  569.     Set rs = Cw_DataEnvi.DataConnect.Execute(s)
  570.     With rs
  571.         If Not .EOF() Then
  572.             iPrintStyle = !PrintStyle
  573.             iSumPerPage = !SumPerPage
  574.             iSplitPage = !SplitPage
  575.             iShowAllCols = !ShowAllCols
  576.             sRTitle = Trim(!RTitle)
  577.         Else
  578.             MsgBox "当前报表已被删除,无法读取格式!", vbOKOnly + vbCritical
  579.             Exit Function
  580.         End If
  581.     End With
  582.     Set rs = Nothing
  583.      
  584.     
  585.     
  586.     '--------------------------------------------------控制信息完成-------------------------------------------------
  587.     
  588.     '--------------------------------------------------打印参数-------------------------------------------------
  589.     '设置打印参数
  590.     If Not SetupPage(frmSetup, DY_Tybbyldy) Then
  591.         MsgBox "打印设置失败!", vbOKOnly + vbCritical
  592.         Exit Function
  593.     End If
  594.     
  595.     '读取打印设置
  596.     Dim sDataFontName As String '数据字体名称
  597.     Dim sTitleFontName As String '表头字体名称
  598.     Dim iDataFontSize As Long '数据字体大小
  599.     Dim iTitleFontSize As Long '表头字体大小
  600.     Dim iRowsPerPage As Long '每行显示数据行数
  601.     Dim bLimitRowPerPage As Boolean '是否每页限制行数
  602.     Dim iLimitRowsPerPage As Long '每页限制行数
  603.     Dim iClientHeight As Long '页面可用高度
  604.     Dim iPageLeft As Long '左边界
  605.     Dim iClientWidth As Long '页面可用宽度
  606.     Dim iPageTop As Long '上边界
  607.     Dim iTitleFontHeight As Long '标题高度
  608.     Dim iDataFontHeight As Long '数据高度
  609.     
  610.     With frmSetup
  611.         sTitleFontName = .Btztlabel.Caption
  612.         sDataFontName = .SjztLabel.Caption
  613.         iTitleFontSize = Val(.Btzhlabel.Caption)
  614.         iDataFontSize = Val(.Sjzhlabel.Caption)
  615.         bLimitRowPerPage = .ZdhsCheck.Value
  616.         iLimitRowsPerPage = Val(.BbhsText)
  617.     End With
  618.     With DY_Tybbyldy.Tydy
  619.         .StartDoc
  620.             .FontName = sTitleFontName
  621.             .FontSize = iTitleFontSize
  622.             .CalcText = "测试"
  623.             iTitleFontHeight = .TextHei
  624.             .FontName = sDataFontName
  625.             .FontSize = iDataFontSize
  626.             .CalcText = "测试"
  627.             iDataFontHeight = .TextHei
  628.         .EndDoc
  629.         .KillDoc
  630.         iPageHeight = .PageHeight
  631.         iClientHeight = .PageHeight - .MarginBottom - .MarginTop
  632.         iPageTop = .MarginTop
  633.         iClientWidth = .PageWidth - .MarginLeft - .MarginRight
  634.         iPageLeft = .MarginLeft
  635.     End With
  636.     
  637.     '--------------------------------------------------打印参数完成-------------------------------------------------
  638.     
  639.     
  640.     '--------------------------------------------------读取数据信息-------------------------------------------------
  641.     '定义打印开始列
  642.     If iShowAllCols = 1 Then
  643.         iStartCol = iVsBeginCol
  644.     Else
  645.         iStartCol = iVsSumEndCol + 1
  646.     End If
  647.     
  648.     '读取有效数据
  649.     Dim sData() As String '网格表体数据
  650.     Dim sTitle() As String '表头数据
  651.     Dim iPages() As Long '打印分页信息,第i页结束行在sData()中的位置是iPages(i)
  652.     Dim iTitleRows() As String '打印的表头行值
  653.     Dim iDataRows() As String '打印的数据行值
  654.     Dim iColsPerPage() As Long '每行在页面上的折行信息 第i行的结束列对应sData()中的iColsPerPage(i)列
  655.     Dim iCols() As Long '需要打印的列值
  656.     Dim iColWidth() As Long '需要打印的列款
  657.     Dim iColType() As Long '需要打印的列数据类型
  658.     Dim iColFormat() As String '需要打印的列格式
  659.     With vs
  660.         '读取有效列
  661.         ReDim iCols(0)
  662.         iCols(0) = 0
  663.         ReDim iColWidth(0)
  664.         iColWidth(0) = 0
  665.         ReDim iColType(0)
  666.         iColType(0) = 0
  667.         ReDim iColFormat(0)
  668.         iColFormat(0) = ""
  669.         For i = 0 To .Cols - 1
  670.             If Not .ColHidden(i) Then
  671.                 ReDim Preserve iCols(UBound(iCols) + 1)
  672.                 iCols(UBound(iCols)) = i
  673.                 ReDim Preserve iColWidth(UBound(iColWidth) + 1)
  674.                 If .ColWidth(i) >= iClientWidth Then
  675.                     
  676.                     MsgBox "纸张宽度太小不能输出报表,请重新设置!", vbOKOnly + vbCritical
  677.                     Exit Function
  678.                 End If
  679.                 iColWidth(UBound(iColWidth)) = .ColWidth(i)
  680.                 ReDim Preserve iColType(UBound(iColType) + 1)
  681.                 iColType(UBound(iColType)) = Val(.TextMatrix(0, i))
  682.                 ReDim Preserve iColFormat(UBound(iColFormat) + 1)
  683.                 iColFormat(UBound(iColFormat)) = .ColFormat(i)
  684.             End If
  685.         Next i
  686.         If UBound(iCols) = 0 Then
  687.             
  688.             Exit Function
  689.         End If
  690.         '读取有效表头行
  691.         ReDim iTitleRows(0)
  692.         iTitleRows(0) = 0
  693.         For i = 0 To .FixedRows - 1
  694.             If .RowHidden(i) = False Then
  695.                 ReDim Preserve iTitleRows(UBound(iTitleRows) + 1)
  696.                 iTitleRows(UBound(iTitleRows)) = i
  697.             End If
  698.         Next i
  699.         If UBound(iTitleRows) = 0 Then
  700.             
  701.             Exit Function
  702.         End If
  703.         '读取有效数据行
  704.         ReDim iDataRows(0)
  705.         iDataRows(0) = 0
  706.         For i = .FixedRows To .Rows - 1
  707.             If .RowHidden(i) = False Then
  708.                 ReDim Preserve iDataRows(UBound(iDataRows) + 1)
  709.                 iDataRows(UBound(iDataRows)) = i
  710.             End If
  711.         Next i
  712.         If UBound(iDataRows) = 0 Then
  713.             
  714.             Exit Function
  715.         End If
  716.         '读取表头数据
  717.         ReDim sTitle(UBound(iTitleRows) - 1, UBound(iCols) - 1)
  718.         For i = LBound(iTitleRows) + 1 To UBound(iTitleRows)
  719.             For j = LBound(iCols) + 1 To UBound(iCols)
  720.                 sTitle(i - LBound(iTitleRows) - 1, j - LBound(iCols) - 1) = .TextMatrix(iTitleRows(i), iCols(j))
  721.             Next j
  722.         Next i
  723.         '读取表体数据
  724.         ReDim sData(UBound(iDataRows) - 1, UBound(iCols) - 1)
  725.         For i = LBound(iDataRows) + 1 To UBound(iDataRows)
  726.             For j = LBound(iCols) + 1 To UBound(iCols)
  727.                 sData(i - LBound(iDataRows) - 1, j - LBound(iCols) - 1) = .TextMatrix(iDataRows(i), iCols(j))
  728.             Next j
  729.         Next i
  730.         
  731.         '--------------------------------------------------读取数据信息完成-------------------------------------------------
  732.         
  733.         '--------------------------------------------------计算打印信息-------------------------------------------------
  734.         '计算数据行折行信息
  735.         ReDim iColsPerPage(0)
  736.         iColsPerPage(0) = iStartCol
  737.         Dim iWidth As Long
  738.         iWidth = 0
  739.         For i = LBound(iColWidth) + 1 + iStartCol To UBound(iColWidth)
  740.             
  741.             iWidth = iWidth + iColWidth(i)
  742.             If iWidth > iClientWidth Then
  743.                 iWidth = 0
  744.                 i = i - 1
  745.                 ReDim Preserve iColsPerPage(UBound(iColsPerPage) + 1)
  746.                 iColsPerPage(UBound(iColsPerPage)) = i
  747.             End If
  748.         Next i
  749.         If iWidth <> 0 Then
  750.             ReDim Preserve iColsPerPage(UBound(iColsPerPage) + 1)
  751.             iColsPerPage(UBound(iColsPerPage)) = UBound(sData, 2) + 1
  752.         End If
  753.         
  754.         '计算每页可以打印的行数
  755.         If iSumPerPage = 1 Then
  756.             i = 1
  757.         Else
  758.             i = 0
  759.         End If
  760.         j = UBound(sTitle) + 2
  761.         If iPrintStyle = PRINTSTYLE_ONETITLE Then
  762.             iRowsPerPage = (iClientHeight - iTitleFontHeight - iDataFontHeight - 1000)  (UBound(iColsPerPage) * (iDataFontHeight + 100)) - i
  763.         Else
  764.             j = UBound(sTitle) + 2
  765.             iRowsPerPage = (iClientHeight - iTitleFontHeight - iDataFontHeight - 1000)  (UBound(iColsPerPage) * j * (iDataFontHeight + 250)) - i
  766.         End If
  767.         If bLimitRowPerPage = True Then
  768.             If iRowsPerPage > iLimitRowsPerPage Then
  769.                 iRowsPerPage = iLimitRowsPerPage
  770.             End If
  771.         End If
  772.         
  773.         '计算分页信息
  774.         ReDim iPages(0)
  775.         iPages(0) = -1
  776.         If iVsSumEndCol = -1 Or iSplitPage = 0 Then '如果没有分页情况,只需判断本页最多能够打印的行数
  777.             For i = LBound(sData) To UBound(sData)
  778.                 If i Mod iRowsPerPage = iRowsPerPage - 1 Then
  779.                     ReDim Preserve iPages(UBound(iPages) + 1)
  780.                     iPages(UBound(iPages)) = i
  781.                 End If
  782.             Next i
  783.         Else
  784.         '如果有分页情况,则首先判断是否是分页行,然后循环判断下边的行
  785.         '如果是合计行则加入本页(在数据行数小于可打印行数的情况下)
  786.             For i = LBound(sData) To UBound(sData) '数据行数达到最大行
  787.                 
  788.                 If (i - iPages(UBound(iPages))) Mod iRowsPerPage = 0 And i <> 0 Then
  789.                     ReDim Preserve iPages(UBound(iPages) + 1)
  790.                     iPages(UBound(iPages)) = i
  791.                     If Len(sData(i, iVsSumEndCol)) >= 3 Then
  792.                         s = Right(sData(i, iVsSumEndCol), 3)
  793.                     Else
  794.                         s = ""
  795.                     End If
  796.                         
  797.                     If s = "合计:" Or s = "小计:" Then
  798.                         bSumRow = True
  799.                     End If
  800.                 Else '合计分行
  801.                     If Len(sData(i, iVsSumEndCol)) >= 3 Then
  802.                         s = Right(sData(i, iVsSumEndCol), 3)
  803.                     Else
  804.                         s = ""
  805.                     End If
  806.                     If s = "合计:" Or s = "小计:" Or bSumRow = True Then
  807.                         bNext = False
  808.                         bSumRow = False
  809.                         For j = iVsSumEndCol To iVsBeginCol + 1 Step -1
  810.                             If Len(sData(i + 1, j - 1)) >= 3 Then
  811.                                 s = Right(sData(i + 1, j - 1), 3)
  812.                             Else
  813.                                 s = ""
  814.                             End If
  815.                             If s = "合计:" Or s = "小计:" Then
  816.                                 bNext = True
  817.                                 i = i + 1
  818.                                 '如果当前行达到最大行,分页
  819.                                 If (i - iPages(UBound(iPages))) Mod iRowsPerPage = 0 Then
  820.                                     ReDim Preserve iPages(UBound(iPages) + 1)
  821.                                     iPages(UBound(iPages)) = i
  822.                                     bNext = False
  823.                                 End If
  824.                             End If
  825.                         Next j
  826.                         '因为如果bNext=true 则数据行多移动了一行,减去
  827.                         If bNext = True Then
  828.                             i = i - 1
  829.                         End If
  830.                         '判断起始列的合计情况
  831.                         bNext = False
  832.                         Do While True
  833.                             If i < UBound(sData) Then
  834.                                 If Len(sData(i + 1, iVsBeginCol)) >= 3 Then
  835.                                     s = Right(sData(i + 1, iVsBeginCol), 3)
  836.                                 Else
  837.                                     s = ""
  838.                                 End If
  839.                                 If s = "小计:" Or s = "合计:" Then
  840.                                     i = i + 1
  841.                                     bNext = True
  842.                                 Else
  843.                                     Exit Do
  844.                                 End If
  845.                             Else
  846.                                 Exit Do
  847.                             End If
  848.                         Loop
  849.                         If bNext = True Then
  850.                             ReDim Preserve iPages(UBound(iPages) + 1)
  851.                             iPages(UBound(iPages)) = i
  852.                         End If
  853.                     End If
  854.                 End If
  855.             Next i
  856.         End If
  857.         '剩下的行也要占一页
  858.         If iPages(UBound(iPages)) <> UBound(sData) Then
  859.             ReDim Preserve iPages(UBound(iPages) + 1)
  860.             iPages(UBound(iPages)) = UBound(sData)
  861.         End If
  862.             
  863.     End With
  864.     
  865.     '合计每行的数据形成本页合计
  866.     Dim sTotal() As String
  867.     ReDim sTotal(0, 0)
  868.     If iSumPerPage = 1 Then
  869.         If UBound(iPages) >= 1 Then
  870.             ReDim sTotal(UBound(iPages) - 1, UBound(sData, 2))
  871.             For i = 0 To UBound(sTotal) '行
  872.                 For j = LBound(iCols) + 1 To UBound(iCols) '列
  873.                     If iColType(j) = DATA_NUMERIC Then
  874.                         For n = iPages(i) + 1 To iPages(i + 1)
  875.                             bNext = False
  876.                             '合计行的信息不加入本页合计
  877.                             For m = iVsBeginCol To iVsSumEndCol
  878.                                 If Len(sData(n, m)) >= 3 Then
  879.                                     s = Right(sData(n, m), 3)
  880.                                 Else
  881.                                     s = ""
  882.                                 End If
  883.                                 If s = "合计:" Or s = "小计:" Then
  884.                                     bNext = True
  885.                                     Exit For
  886.                                 End If
  887.                             Next m
  888.                             If bNext = False Then
  889.                                 sTotal(i, j - 1) = Val(sTotal(i, j - 1)) + Val(Replace(sData(n, j - 1), ",", ""))
  890.                             End If
  891.                         Next n
  892.                     End If
  893.                 Next j
  894.             Next i
  895.         End If
  896.     End If
  897.     
  898.     '格式化合计信息
  899.     If iShowAllCols = 0 Then
  900.         For i = LBound(sData) To UBound(sData)
  901.             For j = iVsSumEndCol To LBound(sData, 2) Step -1
  902.                 If Len(sData(i, j)) >= 3 Then
  903.                     s = Right(sData(i, j), 3)
  904.                 Else
  905.                     s = ""
  906.                 End If
  907.                 If s = "小计:" Then
  908.                     If i - 1 >= 0 Then
  909.                         sData(i, iVsSumEndCol + 1) = sData(i - 1, j) & s
  910.                     End If
  911.                 End If
  912.                 If sData(i, j) = "合计:" Then
  913.                     sData(i, iVsSumEndCol + 1) = "合计:"
  914.                 End If
  915.                 
  916.             Next j
  917.         Next i
  918.     End If
  919.     
  920.     '--------------------------------------------------计算打印信息-------------------------------------------------
  921.     
  922.     
  923.     '--------------------------------------------------打印数据-------------------------------------------------
  924.     '输送数据
  925.     Dim dy As Long
  926.     dy = 0
  927.     With DY_Tybbyldy.Tydy
  928.         .StartDoc
  929.             For i = LBound(iPages) + 1 To UBound(iPages)
  930.                 .FontName = sTitleFontName
  931.                 .FontSize = iTitleFontSize
  932.                 .CalcText = sRTitle
  933.                 .CurrentX = (iClientWidth - .TextWid) / 2 + iPageLeft
  934.                 .CurrentY = iPageTop
  935.                 DY_Tybbyldy.Tydy = sRTitle
  936.                 .CurrentX = (iClientWidth - .TextWid) / 2 + iPageLeft - 500
  937.                 .CurrentY = .CurrentY + 100
  938.                 .CalcText = sRTitle
  939.                 .DrawLine .CurrentX, .CurrentY, (iClientWidth + .TextWid) / 2 + iPageLeft + 500, .CurrentY
  940.                 .CurrentY = .CurrentY + 200
  941.                 .CurrentX = .MarginLeft
  942.                 .FontName = sDataFontName
  943.                 .FontSize = iDataFontSize
  944.                 dy = .CurrentY
  945.                 '打印分组信息
  946.                 If iSplitPage = 1 And iVsSumEndCol <> -1 Then
  947.                     If Len(sData(iPages(i - 1) + 1, iVsSumEndCol)) >= 3 Then
  948.                         If Right(sData(iPages(i - 1) + 1, iVsSumEndCol), 3) = "小计:" Then
  949.                             If iPages(i - 1) >= 0 Then
  950.                                 DY_Tybbyldy.Tydy = sTitle(UBound(sTitle), iVsSumEndCol) & ":" & sData(iPages(i - 1) + 1 - 1, iVsSumEndCol)
  951.                             End If
  952.                         Else
  953.                             DY_Tybbyldy.Tydy = sTitle(UBound(sTitle), iVsSumEndCol) & ":" & sData(iPages(i - 1) + 1, iVsSumEndCol)
  954.                         End If
  955.                     Else
  956.                         DY_Tybbyldy.Tydy = sTitle(UBound(sTitle), iVsSumEndCol) & ":" & sData(iPages(i - 1) + 1, iVsSumEndCol)
  957.                     End If
  958.                 End If
  959.                 .CurrentX = .PageWidth - .MarginRight - .TextWidth("第100页 共100页 ")
  960.                 .CurrentY = dy
  961.                 DY_Tybbyldy.Tydy = "第" & i & "页 共" & UBound(iPages) & "页 "
  962.                 If iPrintStyle = PRINTSTYLE_ONETITLE Then '只输出一个表头
  963.                     For j = LBound(iColsPerPage) + 1 To UBound(iColsPerPage)
  964.                         .CurrentX = .MarginLeft
  965.                         .CurrentY = .CurrentY + 100
  966.                         
  967.                         .StartTable
  968.                             '设置表格属性
  969.                             .TableCell(tcRows) = iPages(i) - iPages(i - 1) + UBound(sTitle) + 1
  970.                             .TableCell(tcCols) = iColsPerPage(j) - iColsPerPage(j - 1)
  971.                             
  972.                             For m = 1 To .TableCell(tcRows) '行高
  973.                                 .TableCell(tcRowHeight, m) = iDataFontHeight + 100
  974.                             Next m
  975.                             For m = 1 To .TableCell(tcCols) '列宽
  976.                                 .TableCell(tcColWidth, , m) = iColWidth(m + iColsPerPage(j - 1))
  977.                             Next m
  978.                             '填充表头
  979.                             For m = 1 To UBound(sTitle) + 1
  980.                                 For k = 1 To .TableCell(tcCols)
  981.                                     .TableCell(tcAlign, m, k) = 6
  982.                                     .TableCell(tcText, m, k) = Trim(sTitle(m - 1, k + iColsPerPage(j - 1) - 1))
  983.                                     .CalcText = .TableCell(tcText, m, k)
  984.                                     If (.TableCell(tcColWidth, , k) - .TextWid - 100) > 0 Then
  985.                                         .TableCell(tcText, m, k) = Space((.TableCell(tcColWidth, , k) - .TextWid - 100) / .TextWidth("测试")) & .TableCell(tcText, m, k)
  986.                                     End If
  987.                                 Next k
  988.                             Next m
  989.                             '填充数据
  990.                             For m = UBound(sTitle) + 1 + 1 To .TableCell(tcRows)
  991.                                 For k = 1 To .TableCell(tcCols)
  992.                                     If iColType(k + iColsPerPage(j - 1)) = DATA_NUMERIC Then
  993.                                         .TableCell(tcAlign, m, k) = 8 'RightMiddle
  994.                                     Else
  995.                                         .TableCell(tcAlign, m, k) = 6 'LeftMiddle
  996.                                     End If
  997.                                     If Len(sData(m + iPages(i - 1) - 1, k + iColsPerPage(j - 1) - 1)) >= 3 Then
  998.                                         If Right(sData(m + iPages(i - 1) - 1, k + iColsPerPage(j - 1) - 1), 3) <> "小计:" And _
  999.                                             Right(sData(m + iPages(i - 1) - 1, k + iColsPerPage(j - 1) - 1), 3) <> "合计:" Then
  1000.                                             s = sData(m + iPages(i - 1) - 1, k + iColsPerPage(j - 1) - 1)
  1001.                                         End If
  1002.                                     End If
  1003.                                     .TableCell(tcText, m, k) = Format(sData(m + iPages(i - 1) - 1, k + iColsPerPage(j - 1) - 1), iColFormat(k + iColsPerPage(j - 1)))
  1004.                                 Next k
  1005.                             Next m
  1006.                             '填充合计信息
  1007.                             If iSumPerPage = 1 And UBound(sTotal) > 0 Then
  1008.                                 .TableCell(tcRows) = .TableCell(tcRows) + 1
  1009.                                 .TableCell(tcRowHeight, .TableCell(tcRows)) = iDataFontHeight + 100
  1010.                                 For k = 1 To .TableCell(tcCols)
  1011.                                     If iColType(k + iColsPerPage(j - 1)) = DATA_NUMERIC Then
  1012.                                         .TableCell(tcAlign, .TableCell(tcRows), k) = 8 'RightMiddle
  1013.                                     Else
  1014.                                         .TableCell(tcAlign, .TableCell(tcRows), k) = 6 'LeftMiddle
  1015.                                     End If
  1016.                                     .TableCell(tcText, .TableCell(tcRows), k) = Format(sTotal(i - 1, k + iColsPerPage(j - 1) - 1), iColFormat(k + iColsPerPage(j - 1)))
  1017.                                 Next k
  1018.                                 If j = 1 Then
  1019.                                     .TableCell(tcText, .TableCell(tcRows), 1) = "本页小计:"
  1020.                                 End If
  1021.                             End If
  1022.                         .EndTable
  1023.                     Next j
  1024.                 Else '每行数据输出表头
  1025.                     For n = iPages(i - 1) + 1 To iPages(i) 'n为数据行
  1026.                         For j = LBound(iColsPerPage) + 1 To UBound(iColsPerPage) 'j为一个数据行分的断
  1027.                             .CurrentX = .MarginLeft
  1028.                             .CurrentY = .CurrentY + 100
  1029.                             
  1030.                             .StartTable
  1031.                                 '设置表格属性
  1032.                                 .TableCell(tcRows) = UBound(sTitle) + 1 + 1
  1033.                                 .TableCell(tcCols) = iColsPerPage(j) - iColsPerPage(j - 1)
  1034.                                 
  1035.                                 For m = 1 To .TableCell(tcRows) '行高
  1036.                                     .TableCell(tcRowHeight, m) = iDataFontHeight + 100
  1037.                                 Next m
  1038.                                 For m = 1 To .TableCell(tcCols) '列宽
  1039.                                     .TableCell(tcColWidth, , m) = iColWidth(m + iColsPerPage(j - 1))
  1040.                                 Next m
  1041.                                 '填充表头
  1042.                                 For m = 1 To UBound(sTitle) + 1
  1043.                                     For k = 1 To .TableCell(tcCols)
  1044.                                         .TableCell(tcAlign, m, k) = 6
  1045.                                         .TableCell(tcText, m, k) = Trim(sTitle(m - 1, k + iColsPerPage(j - 1) - 1))
  1046.                                         .CalcText = .TableCell(tcText, m, k)
  1047.                                         If (.TableCell(tcColWidth, , k) - .TextWid - 100) > 0 Then
  1048.                                             .TableCell(tcText, m, k) = Space((.TableCell(tcColWidth, , k) - .TextWid - 100) / .TextWidth("测试")) & .TableCell(tcText, m, k)
  1049.                                         End If
  1050.                                     Next k
  1051.                                 Next m
  1052.                                 '填充数据
  1053.                                 For k = 1 To .TableCell(tcCols)
  1054.                                     If iColType(k + iColsPerPage(j - 1)) = DATA_NUMERIC Then
  1055.                                         .TableCell(tcAlign, m, k) = 8 'RightMiddle
  1056.                                     Else
  1057.                                         .TableCell(tcAlign, m, k) = 6 'LeftMiddle
  1058.                                     End If
  1059.                                     .TableCell(tcText, .TableCell(tcRows), k) = Format(sData(n, k + iColsPerPage(j - 1) - 1), iColFormat(k + iColsPerPage(j - 1) - 1))
  1060.                                 Next k
  1061.                                 
  1062.                             .EndTable
  1063.                         Next j
  1064.                         '如果不是本页的最后一行并且后边没有本业合计,添加分隔线
  1065.                         If n <> iPages(i) Or iSumPerPage = 1 Then
  1066.                             .CurrentY = .CurrentY + 200
  1067.                             .CurrentX = .MarginLeft
  1068.                             .PenStyle = psDash
  1069.                             .DrawLine .CurrentX, .CurrentY, .PageWidth - .MarginRight, .CurrentY
  1070.                             .PenStyle = psSolid
  1071.                         End If
  1072.                         
  1073.                     Next n
  1074.                     
  1075.                     '添加本页合计信息
  1076.                     If iSumPerPage = 1 Then
  1077.                         For j = LBound(iColsPerPage) + 1 To UBound(iColsPerPage) 'j为一个数据行分的断
  1078.                             .CurrentX = .MarginLeft
  1079.                             .CurrentY = .CurrentY + 100
  1080.                             .StartTable
  1081.                                 '设置表格属性
  1082.                                 .TableCell(tcRows) = UBound(sTitle) + 1 + 1
  1083.                                 .TableCell(tcCols) = iColsPerPage(j) - iColsPerPage(j - 1)
  1084.                                 
  1085.                                 For m = 1 To .TableCell(tcRows) '行高
  1086.                                     .TableCell(tcRowHeight, m) = iDataFontHeight + 100
  1087.                                 Next m
  1088.                                 For m = 1 To .TableCell(tcCols) '列宽
  1089.                                     .TableCell(tcColWidth, , m) = iColWidth(m + iColsPerPage(j - 1))
  1090.                                 Next m
  1091.                                 '填充表头
  1092.                                 For m = 1 To UBound(sTitle) + 1
  1093.                                     For k = 1 To .TableCell(tcCols)
  1094.                                         .TableCell(tcAlign, m, k) = 6
  1095.                                         .TableCell(tcText, m, k) = Trim(sTitle(m - 1, k + iColsPerPage(j - 1) - 1))
  1096.                                         .CalcText = .TableCell(tcText, m, k)
  1097.                                         If (.TableCell(tcColWidth, , k) - .TextWid - 100) > 0 Then
  1098.                                             .TableCell(tcText, m, k) = Space((.TableCell(tcColWidth, , k) - .TextWid - 100) / .TextWidth("测试")) & .TableCell(tcText, m, k)
  1099.                                         End If
  1100.                                     Next k
  1101.                                 Next m
  1102.                                 '填充数据
  1103.                                 For k = 1 To .TableCell(tcCols)
  1104.                                     If iColType(k + iColsPerPage(j - 1)) = DATA_NUMERIC Then
  1105.                                         .TableCell(tcAlign, m, k) = 8 'RightMiddle
  1106.                                     Else
  1107.                                         .TableCell(tcAlign, m, k) = 6 'LeftMiddle
  1108.                                     End If
  1109.                                     .TableCell(tcText, .TableCell(tcRows), k) = Format(sTotal(i - 1, k + iColsPerPage(j - 1) - 1), iColFormat(k + iColsPerPage(j - 1)))
  1110.                                 Next k
  1111.                                 If j = LBound(iColsPerPage) + 1 Then
  1112.                                     .TableCell(tcText, .TableCell(tcRows), 1) = "本页小计:"
  1113.                                 End If
  1114.                             .EndTable
  1115.                         Next j
  1116.                     End If
  1117.                     
  1118.                 End If
  1119.                 If i <> UBound(iPages) Then
  1120.                     .NewPage
  1121.                 End If
  1122.             Next i
  1123.         .EndDoc
  1124.         DY_Tybbyldy.PageHScroll.Max = .Pagecount
  1125.         DY_Tybbyldy.PageHScroll.Min = 1
  1126.         DY_Tybbyldy.PageHScroll.Value = 1
  1127.     End With
  1128.     If bPrint = False Then
  1129.         DY_Tybbyldy.Show 1
  1130.     Else
  1131.         DY_Tybbyldy.Tydy.PrintDoc
  1132.     End If
  1133.     
  1134.     Exit Function
  1135. ErrCtrl:
  1136.     Set rs = Nothing
  1137. End Function
  1138. Public Function SetupPage(frmSetup As DY_Dyymsz, frmPrint As DY_Tybbyldy) As Boolean
  1139.     Dim Tsxx As String
  1140.     Dim Papername(1 To 70) As String
  1141.   
  1142.     Papername(1) = "Letter, 8 1/2 x 11 英寸"
  1143.     Papername(2) = "Letter Small, 8