www.pudn.com > 考勤管理系统源码(VB含串口接口程序).zip > kqModule.bas


Attribute VB_Name = "kqMod" 
Public gDataBase As Database 
Public gTitle As String 
Public gMaxDay  As Integer 
Public Const gMAXITEM = 999 
Public Const gLATETIME = "07:55" 
Public Const gSTRPWD = "wsh2000" 
 
Public gMainDbName As String 
 
Public gLoginGrade As Integer 
Public gLoginName As String 
 
Public gPlanTableName As String 
Public Const gQRY = "Qry" 
Public gPlanQryName As String 
Public Const gRELEMPLOYEEPLAN = "EmployeePlan" 
Public Const gRELSHIFTPLAN = "ShiftPlan" 
Public gRelEmp As String 
Public gRelShift As String 
 
Public gOwnName As String 
Public gOwnAddress As String 
Public gOwnPhone As String 
Public gOwnFax As String 
Public gOwnPost As String 
Public gOwnOwner As String 
 
Public Const GSHIFTRESTID = 1 '休息 
Public Const GSHIFTLEAVEID = 2 '请假 
Public Const GSHIFTEVECTIONID = 3 '出差 
Public Const GSHIFTMONEYID = 4 '有薪假期 
Public Const GSHIFTRESTSTR = "休息" 
Public Const GSHIFTLEAVESTR = "请假" 
Public Const GSHIFTEVECTIONSTR = "出差" 
Public Const GSHIFTMONEYSTR = "有薪假期" 
Public Const GSHIFTRESTNAME = "*" '休息 
Public Const GSHIFTLEAVENAME = "#" '请假 
Public Const GSHIFTEVECTIONNAME = "@" '出差 
Public Const GSHIFTMONEYNAME = "$" '有薪假期 
Public Const gNOSHIFT = 0 
Public Const gNOSHIFTNAME = "未排班" 
Public Const gNOTINWORK = "旷工" 
Public Const gWORKLATE = "迟到" 
Public Const gNORMALKQSTR = "正常出勤" 
 
Public Const gALLDEPTNAME = "所有部门" 
 
Type OwnerShift 
    ID As Integer 
    ShiftName As String 
    Note As String 
End Type 
 
Public aInnerShift(1 To 4) As OwnerShift 
 
 
Type KQTemp 
    WorkNo As String 
    KqDate As String 
    KqTime As String 
End Type 
 
'----card status 
Public Const gNoCard = 0 
Public Const gHasCard = 1 
Public Const gMissCard = 2 
 
Public gPosNumber  As Integer 
Public gCommPort As Integer 
 
Public Type ItemStruc 
    ID As Integer 
    Name As String 
End Type 
 
Public Const mstrOpenCommErr = "无法打开串口!" 
 
Global aDepartment() As ItemStruc 
Global aTitle() As ItemStruc 
Global aLeaveType() As ItemStruc 
 
'*****编辑按钮索引 
Public Const gCMDAPPEND = 0 
Public Const gCMDSAVE = 1 
Public Const gCMDEDIT = 2 
Public Const gCMDDELETE = 3 
Public Const gCMDQUERY = 4 
Public Const gCMDRETURN = 5 
'Private Const mRefresh = 6 
Public Const gCMDEDITNORMAL = 7 '正常的cmdEdit的状态 
Public Const gCMDEDITCANCEL = 8 '取消添加后刷新按钮 
'*****编辑按钮动态更新字串 
Public Const gSTRAPPEND = "添加" 
Public Const gSTRCANCEL = "取消" 
Public Const gSTRMODIFY = "修改" 
Public Const gSTRRESET = "还原" 
 
Global gUserID As String 
Const mMsg1 = "班次初始化有误,系统不能正常运行!" 
 
'区分从frmMDI进入frmMain常数 
Public Const gMAINCOLLECT = 0 
Public Const gMAINLEAVE = 1 
Public Const gMAINABSENT = 2 
 
