⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 frmsalarylistnewwizard.frm

📁 金算盘软件代码
💻 FRM
📖 第 1 页 / 共 5 页
字号:
        '更新发放范围
        Call Salary.EditSalaryEmployee(frmSalaryListNewWizard.msgWizard4, mlngSalaryID)
        '更新工龄
        strSql = "UPDATE Salary Set Sa18660 =0 Where lngSalaryListID=" & mlngSalaryID
        gclsBase.BaseDB.Execute (strSql)
        If mstrAgeMethod <> "0" Then
            'strSql = "UPDATE SalaryData Set Sa18660 = IIF(ISNULL(" & mstrAgeFormula & _
                     "),0," & mstrAgeFormula & ") Where lngSalaryListID=" & mlngSalaryID & " AND " & mstrAgeWhere
            strSql = "UPDATE SalaryData Set Sa18660 = NVL(" & mstrAgeFormula & _
                     ",0 ) Where lngSalaryListID=" & mlngSalaryID & " AND " & mstrAgeWhere
            gclsBase.BaseDB.Execute strSql
        End If
        '计算
        ''''''''''''''''
        Call Salary.SalaryCalc(" lngSalaryListID=" & mlngSalaryID, mlngSalaryID, 0, IIf(mdblDeductLevel > 0, True, _
            False), mblnIsTax, mlngDeductFieldID, mlngTaxFieldID, mdblDeductLevel, _
             mlngDeductPutFieldID, blnIsrefesh) '计算
    End If
    '重新计算工资表历史数据
    Call Salary.CalcOldData(mlngSalaryID, False)
    With frmSalaryList.msgSalaryList
        For i = 0 To .Cols - 1
            If Trim(.TextMatrix(0, i)) = "工资表名称" Then
                .TextMatrix(.Row, i) = Trim(txtWizard(0).Text)
                Exit For
            End If
        Next i
        For i = 0 To .Cols - 1
            If Trim(.TextMatrix(0, i)) = "发放日期" Then
                .TextMatrix(.Row, i) = Format(Calendar1.Value, "yyyy-mm-dd")
                Exit For
            End If
        Next i
        For i = 0 To .Cols - 1
            If Trim(.TextMatrix(0, i)) = "操作员" Then
                .TextMatrix(.Row, i) = gclsBase.OperatorName
                Exit For
            End If
        Next i
        Select Case Trim(frmSalaryList.cboFind.Text)
        Case "工资表名称"
            frmSalaryList.txtFindValue.Text = Trim(txtWizard(0).Text)
        Case "发放日期"
            frmSalaryList.txtFindValue.Text = Format(Calendar1.Value, "yyyy-mm-dd")
        Case "操作员"
            frmSalaryList.txtFindValue.Text = gclsBase.OperatorName
        End Select
    End With
Exit Sub
Errors:
    'gclsBase.BaseWorkSpace.RollBack
    gclsBase.BaseWorkSpace.RollBacktrans
    ShowMsg Me.hwnd, "数据库被其他用户打开,不能生成工资表。", vbInformation
    Unload Me
End Sub
'工资公式校验
Private Sub Check_Fomula()
    Dim strFomular As String       '公式
    Dim strCond As String          '条件
    Dim strSql As String
    Dim recSalaryTry As rdoResultset  '测试公式Rec
    Dim blnIsError As Boolean
    Dim strDateFunTmp1 As String
    Dim strDateFunTmp2 As String
    
    With msgWizard(4)
        mblnFomulaOk = False
        'strSql = "SELECT strTableName,strFieldType,lngViewFieldID FROM ViewField WHERE ViewField.lngViewID" _
            & "=63 AND  TRIM(ViewField.strViewFieldDesc)='" & Trim(.TextMatrix(.Row, 0)) & "'"
        strSql = "SELECT strTableName,strFieldType,lngViewFieldID FROM ViewField WHERE ViewField.lngViewID" _
            & "=63 AND LTRIM(RTRIM(ViewField.strViewFieldDesc))='" & Trim(.TextMatrix(.Row, 0)) & "'"
        Set recSalaryTry = gclsBase.BaseDB.OpenResultset(strSql, rdOpenStatic)
        If recSalaryTry.EOF Then
            STbWizard.Tab = 5
            ShowMsg Me.hwnd, "计算项目:" & Trim(.TextMatrix(.Row, 0)) & "不存在。", vbInformation, Me.Caption
            .col = 0
            If UCase(.TextMatrix(.Row, 4)) <> "CALCZERO" And UCase(.TextMatrix(.Row, 4)) <> "CALCTAX" _
                And UCase(.TextMatrix(.Row, 4)) <> "PUTZERO" Then
                cboFomular.Visible = True
                On Error Resume Next
                cboFomular.SetFocus
                On Error GoTo 0
            End If
            Exit Sub
        End If
        If UCase(Trim(recSalaryTry!strTableName)) = "SALARY" And UCase(Trim(recSalaryTry!strFieldType)) = "DOUBLE" Then
            .TextMatrix(.Row, 3) = recSalaryTry!lngViewFieldID
        Else
            STbWizard.Tab = 5
            ShowMsg Me.hwnd, "项目:" & Trim(.TextMatrix(.Row, 0)) & "为不可计算项目。", vbInformation, Me.Caption
            .col = 0
            If UCase(.TextMatrix(.Row, 4)) <> "CALCZERO" And UCase(.TextMatrix(.Row, 4)) <> "CALCTAX" _
                And UCase(.TextMatrix(.Row, 4)) <> "PUTZERO" Then
                cboFomular.Visible = True
                On Error Resume Next
                cboFomular.SetFocus
                On Error GoTo 0
            End If
            Exit Sub
        End If
        '存回Txt到Grid
        Select Case .col
        Case 0
        Case 1
            .col = 4
            .col = 1
        Case 2
            .col = 5
            .col = 2
        End Select
        '调用公式校验
        If Len(Trim(.TextMatrix(.Row, 1))) > 0 And Trim(.TextMatrix(.Row, 0)) <> "" Then
            '扣零、扣税计算判断,CalcZero,CalcTax
            strFomular = Trim(.TextMatrix(.Row, 1))
            If InStr(strFomular, "扣零计算") > 0 Then
                Call ZeroTaxFunc("扣零计算", strFomular)
                Exit Sub
            End If
            If InStr(strFomular, "扣税计算") > 0 Then
                Call ZeroTaxFunc("扣税计算", strFomular)
                Exit Sub
            End If
            '统计函数或发放扣零校验
            If .TextMatrix(.Row, 9) = "1" Then
                .TextMatrix(.Row, 6) = 1
                mblnFomulaOk = True
                Exit Sub
            End If
            '校验公式
            mblnCond = False
            mblnFomulaOk = True
            '校验公式
            If .TextMatrix(.Row, 9) <> "1" Then
                '判断不存在关系运算符
                If InStr(.TextMatrix(.Row, 1), "=") > 0 Or InStr(.TextMatrix(.Row, 1), ">") > 0 Or _
                    InStr(.TextMatrix(.Row, 1), "<") > 0 Or InStr(.TextMatrix(.Row, 1), "<>") > 0 _
                    Or InStr(.TextMatrix(.Row, 1), " 并且 ") > 0 Or InStr(.TextMatrix(.Row, 1), " 且 ") > 0 _
                    Or InStr(.TextMatrix(.Row, 1), " 或 ") > 0 Or _
                    InStr(.TextMatrix(.Row, 1), " 或者 ") > 0 Then
                    mblnFomulaOk = False
                    STbWizard.Tab = 5
                    ShowMsg Me.hwnd, "计算公式不能含有:'=','>','<','<>','并且','或者','或','且'。", _
                        vbInformation, Me.Caption
                End If
            Else
                mblnFomulaOk = True
            End If
            If mblnFomulaOk = True Then
                '校验公式
                If .TextMatrix(.Row, 9) <> "1" Then
                    '替换运算符
                    strFomular = Trim(.TextMatrix(.Row, 1))
                    '替换回车
                    strFomular = Salary.Change_Text(Chr(13), " ", strFomular)
                    strFomular = Salary.Change_Text(Chr(10), " ", strFomular)
                    '替换Ctrl+I
                    strFomular = Salary.Change_Text(Chr(9), " ", strFomular)
                    '替换除号
                    strFomular = Salary.Change_Text("÷", "/", strFomular)
                    '替换乘号
                    strFomular = Salary.Change_Text("×", "*", strFomular)
                    Analysis strFomular
                    '通过校验
                    If mblnFomulaOk Then
                        '取出公式
                        mclsDepoland.GetFomular strFomular
                    End If
                End If
                '校验条件
                If Len(Trim(.TextMatrix(.Row, 2))) > 0 Then
                    mblnCond = True
                    '替换运算符
                    strCond = .TextMatrix(.Row, 2)
                    '替换回车
                    strCond = Salary.Change_Text(Chr(13), " ", strCond)
                    strCond = Salary.Change_Text(Chr(10), " ", strCond)
                    '替换Ctrl+I
                    strCond = Salary.Change_Text(Chr(9), " ", strCond)
                    '替换除号
                    strCond = Salary.Change_Text("÷", "/", strCond)
                    '替换乘号
                    strCond = Salary.Change_Text("×", "*", strCond)
                    '替换等号
                    strCond = Salary.Change_Text("=", "=", strCond)
                    '替换并且
                    strCond = Salary.Change_Text("并且", " 且 ", strCond)
                    '替换或者
                    strCond = Salary.Change_Text("或者", " 或 ", strCond)
                    Analysis strCond
                    '通过校验
                    If mblnFomulaOk Then
                        '取出公式条件
                        mclsDepoland.GetFomular strCond
                        '根据关键字IN删除等号,如:部门名称='生产部'而'生产部'为非末级部门时,先在
                        'mclsDepoland_OnAccidenceParse中将'生产部'替换为:IN('一车间','二车间')。(其中'一车间'
                        ','二车间'为'生产部'的下级明细部门)则公式变为:部门名称=IN('一车间','二车间'),
                        '多出一个等号。ChangIN的功能是将多出的等号删除。计算条件中包含"IN('"系统认为可能多出一个等号
                        '将紧靠前的"="删除
                        Call Salary.ChangeIN(strCond)
                        .TextMatrix(.Row, 6) = "1"     '公式确认
                    Else
                        .TextMatrix(.Row, 6) = ""
                    End If
                Else
                    If mblnFomulaOk Then
                        .TextMatrix(.Row, 6) = "1"     '公式确认
                    Else
                        .TextMatrix(.Row, 6) = ""     '公式确认
                    End If
                End If
                If .TextMatrix(.Row, 6) = "1" Then
                    '写回英文公式
                    '校验公式
                    If .TextMatrix(.Row, 9) <> "1" Then
                        strDateFunTmp1 = ""
                        strDateFunTmp2 = ""
                        strDateFunTmp1 = Salary.GetOraDateFunnctionCalc(strFomular, strDateFunTmp2)
                        strSql = "SELECT " & strDateFunTmp1 & " AS dblValue " & " FROM SalaryData"
                        If strDateFunTmp2 <> "" Then
                            strSql = strSql & " WHERE " & strDateFunTmp2
                        End If
                        'strSql = "SELECT " & strFomular & " AS dblValue " & " FROM SalaryData"
                    Else  '校验函数
                        strSql = "SELECT * FROM SalaryData"
                    End If
                    If Len(Trim(strCond)) > 0 Then
                        strDateFunTmp1 = ""
                        strDateFunTmp2 = ""
                        strDateFunTmp1 = Salary.GetOraDateFunnctionCalc(strCond, strDateFunTmp2)
                        If InStr(UCase(strSql), "WHERE") > 0 Then
                            strSql = strSql & " AND " & strDateFunTmp1
                        Else
                            strSql = strSql & " WHERE " & strDateFunTmp1
                        End If
                        If strDateFunTmp2 <> "" Then
                            strSql = strSql & " AND " & strDateFunTmp2
                        End If
                    End If
                    blnIsError = False
                    On Error GoTo Errors1
                    Set recSalaryTry = gclsBase.BaseDB.OpenResultset(strSql, rdOpenStatic)
                    If Not blnIsError Then
                        If .TextMatrix(.Row, 9) <> "1" Then
                            .TextMatrix(.Row, 4) = strFomular
                        End If
                        .TextMatrix(.Row, 5) = strCond
                    Else
                        mblnFomulaOk = False
                        STbWizard.Tab = 5
                        ShowMsg Me.hwnd, "工资公式有误。", vbInformation, Me.Caption
                    End If
                    recSalaryTry.Close
                    Set recSalaryTry = Nothing
                End If
            End If
        Else
            If Len(Trim(.TextMatrix(.Row, 0))) = 0 Then
                STbWizard.Tab = 5
                ShowMsg Me.hwnd, "计算项目不允许为空。", vbInformation, "工资发放"
                .col = 0
            Else
                STbWizard.Tab = 5
                ShowMsg Me.hwnd, "计算公式不允许为空。", vbInformation, "工资发放"
                .col = 1
                If .TextMatrix(.Row, 9) <> "1" Then
                    txtWizard(1).Visible = True
                    On Error Resume Next
                    txtWizard(1).SetFocus
                    On Error GoTo 0
                End If
            End If
            mblnFomulaOk = False
        End If
    End With
    Exit Sub
Errors1:
    blnIsError = True
    Resume Next
End Sub
'设置职员列表(新增:为职员表所有职员(职员未停用,部门未停用)
'            (修改:符合原工资表的所有职员(可包停用职员和停用部门)
Private Sub SetEmployee()
    Dim strSelect As String
    Dim strFrom As String
    Dim strWhere As String
    Dim strSql As String
    Dim recEmployee As rdoResultset
    mblnInitmsgWizard4 = True
    
    mclsGrid.ColOfs = 3
    mclsGrid.ListSet.ViewId = 72
    With msgWizard4
        .Redraw = False
        .FixedCols = 0
    End With
    With mclsGrid.ListSet
        If Not mblnIsAddSalary Then
            strSelect = "Select Employee.lngEmployeeID As ID,0 AS intSourceTable,' ' As 选择," & .SelectOfSql
        Else
            strSelect = "Select Employee.lngEmployeeID As ID,0 AS intSourceTable, '√' As 选择," & .SelectOfSql
        End If
        Filter.DelSelectedCond mclsGrid.ListSet.ListID, 1
        strFrom = .FromOfSql
        strWhere = .WhereOfSql
    End With
    strSql = strSelect & " " & strFrom & " WHERE " & strWhere
'    strSql = strSql & " AND Employee.lngEmployeeID NOT IN(SELECT " & _
'            " lngEmployeeID FROM Salary WHERE lngSalaryListID=" & mlngSalaryID & ")"
    strSql = strSql & " AND  NOT Exists(SELECT " & _
            " lngEmployeeID FROM Salary WHERE Employee.lngEmployeeID=Salary.lngEmployeeid " _
            & " And lngSalaryListID=" & mlngSalaryID & ")"
    strSql = strSql & " AND Employee.blnIsInActive=0 "
    'strSql = strSql & " UNION " & _
            " SELECT Employee.lngEmployeeID AS ID, '√' AS 选择, Employee.strEmployeeCode AS 职员编号," & _
            " Employee.strEmployeeName AS 职员姓名, EmployeeType.strEmployeeTypeName AS 职员类别," & _
            " Department.strDepartmentName AS 所属部门, Title.strTitleName AS 职务," & _
            " IIf(Employee.blnIsMale=True,'男','女') AS 性别, Education.strEducationName AS 文化程度 " & _
            " FROM (((Salary INNER JOIN ((Employee LEFT JOIN Title ON Employee.lngTitleID = Title.lngTitleID) " & _
            " LEFT JOIN Education ON Employee.lngEducationID = Education.lngEducationID) ON  " & _
            " Salary.lngEmployeeID = Employee.lngEmployeeID) " & _
            " LEFT JOIN Department ON Salary.lngDepartmentID = Department.lngDepartmentID)" & _
            " LEFT JOIN EmployeeType ON Salary.lngEmployeeTypeID = EmployeeType.lngEmployeeTypeID) " & _
            " LEFT JOIN PersonTaxType ON Salary.lngPersonTaxTypeID = PersonTaxType.lngPersonTaxTypeID " & _
            " WHERE (Salary.lngSalaryListID = " & mlngSalaryID & " ) AND ( " & _
            " Employee.lngEmployeeID IN (SELECT lngEmployeeID FROM Salary WHERE lngSalaryListID = " & mlngSalaryID & "))"
    strSql = strSql & " UNION " & _
            " SELECT Employee.lngEmployeeID AS ID, 1 AS intSourceTable,'√' AS 选择, Employee.strEmployeeCode AS 职员编号," & _
            " Employee.strEmployeeName AS 职员姓名, EmployeeType.strEmployeeTypeName AS 职员类别," & _
            " Department.strDepartmentName AS 所属部门, Title.strTitleName AS 职务," & _
            " DECODE(Employee.blnIsMale,1,'男','女') AS 性别, Education.strEducationName AS 文化程度 " & _
            " FROM Salary,Employe

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -