CREATE PROC [dbo].[GEX_SALFORMULA_V3] ( @BILLDATE1 VARCHAR(10), @BILLDATE2 VARCHAR(10), @PERSONID1 NVARCHAR(20), @PERSONID2 NVARCHAR(20), @DEPARTMENTID1 NVARCHAR(10), @DEPARTMENTID2 NVARCHAR(10), @FACDISTRICT1 VARCHAR(10), @FACDISTRICT2 VARCHAR(10), @COUNTRYID1 VARCHAR(10), @COUNTRYID2 VARCHAR(10), @SALTERM NVARCHAR(10), @LOGINID NVARCHAR(30), @FUNCTAG NVARCHAR(30) ) /* Function : 計算人員薪資公式內容 Description: 本 SP 是配合薪資計算使用, 傳入的參數較多 Build Date : 2011/07/13 Modify History Item Who Date Modify Docs ==== ========== ========== ================================================ 1 Michael 2011/07/13 加入註解, 本功能不支援多選 2 Michael 2011/08/15 新增莎美娜的部門代替群組的需求 依參數來判斷 3 Michael 2011/09/05 新增留職停薪不納入計算的判斷 4 Michael 2011/09/14 新增廠區條件 sql 5 Michael 2011/09/26 新增國別 6 Michael 2011/11/10 修正產品引數傳入星號(zz)的 SQL 問題 7 Michael 2013/06/03 當 @FUNCTAG 為 ESSR2D 時, 資料寫到暫存檔 */ AS IF @DEPARTMENTID1 = '' OR @DEPARTMENTID1 = '*' BEGIN SET @DEPARTMENTID1 = '' END IF @DEPARTMENTID2 = '' OR @DEPARTMENTID2 = '*' BEGIN SET @DEPARTMENTID2 = 'zz' END IF @FACDISTRICT1 = '*' BEGIN SET @FACDISTRICT1 = '' END IF @FACDISTRICT2 = '*' BEGIN SET @FACDISTRICT2 = 'zz' END IF @COUNTRYID1 = '*' BEGIN SET @COUNTRYID1 = '' END IF @COUNTRYID2 = '*' BEGIN SET @COUNTRYID2 = 'zz' END --防錯 UPDATE BASPERSON SET FACDISTRICT = '' WHERE FACDISTRICT IS NULL UPDATE BASPERSON SET COUNTRYID = '' WHERE COUNTRYID IS NULL DECLARE @IS_SAB VARCHAR(10) SELECT @IS_SAB=PARAVALUE FROM PARAMETER WHERE PARATYPE = 'ESS' AND PARAFIELD = 'IS_SAB' IF @IS_SAB = '' OR @IS_SAB IS NULL BEGIN SET @IS_SAB = 'N' END --依參數決定群組的取法 DECLARE @SAL_TMP TABLE ( USERID VARCHAR(20), GROUPID VARCHAR(50) ) IF @IS_SAB = 'Y' BEGIN INSERT INTO @SAL_TMP SELECT USERID,GROUPID FROM ( SELECT PERSONID USERID, CASE WHEN DATAEXTEND5 IS NULL OR DATAEXTEND5 = '' THEN DEPARTMENTID ELSE DATAEXTEND5 END GROUPID FROM BASPERSON WHERE CASE WHEN @PERSONID1 = '*' THEN @PERSONID1 ELSE PERSONID END >= @PERSONID1 AND CASE WHEN @PERSONID2 = '*' THEN @PERSONID2 ELSE PERSONID END <= @PERSONID2 ) Z WHERE Z.GROUPID IN (SELECT GROUPID FROM ESSGROUP) END ELSE BEGIN INSERT INTO @SAL_TMP SELECT USERID,GROUPID FROM USERGROUPS WHERE GROUPID IN (SELECT GROUPID FROM ESSGROUP) AND CASE WHEN @PERSONID1 = '*' THEN @PERSONID1 ELSE USERID END >= @PERSONID1 AND CASE WHEN @PERSONID2 = '*' THEN @PERSONID2 ELSE USERID END <= @PERSONID2 END --清除薪資公式科目為NULL DELETE FROM ESSEMPSALSETUP WHERE ESS_SUBJECTID = ''; WITH NO_EMP AS ( --排除本月不需計薪人員 FIRSTWORKDATE,BYEDATE SELECT PERSONID FROM BASPERSON WHERE DEPARTMENTID >= @DEPARTMENTID1 AND DEPARTMENTID <= @DEPARTMENTID2 AND CASE WHEN @PERSONID1 = '*' THEN @PERSONID1 ELSE PERSONID END >= @PERSONID1 AND CASE WHEN @PERSONID2 = '*' THEN @PERSONID2 ELSE PERSONID END <= @PERSONID2 AND (FIRSTWORKDATE > @BILLDATE2 OR BYEDATE < @BILLDATE1) UNION ALL --留職停薪 SELECT A.PERSONID FROM ESSKEEPWORK A LEFT JOIN ESSRETURNWORK B ON A.PERSONID = B.PERSONID AND A.ENDDATE = B.ENDDATE WHERE A.STARTDATE <= @BILLDATE1 AND A.ENDDATE >= @BILLDATE2 AND ((B.STARTDATE > @BILLDATE2) OR (B.STARTDATE IS NULL)) AND CASE WHEN @PERSONID1 = '*' THEN @PERSONID1 ELSE A.PERSONID END >= @PERSONID1 AND CASE WHEN @PERSONID2 = '*' THEN @PERSONID2 ELSE A.PERSONID END <= @PERSONID2 ), EMP AS ( SELECT PERSONID FROM BASPERSON WHERE DEPARTMENTID >= @DEPARTMENTID1 AND DEPARTMENTID <= @DEPARTMENTID2 AND CASE WHEN @PERSONID1 = '*' THEN @PERSONID1 ELSE PERSONID END >= @PERSONID1 AND CASE WHEN @PERSONID2 = '*' THEN @PERSONID2 ELSE PERSONID END <= @PERSONID2 AND FACDISTRICT >= @FACDISTRICT1 AND FACDISTRICT <= @FACDISTRICT2 AND COUNTRYID >= @COUNTRYID1 AND COUNTRYID <= @COUNTRYID2 AND NOT EXISTS ( SELECT * FROM NO_EMP WHERE NO_EMP.PERSONID = BASPERSON.PERSONID ) ), ESS_GROUP AS ( --取得人員所屬的薪資群組 SELECT USERID,GROUPID FROM @SAL_TMP Z WHERE --USERID >= @PERSONID1 AND USERID <= @PERSONID2 CASE WHEN @PERSONID1 = '*' THEN @PERSONID1 ELSE USERID END >= @PERSONID1 AND CASE WHEN @PERSONID2 = '*' THEN @PERSONID2 ELSE USERID END <= @PERSONID2 AND EXISTS ( SELECT * FROM EMP WHERE Z.USERID = EMP.PERSONID ) ), ESS_SUBJECT1 AS ( --先取得人員的所有計薪科目(個人+群組) SELECT DISTINCT PERSONID,ESS_SUBJECTID,SALTERM,SALARY FROM ESSEMPSALSETUP WHERE SALTERM = @SALTERM AND FLAG = 1 AND EXISTS ( SELECT * FROM EMP WHERE PERSONID = ESSEMPSALSETUP.PERSONID ) ), ESS_SUBJECT2 AS ( --人員所屬群組公式 SELECT DISTINCT X.PERSONID,A.ESS_SUBJECTID,A.SALTERM,A.SALARY FROM EMP X LEFT JOIN ESS_GROUP B ON X.PERSONID = B.USERID LEFT JOIN ESSEMPSALSETUP A ON A.PERSONID = B.GROUPID AND A.FLAG = 2 WHERE A.SALTERM = @SALTERM AND NOT EXISTS ( SELECT * FROM ESS_SUBJECT1 WHERE PERSONID = X.PERSONID AND ESS_SUBJECTID = A.ESS_SUBJECTID AND SALTERM = A.SALTERM ) ), ESS_SUBJECT AS ( SELECT * FROM ESS_SUBJECT1 UNION ALL SELECT * FROM ESS_SUBJECT2 ), SAL_EMP AS ( --先取得人員科目公式 SELECT PERSONID,ESS_SUBJECTID,SALTERM,SEQNO,DCTYPE,CALCMETHOD,TRUETO,FALSETO FROM ESSCALCFORMULA WHERE FLAG = 1 AND SALTERM = @SALTERM AND EXISTS ( SELECT * FROM EMP WHERE ESSCALCFORMULA.PERSONID = EMP.PERSONID ) ), SAL_GROUP1 AS ( --想辦法取得人員科目沒有設公式的資料 SELECT PERSONID,ESS_SUBJECTID FROM ESS_SUBJECT WHERE SALTERM = @SALTERM AND NOT EXISTS ( SELECT * FROM SAL_EMP WHERE PERSONID = ESS_SUBJECT.PERSONID AND ESS_SUBJECTID= ESS_SUBJECT.ESS_SUBJECTID ) ), SAL_GROUP2 AS ( --然後當然是依人員取得群組公式, union 就 ok 了 SELECT A.PERSONID,A.ESS_SUBJECTID,B.SALTERM,B.SEQNO,B.DCTYPE,B.CALCMETHOD,B.TRUETO,B.FALSETO FROM SAL_GROUP1 A LEFT JOIN ESS_GROUP X ON A.PERSONID = X.USERID LEFT JOIN ESSCALCFORMULA B ON B.PERSONID = X.GROUPID AND A.ESS_SUBJECTID = B.ESS_SUBJECTID AND B.FLAG = 2 ) SELECT A.PERSONID,A.ESS_SUBJECTID,ISNULL(A.SALTERM,@SALTERM) SALTERM,B.SALARY,A.SEQNO,A.DCTYPE,A.CALCMETHOD,A.TRUETO,A.FALSETO INTO #ESS_TMP9 FROM SAL_EMP A LEFT JOIN ESS_SUBJECT B ON A.PERSONID = B.PERSONID AND A.ESS_SUBJECTID = B.ESS_SUBJECTID UNION ALL SELECT A.PERSONID,A.ESS_SUBJECTID,ISNULL(A.SALTERM,@SALTERM) SALTERM,B.SALARY,A.SEQNO,A.DCTYPE,A.CALCMETHOD,A.TRUETO,A.FALSETO FROM SAL_GROUP2 A LEFT JOIN ESS_SUBJECT B ON A.PERSONID = B.PERSONID AND A.ESS_SUBJECTID = B.ESS_SUBJECTID ORDER BY 1,2,3,5 IF @FUNCTAG = 'ESSR2D' BEGIN IF NOT EXISTS (SELECT NAME FROM SYSOBJECTS WHERE NAME = 'ESSRPT_TMP7') CREATE TABLE dbo.ESSRPT_TMP7 ( LOGINID varchar(30), PERSONID VARCHAR(20), ESS_SUBJECTID VARCHAR(20), SALTERM VARCHAR(10), SALARY DECIMAL(12,2) ) DELETE FROM ESSRPT_TMP7 WHERE LOGINID = @LOGINID INSERT INTO ESSRPT_TMP7 SELECT DISTINCT @LOGINID,PERSONID,ESS_SUBJECTID,SALTERM,SALARY FROM #ESS_TMP9 WHERE SUBSTRING(ESS_SUBJECTID,1,1) = '1' AND SALARY > 0 END ELSE SELECT * FROM #ESS_TMP9 DROP TABLE #ESS_TMP9