www.pudn.com > VB-KAOQINXITONG.zip > frmWkTmRetouch.frm


VERSION 5.00 
Object = "{86CF1D34-0C5F-11D2-A9FC-0000F8754DA1}#2.0#0"; "MSCOMCT2.OCX" 
Object = "{831FDD16-0C5C-11D2-A9FC-0000F8754DA1}#2.0#0"; "MSCOMCTL.OCX" 
Object = "{CFBDEFBA-4F23-11D7-910C-00000E55E64F}#5.0#0"; "BNListTree.ocx" 
Object = "{B9D938CE-50EE-40B2-9FA2-79A3112F4788}#4.2#0"; "BNCtrlGroup.ocx" 
Begin VB.Form frmWkTmRetouch  
   ClientHeight    =   4230 
   ClientLeft      =   2085 
   ClientTop       =   2280 
   ClientWidth     =   4230 
   Icon            =   "frmWkTmRetouch.frx":0000 
   LinkTopic       =   "Form1" 
   LockControls    =   -1  'True 
   MaxButton       =   0   'False 
   ScaleHeight     =   4230 
   ScaleWidth      =   4230 
   StartUpPosition =   2  '屏幕中心 
   Begin MSComctlLib.ProgressBar ProgressBar1  
      Align           =   2  'Align Bottom 
      Height          =   135 
      Left            =   0 
      TabIndex        =   15 
      Top             =   3795 
      Visible         =   0   'False 
      Width           =   4230 
      _ExtentX        =   7461 
      _ExtentY        =   238 
      _Version        =   393216 
      Appearance      =   0 
   End 
   Begin MSComctlLib.StatusBar StatusBar1  
      Align           =   2  'Align Bottom 
      Height          =   300 
      Left            =   0 
      TabIndex        =   14 
      Top             =   3930 
      Width           =   4230 
      _ExtentX        =   7461 
      _ExtentY        =   529 
      _Version        =   393216 
      BeginProperty Panels {8E3867A5-8586-11D1-B16A-00C0F0283628}  
         NumPanels       =   2 
         BeginProperty Panel1 {8E3867AB-8586-11D1-B16A-00C0F0283628}  
            AutoSize        =   1 
            Object.Width           =   4392 
         EndProperty 
         BeginProperty Panel2 {8E3867AB-8586-11D1-B16A-00C0F0283628}  
         EndProperty 
      EndProperty 
   End 
   Begin VB.ListBox lstEvents  
      Height          =   2940 
      Left            =   4515 
      TabIndex        =   13 
      Top             =   60 
      Width           =   4035 
   End 
   Begin VB.Frame Frame1  
      Appearance      =   0  'Flat 
      ForeColor       =   &H80000008& 
      Height          =   3825 
      Left            =   0 
      TabIndex        =   1 
      Top             =   -75 
      Width           =   4185 
      Begin BNListTreeProj.BNListTree BNListTree1  
         Height          =   330 
         Left            =   240 
         TabIndex        =   2 
         Top             =   270 
         Width           =   3840 
         _ExtentX        =   6773 
         _ExtentY        =   503 
         BeginProperty ToolTipFont {0BE35203-8F91-11CE-9DE3-00AA004BB851}  
            Name            =   "宋体" 
            Size            =   9 
            Charset         =   134 
            Weight          =   400 
            Underline       =   0   'False 
            Italic          =   0   'False 
            Strikethrough   =   0   'False 
         EndProperty 
         TreeHeight      =   211 
         TreePos         =   1 
         TreeVisible     =   0   'False 
         SizeLock        =   0   'False 
         BarWidth        =   187 
         Text            =   "" 
      End 
      Begin VB.Timer tmrExcute  
         Enabled         =   0   'False 
         Interval        =   100 
         Left            =   3555 
         Top             =   3870 
      End 
      Begin BNCtrlGroup.BNButton cmdStop  
         Height          =   375 
         Left            =   1440 
         TabIndex        =   6 
         Tag             =   "Stop" 
         Top             =   3030 
         Width           =   1200 
         _ExtentX        =   2117 
         _ExtentY        =   661 
         Caption         =   "停 止" 
         CapAlign        =   2 
         BackStyle       =   2 
         BeginProperty Font {0BE35203-8F91-11CE-9DE3-00AA004BB851}  
            Name            =   "宋体" 
            Size            =   10.5 
            Charset         =   134 
            Weight          =   400 
            Underline       =   0   'False 
            Italic          =   0   'False 
            Strikethrough   =   0   'False 
         EndProperty 
         Mode            =   0 
         Value           =   0   'False 
         cBack           =   -2147483633 
      End 
      Begin BNCtrlGroup.BNButton cmdExit  
         Cancel          =   -1  'True 
         Height          =   375 
         Left            =   2670 
         TabIndex        =   7 
         Tag             =   "Exit" 
         Top             =   3030 
         Width           =   1200 
         _ExtentX        =   2117 
         _ExtentY        =   661 
         Caption         =   "退 出" 
         CapAlign        =   2 
         BackStyle       =   2 
         BeginProperty Font {0BE35203-8F91-11CE-9DE3-00AA004BB851}  
            Name            =   "宋体" 
            Size            =   10.5 
            Charset         =   134 
            Weight          =   400 
            Underline       =   0   'False 
            Italic          =   0   'False 
            Strikethrough   =   0   'False 
         EndProperty 
         Mode            =   0 
         Value           =   0   'False 
         cBack           =   -2147483633 
      End 
      Begin BNCtrlGroup.BNButton cmdCalWkTm  
         Height          =   375 
         Left            =   210 
         TabIndex        =   5 
         Tag             =   "Excute" 
         Top             =   3030 
         Width           =   1200 
         _ExtentX        =   2117 
         _ExtentY        =   661 
         Caption         =   "计 算" 
         CapAlign        =   2 
         BackStyle       =   2 
         BeginProperty Font {0BE35203-8F91-11CE-9DE3-00AA004BB851}  
            Name            =   "宋体" 
            Size            =   10.5 
            Charset         =   134 
            Weight          =   400 
            Underline       =   0   'False 
            Italic          =   0   'False 
            Strikethrough   =   0   'False 
         EndProperty 
         Mode            =   0 
         Value           =   0   'False 
         cBack           =   -2147483633 
      End 
      Begin MSComCtl2.DTPicker dtpRange  
         Height          =   330 
         Index           =   1 
         Left            =   1290 
         TabIndex        =   4 
         Top             =   1740 
         Width           =   2805 
         _ExtentX        =   4948 
         _ExtentY        =   582 
         _Version        =   393216 
         BeginProperty Font {0BE35203-8F91-11CE-9DE3-00AA004BB851}  
            Name            =   "宋体" 
            Size            =   10.5 
            Charset         =   134 
            Weight          =   400 
            Underline       =   0   'False 
            Italic          =   0   'False 
            Strikethrough   =   0   'False 
         EndProperty 
         Format          =   23789568 
         CurrentDate     =   36455 
      End 
      Begin MSComCtl2.DTPicker dtpRange  
         Height          =   330 
         Index           =   0 
         Left            =   1290 
         TabIndex        =   3 
         Top             =   1270 
         Width           =   2805 
         _ExtentX        =   4948 
         _ExtentY        =   582 
         _Version        =   393216 
         BeginProperty Font {0BE35203-8F91-11CE-9DE3-00AA004BB851}  
            Name            =   "宋体" 
            Size            =   10.5 
            Charset         =   134 
            Weight          =   400 
            Underline       =   0   'False 
            Italic          =   0   'False 
            Strikethrough   =   0   'False 
         EndProperty 
         Format          =   23789568 
         CurrentDate     =   36455 
         MaxDate         =   44196 
         MinDate         =   35431 
      End 
      Begin BNCtrlGroup.BNComboBox cobEmployee  
         Height          =   330 
         Left            =   1305 
         TabIndex        =   0 
         Top             =   800 
         Width           =   2805 
         _ExtentX        =   0 
         _ExtentY        =   0 
         BackColor       =   14737632 
         BackColor       =   14737632 
         BackColor       =   14737632 
      End 
      Begin VB.CheckBox chkAutoSign  
         Alignment       =   1  'Right Justify 
         Appearance      =   0  'Flat 
         Caption         =   "自动签卡:" 
         BeginProperty Font  
            Name            =   "宋体" 
            Size            =   10.5 
            Charset         =   134 
            Weight          =   400 
            Underline       =   0   'False 
            Italic          =   0   'False 
            Strikethrough   =   0   'False 
         EndProperty 
         ForeColor       =   &H80000008& 
         Height          =   255 
         Left            =   120 
         TabIndex        =   18 
         Top             =   2265 
         Width           =   1335 
      End 
      Begin BNCtrlGroup.BNButton cmdFind  
         Height          =   375 
         Index           =   0 
         Left            =   2565 
         TabIndex        =   8 
         Tag             =   "See" 
         Top             =   2205 
         Width           =   1530 
         _ExtentX        =   2699 
         _ExtentY        =   661 
         Caption         =   "按卡号查找" 
         CapAlign        =   2 
         BackStyle       =   2 
         BeginProperty Font {0BE35203-8F91-11CE-9DE3-00AA004BB851}  
            Name            =   "宋体" 
            Size            =   10.5 
            Charset         =   134 
            Weight          =   400 
            Underline       =   0   'False 
            Italic          =   0   'False 
            Strikethrough   =   0   'False 
         EndProperty 
         Mode            =   0 
         Value           =   0   'False 
         cBack           =   -2147483633 
      End 
      Begin VB.Line Line1  
         BorderColor     =   &H80000010& 
         BorderStyle     =   6  'Inside Solid 
         Index           =   3 
         X1              =   30 
         X2              =   4155 
         Y1              =   2865 
         Y2              =   2865 
      End 
      Begin VB.Line Line1  
         BorderColor     =   &H80000005& 
         BorderStyle     =   6  'Inside Solid 
         Index           =   2 
         X1              =   30 
         X2              =   4185 
         Y1              =   2880 
         Y2              =   2880 
      End 
      Begin VB.Label Label3  
         Alignment       =   1  'Right Justify 
         AutoSize        =   -1  'True 
         Caption         =   "部   门:" 
         BeginProperty Font  
            Name            =   "宋体" 
            Size            =   10.5 
            Charset         =   134 
            Weight          =   400 
            Underline       =   0   'False 
            Italic          =   0   'False 
            Strikethrough   =   0   'False 
         EndProperty 
         Height          =   210 
         Index           =   0 
         Left            =   120 
         TabIndex        =   11 
         Top             =   360 
         Width           =   840 
      End 
      Begin VB.Label Label3  
         Alignment       =   1  'Right Justify 
         AutoSize        =   -1  'True 
         Caption         =   "员   工:" 
         BeginProperty Font  
            Name            =   "宋体" 
            Size            =   10.5 
            Charset         =   134 
            Weight          =   400 
            Underline       =   0   'False 
            Italic          =   0   'False 
            Strikethrough   =   0   'False 
         EndProperty 
         Height          =   210 
         Index           =   1 
         Left            =   120 
         TabIndex        =   12 
         Top             =   840 
         Width           =   840 
      End 
      Begin VB.Label Label1  
         Alignment       =   1  'Right Justify 
         AutoSize        =   -1  'True 
         Caption         =   "开始日期:" 
         BeginProperty Font  
            Name            =   "宋体" 
            Size            =   10.5 
            Charset         =   134 
            Weight          =   400 
            Underline       =   0   'False 
            Italic          =   0   'False 
            Strikethrough   =   0   'False 
         EndProperty 
         Height          =   210 
         Left            =   120 
         TabIndex        =   10 
         Top             =   1320 
         Width           =   945 
      End 
      Begin VB.Label Label2  
         AutoSize        =   -1  'True 
         Caption         =   "结束日期:" 
         BeginProperty Font  
            Name            =   "宋体" 
            Size            =   10.5 
            Charset         =   134 
            Weight          =   400 
            Underline       =   0   'False 
            Italic          =   0   'False 
            Strikethrough   =   0   'False 
         EndProperty 
         Height          =   210 
         Left            =   120 
         TabIndex        =   9 
         Top             =   1800 
         Width           =   945 
      End 
   End 
   Begin BNCtrlGroup.BNButton cmdClear  
      Height          =   345 
      Left            =   4545 
      TabIndex        =   16 
      Tag             =   "Delete" 
      Top             =   3300 
      Width           =   1335 
      _ExtentX        =   2355 
      _ExtentY        =   609 
      Caption         =   "清除事件" 
      CapAlign        =   2 
      BeginProperty Font {0BE35203-8F91-11CE-9DE3-00AA004BB851}  
         Name            =   "宋体" 
         Size            =   9 
         Charset         =   134 
         Weight          =   400 
         Underline       =   0   'False 
         Italic          =   0   'False 
         Strikethrough   =   0   'False 
      EndProperty 
      Mode            =   0 
      Value           =   0   'False 
      cBack           =   -2147483633 
   End 
   Begin BNCtrlGroup.BNButton cmdSave  
      Height          =   345 
      Left            =   6015 
      TabIndex        =   17 
      Tag             =   "Save" 
      Top             =   3300 
      Width           =   1335 
      _ExtentX        =   2355 
      _ExtentY        =   609 
      Caption         =   "保存事件" 
      CapAlign        =   2 
      BeginProperty Font {0BE35203-8F91-11CE-9DE3-00AA004BB851}  
         Name            =   "宋体" 
         Size            =   9 
         Charset         =   134 
         Weight          =   400 
         Underline       =   0   'False 
         Italic          =   0   'False 
         Strikethrough   =   0   'False 
      EndProperty 
      Mode            =   0 
      Value           =   0   'False 
      cBack           =   -2147483633 
   End 
End 
Attribute VB_Name = "frmWkTmRetouch" 
Attribute VB_GlobalNameSpace = False 
Attribute VB_Creatable = False 
Attribute VB_PredeclaredId = True 
Attribute VB_Exposed = False 
'以下是关于表 T6621a001(考勤明细) 中的字段定义 
 
'A0186:   状态标志       C6675:   夜班工时       E6649:   工伤           E6682:   旷工2 
'A0187:   加班类型       C6680:   额定正班工时   E6651:   公休假         E6683:   旷工3 
'A0189:   员工编号       E0122:   机构编号       E6653:   补休假         E6684:   旷工4 
'B0110:   单位编号       E6600:   考勤登记时间   E6655:   厂休假         E6685:   旷工5 
'C6609:   日正班段工时   E6602:   日正班段加班   E6656:   停工           E6686:   旷工6 
'C6610:   星期           E6603:   特卡工时       E6657:   计生假         E6687:   旷工7 
'C6616:   休日工时       E6604:   应上工时       E6658:   年假           E6688:   旷工8 
'C6617:   日加班工时     E6606:   出勤工时       E6659:   婚检假         E6691:   早退1 
'C6618:   法定假工时     E6608:   标准工时       E6660:   其他假1        E6692:   早退2 
'C6621:   班次时间1      E6609:   平日特卡工时   E6661:   产检假         E6693:   早退3 
'C6622:   班次时间2      E6610:   休日特卡工时   E6662:   放假           E6694:   早退4 
'C6623:   班次时间3      E6611:   节假日特卡工时 E6663:   其他假2        E6695:   扣罚5 
'C6624:   班次时间4      E6623:   旷工工时       E6664:   其他假3        E6696:   扣罚6 
'C6625:   班次时间5      E6625:   报表出勤天数   E6665:   出差           E6697:   扣罚7 
'C6626:   班次时间6      E6626:   出勤天数       E6667:   外勤           E6698:   扣罚8 
'C6627:   班次时间7      E6627:   迟到工时       E6671:   迟到1          E6699:   班次代码 
'C6628:   班次时间8      E6630:   加班段工时     E6672:   迟到2          ID:      索引 
'C6630:   班次调整工时   E6633:   早退工时       E6673:   迟到3          W0075:  状态 
'C6631:   打卡1          E6635:   调休工时       E6674:   迟到4          W0076: 状态2 
'C6632:   打卡2          E6636:   总扣罚工时     E6675:   扣罚1          W0030:   备注 
'C6633:   打卡3          E6637:   病假           E6676:   扣罚2          W6622:   早班天数 
'C6634:   打卡4          E6639:   事假           E6677:   扣罚3          W6623:   白班天数 
'C6635:   打卡5          E6641:   婚假           E6678:   扣罚4          W6624:   夜班天数 
'C6636:   打卡6          E6643:   产假           E6679:   有工时假       W6646:   工作状态标志 
'C6637:   打卡7          E6645:   丧假           E6680:   无工时假       W6648:   特卡起始时间 
'C6638:   打卡8          E6647:   探亲假         E6681:   旷工1          W6649:   特卡结束时间 
 
Option Explicit 
 
  Dim mbStop            As Boolean 
  Dim mlWidth           As Long 
  Dim mlCardID          As Long 
  Dim mTDateRange       As DateRange 
  Dim msEmpNum          As String 
  Dim madoEmployeeRS    As ADODB.Recordset 
  Dim madoResultRS      As ADODB.Recordset 
  Dim madoSwitchRS      As ADODB.Recordset 
  Dim mTWorkChange()    As WorkChange 
  Dim msDebugFields     As String 
   
Private Sub Form_Unload(Cancel As Integer) 
  Set madoEmployeeRS = Nothing 
  Set madoResultRS = Nothing 
  Set madoSwitchRS = Nothing 
  SavePickStruct BNListTree1, mTDateRange, cobEmployee 
End Sub 
 
'本段程序加编号的原因是:一旦计算出错,便知道在哪行 
Private Sub tmrExcute_Timer() 
  Dim sCondition As String 
  Dim sSQL       As String 
  Dim bSelectAll As Boolean 
  Dim l          As Long 
  Dim lTemp      As Long 
  Dim sinTemp    As Single 
  Dim i          As Integer 
  Dim bFlag      As Boolean 
  Dim iSaturday()   As Integer 
  Dim sSplitMan 
  Dim DRange     As DateRange 
 
   
10      On Error GoTo ErrLabel 
 
        '    关闭定时器,避免代码重复执行. 
20      tmrExcute.Enabled = False 
 
        '    在计算过程中,计算机根据此标志决定是否继续计算,如果此标志置位,则停止计算. 
30      mbStop = False 
 
        '|***************************** 选择员工开始 ************************************ 
        '|* 
        '|*    如果所给出的条件无效,则根本不进行计算!函数退出. 
40      If Not IsValidSQL(BNListTree1.UnitList, BNListTree1.DeptList, _ 
                          cobEmployee.Text, mTDateRange.DStart, mTDateRange.DEnd, cobEmployee.ListCount) Then GoTo StopCalcute 
        '    如果经过检验有效,则继续进行计算.此时,将选择员工列表中显示的值. 
        '    在后面,我们会看到,如果显示的值为VALUE_ALL_STR,则计算员工列表中所有 
        '的员工,否则,只计算显示出的那个员工. 
        '    得到员工列表中的数值 
 
        '判断部门是否全部被选择了 
50      If BNListTree1.Nodes.Count = BNListTree1.SelectedCount Then 
60        bSelectAll = True 
70      End If 
80      msEmpNum = gclsCommon.CBNGetFirstData(cobEmployee.Text) 
90      If msEmpNum = VALUE_ALL_STR Then 
          '    如果显示为VALUE_ALL_STR,则通过函数 CBNGetComboList 来得到全部员工的工号列表, 
          '用逗号分割,后面,通过转换,将这些合法的员工直接放到 SQL 查询语句中. 
100       msEmpNum = gclsCommon.CBNGetComboList(cobEmployee) 
110     End If 
120     sSplitMan = Split(msEmpNum, ",") 
130     ReDim iSaturday(UBound(sSplitMan)) 
        '|* 
        '|**************************** 选择员工结束 ************************************ 
 
        '   置鼠标忙标志 
140     Screen.MousePointer = vbHourglass 
        '置位进度工具条 
150     ProgressBar1.Value = 0 
160     StatusBar1.Panels(1).Text = "正在修正出勤" 
 
        '    在计算时,将使某些按纽失效 
170     cmdCalWkTm.Enabled = False 
180     cmdExit.Enabled = False 
 
 
        '|************************* 加载考勤明细数据开始 ************************************ 
        '|* 
190     StatusBar1.Panels(1).Text = "加载考勤明细数据" 
200     sSQL = gclsCommon.CBNGetCondition(BNListTree1.UnitList, BNListTree1.DeptList, msEmpNum, _ 
                          "E6600", gclsInclude.MyDateOf(mTDateRange.DStart), gclsInclude.MyDateOf(mTDateRange.DEnd)) 
 
210     sSQL = IIf(sSQL = "", "", " WHERE " & sSQL) 
220     sSQL = gclsCommon.CBNCSql(Trim("SELECT * FROM T6621A001 " & sSQL)) 
230     Set madoResultRS = New ADODB.Recordset 
240     madoResultRS.Open sSQL, gDBRecordConn, adOpenStatic, adLockOptimistic 
250     If madoResultRS.RecordCount = 0 Then 
260       MsgBox "指定的范围内没有考勤数据,请先计算后在运行本修正程序!" 
270       GoTo StopCalcute 
280     End If 
        '|* 
        '|************************* 加载考勤明细数据结束 ************************************ 
 
 
        '|************************* 加载换班状态开始 ************************************ 
        '|* 
290     StatusBar1.Panels(1).Text = "加载换班状态数据" 
300     sSQL = gclsCommon.CBNGetCondition(BNListTree1.UnitList, BNListTree1.DeptList, msEmpNum, _ 
                          "W6616,W6617", gclsInclude.MyDateOf(mTDateRange.DStart), gclsInclude.MyDateOf(mTDateRange.DEnd)) 
 
310     sSQL = IIf(sSQL = "", "", " WHERE " & sSQL) 
320     sSQL = gclsCommon.CBNCSql(Trim("SELECT * FROM T6650A001 " & sSQL)) 
330     Set madoSwitchRS = New ADODB.Recordset 
340     madoSwitchRS.Open sSQL, gDBRecordConn, adOpenStatic, adLockOptimistic 
        '|* 
        '|************************* 加载考勤明细数据结束 ************************************ 
 
 
        '|************************* 加载工时调换数据开始 ************************************ 
        '|* 
350     sCondition = gclsCommon.CBNGetCondition(BNListTree1.UnitList, BNListTree1.DeptList, msEmpNum, _ 
                                "W6616", gclsInclude.MyDateOf(mTDateRange.DStart), gclsInclude.MyDateOf(mTDateRange.DEnd)) 
360     sCondition = IIf(sCondition = "", "", " WHERE" & sCondition) 
370     StatusBar1.Panels(1).Text = "正在加载工时调换数据" 
380     If sCondition <> "" Then 
390       i = InStr(1, sCondition, "(W6616") 
400       sSQL = Mid(sCondition, i) 
410       sSQL = Left(sCondition, i - 1) & "(" & sSQL & " OR " & Replace(sSQL, "W6616", "W6617") & ") ORDER BY A0189" 
420       mTWorkChange = GetWorkChange(sSQL) 
430     Else 
440       ReDim mTWorkChange(0) 
450     End If 
        '|* 
        '|************************* 加载工时调换数据结束 ************************************ 
 
460     For i = 1 To UBound(mTWorkChange) 
          '情况1、6 ,在表T6650A001中,如果存在该调换数据,则在成功调换后将标志A0196=1 
470       If mTWorkChange(i).FromDate < mTDateRange.DStart Or mTWorkChange(i).FromDate > mTDateRange.DEnd Then 
      '      MsgBox "情况1、6" '(模式1) 
480         If LoCanSwitchWork(1, mTWorkChange(i), sinTemp) Then 
490           If sinTemp > 0 Then 
500             LoWorkTo mTWorkChange(i), sinTemp 
510           End If 
520         End If 
          '情况2和情况5,在表T6650A001中写入新的调换数据,并将标志A0196=0 
530       ElseIf mTWorkChange(i).ToDate < mTDateRange.DStart Or mTWorkChange(i).ToDate > mTDateRange.DEnd Then 
      '      MsgBox "情况2、5" '(模式2) 
540         If LoWorkFrom(mTWorkChange(i), sinTemp) Then  '如果调换成功 
550           If LoCanSwitchWork(2, mTWorkChange(i), sinTemp) Then 
560           End If 
570         End If 
          '情况3和情况4,成功调换后在表T6650A001中写入新的调换数据,并将标志A0196=1 
580       Else '情况3、4 
      '      MsgBox "情况3、4" '(模式3) 
            '如果有休工时,则调换休工时即可 
590         If LoWorkFrom(mTWorkChange(i), sinTemp) Then  '如果调换成功 
600           If LoCanSwitchWork(3, mTWorkChange(i), sinTemp) Then 
610             LoWorkTo mTWorkChange(i), sinTemp 
620           Else 
630             MsgBox "LoCanSwitchWork Err" 
640           End If 
650         Else 
660           MsgBox "LoWorkFrom Err" 
670         End If 
680       End If 
690     Next i 
 
700     If gTAttendCtl.MustAddTime = 0 Then GoTo LastProcessLabel 
 
710     madoResultRS.Filter = 0 
        '    将进度条的最大值设置为要计算的员工值,这样,每计算一个员工,进度条将增加一个值 
720     ProgressBar1.Max = madoResultRS.RecordCount 
730     ProgressBar1.Visible = True 
 
740     With madoResultRS 
750       For l = 1 To .RecordCount 
760         DoEvents 
770         If mbStop Then GoTo StopCalcute 
780         StatusBar1.Panels(1).Text = "出勤修正" & !A0189 & "的数据" 
790         If !E6606 = 0 And !C6616 = 0 Then GoTo NextLabel '没有日工时也没有休日工时 
800         ProgressBar1.Value = l 
810         If (!W6646 And WK_SATURDAY) > 0 And (!W6646 And WK_REST) > 0 Then '周六超过八小时的都是特卡 
 
              '   本代码仅针对客户B,林朝2002-7-3日邮件说: 
              '   对于月薪,加班类型为9的问题,修正: 
              '   1.星期六的加班段加班算调休,同平时一样,不应算加班工资,例:17:00-18:00 
              '这一小时是有加班费,18:00之后的加班不计加班费. 
              '   2.星期天加班算调休,不算加班费。 
              '   3.当月有5个星期六的,最后一个星期六的加班工时算调休,或者可以不来上班, 
              '来上班的可以算调休,总之每个月的休工时,只能是算4个星期六的加班工时. 
 
              '   但是,在2002-7-10日,客户B的林朝打电话说,休日的工时只计算每月最多4个周六 
              '9小时内的工时,对于周日以及超出4个周六的工时,则全部记为调休. 
820           If !A0187 = 9 Then 'A0187:   加班类型 
830             For i = 0 To UBound(iSaturday) 
840               If sSplitMan(i) = !A0189 Then 
850                 lTemp = i 
860                 Exit For 
870               End If 
880             Next i 
890             If !C6616 > 0 Then 'C6616:休日工时 
                  '2003-1-15日根据林朝的要求将以下的为改为5 
900               If iSaturday(lTemp) < 5 Then '只计算前4周的周六工时 
910                 iSaturday(lTemp) = iSaturday(lTemp) + 1 
920               Else 
930                 GoTo RestProcessLabel 
940               End If 
950             End If 
960           End If 
970           If !C6616 > !E6608 Then 
980             !W6646 = !W6646 Or WK_SPECARD 
990             If !A0187 = 9 Then 
1000              If !C6616 > !C6680 Then 'C6680: 正班工时 
1010                !E6603 = !C6680 - !E6608 
1020                !E6635 = !C6616 - !E6608 - !E6603 
1030                If !E6635 < 0 Then !E6635 = 0 
1040              Else 
1050                !E6603 = !C6616 - !E6608 'E6608:   标准工时 
1060              End If 
1070            Else 
1080              !E6603 = !C6616 - !E6608 
1090            End If 
1100            !C6616 = !E6608 'C6616: 休日工时 
1110            !E6630 = !E6630 - !E6603 - !E6635: If !E6630 < 0 Then !E6630 = 0 'E6630: 加班段工时 
1120            !C6609 = !E6608  'C6609: 日正班段工时 
1130            !E6602 = 0 'E6602: 日正班段加班 
1140            !E6610 = !E6603 
1150            If gTAttendCtl.FeastRestToDay Then 
1160              !E6606 = !C6616 
1170            End If 
1180            LoCalculateSpeCard WK_SATURDAY 
1190          End If 
1200        ElseIf !W6646 And WK_FEAST Then 
1210          If !C6618 > gTAttendCtl.MustAddTime Then   '法定假超过3小时为特卡 
1220            !W6646 = !W6646 Or WK_SPECARD 
1230            !E6603 = !C6618 - gTAttendCtl.MustAddTime 
1240            !C6618 = gTAttendCtl.MustAddTime 
1250            !E6606 = !E6606 - !E6603 
1260            !E6630 = !E6630 - !E6603 
1270            !E6611 = !E6603 
1280            .Update 
1290            LoCalculateSpeCard WK_FEAST 
1300          End If 
1310        ElseIf !C6616 > 0 Then   '周日全天都是特卡 
 
RestProcessLabel: 
 
1320            If !A0187 = 9 Then 
1330              !W6646 = !W6646 Or WK_SWITCHREST 
1340              !E6635 = !C6616 
1350            Else 
1360              !W6646 = !W6646 Or WK_SPECARD 
1370              !E6603 = !C6616 
1380              !E6610 = !E6603 
1390            End If 
1400            !C6609 = 0 'C6609: 日正班段工时 
1410            !C6616 = 0 'C6616: 休日工时 
1420            !E6630 = 0 'E6630: 加班段工时 
1430            !E6625 = 0 'E6625: 
1440            LoCalculateSpeCard WK_REST 
1450        ElseIf !C6617 > gTAttendCtl.MustAddTime Then '日加班工时 
1460            !W6646 = !W6646 Or WK_SPECARD 
1470            !E6603 = !C6617 - gTAttendCtl.MustAddTime 'E6603: 特卡段工时 
1480            !C6617 = !C6617 - !E6603 
1490            !E6630 = !E6630 - !E6603 'E6630: 加班段工时 
1500            If !E6630 < 0 Then 
1510              !C6609 = !C6609 + !E6630 'C6609: 日正班段工时 
1520              !E6602 = !E6602 + !E6630: If !E6602 < 0 Then !E6602 = 0 'E6602: 日正班段加班 
1530              !E6630 = 0 
1540            End If 
1550            !E6606 = !E6606 - !E6603 'E6606: 出勤工时 
1560            !E6609 = !E6603 
1570            .Update 
1580            LoCalculateSpeCard WK_OVERTIME 
1590        End If 
 
NextLabel: 
 
1600        For i = 1 To CLASS_SEC * 2 
1610          If .Fields("C663" & i) > 0 Then 
1620            gDBRecordConn.Execute gclsCommon.CBNCSql("UPDATE T0109A001 SET W1113 = '0' WHERE (A0189 = '" & !A0189 & "') AND (W0031 = #" & .Fields("C663" & i) & "#) AND (W1113 <> '1')") 
1630          End If 
1640        Next i 
1650        .MoveNext 
1660      Next l 
1670    End With 
 
LastProcessLabel: 
 
        '将表中所有的打卡数据为零的项置为空 
1680    For i = 1 To CLASS_SEC * 2 
1690      sSQL = gclsCommon.CBNGetCondition(BNListTree1.UnitList, BNListTree1.DeptList, msEmpNum, _ 
                          "E6600", gclsInclude.MyDateOf(mTDateRange.DStart), gclsInclude.MyDateOf(mTDateRange.DEnd)) 
 
1700      sSQL = IIf(sSQL = "", "", " AND " & sSQL) 
1710      If gTAppLicInfo.SoftNetwork Then 
1720        sSQL = "UPDATE T6621A001 SET C663" & i & " = NULL WHERE (C663" & i & " = '1899-12-30')" & sSQL 
1730      Else 
1740        sSQL = "UPDATE T6621A001 SET C663" & i & " = NULL WHERE (C663" & i & " = #0#)" & sSQL 
1750      End If 
1760      gDBRecordConn.Execute sSQL 
1770    Next i 
 
StopCalcute: 
 
1780    StatusBar1.Panels(1).Text = "出勤修正计算完毕" 
1790    Screen.MousePointer = vbNormal 
1800    msEmpNum = "" 
1810    mbStop = False 
1820    cmdCalWkTm.Enabled = True 
1830    cmdExit.Enabled = True 
1840    ProgressBar1.Visible = False 
1850  Exit Sub 
 
ErrLabel: 
  LoShowErr "发生错误,错误号=" & Err & ",错误原因=" & Err.Description & ",位置=" & Erl 
  LoShowErr "错误位置:员工号=" & msEmpNum & ",错误模块=cmdCalWkTmClick" 
  Resume Next 
End Sub 
 
Private Sub cmdExit_Click() 
  Unload Me 
End Sub 
 
Private Sub cmdStop_Click() 
  mbStop = True 
End Sub 
 
Private Sub dtpRange_Click(Index As Integer) 
  Select Case Index 
    Case 0 
      mTDateRange.DStart = dtpRange(Index).Value 
      If mTDateRange.DStart > mTDateRange.DEnd Then 
        dtpRange(1 - Index).Value = mTDateRange.DStart 
        mTDateRange.DEnd = mTDateRange.DStart 
      End If 
    Case 1 
      mTDateRange.DEnd = dtpRange(Index).Value 
      If mTDateRange.DStart > mTDateRange.DEnd Then 
        dtpRange(1 - Index).Value = mTDateRange.DEnd 
        mTDateRange.DStart = mTDateRange.DEnd 
      End If 
  End Select 
End Sub 
 
Private Sub dtpRange_Change(Index As Integer) 
  dtpRange_Click Index 
End Sub 
 
Private Sub lstEvents_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single) 
  If Button = 0 Then ' 如果没有按钮被按下 
    lstEvents.ToolTipText = gclsInclude.MyGetLstText(lstEvents, x, y) 
  End If 
End Sub 
 
Private Sub Form_Load() 
  On Error GoTo ErrLabel 
  LoSetButtonTag 
  SetIcon Me 
   
  mbStop = False 
   
  BNListTree1.RefuseDeptList = gTOperRight.RefuseDeptRight 
  gclsCommon.CBNFillBNListTree BNListTree1 
  LoadPickStruct BNListTree1, mTDateRange, cobEmployee 
   
  dtpRange(0).Value = mTDateRange.DStart 
  dtpRange(1).Value = mTDateRange.DEnd 
  mlCardID = 0 
   
  Caption = "员工考勤计算修正" 
  mlWidth = Me.Width 
  msDebugFields = "A0186,A0187,A0189,B0110,C6609,C6610,C6616,C6617,C6618,C6621,C6622,C6623,C6624,C6625,C6626,C6630," & _ 
                  "C6631,C6632,C6633,C6634,C6635,C6636,C6675,C6680,E0122,E6600,E6602,E6603,E6604,E6606,E6608," & _ 
                  "E6623,E6626,E6627,E6630,E6633,E6635,E6636,E6699,W0030,W6646,W6648,W6649" 
 
  Exit Sub 
ErrLabel: 
  LoShowErr "发生错误,错误号=" & Err & ",错误原因=" & Err.Description & ",错误模块=FormLoad" 
End Sub 
 
Private Sub Form_Resize() 
  If Me.Width > 8805 Then 
    lstEvents.Width = Me.Width - lstEvents.Left - 200 
  Else 
    lstEvents.Width = 4035 
  End If 
End Sub 
 
Private Sub cmdClear_Click() 
  lstEvents.Clear 
  Me.Width = mlWidth 
End Sub 
 
Private Sub cmdCalWkTm_Click() 
  tmrExcute.Enabled = True 
End Sub 
 
Private Sub cmdFind_Click(Index As Integer) 
  Dim sSQL As String 
  Dim sField As String 
  Dim sDeptSQL As String 
  Dim bCancle As Boolean 
  Dim sRet As String 
  sRet = Switch(Index = 0, gTPickStruct.TempNumberLists, Index = 1, gTPickStruct.TempNameLists) 
  sField = Switch(Index = 0, "A0189", Index = 1, "A0101") 
  sSQL = gclsCommon.CBNShowSearchWindows(sField, , bCancle, , sRet, sRet) 
   
  If sSQL <> "" Then 
    If sRet <> "" Then 
      If Index = 0 Then 
        gTPickStruct.TempNumberLists = sRet 
      ElseIf Index = 1 Then 
        gTPickStruct.TempNameLists = sRet 
      End If 
    End If 
    BNListTree1.Text = "" 
    LoListEmployee "", "", sSQL 
  Else 
    If bCancle Then 
      StatusBar1.Panels(1).Text = "未输入有效的员工" 
    Else 
      MsgBox "未输入有效的员工", vbCritical 
    End If 
  End If 
End Sub 
 
Private Sub LoSetButtonTag() 
  cmdStop.Tag = "IMG047" 
  cmdExit.Tag = "IMG029" 
  cmdCalWkTm.Tag = "IMG028" 
  cmdClear.Tag = "IMG021" 
  cmdSave.Tag = "IMG041" 
  cmdFind(0).Tag = "IMG031" 
End Sub 
 
Private Sub LoShowErr(ByVal fsMsg As String) 
  If Width < 8410 Then 
    Width = lstEvents.Left + lstEvents.Width + 300 
  End If 
  lstEvents.AddItem fsMsg 
End Sub 
 
Private Sub LoListEmployee(ByVal fsUnitNo As String, _ 
                           ByVal fsDeptNo As String, _ 
                           Optional fsEmpList As String) 
  cobEmployee.Clear 
  cobEmployee.AddItem VALUE_ALL_STR 
  cobEmployee.ItemData(cobEmployee.NewIndex) = 0 
  StatusBar1.Panels(1).Text = "正在加载员工数据" 
  If Len(fsEmpList) > 0 Then 
    gclsCommon.CBNFillEmpCombo cobEmployee, "", "", fsEmpList 
  ElseIf Len(fsUnitNo) + Len(fsDeptNo) > 0 Then 
    gclsCommon.CBNFillEmpCombo cobEmployee, fsUnitNo, fsDeptNo 
  End If 
  If cobEmployee.ListCount > 0 Then cobEmployee.ListIndex = 0 
  StatusBar1.Panels(1).Text = "加载员工数据完毕" 
End Sub 
 
Private Sub BNListTree1_NodeSelect(ByVal UnitLists As String, ByVal DeptLists As String) 
  If Len(UnitLists) + Len(DeptLists) = 0 Then Exit Sub 
  LoListEmployee UnitLists, DeptLists 
End Sub 
 
Private Function LoCanSwitchWork(fiMode As Integer, fTWorkChange As WorkChange, fsinActValue As Single) As Boolean 
    '情况1、6(模式1),在表T6650A001中,如果存在该调换数据,则在成功调换后将标志A0186=1 
    '情况2、5(模式2),在表T6650A001中写入新的调换数据,并将标志A0186=0 
    '情况3、4(模式3),成功调换后在表T6650A001中写入新的调换数据,并将标志A0186=1 
 
'以下是关于表 T6650A001(工时调换状态) 中的字段定义 
 
'A0186: 状态标志      W6606: 工时数        W6617: 工时被调日期 
'A0189: 员工编号      W6616: 工时调换日期 
 
  With madoSwitchRS 
    madoResultRS.Filter = gclsCommon.CBNCSql("A0189 = '" & fTWorkChange.EmplyeeNum & "' AND E6600 = #" & gclsCommon.CBNGetStandDate(fTWorkChange.ToDate) & "#") 
    LoCanSwitchWork = madoResultRS.RecordCount > 0 '表示可以调换 
    .Filter = gclsCommon.CBNCSql("(A0189 = '" & fTWorkChange.EmplyeeNum & _ 
                                 "') AND (W6616 = #" & gclsCommon.CBNGetStandDate(fTWorkChange.ToDate) & "#" & _ 
                                 ") AND (W6617 = #" & gclsCommon.CBNGetStandDate(fTWorkChange.FromDate) & "#)") 
    Select Case fiMode 
      Case 1 
        If .RecordCount > 0 Then 
          !A0186 = 1 
          fsinActValue = !W6606 
          .Update 
        Else 
          LoCanSwitchWork = False 
        End If 
      Case 2, 3 
        If .RecordCount = 0 Then 
          .AddNew 
          !A0189 = fTWorkChange.EmplyeeNum 
          !W6617 = fTWorkChange.FromDate 
          !W6616 = fTWorkChange.ToDate 
        End If 
        !W6606 = fsinActValue 
        !A0186 = IIf(LoCanSwitchWork, IIf(fiMode = 2, 0, 1), 0) 
        .Update 
    End Select 
  End With 
End Function 
 
Private Function LoWorkFrom(fTWorkChange As WorkChange, fsinRet As Single) As Boolean 
    Dim i As Integer 
    Dim lWorktime As Long 
    fsinRet = 0 
    With madoResultRS 
      .Filter = gclsCommon.CBNCSql("A0189 = '" & fTWorkChange.EmplyeeNum & "' AND E6600 = #" & gclsCommon.CBNGetStandDate(fTWorkChange.FromDate) & "#") 
      If .RecordCount > 0 Then 
        If !W6646 And WK_FEAST Then '对于法定假工时,加班部分为:法定假工时+休日工时 
          If fTWorkChange.FromWorkMode = WK_OVERTIME Then 
            fsinRet = IIf(!C6618 + !C6616 + !E6602 > fTWorkChange.Value, fTWorkChange.Value, !C6618 + !C6616 + !E6602) 'C6618: 法定假工时;C6616: 休日工时;E6602: 日正班段加班 
            !C6618 = !C6618 - fsinRet 
            If !C6618 < 0 Then 
              !C6616 = !C6616 + !C6618: !C6618 = 0 
              If !C6616 < 0 Then 
                !E6602 = !E6602 + !C6616: !C6616 = 0 
              End If 
            End If 
            !E6630 = !E6630 - fsinRet: If !E6630 < 0 Then !E6630 = 0 
            !E6606 = !E6606 - fsinRet 
          ElseIf fTWorkChange.FromWorkMode = WK_NORMAL Then 
            fsinRet = IIf(!E6608 > fTWorkChange.Value, fTWorkChange.Value, !E6608) 'E6608: 标准工时 
            !E6606 = !E6606 - fsinRet: If !E6606 < 0 Then !E6606 = 0 'E6606: 出勤工时 
            !C6609 = !C6609 - fsinRet 'C6609: 日正班段工时 
            If !C6609 < !E6602 Then !C6609 = !E6602 'E6602: 日正班段加班 
          ElseIf fTWorkChange.FromWorkMode = WK_ALLSWITCH Then 
            fsinRet = !E6606 
            !C6609 = 0 
            !E6630 = 0 
            !E6602 = 0 
            !C6618 = 0 
            !C6616 = 0 
            !C6617 = 0 
            For i = 1 To CLASS_SEC * 2 
              .Fields("C663" & i) = 0 
            Next i 
            !E6626 = 0 
          End If 
          lWorktime = 0 
        ElseIf !C6616 > 0 Then '对于休日只有休日工时,因此不必理会是哪种工时 
          fsinRet = IIf(!C6616 > fTWorkChange.Value, fTWorkChange.Value, !C6616) 
          !E6606 = !E6606 - fsinRet: If !E6606 < 0 Then !E6606 = 0 'E6606: 出勤工时 
          If fTWorkChange.FromWorkMode = WK_OVERTIME Then 
            !C6675 = !C6675 - fsinRet: If !C6675 < 0 Then !C6675 = 0 'C6675: 夜班工时 
            !E6630 = !E6630 - fsinRet 'E6630: 加班段工时 
            If !E6630 < 0 Then 
              !C6609 = !C6609 + !E6630: If !C6609 < 0 Then !C6609 = 0 'C6609: 日正班段工时 
              !E6630 = 0 
            End If 
          ElseIf fTWorkChange.FromWorkMode = WK_NORMAL Then 
            !C6609 = !C6609 - fsinRet 'C6609: 日正班段工时 
            If !C6609 < 0 Then 
              !E6630 = !E6630 + !C6609: If !E6630 < 0 Then !E6630 = 0 'E6630: 加班段工时 
              !C6609 = 0 
            End If 
          ElseIf fTWorkChange.FromWorkMode = WK_ALLSWITCH Then 
            fsinRet = !C6616 
            !C6609 = 0 
            !E6630 = 0 
            !E6602 = 0 
            !C6617 = 0 
            For i = 1 To CLASS_SEC * 2 
              .Fields("C663" & i) = 0 
            Next i 
            !E6626 = 0 
          End If 
          !C6616 = !C6616 - fsinRet 
          lWorktime = !C6616 
        ElseIf !E6606 > 0 Then 'E6606: 出勤工时 
          If fTWorkChange.FromWorkMode = WK_OVERTIME Then 
            fsinRet = IIf(!C6617 > fTWorkChange.Value, fTWorkChange.Value, !C6617) 'C6617: 日加班工时 
            !E6606 = !E6606 - fsinRet: If !E6606 < 0 Then !E6606 = 0 'E6606: 出勤工时 
            !C6617 = !C6617 - fsinRet: If !C6617 < 0 Then !C6617 = 0 'C6617: 日加班工时 
            !E6630 = !E6630 - fsinRet 'E6630: 加班段工时 
            If !E6630 < 0 Then '还要扣除正班段的加班 
              !E6602 = !E6602 + !E6630 'E6602: 日正班段加班 
              !C6609 = !C6609 + !E6630 'C6609: 日正班段工时 
              !E6630 = 0 
            End If 
            !C6675 = !C6675 - fsinRet: If !C6675 < 0 Then !C6675 = 0 'C6675: 夜班工时 
          ElseIf fTWorkChange.FromWorkMode = WK_NORMAL Then 
            fsinRet = IIf(!C6609 - !E6602 > fTWorkChange.Value, fTWorkChange.Value, !C6609 - !E6602) 'C6609: 日正班段工时;E6602: 日正班段加班 
            !E6606 = !E6606 - fsinRet: If !E6606 < 0 Then !E6606 = 0 'E6606: 出勤工时 
            !C6609 = !C6609 - fsinRet 'C6609: 日正班段工时 
            If !C6609 < !E6602 Then !C6609 = !E6602 'E6602: 日正班段加班 
          ElseIf fTWorkChange.FromWorkMode = WK_ALLSWITCH Then 
            fsinRet = !E6606 
            !E6606 = 0 'E6606: 出勤工时 
            !C6609 = 0 'C6609: 日正班段工时 
            !E6602 = 0 'E6602: 日正班段加班 
            !C6617 = 0 'C6617: 日加班工时 
            For i = 1 To CLASS_SEC * 2 
              .Fields("C663" & i) = 0 
            Next i 
            !E6626 = 0 
          End If 
          lWorktime = !E6606 
        ElseIf !E6699 = NO_CLASS Then '对于无班次,工时交换失败 
          LoWorkFrom = False 
          Exit Function 
        End If 
        If !E6608 > 0 Then !E6626 = lWorktime / !E6608 
        If !E6626 > 1 Then !E6626 = 1 
        If fsinRet > 0 Then !W0030 = !W0030 & GetNote(WK_TOCLASS, fsinRet & "T" & Day(fTWorkChange.ToDate)) 
        !W6646 = !W6646 Or WK_FROMCLASS 
        !E6625 = !E6626 
        If Left(!W0030, 1) = "," Then !W0030 = Mid(!W0030, 2) 
        LoMakeOneDayCard 
        .Update 
        LoWorkFrom = True 
      End If 
    End With 
End Function 
 