Const modMsg2 = "新的月份已开始,本月是否沿用上月的排班表?" 
Const modMsg3 = "欢迎您进入新月份的排班!" 
Public Const gMsg3 = "该名称已经存在,请您换个名称!!" 
Public Const gMsg4 = "请选择要删除的记录!!" 
Public Const gMsg5 = "抱歉,保存未成功!" 
Public Const gMsg6 = "抱歉,删除未成功!" 
Public Const gMsg7 = "抱歉,添加未成功!" 
Public Const gMsg8 = "数据有改动,要保存吗?" 
Public Const gMsg9 = "恭喜,保存成功!!" 
Public Const gMsg10 = "您确定要删除该条记录吗?" 
Public Const gMsg11 = "请准备好打印机,按[确定]开始打印..." 
Public Const gMsg12 = "抱歉,打印未成功!" 
 
Public Function CreateATable(TableName As String) As Boolean 
    Dim Sql As String 
    Dim strPrevTableName As String 
    Dim strPrevMonth As String 
    Dim strPrevYear As String 
    Dim blnCreateNew As Boolean 
    Dim HasThisTD As Boolean 
     
    On Error GoTo CreateErr 
    HasThisTD = False 
    strPrevYear = Year(Date) 
    strPrevMonth = Month(Date) - 1 
    If Val(strPrevMonth) = 0 Then 
        strPrevYear = Val(strPrevYear) - 1 
        strPrevMonth = 12 
    End If 
    strPrevTableName = Right(strPrevYear, 2) & strPrevMonth 
     
    HasThisTD = HasThisTable(strPrevTableName) 
    blnCreateNew = True 
    If HasThisTD Then 
'        If MsgBox(modMsg2, vbQuestion + vbYesNo, gTitle) = vbYes Then '是否沿用 
'            Sql = "select * into " & TableName & " from " & strPrevTableName 
'            gDataBase.Execute Sql 
'            Sql = "delete * from " & TableName 
'            gDataBase.Execute Sql 
'            blnCreateNew = False 
'        Else 
            MsgBox modMsg3, vbInformation, gTitle 
'        End If 
    End If 
    If blnCreateNew Then 
        Sql = "select * into " & TableName & " from EmptyPlan" 
        gDataBase.Execute Sql 
    End If 
     
    '创建关系 
    Dim Rel As Relation 
    Dim RelName As String 
    Dim HasRel As Boolean 
     
    RelName = gRelShift 
    HasRel = HasThisRelation(RelName) 
     
    If Not HasRel Then 'create relation 
        Set Rel = gDataBase.CreateRelation(RelName) 
        With Rel 
            .Table = "Shift" 
            .ForeignTable = TableName 
            .Fields.Append .CreateField("ID") 
            .Fields("ID").ForeignName = "F_Shift" 
            gDataBase.Relations.Append Rel 
        End With 
    End If 
     
    Set Rel = Nothing 
    HasRel = False 
    RelName = gRelEmp 
    HasRel = HasThisRelation(RelName) 
    If Not HasRel Then 
        Set Rel = gDataBase.CreateRelation(RelName) 
        With Rel 
            .Table = "Employee" 
            .ForeignTable = TableName 
            .Fields.Append .CreateField("WorkNo") 
            .Fields("WorkNo").ForeignName = "WorkNo" 
            gDataBase.Relations.Append Rel 
        End With 
    End If 
    Set Rel = Nothing 
     
'    Dim QD As QueryDef 
    Dim QDName As String 
    Dim HasThisQry As Boolean 
    QDName = gPlanQryName 
    HasThisQry = HasThisQuery(QDName) 
    If Not HasThisQry Then 
        Set QD = New QueryDef 'PARAMETERS DeptID Short; 
        QD.Sql = "select a.Name,a.DeptID," _ 
            & "b.WorkNo," _ 
            & "b.F_Day,c.ShiftName,c.ID" _ 
            & " from Employee a," _ 
            & TableName & " b,Shift c" _ 
            & " where a.WorkNo=b.WorkNo " _ 
            & "and b.F_Shift=c.ID and a.F_DelFlag=" & gFALSE _ 
            & " order by b.WorkNo" 
        QD.Name = QDName 
        gDataBase.QueryDefs.Append QD 
    End If 
    QD.Close 
    Set QD = Nothing 
    CreateATable = True 
    Exit Function 
