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

企业管理

开发平台:

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