Private Function LoWorkTo(fTWorkChange As WorkChange, fsinValue As Single) As Boolean 
    If fsinValue = 0 Then Exit Function 
    With madoResultRS 
      .Filter = gclsCommon.CBNCSql("A0189 = '" & fTWorkChange.EmplyeeNum & "' AND E6600 = #" & gclsCommon.CBNGetStandDate(fTWorkChange.ToDate) & "#") 
      If .RecordCount > 0 Then 
        LoWorkTo = True 
        !E6623 = 0 'E6623: 旷工工时 
        !E6627 = 0 'E6627: 迟到工时 
        !E6633 = 0 'E6633: 早退工时 
        !E6636 = 0 'E6636: 总扣罚工时 
        !E6626 = Round(!E6626 + fsinValue / !E6608, 1) 'E6626: 出勤天数 
        If !E6626 > 1 Then !E6626 = 1 
        If !E6606 < 0 Then !E6606 = 0 'E6606: 出勤工时 
        !W6646 = !W6646 Or WK_TOCLASS 
        If !E6699 = NO_CLASS Then '对于无班次,则直接将该数据填入结果表中 
          !E6606 = !E6606 + fsinValue 'E6606: 出勤工时 
          If fTWorkChange.ToWorkMode = WK_OVERTIME Then 
            !C6617 = !C6617 + fsinValue 'C6617: 日加班工时 
            !E6630 = !E6630 + fsinValue 'E6630: 加班段工时 
          ElseIf fTWorkChange.ToWorkMode = WK_NORMAL Then 
            !C6609 = !C6609 + fsinValue 'C6609: 日正班段工时 
          ElseIf fTWorkChange.ToWorkMode = WK_ALLSWITCH Then '全天调换 
            !C6609 = !C6609 + fsinValue 'C6609: 日正班段工时 
          End If 
          !W6646 = !W6646 Or WK_TOCLASS 
        ElseIf !W6646 And WK_REST Then '如果是周日或周六 
          If gTAttendCtl.FeastRestToDay Then !E6606 = !E6606 + fsinValue 'E6606: 出勤工时 
          !C6609 = !C6609 + fsinValue 'C6609: 日正班段工时 
          !C6616 = !C6616 + fsinValue 'C6616: 休日工时 
        Else 
          !E6606 = !E6606 + fsinValue 'E6606: 出勤工时 
          If fTWorkChange.ToWorkMode = WK_OVERTIME Then 
            !C6617 = !C6617 + fsinValue 'C6617: 日加班工时 
            !E6630 = !E6630 + fsinValue 'E6630: 加班段工时 
          ElseIf fTWorkChange.ToWorkMode = WK_NORMAL Then 
            !C6609 = !C6609 + fsinValue 'C6609: 日正班段工时 
            If !C6609 > !E6608 Then 'E6608: 标准工时 
              !E6602 = !C6609 - !E6608 'E6602: 日正班段加班 
              !C6617 = !E6630 + !E6602 'C6617: 日加班工时 
            End If 
          ElseIf fTWorkChange.ToWorkMode = WK_ALLSWITCH Then '全天调换 
            '需要重新计算加班以及正班时间,根据当天的班次情况重新安排工时 
            !C6609 = IIf(!E6606 > !C6680, !C6680, !E6606) 'C6680: 正班工时;C6609: 日加班工时 
            !E6602 = !C6609 - !E6608: If !E6602 < 0 Then !E6602 = 0 'E6602: 日正班段加班;E6608: 标准工时 
            !E6630 = !E6606 - !C6609 'E6630: 加班段工时 
            !C6617 = !E6602 + !E6630 'C6617: 日加班工时 
          End If 
        End If 
         
        If !W6646 And WK_ABSENT Then !W6646 = !W6646 Xor WK_ABSENT '有旷工 
        If !W6646 And WK_LATE Then !W6646 = !W6646 Xor WK_LATE '有旷工 
        If !W6646 And WK_EARLY Then !W6646 = !W6646 Xor WK_EARLY '有旷工 
        If !W6646 And WK_PUNISH Then !W6646 = !W6646 Xor WK_PUNISH '有旷工 
         
        '修改备注,去掉缺卡显示 
        !W0030 = gclsInclude.MyTrimSymbol(gclsInclude.MyReplace(!W0030 & ",", "缺卡*,", "")) 
        LoMakeOneDayCard 
        If fsinValue > 0 Then !W0030 = !W0030 & GetNote(WK_FROMCLASS, _ 
                         Switch(fTWorkChange.ToWorkMode = WK_OVERTIME, "加", _ 
                                fTWorkChange.ToWorkMode = WK_NORMAL, "正", _ 
                                fTWorkChange.ToWorkMode = WK_ALLSWITCH, "全") & _ 
                                fsinValue & "F" & Day(fTWorkChange.FromDate)) 
        If Left(!W0030, 1) = "," Then !W0030 = Mid(!W0030, 2) 
        .Update 
      End If 
    End With 
End Function 
 
'根据工时以及班次用计算机自动做出一天的卡数据 
Private Sub LoMakeOneDayCard() 
    Dim iCount As Integer 
    Dim i As Integer 
    Dim lWorktime As Long 
    Dim lTotal As Long 
    Dim sRndSeed(2) As String 
    Dim DInsertTime() As Date '插入的数据,能显示的卡 
    Dim bFlag As Boolean 
     
    With madoResultRS 
      sRndSeed(0) = !A0189 
      sRndSeed(1) = !E6600 
      ReDim DInsertTime(0) 
      iCount = !A0186 And 7 '本班次共iCount段 
       
      For i = 1 To iCount * 2 
        .Fields("C663" & i) = 0 
      Next i 
       
      If !W6646 And WK_FEAST Then 
        lWorktime = 60 * (!C6616 + !C6618) 
      ElseIf !C6616 > 0 Then 
        lWorktime = 60 * !C6616 
      Else 
        lWorktime = 60 * !E6606 
      End If 
       
      For i = 1 To iCount 
          bFlag = False 
          lTotal = lTotal + DateDiff("n", .Fields("C662" & (2 * i - 1)), .Fields("C662" & (2 * i))) 
          sRndSeed(2) = 2 * i - 1 
          .Fields("C663" & (2 * i - 1)) = DateAdd("s", -gclsInclude.MyGetFixRandom(sRndSeed) * 200, .Fields("C662" & (2 * i - 1))) 
          sRndSeed(2) = 2 * i 
          If lWorktime >= lTotal Then 
            If i = iCount Then 
              .Fields("C663" & (2 * i)) = DateAdd("s", 60 * (lWorktime - lTotal) + gclsInclude.MyGetFixRandom(sRndSeed) * 200, .Fields("C662" & (2 * i - 1))) 
              bFlag = True 
            Else 
              .Fields("C663" & (2 * i)) = DateAdd("s", gclsInclude.MyGetFixRandom(sRndSeed) * 200, .Fields("C662" & (2 * i))) 
            End If 
          Else 
            .Fields("C663" & (2 * i)) = DateAdd("s", 60 * (lWorktime - lTotal) + gclsInclude.MyGetFixRandom(sRndSeed) * 200, .Fields("C662" & (2 * i))) 
            bFlag = True 
          End If 
          If DateDiff("n", .Fields("C663" & (2 * i - 1)), .Fields("C663" & (2 * i))) < 20 Then '20分钟以内 
            .Fields("C663" & (2 * i - 1)) = 0 
            .Fields("C663" & (2 * i)) = 0 
          End If 
          If DInsertTime(0) > 0 Then ReDim Preserve DInsertTime(UBound(DInsertTime) + 1) 
          DInsertTime(UBound(DInsertTime)) = .Fields("C663" & (2 * i - 1)) 
          ReDim Preserve DInsertTime(UBound(DInsertTime) + 1) 
          DInsertTime(UBound(DInsertTime)) = .Fields("C663" & (2 * i)) 
          If bFlag Then Exit For 
      Next i 
      lTotal = 0 
      For i = 1 To iCount 
        lTotal = lTotal + DateDiff("n", .Fields("C663" & (2 * i - 1)), .Fields("C663" & (2 * i))) 
      Next i 
  '    StatusBar1.Panels(1).Text = "正在插入特卡打卡数据" 
      For i = 0 To UBound(DInsertTime) 
          If DInsertTime(i) > 0 Then 
            gDBRecordConn.Execute "INSERT INTO T0109A001(A0199,W0031,A0189,W1001,W1002,W1028,W1113) VALUES('-1','" & _ 
                                  DInsertTime(i) & "','" & !A0189 & "',0,1,0,'1')" 
          End If 
      Next i 
    End With 
