Files
e-Book/3.玩轉SQL/參考資料/erp/Day7/參考文檔/薪資-sp/GEX_CALCSALARY_STEP2.txt
T

204 lines
7.2 KiB
Plaintext

CREATE PROC dbo.GEX_CALCSALARY_STEP2
(
@P1 VARCHAR(100),
@P2 VARCHAR(100),
@P3 VARCHAR(100),
@P4 VARCHAR(100),
@P5 VARCHAR(100),
@P6 VARCHAR(100),
@P7 VARCHAR(100),
@P8 VARCHAR(100),
@P9 VARCHAR(100),
@P10 VARCHAR(100),
@P11 VARCHAR(100),
@P12 VARCHAR(100),
@LOGINID VARCHAR(30)
)
/*
Function : 呼叫 GEX_SALFORMULA_V3, 展開每一個 user 每個科目的計算公式(loop)
Description: 被主程序 GEX_CALCSALARY 呼叫
Build Date : 2013/05/23
Modify History
Item Who Date Modify Docs
==== ========== ========== ================================================
*/
AS
--0.預設值整理
IF @P1 = '*' SET @P1 = ''
IF @P2 = '*' SET @P2 = 'zzzzzz'
IF @P3 = '*' SET @P3 = ''
IF @P4 = '*' SET @P4 = 'zzzzzz'
IF @P7 = '*' SET @P7 = dbo.CALC_YEARMONTH(@P5)
IF @P8 = '*' SET @P8 = '0'
--計算薪資變數的值, 並寫到暫存檔
DECLARE @SQL1 NVARCHAR(2000)
DECLARE @SQL2 NVARCHAR(2000)
DECLARE @PERSONID VARCHAR(20)
DECLARE @ESS_SUBJECTID VARCHAR(20)
DECLARE @SALTERM VARCHAR(20)
DECLARE @SALARY DECIMAL(18,6)
DECLARE @SEQNO VARCHAR(20)
DECLARE @DCTYPE VARCHAR(20)
DECLARE @CALCMETHOD NVARCHAR(400)
DECLARE @TRUETO VARCHAR(20)
DECLARE @FALSETO VARCHAR(20)
DECLARE @D_SEQNO VARCHAR(20)
DECLARE @CDATA NVARCHAR(400)
DECLARE @RETVAL INT
DECLARE @PRE_STATE NVARCHAR(20)
DECLARE @PRE_CODE NVARCHAR(60)
--展開人員科目的所有項目, 呼叫 GEX_SALFORMULA_V3
SET @SQL1= 'EXEC GEX_SALFORMULA_V3 ' + CHAR(39)+@P5+CHAR(39)+','+CHAR(39)+@P6+CHAR(39) + ',' +
CHAR(39)+@P1+CHAR(39)+','+CHAR(39)+@P2+CHAR(39) + ',' +
CHAR(39)+@P3+CHAR(39)+','+CHAR(39)+@P4+CHAR(39) + ',' +
CHAR(39)+'*'+CHAR(39)+','+CHAR(39)+'*'+CHAR(39) + ',' +
CHAR(39)+'*'+CHAR(39)+','+CHAR(39)+'*'+CHAR(39) + ',' +
CHAR(39)+@P8+CHAR(39)+','+CHAR(39)+@LOGINID+CHAR(39) + ',' +
CHAR(39)+'ESSM62'+CHAR(39)
--利用暫存檔轉入(承接 SP 的展開內容)
CREATE TABLE #TMP88 (
PERSONID varchar(30),
ESS_SUBJECTID varchar(10),
SALTERM varchar(10),
SALARY DECIMAL(18,6),
SEQNO varchar(10),
DCTYPE varchar(10),
CALCMETHOD nvarchar(400),
TRUETO varchar(30),
FALSETO varchar(30)
)
INSERT INTO #TMP88
EXECUTE SP_EXECUTESQL @SQL1
--將 GEX_SALFORMULA_V3 展開的固定薪, 一併填到 ESS_TMPC1, 方便替換公式
INSERT INTO ESS_TMPC1 (LOGINID,VARID,PERSONID,RESULT_VALUE)
SELECT @LOGINID,'^'+ESS_SUBJECTID,PERSONID,SALARY FROM #TMP88 WHERE ISNULL(SALARY,0) > 0
--
DECLARE contact_cursor9 CURSOR FOR
SELECT PERSONID,ESS_SUBJECTID,SALTERM,SALARY,SEQNO,DCTYPE,CALCMETHOD,TRUETO,FALSETO FROM #TMP88
OPEN contact_cursor9
-- Perform the first fetch.
FETCH NEXT FROM contact_cursor9
INTO @PERSONID,@ESS_SUBJECTID,@SALTERM,@SALARY,@SEQNO,@DCTYPE,@CALCMETHOD,@TRUETO,@FALSETO
-- Check @@FETCH_STATUS to see if there are any more rows to fetch.
WHILE @@FETCH_STATUS = 0
BEGIN
SET @PRE_STATE = ''
--沒有設公式, 直接將 SALARY 寫入年檔(固定金額)
IF ISNULL(@SEQNO,'') = ''
BEGIN
INSERT INTO ESSCALCFORMULA_LOG (LOGINID,YEARMONTH,PERSONID,ESS_SUBJECTID,SALTERM,SEQNO,VAR_RECORD,CALCAMOUNT)
SELECT @LOGINID,@P7,@PERSONID,@ESS_SUBJECTID,@SALTERM,ISNULL(@SEQNO,''),'固定薪資',@SALARY
--INSERT INTO ESSYEARFINAL (PERSONID,YEARMONTH,SALTERM,ESS_SUBJECTID,SALARY)
--SELECT @PERSONID,@P7,@SALTERM,@ESS_SUBJECTID,@SALARY
END
--將計算過程寫到 ESSCALCFORMULA_LOG, 並將科目的最後一行結果填入年檔
ELSE IF @DCTYPE = 'DC'
BEGIN
INSERT INTO ESSCALCFORMULA_LOG (LOGINID,YEARMONTH,PERSONID,ESS_SUBJECTID,SALTERM,SEQNO,VAR_RECORD,CALCAMOUNT)
SELECT @LOGINID,@P7,@PERSONID,@ESS_SUBJECTID,@SALTERM,@SEQNO,@CALCMETHOD,0
END
ELSE IF @DCTYPE = 'IF'
BEGIN
--取得變數值, 利用前 SP 的 ESS_TMPC1, 直接一個一個 REPLACE
SELECT @CDATA=dbo.GEXFUNC_ESSREPLACE(@CALCMETHOD,@PERSONID,@ESS_SUBJECTID,@LOGINID)
--防錯, 防萬一客戶設錯(應該要設 CA 確設為 IF)
IF ISNUMERIC(@CDATA) = 1
BEGIN
SET @SQL2 = 'SELECT @RETVALIN=' + @CDATA
EXECUTE SP_EXECUTESQL @SQL2,N'@RETVALIN FLOAT OUT', @RETVAL OUT
--計算後, 寫入 LOG
INSERT INTO ESSCALCFORMULA_LOG (LOGINID,YEARMONTH,PERSONID,ESS_SUBJECTID,SALTERM,SEQNO,VAR_RECORD,CALCAMOUNT)
SELECT @LOGINID,@P7,@PERSONID,@ESS_SUBJECTID,@SALTERM,@SEQNO,@CALCMETHOD+' ==> '+@CDATA,@RETVAL
END
--防除以0 的 BUG
ELSE IF CHARINDEX('/0',@CDATA) > 0 OR CHARINDEX('/ 0',@CDATA) > 0
BEGIN
SET @RETVAL = 0
--計算後, 寫入 LOG
INSERT INTO ESSCALCFORMULA_LOG (LOGINID,YEARMONTH,PERSONID,ESS_SUBJECTID,SALTERM,SEQNO,VAR_RECORD,CALCAMOUNT)
SELECT @LOGINID,@P7,@PERSONID,@ESS_SUBJECTID,@SALTERM,@SEQNO,@CALCMETHOD+' ==> '+@CDATA,@RETVAL
END
ELSE BEGIN
SET @SQL2 = 'SELECT @RETVALIN=CASE WHEN ' + @CDATA + ' THEN 1 ELSE 0 END'
EXECUTE SP_EXECUTESQL @SQL2,N'@RETVALIN FLOAT OUT', @RETVAL OUT
IF @RETVAL = 1 SET @D_SEQNO = @TRUETO ELSE SET @D_SEQNO = @FALSETO
SET @PRE_CODE = ' ==> ' + @CDATA
WHILE @SEQNO <> @D_SEQNO AND @@FETCH_STATUS = 0
BEGIN
--每一行公式都要寫到 LOG
INSERT INTO ESSCALCFORMULA_LOG (LOGINID,YEARMONTH,PERSONID,ESS_SUBJECTID,SALTERM,SEQNO,VAR_RECORD)
SELECT @LOGINID,@P7,@PERSONID,@ESS_SUBJECTID,@SALTERM,@SEQNO,@CALCMETHOD + @PRE_CODE
SET @PRE_CODE = ''
FETCH NEXT FROM contact_cursor9
INTO @PERSONID,@ESS_SUBJECTID,@SALTERM,@SALARY,@SEQNO,@DCTYPE,@CALCMETHOD,@TRUETO,@FALSETO
END
SET @PRE_STATE = 'IF'
END
END
ELSE IF @DCTYPE = 'CA' OR @DCTYPE = 'SM'
BEGIN
--公式換成數字字串
SELECT @CDATA=dbo.GEXFUNC_ESSREPLACE(@CALCMETHOD,@PERSONID,@ESS_SUBJECTID,@LOGINID)
--防除以0 的 BUG
IF CHARINDEX('/0',@CDATA) > 0 OR CHARINDEX('/ 0',@CDATA) > 0
SET @RETVAL = 0
ELSE BEGIN
SET @SQL2 = 'SELECT @RETVALIN=' + @CDATA
EXECUTE SP_EXECUTESQL @SQL2,N'@RETVALIN FLOAT OUT', @RETVAL OUT
END
--計算後, 寫入 LOG
INSERT INTO ESSCALCFORMULA_LOG (LOGINID,YEARMONTH,PERSONID,ESS_SUBJECTID,SALTERM,SEQNO,VAR_RECORD,CALCAMOUNT)
SELECT @LOGINID,@P7,@PERSONID,@ESS_SUBJECTID,@SALTERM,@SEQNO,@CALCMETHOD+' ==> '+@CDATA,@RETVAL
END
ELSE IF @DCTYPE = 'GO'
BEGIN
SET @D_SEQNO = SUBSTRING(@CALCMETHOD,2,LEN(@CALCMETHOD)-1)
WHILE @SEQNO <> @D_SEQNO AND @@FETCH_STATUS = 0
BEGIN
--每一行公式都要寫到 LOG
INSERT INTO ESSCALCFORMULA_LOG (LOGINID,YEARMONTH,PERSONID,ESS_SUBJECTID,SALTERM,SEQNO,VAR_RECORD)
SELECT @LOGINID,@P7,@PERSONID,@ESS_SUBJECTID,@SALTERM,@SEQNO,'GO SKIP: '+@CALCMETHOD
FETCH NEXT FROM contact_cursor9
INTO @PERSONID,@ESS_SUBJECTID,@SALTERM,@SALARY,@SEQNO,@DCTYPE,@CALCMETHOD,@TRUETO,@FALSETO
END
SET @PRE_STATE = 'GO'
END
--如果是
IF @PRE_STATE = 'IF' OR @PRE_STATE = 'GO'
SET @PRE_STATE = ''
ELSE
FETCH NEXT FROM contact_cursor9
INTO @PERSONID,@ESS_SUBJECTID,@SALTERM,@SALARY,@SEQNO,@DCTYPE,@CALCMETHOD,@TRUETO,@FALSETO
END
CLOSE contact_cursor9
DEALLOCATE contact_cursor9
DROP TABLE #TMP88