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