CreateErr: 
    Err.Clear 
    CreateATable = False 
    Exit Function 
End Function 
 
Public Function HasThisQuery(QryName As String) As Boolean 
    Dim QD As QueryDef 
    For Each QD In gDataBase.QueryDefs 
        If QD.Name = QryName Then 
            HasThisQuery = True 
            Exit Function 
        End If 
    Next 
    HasThisQuery = False 
End Function 
 
Public Function HasThisRelation(RelName As String) As Boolean 
    Dim Rel As Relation 
    For Each Rel In gDataBase.Relations 
        If Rel.Name = RelName Then 
            HasThisRelation = True 
            Exit Function 
        End If 
    Next 
    HasThisRelation = False 
End Function 
 
 
Function AsciiToVal(nAscii As Byte) 
  Select Case UCase(nAscii) 
  Case 48 To 57: AsciiToVal = nAscii - 48 
  Case 65 To 70: AsciiToVal = nAscii - 55 
  Case 97 To 102: AsciiToVal = nAscii - 87 
 End Select 
End Function 
 
Public Sub Main() 
    If App.PrevInstance Then Exit Sub 
    Dim Str As String 
    ChDrive Mid(App.Path, 1, 2) 
    ChDir App.Path 
     
    GetRegister 
    gTitle = "考勤系统" 
    gMaxDay = GetMaxDayInAMonth(Year(Date), Month(Date)) 
    gUserID = "Wsh" 
    Str = App.Path + "\data\kq.mdb" 
    gMainDbName = Str 
    On Error GoTo OpenErr 
    If Dir(Str) <> Empty Then 
        Set gDataBase = Workspaces(0).OpenDatabase(Str, False, False, ";pwd=" & gSTRPWD) 
    Else 
        MsgBox "找不到数据库!请您检查一下您的数据库路径!!", , gTitle 
        End 
    End If 
     
    SetPlanTableName 
     
    IniPort 
    IniItem "Department", aDepartment() 
    IniItem "LeaveType", aLeaveType() 
    IniItem "Title", aTitle() 
    IniShift 
     
    aDepartment(0).Name = gALLDEPTNAME 
    aLeaveType(0).Name = "所有请假类型" 
    aTitle(0).Name = "所有职务" 
     
    'frmSplash.Show 
    'frmMonth.Show 
    'frmLookMan.Show 1 
    'frmEmploy.Show 1 
    'frmPlan.Show 
    Dim Fr As New frmLogin 
    Set Fr = New frmLogin 
    Fr.Show 1 
    If Not Fr.LoginSucceeded Then 
        EndSystem 
    Else 
        frmMDI.Show 
        Unload Fr 
    End If 
    
    Exit Sub 
OpenErr: 
    MsgBox Err.Description, , gTitle 
    Err.Clear 
    EndSystem 
End Sub 
 
Private Sub IniPort() 
    gPosNumber = 1 
    gCommPort = 0 
End Sub 
Public Sub SetPlanTableName() 
    gPlanTableName = Right(Year(Date), 2) & Month(Date) 
    gPlanQryName = gQRY & gPlanTableName 
    gRelEmp = Trim(gPlanTableName) & gRELEMPLOYEEPLAN 
    gRelShift = Trim(gPlanTableName) & gRELSHIFTPLAN 
