204 lines
7.2 KiB
Plaintext
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 |