End Sub 
 
Private Function LoCalculateSpeCard(ByVal fWorkState As WorkState) As Boolean 
  Dim i As Integer 
  Dim j As Integer 
  Dim iCount As Integer 
  Dim lTotal As Long 
  Dim lLast As Long 
  Dim iSplit As Integer 
  Dim TDateRange As DateRange 
  Dim DInsertTime() As Date '插入的数据,能显示的卡 
  Dim sRndSeed(2) As String 
   
  With madoResultRS 
'    .Update 
    iCount = !A0186 And 7 '本班次共iCount段 
    lTotal = 0 
    ReDim DInsertTime(0) 
    sRndSeed(0) = !A0189 
    sRndSeed(1) = !E6600 
    Select Case fWorkState 
      Case WK_SATURDAY, WK_OVERTIME, WK_FEAST 
        For i = 1 To iCount 
          If .Fields("C663" & (i * 2 - 1)) > 0 And .Fields("C663" & (i * 2)) > 0 Then '如果有两次的打卡记录 
            If !A0186 And 2 ^ (i + 2) Then '表示有加班段 
              If .Fields("C663" & (i * 2 - 1)) > .Fields("C663" & (i * 2)) Then '如果上班推迟 
                TDateRange.DStart = .Fields("C663" & (i * 2 - 1)) 
                TDateRange.DEnd = .Fields("C663" & (i * 2)) 
              Else 
                TDateRange.DStart = .Fields("C662" & (i * 2 - 1)) 
                TDateRange.DEnd = .Fields("C663" & (i * 2)) 
              End If 
            Else 
              TDateRange.DStart = .Fields("C662" & (i * 2 - 1)) 
              TDateRange.DEnd = .Fields("C662" & (i * 2)) 
            End If 
          End If 
          lLast = DateDiff("n", TDateRange.DStart, TDateRange.DEnd) 
          lTotal = lTotal + lLast 
          '先不考虑 
          If (lTotal >= 60 * (!C6609 + !E6630)) Then 'C6609:日正班段工时;E6630:加班段工时;C6630:班次调整工时 
            If i <> iCount Then 
              For j = iCount To 1 Step -1 
                If .Fields("C663" & (j * 2 - 1)) > 0 And .Fields("C663" & (j * 2)) > 0 Then '如果有两次的打卡记录 
                  TDateRange.DEnd = .Fields("C663" & (j * 2)) 
                  Exit For 
                End If 
              Next j 
            End If 
            !W6649 = TDateRange.DEnd 
            iSplit = i * 2 
            For j = iSplit To 2 * CLASS_SEC:  .Fields("C663" & j) = 0:  Next j 
            .Fields("C662" & iSplit) = DateAdd("n", 60 * (!C6609 + !E6630) + lLast - lTotal, TDateRange.DStart) 
            If iCount = 1 Then '对于只有一个打卡时段的情况 
              If gclsInclude.MyCountsOfTime(.Fields("C662" & iSplit - 1), .Fields("C662" & iSplit), #12:00:00 PM#) > 0 Then 
                If DateDiff("h", .Fields("C662" & iSplit - 1), !E6600 + #12:00:00 PM#) > 1 And _ 
                   DateDiff("h", !E6600 + #12:00:00 PM#, .Fields("C662" & iSplit)) > 1 Then  '如果包括吃中饭的时间 
                   .Fields("C662" & iSplit) = DateAdd("h", 1, .Fields("C662" & iSplit)) 
                End If 
              End If 
              If gclsInclude.MyCountsOfTime(.Fields("C662" & iSplit - 1), .Fields("C662" & iSplit), #5:00:00 PM#) > 0 Then 
                If DateDiff("h", .Fields("C662" & iSplit - 1), !E6600 + #5:00:00 PM#) > 1 And _ 
                   DateDiff("h", !E6600 + #5:00:00 PM#, .Fields("C662" & iSplit)) > 1 Then    '如果包括吃午饭的时间 
                   .Fields("C662" & iSplit) = DateAdd("h", 1, .Fields("C662" & iSplit)) 
                End If 
              End If 
              If gclsInclude.MyCountsOfTime(.Fields("C662" & iSplit - 1), .Fields("C662" & iSplit), #11:00:00 PM#) > 0 Then 
                If DateDiff("h", .Fields("C662" & iSplit - 1), !E6600 + #11:00:00 PM#) > 1 And _ 
                   DateDiff("h", !E6600 + #11:00:00 PM#, .Fields("C662" & iSplit)) > 1 Then    '如果包括吃晚饭的时间 
                   .Fields("C662" & iSplit) = DateAdd("n", 30, .Fields("C662" & iSplit)) 
                End If 
              End If 
            End If 
            sRndSeed(2) = iSplit 
            .Fields("C663" & iSplit) = DateAdd("s", gclsInclude.MyGetFixRandom(sRndSeed) * 400, .Fields("C662" & iSplit)) 
            Debug.Print gclsCommon.CBNGetTblStructNote("T6621A001", 2, True, gclsCommon.CBNCSql("A0189 = '" & _ 
                                                        !A0189 & "' AND E6600 = #" & gclsCommon.CBNGetStandDate(!E6600) & "#")) 
            If !W6649 > 0 Then 
              If Minute(!W6649) > 30 Then 
                TDateRange.DEnd = Format(!W6649, "YYYY-MM-DD HH:30:00") 
              Else 
                TDateRange.DEnd = Format(!W6649, "YYYY-MM-DD HH:00:00") 
              End If 
              sRndSeed(2) = iSplit + 1 
              !W6648 = DateAdd("s", -20 - gclsInclude.MyGetFixRandom(sRndSeed) * 300 - (!E6635 + !E6603) * 3600, TDateRange.DEnd) 'E6635:调休工时;E6603:特卡工时 
            End If 
            Exit For 
          End If 
        Next i 
      Case WK_REST 
          '休日取一首一尾 
          iSplit = 1 
          For i = 1 To iCount 
            If .Fields("C663" & (i * 2 - 1)) > 0 And .Fields("C663" & (i * 2)) > 0 Then 
              !W6648 = .Fields("C663" & (i * 2 - 1)) 
              Exit For 
            End If 
          Next i 
          For i = iCount To 1 Step -1 
            If .Fields("C663" & (i * 2 - 1)) > 0 And .Fields("C663" & (i * 2)) > 0 Then 
              !W6649 = .Fields("C663" & (i * 2)) 
              Exit For 
            End If 
          Next i 
          For i = 1 To CLASS_SEC * 2: .Fields("C663" & i) = 0: Next i 
            '将以上的第一个时间作为特卡的下班时间,第二个为上班时间 
            '规定:在T0109A001中,当W1113=1或当W1113=3时为计算机自动加入的特卡, 
            '但当W1113=1时是需要显示的;当W1113=3时,表示被设置为特卡,不需要显示。 
            '当W1113=4时,为原始的打卡记录,但被标记为特卡,不显示。 
    End Select 
    .Update 
    If .Fields("C663" & iSplit) > 0 Then 
      If DInsertTime(0) > 0 Then 
          ReDim Preserve DInsertTime(UBound(DInsertTime) + 1) 
      End If 
    End If 
    DInsertTime(UBound(DInsertTime)) = .Fields("C663" & iSplit) 
'    StatusBar1.Panels(1).Text = "正在插入特卡打卡数据" 
    For i = 0 To UBound(DInsertTime) 
      If DInsertTime(i) > 0 Then 
        gDBRecordConn.Execute "INSERT INTO T0109A001(A0199,W0031,A0189,W1001,W1002,W1028,W1113) VALUES('-1','" & _ 
                              DInsertTime(i) & "','" & !A0189 & "',0,1,0,'1')" 
      End If 
    Next i 
  End With 
End Function