End Sub 
Private Sub IniShift() 
    With aInnerShift(1) 
        .ID = GSHIFTRESTID 
        .ShiftName = GSHIFTRESTNAME 
        .Note = GSHIFTRESTSTR 
    End With 
     
    With aInnerShift(2) 
        .ID = GSHIFTLEAVEID 
        .ShiftName = GSHIFTLEAVENAME 
        .Note = GSHIFTLEAVESTR 
    End With 
     
    With aInnerShift(3) 
        .ID = GSHIFTEVECTIONID 
        .ShiftName = GSHIFTEVECTIONNAME 
        .Note = GSHIFTEVECTIONSTR 
    End With 
     
    With aInnerShift(4) 
        .ID = GSHIFTMONEYID 
        .ShiftName = GSHIFTMONEYNAME 
        .Note = GSHIFTMONEYSTR 
    End With 
     
    Dim Rst As Recordset 
    Dim i As Integer 
    Dim Sql As String 
    Dim IsToDelete As Boolean 
    Dim isToAdd As Boolean 
    On Error GoTo ShiftErr 
    For i = 1 To UBound(aInnerShift) 
        With aInnerShift(i) 
            IsToDelete = False 
            isToAdd = True 
            Sql = "Select * from Shift where ID=" & .ID 
            Set Rst = gDataBase.OpenRecordset(Sql, dbOpenSnapshot) 
            If Rst.RecordCount > 0 Then 
                If Rst!ShiftName <> Trim(.ShiftName) Then 
                    IsToDelete = True 
                Else 
                    isToAdd = False 
                End If 
            End If 
            Rst.Close 
            Set Rst = Nothing 
            If IsToDelete Then 
                Sql = "delete * from Shift where ID=" & .ID 
                gDataBase.Execute Sql 
            End If 
            If isToAdd Then 
                Sql = "Insert into Shift (ID,ShiftName) values(" & .ID _ 
                    & ",'" & .ShiftName & "')" 
                gDataBase.Execute Sql 
            End If 
        End With 
    Next 
    Exit Sub 
ShiftErr: 
    Err.Clear 
    MsgBox mMsg1, vbExclamation, gTitle 
    EndSystem 
End Sub 
 
Public Sub EndSystem() 
    If Not gDataBase Is Nothing Then 
        gDataBase.Close 
        Set gDataBase = Nothing 
    End If 
    Dim Fr As Form 
    For Each Fr In Forms 
        Unload Fr 
    Next 
End Sub 
Private Sub IniItem(t_table As String, aArray() As ItemStruc) 
    ReDim aArray(0) 
    aArray(0).ID = gMAXITEM 
     
    Dim Rst As Recordset 
    Dim i As Integer 
    Dim isSame As Boolean 
     
    On Error GoTo ErrHandle 
    Set Rst = gDataBase.OpenRecordset("select * from " _ 
        & Trim(t_table) & " Where F_DelFlag=" & gFALSE _ 
        & " order by ID", dbOpenSnapshot) 
     
    While Not Rst.EOF 
        isSame = False 
        For i = 0 To UBound(aArray) 
            If Rst!ID = aArray(i).ID Then 
                isSame = True 
                Exit For 
            End If 
        Next 
        If Not isSame Then 
            ReDim Preserve aArray(UBound(aArray) + 1) 
            With aArray(UBound(aArray)) 
                .ID = Rst!ID 
                .Name = IIf(IsNull(Rst!Name), "", Trim(Rst!Name)) 
            End With 
        End If 
        Rst.MoveNext 
    Wend 
    Rst.Close 
    Set Rst = Nothing 
    Exit Sub 
ErrHandle: 
    Dim er As Error 
    Dim MsgStr As String 
    For Each er In Errors 
        MsgStr = MsgStr & er.Description & er.Number & vbCrLf 
    Next 
    MsgBox MsgStr, , gTitle 
    Resume Next 
End Sub 
 
Public Sub RefreshButton(cmdEdit As Object, Optional intActionAfter As Integer = gCMDEDITNORMAL) 
    Dim i As Integer 
    Select Case intActionAfter 
        Case gCMDAPPEND 
            For i = 0 To cmdEdit.Count - 2 
                With cmdEdit(i) 
                    Select Case i 
                        Case gCMDSAVE, gCMDRETURN, gCMDAPPEND 
                            If Not .Enabled Then .Enabled = True 
                        Case gCMDEDIT, gCMDDELETE, gCMDQUERY 
                            If .Enabled Then .Enabled = False 
                    End Select 
                End With 
            Next 
        Case gCMDEDITNORMAL 
            For i = 0 To cmdEdit.Count - 2 
                With cmdEdit(i) 
                    Select Case i 
                        Case gCMDAPPEND, gCMDQUERY, gCMDRETURN 
                            If Not .Enabled Then .Enabled = True 
                        Case gCMDSAVE, gCMDEDIT, gCMDDELETE 
                            If .Enabled Then .Enabled = False 
                    End Select 
                End With 
            Next 
        Case gCMDEDIT 
            For i = 0 To cmdEdit.Count - 2 
                With cmdEdit(i) 
                    Select Case i 
                        Case gCMDSAVE, gCMDEDIT 
                            If Not .Enabled Then .Enabled = True 
                        Case gCMDAPPEND, gCMDDELETE, gCMDQUERY, gCMDRETURN 
                            If .Enabled Then .Enabled = False 
                    End Select 
                End With 
            Next 
        Case gCMDEDITCANCEL 
            If cmdEdit(gCMDSAVE).Enabled Then cmdEdit(gCMDSAVE).Enabled = False 
    End Select 
End Sub 
 
Public Sub ChangeBackColor(cn As Control, isEdit As Boolean) 
    If isEdit Then 
        cn.BackColor = vbWhite 
    Else 
        cn.BackColor = &H8000000F 
    End If 
End Sub 
 
 
Public Sub ClipToGrid(msfGrid As MSFlexGrid, ClipStr As String, intRows As Integer, intCols As Integer) 
    With msfGrid 
        On Error GoTo ClipErr 
        .Rows = .FixedRows 
        If intRows > .FixedRows Then 
            If .Redraw Then .Redraw = False 
            .Rows = intRows 
            .Cols = intCols 
            .row = .FixedRows 
            .col = .FixedCols 
            .RowSel = .Rows - 1 
            .ColSel = .Cols - 1 
            .Clip = ClipStr 
            .row = .FixedRows 
            .col = 0 
            .Redraw = True 
            .RowHeightMin = 300 
        End If 
    End With 
    Exit Sub 
ClipErr: 
    MsgBox Err.Description, vbExclamation, gTitle 
    Err.Clear 
End Sub 
 
Public Function HasThisTable(TableName As String) As Boolean 
    Dim TD As TableDef 
    For Each TD In gDataBase.TableDefs 
        If TD.Name = TableName Then 
            HasThisTable = True 
            Exit Function 
        End If 
    Next 
    HasThisTable = False 
End Function 
 
Public Function CreateAllRecord(TableName As String) As Boolean 
    Dim intEmp As Integer 
    Dim intDay As Integer 
    Dim Rst As Recordset 
    Dim strWorkNo As String 
    Dim bytDay As Byte 
    Dim bytShift As Byte 
    Dim Sql As String 
     
    bytShift = gNOSHIFT '缺省的 无班次 
     
    On Error GoTo CreateRecErr 
    Set Rst = gDataBase.OpenRecordset("select WorkNo from Employee" _ 
        & " where F_DelFlag=" & gFALSE, dbOpenSnapshot) 
         
    While Not Rst.EOF 
        strWorkNo = Trim(Rst!WorkNo) 
        For intDay = 1 To gMaxDay 
            bytDay = intDay 
            Sql = "Insert into " & TableName & _ 
                " (WorkNo,F_Day,F_Shift) values ('" _ 
                & strWorkNo & "'," & bytDay & "," & bytShift & ")" 
            gDataBase.Execute Sql 
        Next 
        Rst.MoveNext 
    Wend 
     
    Rst.Close 
    Set Rst = Nothing 
    CreateAllRecord = True 
    Exit Function 
CreateRecErr: 
    Err.Clear 
    CreateAllRecord = False 
End Function 
 
 
Public Function CreatePlanTable() As Boolean 
    Dim strTableName As String 
    Dim HasThisTD As Boolean 
    Dim HasRecord As Boolean 
    Dim TD As TableDef 
    Dim Rst As Recordset 
     
    strTableName = gPlanTableName 
     
    HasThisTD = HasThisTable(strTableName) 
     
    If Not HasThisTD Then '无此表 
        If Not CreateATable(strTableName) Then GoTo IniErr 
    End If 
     
    Set Rst = gDataBase.OpenRecordset(strTableName) 
    If Rst.RecordCount > 0 Then HasRecord = True 
    Rst.Close 
    Set Rst = Nothing 
     
    If Not HasRecord Then '无记录 
       If Not CreateAllRecord(strTableName) Then GoTo IniErr 
    End If 
     
    CreatePlanTable = True 
    Exit Function 
IniErr: 
    CreatePlanTable = False 
    Exit Function 
End Function 
 
Public Sub GetPosToCbo(tmpCbo As ComboBox) 
    Dim mSql As String 
    Dim mRst As Recordset 
     
    mSql = "select * from T_Pos order by PosNo" 
    Set mRst = gDataBase.OpenRecordset(mSql) 
    Dim Str As String 
    tmpCbo.Clear 
    While Not mRst.EOF 
        Str = IIf(IsNull(mRst!PosName), "", Trim(mRst!PosName)) 
        tmpCbo.AddItem Str 
        tmpCbo.ItemData(tmpCbo.NewIndex) = mRst!PosNo 
        mRst.MoveNext 
    Wend 
    If tmpCbo.ListCount > 0 Then tmpCbo.ListIndex = 0 
    mRst.Close 
    Set mRst = Nothing 
End Sub 
 
 
Public Function IsNormalKq(IntShift As Integer, strWorkNo As String, strDate As String, strKqTime As String) As Boolean 
    Dim sKqTime As String 
    Dim tmpStr As String 
    Dim mSql As String 
    Dim mRst As Recordset 
     
    strKqTime = Empty 
    mSql = "select F_1On from Shift where ID=" & IntShift _ 
        & " and F_1OnIsKq=" & gTRUE '暂时只适合A段要求考勤的班次 
        '只要在KqHistory中添加F_Section(是哪段考勤) 
    Set mRst = gDataBase.OpenRecordset(mSql, dbOpenSnapshot) 
    If mRst.RecordCount > 0 Then 
        sKqTime = IIf(IsNull(mRst!F_1On), "", Trim(mRst!F_1On)) 
    Else 
        IsNormalKq = False 
        Exit Function 
    End If 
    mRst.Close 
    Set mRst = Nothing 
     
    If sKqTime = Empty Then 
        IsNormalKq = False 
        Exit Function 
    End If 
     
    mSql = "select KqTime from KqHistory " _ 
        & " where KqDate='" & strDate & "'" _ 
        & " and WorkNo='" & strWorkNo & "'" _ 
        & " order by KqTime" 
    Set mRst = gDataBase.OpenRecordset(mSql, dbOpenSnapshot) 
    If mRst.RecordCount > 0 Then 
        tmpStr = IIf(IsNull(mRst!KqTime), "", Trim(mRst!KqTime)) 
    End If 
    mRst.Close 
    Set mRst = Nothing 
     
    If tmpStr = Empty Then 
        IsNormalKq = False 
        'Exit Function 
    Else 
        If sKqTime < tmpStr Then 
            IsNormalKq = False 
        Else 
            IsNormalKq = True 
        End If 
    End If 
    strKqTime = tmpStr 
End Function