|
代碼太長,所以有刪,但定義和引用是這樣,你還是可以看看的。
create or replace package as
--定義結構
TYPE MONTYPE IS RECORD(
PNL M_SMONTOFW.PNL%TYPE,
EVENT_NO M_DAYTOFW.EVENT_NO%TYPE,
B001 M_DAYTOFW.B001%TYPE,
B002 M_DAYTOFW.B002%TYPE,
B003 M_DAYTOFW.B003%TYPE,
B004 M_DAYTOFW.B004%TYPE,
B005 M_DAYTOFW.B005%TYPE,
UPDATE_NUMBER M_DAYTOFW.UPDATE_NUMBER%TYPE,
B011 M_DAYTOFW.B001%TYPE,
B012 M_DAYTOFW.B001%TYPE,
B013 M_DAYTOFW.B001%TYPE,
B014 M_DAYTOFW.B001%TYPE,
B015 M_DAYTOFW.B001%TYPE,
B016 M_DAYTOFW.B001%TYPE,
B017 M_DAYTOFW.B001%TYPE);
TYPE VDAYTOFW IS TABLE OF MONTYPE INDEX BY BINARY_INTEGER;
TYPE DUTY IS TABLE OF M_DUTY%ROWTYPE INDEX BY BINARY_INTEGER;
END;
CREATE OR REPLACE PROCEDURE MONTOFW
(VFACT_NO VARCHAR2,VYYMM VARCHAR2,VUSERNAME VARCHAR2,OUT_MSG OUT VARCHAR2)
IS
VUPRIGHT_TM NUMBER(3,1);
CURSOR C_1 IS
SELECT PNL,NAME_CH,NAME_EN,SLSORT_NO,SEC_NO,INFACT_DAY,INMOVE_DAY,DUTY_NO
FROM M_PERSONNEL
WHERE FACT_NO = VFACT_NO;
VUPDATE_NUMBER M_DAYTOFW.UPDATE_NUMBER%TYPE;
VCOMMIT INTEGER:=0;
VMON MON.VDAYTOFW;
VHOLD MON.VHOLDTOFW;
VCAREVTOPR MON.CAREVTOPR;
VDUTY MON.DUTY;
VSMONTOFW MON.SMONTOFW;
VSMONTOFW1 MON.SMONTOFW;
VEVENT_NO M_CAREVTOPR.EVENT_NO%TYPE;
QTY M_SMONTOFW.TIMES_NUMBER%TYPE;
VCHAR VARCHAR2(150);
VTURN INTEGER:=0;
VUPDATE_DELAY M_FACTORY.UPDATE_DELAY%TYPE;
VDELAY_LEAVE M_FACTORY.DELAY_LEAVE_%TYPE;
BEGIN
DELETE FROM M_SMONTOFW WHERE INFM_YM = VYYMM AND PNL IN (SELECT PNL FROM M_MONTOFW WHERE INFM_YM = VYYMM AND FACT_NO = VFACT_NO AND LEAVE_MK = 'N');
DELETE FROM M_MONTOFW WHERE INFM_YM = VYYMM AND FACT_NO = VFACT_NO AND LEAVE_MK = 'N';
COMMIT;
---SELECT MAX(NVL(UPRIGHT_TM,8)) INTO VUPRIGHT_TM FROM M_WAYCARD;
---取得廠別檔所設的修改次數計遲到,遲到次數算曠工
SELECT MAX(UPDATE_DELAY),MAX(DELAY_LEAVE_) INTO VUPDATE_DELAY,VDELAY_LEAVE FROM M_FACTORY WHERE FACT_NO = VFACT_NO;
---取得所有人員的1.0倍工時﹐2.0倍工時,3.0倍工時
FOR C2 IN C_2 LOOP
VC2 := VC2 + 1;
VMON(VC2).PNL := C2.PNL;
VMON(VC2).EVENT_NO := C2.EVENT_NO;
VMON(VC2).B001 := C2.B001;
VMON(VC2).B002 := C2.B002;
VMON(VC2).B003 := C2.B003;
VMON(VC2).B004 := C2.B004;
VMON(VC2).UPDATE_NUMBER := C2.UPDATE_NUMBER;
VMON(VC2).B011 := C2.B011;
VMON(VC2).B012 := C2.B012;
VMON(VC2).B013 := C2.B013;
VMON(VC2).B014 := C2.B014;
VMON(VC2).B015 := C2.B015;
VMON(VC2).B016 := C2.B016;
VMON(VC2).B017 := C2.B017;
END LOOP;
OPEN C_1;
LOOP
FETCH C_1 INTO C1;
EXIT WHEN C_1%NOTFOUND;
VCOMMIT := VCOMMIT + 1;
VSMONTOFW := VSMONTOFW1; ---清空所放個人所有項目的索引表
IF C1.INFACT_DAY <= VYYMM||'31' OR C1.INMOVE_DAY <= VYYMM||'31' THEN ---此人員本月要算工時
---INSERT主檔
INSERT INTO M_MONTOFW(INFM_YM,PNL,NAME_CH,NAME_EN,SLSORT_NO,SEC_NO,UPDATE_NM,UPDATE_TM,COUNT_TM,LEAVE_MK,FACT_NO)
VALUES(VYYMM,C1.PNL,C1.NAME_CH,C1.NAME_EN,C1.SLSORT_NO,C1.SEC_NO,VUSERNAME,TO_CHAR(SYSDATE,'YYYYMMDD'),TO_CHAR(SYSDATE,'YYYYMMDD'),'N',VFACT_NO);
FOR N IN 1..VC2 LOOP
VSMONTOFW(SUBSTR(VMON(N).EVENT_NO,2,3)).EVENT_NO := VMON(N).EVENT_NO;
VSMONTOFW(SUBSTR(VMON(N).EVENT_NO,2,3)).TIMES_NUMBER := NVL(VMON(N).B005,0);
END IF;
END LOOP;
END LOOP;
CLOSE C_1;
COMMIT;
END;
|