*{ INSERT DEVK947686 1
FORM FU_Z001 .
*获取需卡次数
*BREAK-POINT .
DATA : lt_psp like TABLE OF PC2BA WITH HEADER LINE ,
ls_psp TYPE PC2BA ,
lt_tip LIKE TABLE OF tip WITH HEADER LINE ,
ls_tip LIKE tip ,
LT_TEVEN LIKE TABLE OF TEVEN WITH HEADER LINE ,
lv_TEVENLInes1 TYPE int2 ,
lv_TEVENLInes2 TYPE int2 ,
t_datum TYPE sy-datum ,
v_qj TYPE int1 . "是否有勤假记录
DATA: LT_TES LIKE TES[] ,
LS_TES LIKE LINE OF LT_TES ,
modcnt type i.
ls_psp = psp .
* IF LS_PSP-DATUM = '20180330' .
* BREAK-POINT .
* ENDIF.
v_qj = 0 .
LOOP AT tip INTO ls_tip WHERE ORIGS = 'A' or ORIGS = 'P' .
* LOOP AT tip INTO ls_tip WHERE ZTART = '0120' or ZTART = '0130' .
v_qj = 1 .
ENDLOOP.
IF v_qj = 0 .
t_datum = LS_PSP-DATUM + 1 .
if p0007-zterf = '1'.
SELECT COUNT(*) INTO lv_TEVENLInes1 FROM TEVEN WHERE ( ( LDATE = LS_PSP-DATUM AND ( DALLF = '+' or DALLF = '=' or DALLF = '' ) AND PERNR = PERNR-pernr )
or ( LDATE = t_datum AND ( DALLF = '-' or DALLF = '<' ) ) AND PERNR = PERNR-pernr ) AND STOKZ = '' . "判断4笔卡
modcnt = lv_TEVENLInes1 mod 2.
IF lv_TEVENLInes1 < 4 or modcnt = 1.
LS_TES-ZTART = '9902' .
LS_TES-ANZHL = 1 .
ENDIF.
APPEND ls_TES to TES .
ENDIF.
ENDIF.
ENDFORM .
FORM FU_Z002 .
*判定公休
DATA : LT_P2001 TYPE STANDARD TABLE OF p2001 ,
LS_P2001 TYPE P2001 .
DATA : LT_TES LIKE TES[] ,
LS_TES LIKE LINE OF LT_TES .
LT_P2001[] = p2001[] .
LS_TES-ANZHL = 0 .
LOOP AT lt_P2001 INTO ls_P2001 WHERE ALLDF = 'X' AND KALTG >= 7 AND begda <= PSP-datum and endda >= PSP-datum .
* BREAK-POINT .
CASE ls_P2001-subty .
WHEN '1001' . "事假无薪
LS_TES-ANZHL = 1 .
WHEN '1016' . "病假无薪
LS_TES-ANZHL = 2 .
WHEN '1013' . "病假80%薪
LS_TES-ANZHL = 3 .
WHEN '1002' . "病假(全薪)
LS_TES-ANZHL = 4 .
WHEN '1003' . "产假80%薪
LS_TES-ANZHL = 5 .
WHEN OTHERS.
ENDCASE.
EXIT .
ENDLOOP.
LS_TES-ZTART = '9903' .
APPEND ls_TES to TES .
ENDFORM .
FORM FU_Z005 .
data : wa9025 like line of tes,
wa9026 like line of tes,
hours type PTM_QUONUM ,
it_TPROG like STANDARD TABLE OF Zhr_TPROG WITH HEADER LINE.
data: lt_tip LIKE TABLE OF tip WITH HEADER LINE ,
ls_tip LIKE tip ,
lt_tzp LIKE TABLE OF tzp WITH HEADER LINE .
constants: lv_time type uzeit value '240000' .
READ TABLE TES with key ZTART = '9025'. "2007申请加班时数
if sy-subrc = 0.
wa9025-anzhl = TES-anzhl.
ENDIF.
hours = 25 / 100 .
if wa9025-anzhl is INITIAL or wa9025-anzhl < hours .
exit.
endif.
READ TABLE TES with key ZTART = '9026'. "读取的实际加班时数
if sy-subrc = 0.
wa9026-anzhl = TES-anzhl.
ENDIF.
if wa9026-anzhl is INITIAL.
wa9026-anzhl = 0.
ENDIF.
if wa9025-anzhl = wa9026-anzhl.
exit.
ENDIF.
CLEAR: it_TPROG,it_TPROG[].
*select SINGLE * into CORRESPONDING FIELDS OF it_T550A from T550A WHERE MOTPR = '28' and TPROG = PSP-TPROG AND BEGDA LE PSP-DATUM AND ENDDA GE PSP-DATUM.
select SINGLE * into CORRESPONDING FIELDS OF it_TPROG from Zhr_TPROG WHERE TPROG = PSP-TPROG.
if it_TPROG is INITIAL.
exit.
ENDIF.
CHECK tzp[] is NOT INITIAL.
lt_tzp[] = tzp[].
sort lt_tzp by ZEIT DESCENDING.
delete ADJACENT DUPLICATES FROM lt_tzp.
READ TABLE lt_tzp INDEX 1.
"解决正班延后1/N 小时下班算加班的情况
if it_TPROG-endtm1 is NOT INITIAL.
lt_tip[] = tip[].
delete lt_tip where ztart ne '0310' OR VTYPE = 'M'.
data: tmptx type string ,
ss type P decimals 4 ,
hrs_beg type i,
hrs_end type i.
delete lt_tip WHERE BEGTM LT lt_tzp-zeit.
sort lt_tip[] by begtm.
read TABLE lt_tip into ls_tip with key BEGTM = lt_tzp-zeit.
if sy-subrc = 0.
if ls_tip-anzhl GE hours.
if ls_tip-anzhl > it_TPROG-SOLLZ1.
tmptx = it_TPROG-endtm1.
clear hrs_end.
hrs_end = tmptx+0(2).
ss = tmptx+2(2).
ss = ss / 60.
hrs_end = hrs_end * 10000 + ss * 10000.
if it_TPROG-endtm1 < '100000'. "如果下班时间小于 10:00,视为加班至第二天下班
hrs_end = hrs_end + lv_time.
endif.
ls_tip-endtm = hrs_end.
ls_tip-anzhl = it_TPROG-SOLLZ1.
ls_tip-VTYPE = 'M'.
* modify tip from ls_tip ."where BEGTM = hrs_beg .
delete tip where BEGTM = hrs_beg .
else.
ls_tip-VTYPE = 'M'.
delete tip where BEGTM = hrs_beg .
* modify tip from ls_tip .
endif.
if wa9026-anzhl + ls_tip-anzhl > wa9025-anzhl. "计算出来的加班总数不能超过申请加班的时数
ls_tip-anzhl = wa9025-anzhl - wa9026-anzhl.
ls_tip-endtm = ls_tip-begtm + ls_tip-anzhl * 10000.
wa9026-anzhl = wa9025-anzhl.
APPEND ls_tip to tip .
else.
wa9026-anzhl = wa9026-anzhl + ls_tip-anzhl.
APPEND ls_tip to tip .
endif.
delete TES where ZTART = '9026'.
tes-ztart = '9026'.
tes-ANZHL = wa9026-anzhl.
append tes.
ENDIF.
endif.
ENDIF.
"开始解决连班的情况
if wa9025-anzhl = wa9026-anzhl.
exit.
ENDIF.
data: it_lianban LIKE TABLE OF zhr_lianban WITH HEADER LINE,
nextday type datum.
nextday = psp-datum + 1.
select * INTO CORRESPONDING FIELDS OF TABLE it_lianban from zhr_lianban where pernr = pernr-pernr and ( kqdate = psp-datum or kqdate = nextday ) .
check sy-subrc = 0.
loop at it_lianban.
if it_lianban-kqdate = psp-datum and it_lianban-fst < '030000' and it_lianban-scd < '30000' . "小于当天3点的,视为前一天的连班需删除
delete it_lianban.
ENDIF.
if it_lianban-kqdate = nextday and ( it_lianban-fst > '030000' or it_lianban-scd > '030000' ). "大于第二天3点的,视为后一天的连班卡需删除
delete it_lianban.
ENDIF.
ENDLOOP.
check it_lianban[] is NOT INITIAL.
READ TABLE it_lianban INDEX 1.
check sy-subrc = 0.
data: lt_pt like TABLE OF pt with HEADER LINE,
tb_pt like TABLE OF pt with HEADER LINE.
data: lt_breaks type standard table of pwsdayint WITH HEADER LINE,
ls_breaks type pwsdayint.
lt_pt[] = pt[].
delete lt_pt where ldate ne psp-datum.
check lt_pt[] is NOT INITIAL.
if ( it_lianban-fst is INITIAL and it_lianban-scd is INITIAL ) or it_lianban-fst is not INITIAL. "都为初始值时可以看作是 班段1后连班,时间为 00:00:00
REFRESH lt_TZP[].
lt_TZP[] = TZP[].
delete lt_TZP where code ne '05'.
CHECK lt_TZP[] is NOT INITIAL.
sort lt_TZP by pdunb.
READ TABLE lt_TZP index 1 .
ls_breaks-BEGUZ = lt_TZP-zeit. "取休息开始时间
loop at TZP where zeit > lt_TZP-zeit.
ls_breaks-ENDUZ = TZP-zeit. "取休息结束时间
EXIT.
ENDLOOP.
ls_breaks-BEGUZ = ls_breaks-BEGUZ - 3600. "下班休息时间前推 1 小时
ls_breaks-ENDUZ = ls_breaks-ENDUZ + 3600. "上班开始时间后推 1 小时
data: hou type ptm_quonum,
breaks type p DECIMALS 2 .
breaks = 75 / 100 .
READ TABLE tes with key ZTART = '9100'. "排除连班允许的时间范围内的迟到早退时数
if sy-subrc = 0.
loop at tip where ztype = '02' and VTYPE = 'K'.
if tip-begtm BETWEEN ls_breaks-BEGUZ and ls_breaks-ENDUZ .
tes-anzhl = tes-anzhl - tip-anzhl.
endif.
endloop.
endif.
loop at lt_pt where begtm ge ls_breaks-BEGUZ and begtm lT ls_breaks-ENDUZ and endtm ge lt_TZP-zeit.
tb_pt[] = lt_pt[].
delete tb_pt where begtm ge lt_pt-begtm.
sort tb_pt by begtm descending.
delete ADJACENT DUPLICATES FROM tb_pt comparing ldate.
READ TABLE tb_pt INDEX 1.
if tb_pt-endtm lt ls_breaks-BEGUZ.
exit.
endif.
HOU = ( lt_pt-begtm - tb_pt-endtm ) / 3600 . "取连班中途休息时间
if hou > it_TPROG-MD_SISU. "连班休息时间超出规定时限, 则计迟到
tes-ZTART = '9100'.
tes-anzhl = tes-anzhl + hou - it_TPROG-MD_SISU.
ENDIF.
exit.
endloop.
if tes-ZTART = '9100'. "变更迟到早退
delete tes where ZTART = '9100'.
append tes.
endif.
ENDIF.
endform.
"区分迟到早退类型
FORM FU_Z003.
DATA: LT_LIANBAN LIKE STANDARD TABLE OF ZHR_LIANBAN WITH HEADER LINE.
DATA: TABIX1 TYPE I,
TABIX2 TYPE I,
lv_num type i.
DATA HTIP1 LIKE TIP.
CLEAR: TABIX1,TABIX2,lv_num.
IF PSP-TPROG+0(1) = 'X' .
CLEAR: LT_LIANBAN,LT_LIANBAN[].
SELECT SINGLE * INTO CORRESPONDING FIELDS OF LT_LIANBAN FROM ZHR_LIANBAN
WHERE PERNR = PERNR-PERNR AND KQDATE = PSP-DATUM .
IF LT_LIANBAN IS NOT INITIAL AND LT_LIANBAN-FST IS NOT INITIAL.
CLEAR TES.
TES-ZTART = 'ZLB1'.
TES-ANZHL = 1.
APPEND TES.
ENDIF.
ENDIF.
IF PSP-DATUM BETWEEN '20250125' and '20250205' AND ( ( SY-DATUM = '20250207' and sy-uzeit > '105000' ) or SY-DATUM between '20250208' and '20250210') .
DATA: IT_ZTIP LIKE TABLE OF ZTIP WITH HEADER LINE.
DATA: IT_ZTIP2 LIKE TABLE OF ZTIP WITH HEADER LINE.
CLEAR:IT_ZTIP[],IT_ZTIP2[].
LOOP AT TIP WHERE ZTART = 'Z004' OR ZTART = 'Z005'.
CLEAR:IT_ZTIP,IT_ZTIP2.
MOVE-CORRESPONDING TIP TO IT_ZTIP.
* IT_ZTIP-BEGTM+2(2) = TIP-BEGTM+2(2) / 100 * 60.
* IT_ZTIP-ENDTM+2(2) = TIP-ENDTM+2(2) / 100 * 60.
IT_ZTIP-PERNR = PERNR-PERNR.
IT_ZTIP-DATUM = PSP-DATUM.
APPEND IT_ZTIP.
* IT_ZTIP2-ZTART = TIP-ztart.
IT_ZTIP2-anzhl = TIP-anzhl.
collect it_ztip2.
ENDLOOP.
LOOP AT IT_ZTIP2 WHERE ANZHL GE 8.
DELETE IT_ZTIP WHERE ZTART = 'Z004' OR ZTART = 'Z005'.
COMMIT WORK.
ENDLOOP.
CLEAR IT_ZTIP2[].
SELECT * INTO TABLE IT_ZTIP2 FROM ZTIP WHERE PERNR = PERNR-PERNR AND DATUM = PSP-DATUM.
IF IT_ZTIP2[] IS NOT INITIAL.
LOOP AT IT_ZTIP2 .
READ TABLE IT_ZTIP WITH KEY PERNR = IT_ZTIP2-PERNR DATUM = PSP-DATUM BEGTM = IT_ZTIP2-BEGTM ENDTM = IT_ZTIP2-ENDTM.
IF SY-SUBRC NE 0.
DELETE FROM ZTIP WHERE PERNR = IT_ZTIP2-PERNR AND DATUM = PSP-DATUM AND BEGTM = IT_ZTIP2-BEGTM AND ENDTM = IT_ZTIP2-ENDTM.
COMMIT WORK.
ENDIF.
ENDLOOP.
ENDIF.
IF IT_ZTIP[] IS NOT INITIAL.
MODIFY ZTIP FROM TABLE IT_ZTIP[].
ENDIF.
ENDIF.
"早退处理
LOOP AT TIP WHERE VTYPE = 'E'.
TABIX2 = SY-TABIX.
EXIT.
ENDLOOP.
DESCRIBE TABLE TIP[] LINES lv_num.
CHECK TABIX2 <> '0'.
TABIX1 = TABIX2.
TABIX1 = TABIX1 + 1.
* DO 16 TIMES.
IF TABIX1 <= lv_num.
CLEAR htip1.
READ TABLE TIP INDEX TABIX1 INTO HTIP1.
IF HTIP1-ZTYPE = '05'.
TABIX1 = TABIX1 + 1.
ELSEIF HTIP1-ZTART = 'Z004' AND HTIP1-VTYPE = 'L'.
HTIP1-VTYPE = 'E'.
HTIP1-ZTART = 'Z005'.
MODIFY TIP FROM HTIP1 INDEX TABIX1.
ELSEIF HTIP1-ZTYPE = '02' AND HTIP1-VTYPE = 'S' AND TIP-ZTART = 'Z005' AND PSP-TPROG+0(1) NE 'X' .
CLEAR LT_LIANBAN.
SELECT SINGLE * INTO CORRESPONDING FIELDS OF LT_LIANBAN FROM ZHR_LIANBAN
WHERE PERNR = PERNR-PERNR AND KQDATE = PSP-DATUM .
IF ( LT_LIANBAN-FST IS NOT INITIAL AND TIP-ENDTM < '125000' ) OR ( LT_LIANBAN-SCD IS NOT INITIAL AND TIP-ENDTM < '185000' ).
TIP-VTYPE = 'E'.
TIP-ZTART = 'Z004'.
MODIFY TIP INDEX TABIX2.
ENDIF.
ENDIF.
ENDIF.
* ENDDO.
ENDFORM. "FU_Z003
"特殊加班处理:连班处理
FORM FU_Z004.
DATA: LT_LIANBAN LIKE STANDARD TABLE OF ZHR_LIANBAN WITH HEADER LINE,
LT_TPROG LIKE STANDARD TABLE OF ZHR_TPROG WITH HEADER LINE,
WA_TPROG LIKE LINE OF LT_TPROG,
LS_LIANBAN TYPE ZHR_LIANBAN,
ZTPROG TYPE TPROG,
* LS_TPROG TYPE ZHR_TPROG,
LS_TZP LIKE TZP.
DATA: LS_FLAG(1) TYPE C. "判断连班期间段是否有请假记录
DATA: LS_ZEIT TYPE TIMPT,
LS_TABIX TYPE SY-TABIX.
DATA: LS_NDAY TYPE DATUM.
DATA: LS_ZSOT TYPE PTM_QUODED.
DATA: LS_PDNUM(6) TYPE C.
DATA: LS_BEGTM(6) TYPE C.
LS_NDAY = PSP-DATUM + 1.
REFRESH: LT_TPROG.
CLEAR ZTPROG.
if PSP-TPROG ne 'OFF'.
ZTPROG = PSP-TPROG.
IF ZTPROG+0(1) = 'X' OR ZTPROG+0(1) = 'Y'. "半天对调班次
IF ZTPROG+1(1) > '9'. "大竹班次,班次名称第个字符为字母
ZTPROG = 'D' && ZTPROG+1(3).
ELSE.
ZTPROG = 'H' && ZTPROG+1(3).
ENDIF.
ENDIF.
SELECT * INTO CORRESPONDING FIELDS OF TABLE LT_TPROG
FROM ZHR_TPROG
WHERE TPROG = ZTPROG
AND BEGDA <= PSP-DATUM
AND ENDDA >= PSP-DATUM.
CHECK LT_TPROG[] is NOT INITIAL. "add by yangyueqian
READ TABLE LT_TPROG INDEX 1.
MOVE-CORRESPONDING LT_TPROG to WA_TPROG.
endif.
IF AS-PARM2 EQ 'ZLB1' AND PSP-TPROG+0(1) NE 'X'. "连班处理
REFRESH: LT_LIANBAN,LT_TPROG.
SELECT * INTO CORRESPONDING FIELDS OF TABLE LT_LIANBAN FROM ZHR_LIANBAN
WHERE PERNR = PERNR-PERNR
AND KQDATE = PSP-DATUM .
CLEAR LS_LIANBAN.
loop at p0001 where pernr = PERNR-PERNR and begda le PSP-DATUM and endda ge PSP-DATUM.
exit.
ENDLOOP.
READ TABLE LT_LIANBAN INTO LS_LIANBAN INDEX 1.
IF SY-SUBRC = 0 OR ( p0001-ABKRS EQ 'Y2' and ( PSP-ZMODN = 'DCPY' or PSP-ZMODN = 'DSMY' or PSP-ZMODN = 'DZPY' ) ).
CLEAR: LS_TABIX,LS_TZP.
DATA: z_begtm type TIMPT,
z_endtm type TIMPT.
DATA: z_begtm2 type TIMPT,
z_endtm2 type TIMPT.
DATA HOURS TYPE P DECIMALS 4. "实际上班打卡的班段数目
HOURS = 1 / 6 . "10 分钟
IF p0001-ABKRS EQ 'Y2' and ( PSP-ZMODN = 'DCPY' or PSP-ZMODN = 'DSMY' or PSP-ZMODN = 'DZPY' ).
IF LT_TPROG-MD_SISU > HOURS.
LOOP AT TZP WHERE CODE = '05' and pdunb > HOURS.
LS_LIANBAN-FST = TZP-ZEIT.
EXIT.
ENDLOOP.
ENDIF.
IF LT_TPROG-PM_SIHU > HOURS.
LOOP AT TZP WHERE CODE = '01' and ZEIT > '000001'.
LS_LIANBAN-SCD = TZP-ZEIT.
EXIT.
ENDLOOP.
ENDIF.
ENDIF.
IF LS_LIANBAN-FST IS NOT INITIAL and LT_TPROG-MD_SISU > HOURS.
" 判断连班申请时间无请假记录,否则不做连班替换。---BEGIN
CLEAR: LS_FLAG.
LOOP AT AB WHERE BEGDA <= PSP-DATUM
AND ENDDA >= PSP-DATUM.
IF AB-BEGUZ IS INITIAL OR AB-ENDUZ is INITIAL.
LS_FLAG = 'X'.
ELSE.
IF AB-ENDUZ < AB-BEGUZ.
ADD 24 TO AB-ENDUZ+0(2).
ENDIF.
IF AB-BEGUZ <= LS_LIANBAN-FST and AB-ENDUZ >= LS_LIANBAN-FST.
LS_FLAG = 'X'.
ENDIF.
ENDIF.
ENDLOOP.
IF LS_FLAG <> 'X' AND LT_TPROG-MD_SISU IS NOT INITIAL .
" 判断连班申请时间无请假记录,否则不做连班替换。---END
IF LS_LIANBAN-FST = '000100'.
LS_LIANBAN-FST = '240000'.
ENDIF.
IF LS_LIANBAN-FST < '030000'.
ADD 24 TO LS_LIANBAN-FST+0(2).
ENDIF.
PERFORM DEZIMAL USING LS_LIANBAN-FST.
" 变更连班时间匹配TZP中休息开始时间的逻辑 --20190813
data esc_flg(1). "判断是否与请假时间有重叠,则不考虑连班
data: mi type i ,"分钟数"
mi_c(2).
LOOP AT TZP WHERE CODE = '05' and pdunb > HOURS.
LS_TABIX = SY-TABIX.
CLEAR: z_begtm,z_endtm,LS_TZP.
z_begtm = TZP-ZEIT - '010000'.
LS_TABIX = LS_TABIX + 1.
READ TABLE TZP INDEX LS_TABIX INTO LS_TZP.
if LS_TZP is not INITIAL.
z_endtm = LS_TZP-ZEIT + '010000'.
ENDIF.
*---------------判断连班申请时间后是否有打卡记录,如无打卡记录,则不做连班替换---BEGIN----*
IF ls_flag IS INITIAL.
mi = z_begtm+2(2).
mi_c = mi / 100 * 60 .
if STRLEN( mi_c ) = 1.
CONCATENATE '0' mi_c INTO mi_c.
endif.
z_begtm2 = z_begtm.
z_begtm2+2(2) = mi_c.
mi = z_endtm+2(2).
mi_c = mi / 100 * 60 .
if STRLEN( mi_c ) = 1.
CONCATENATE '0' mi_c INTO mi_c.
endif.
z_endtm2 = z_endtm.
z_endtm2+2(2) = mi_c.
LOOP AT pt WHERE ldate = psp-datum
AND begtm >= z_begtm2 and begtm < z_endtm2.
ENDLOOP.
IF sy-subrc <> 0.
ls_flag = 'X'.
EXIT.
ENDIF.
ENDIF.
*---------------判断连班申请时间后是否有打卡记录,如无打卡记录,则不做连班替换--
CLEAR esc_flg.
"连班中班休息时长
if LS_LIANBAN-FST BETWEEN z_begtm and z_endtm.
CLEAR TES.
TES-ZTART = 'Z101'.
TES-ANZHL = TZP-PDUNB.
APPEND TES.
CLEAR TES.
TES-ZTART = 'Z102'.
TES-ANZHL = LT_TPROG-MD_SISU.
APPEND TES.
TZP-ZEIT = TZP-ZEIT - '010000'.
TZP-CODE = '10'.
TZP-PDUNB = TZP-PDUNB + 2.
MODIFY TZP.
IF Z_ENDTM IS NOT INITIAL.
LS_TZP-ZEIT = LS_TZP-ZEIT + '010000'.
MODIFY TZP FROM LS_TZP INDEX LS_TABIX.
ENDIF.
EXIT.
ENDIF.
ENDLOOP.
ENDIF. "---
ENDIF.
IF LS_LIANBAN-FST IS NOT INITIAL AND ( LS_LIANBAN-SCD IS INITIAL OR LS_LIANBAN-SCD = '' ) AND LT_TPROG-PM_SIHU > HOURS AND PSP-TPKLA = '2'.
LS_LIANBAN-SCD = LS_LIANBAN-FST.
ENDIF.
IF LS_LIANBAN-SCD IS NOT INITIAL AND LT_TPROG-SOLLZ3 IS NOT INITIAL AND LT_TPROG-PM_SIHU > HOURS.
" 判断连班申请时间无请假记录,否则不做连班替换。---BEGIN
CLEAR: LS_FLAG.
LOOP AT AB WHERE BEGDA <= PSP-DATUM
AND ENDDA >= PSP-DATUM.
IF AB-BEGUZ IS INITIAL OR AB-ENDUZ IS INITIAL.
LS_FLAG = 'X'.
ELSE.
IF AB-ENDUZ < AB-BEGUZ.
ADD 24 TO AB-ENDUZ+0(2).
ENDIF.
IF AB-BEGUZ <= LS_LIANBAN-SCD AND AB-ENDUZ >= LS_LIANBAN-SCD.
LS_FLAG = 'X'.
ENDIF.
ENDIF.
ENDLOOP.
CLEAR:LS_TZP,LS_PDNUM,Z_BEGTM,Z_ENDTM.
PERFORM DEZIMAL USING LS_LIANBAN-SCD.
PERFORM DEZIMAL USING LT_TPROG-BEGTM3.
DATA: CNT TYPE I.
CNT = LINES( TZP[] ).
CHECK CNT GT LS_TABIX.
READ TABLE TZP INTO LS_TZP INDEX CNT.
"判断连班申请时间后是否有打卡记录,如无打卡记录,则不做连班替换
IF LS_FLAG <> 'X' AND LT_TPROG-PM_SIHU IS NOT INITIAL.
" 判断连班申请时间无请假记录,否则不做连班替换。---END
Z_BEGTM = LS_TZP-ZEIT - '010000'.
* Z_ENDTM = LT_TPROG-BEGTM3 + '010000'.
WA_TPROG-ENDTM3 = WA_TPROG-BEGTM3 + 3600.
PERFORM DEZIMAL USING WA_TPROG-ENDTM3.
Z_ENDTM = WA_TPROG-ENDTM3.
IF Z_BEGTM > Z_ENDTM.
ADD 24 TO Z_ENDTM+0(2).
ENDIF.
*---------------判断连班申请时间后是否有打卡记录,如无打卡记录,则不做连班替换 ---BEGIN----*
IF LS_FLAG IS INITIAL.
mi = z_begtm+2(2).
mi_c = mi / 100 * 60 .
if STRLEN( mi_c ) = 1.
CONCATENATE '0' mi_c INTO mi_c.
endif.
z_begtm2 = z_begtm.
z_begtm2+2(2) = mi_c.
mi = z_endtm+2(2).
mi_c = mi / 100 * 60 .
if STRLEN( mi_c ) = 1.
CONCATENATE '0' mi_c INTO mi_c.
endif.
z_endtm2 = z_endtm.
z_endtm2+2(2) = mi_c.
LOOP AT PT WHERE LDATE = PSP-DATUM
AND BEGTM >= z_begtm2 and BEGTM < z_endtm2.
ENDLOOP.
IF SY-SUBRC <> 0.
LS_FLAG = 'X'.
EXIT.
ENDIF.
ENDIF.
*---------------判断连班申请时间后是否有打卡记录,如无打卡记录,则不做连班替换 ---END------*
CLEAR esc_flg.
loop at ab where begda le psp-datum and endda ge psp-datum.
if ( ab-beguz > z_begtm and ab-beguz < z_endtm ) or ( ab-enduz > z_begtm and ab-enduz < z_endtm ) or ( ab-beguz le z_begtm and ab-enduz ge z_endtm ).
esc_flg = 'X'.
exit.
endif.
ENDLOOP.
IF ESC_FLG = 'X'. "与请假时间有重叠,则不考虑连班
exit.
ENDIF.
* READ TABLE TZP INTO LS_TZP WITH KEY ZEIT = LS_LIANBAN-SCD.
IF LS_LIANBAN-SCD BETWEEN z_begtm and z_endtm.
LS_TABIX = SY-TABIX.
READ TABLE LT_TPROG INDEX 1.
IF LT_TPROG-BEGTM3+0(2) < '03'.
ADD 24 TO LT_TPROG-BEGTM3+0(2).
ENDIF.
IF LT_TPROG-BEGTM3 > LS_TZP-ZEIT."----
CLEAR TZP.
TZP-ZEIT = LT_TPROG-BEGTM3.
TZP-CODE = '01'.
"----BEGIN
* LS_PDNUM = LT_TPROG-BEGTM3 - LS_LIANBAN-SCD.----mark*
* LS_PDNUM = LS_PDNUM / 3600.----mark*
DATA: ls_time(6) type c.
ls_time = LT_TPROG-BEGTM3.
LS_PDNUM = ( ls_time - LS_TZP-ZEIT ) / 10000." ----add
"----END
TZP-PDUNB = LS_PDNUM.
APPEND TZP.
"连班晚班休息时长
CLEAR TES.
TES-ZTART = 'Z201'.
TES-ANZHL = LS_PDNUM." + 1.
APPEND TES.
CLEAR TES.
TES-ZTART = 'Z202'.
TES-ANZHL = LT_TPROG-PM_SIHU.
APPEND TES.
LS_TZP-ZEIT = LS_TZP-ZEIT - '010000'.
LS_TZP-CODE = '07'.
* LS_TZP-PDUNB = LS_TZP-PDUNB + 2.
LS_TZP-PDUNB = LS_PDNUM + 2.
MODIFY TZP FROM LS_TZP INDEX LS_TABIX.
LS_TABIX = LS_TABIX + 1.
CLEAR:LS_TZP.
READ TABLE TZP INDEX LS_TABIX INTO LS_TZP.
IF LS_TZP IS NOT INITIAL.
LS_TZP-ZEIT = LS_TZP-ZEIT + '010000'.
* LS_TZP-CODE = '07'.
MODIFY TZP FROM LS_TZP INDEX LS_TABIX.
ENDIF.
ENDIF."
ENDIF.
ENDIF."
ENDIF.
ENDIF.
ENDIF.
CLEAR LS_ZSOT.
LOOP AT ANWKONTI WHERE KTART = '01'
AND BEGDA <= PSP-DATUM
AND ENDDA >= PSP-DATUM.
LS_ZSOT = LS_ZSOT + ANWKONTI-ANZHL.
ENDLOOP.
if SY-SUBRC <> 0 and p0001-abkrs = 'Y2' and p0001-persk = 'A6'.
ANWKONTI-INFTY = '2007'.
ANWKONTI-SUBTY = '01'.
ANWKONTI-KTART = '01'.
ANWKONTI-VERSL = '1'.
ANWKONTI-ZEINH = '001'.
ANWKONTI-REWRI = '1'.
ANWKONTI-DESTA = PSP-DATUM.
ANWKONTI-DEEND = PSP-DATUM.
APPEND ANWKONTI.
else.
CHECK SY-SUBRC = 0.
ENDIF.
IF as-parm2 EQ 'ZOT1'. "特殊加班处理:固定延时加班,加班有效时间段,总加班时长控制
CLEAR TES.
TES-ZTART = 'Z100'. "当天加班有效时长
TES-ANZHL = LS_ZSOT.
APPEND TES.
IF LT_TPROG-BEGTM3 EQ ''.
LT_TPROG-BEGTM3 = '000000'.
ENDIF.
IF LT_TPROG-ENDTM3 EQ ''.
LT_TPROG-ENDTM3 = '000000'.
ENDIF.
IF LT_TPROG-ENDTM1 EQ ''.
LT_TPROG-ENDTM1 = '000000'.
ENDIF.
""加班有效时间段替换
LOOP AT ANWKONTI WHERE KTART = '01' AND BEGDA <= PSP-DATUM AND ENDDA >= PSP-DATUM.
IF PSP-TPROG+0(1) = 'X'. " OR ZTPROG+0(1) = 'Y'. "半天对调班次
DATA:GT_T550P LIKE TABLE OF T550P WITH HEADER LINE,
ZPDUNB TYPE PDUNB,
ZPAMOD TYPE PAMOD.
CLEAR:ZPAMOD.
SELECT SINGLE PAMOD INTO ZPAMOD FROM T550A WHERE MOTPR = '28' AND TPROG = ZTPROG.
IF NOT ZPAMOD IS INITIAL.
ZPDUNB = 17.
ZPDUNB = ZPDUNB / 100 .
SELECT single * INTO CORRESPONDING FIELDS OF GT_T550P FROM T550P WHERE MOTPR = '28' AND PAMOD = ZPAMOD AND PDUNB > ZPDUNB .
IF SY-SUBRC = 0.
PERFORM DEZIMAL USING GT_T550P-PABEG.
PERFORM DEZIMAL USING GT_T550P-PAEND.
READ TABLE TES WITH KEY ZTART = 'ZLB1'.
IF SY-SUBRC = 0 . "如果有申请连班
ANWKONTI-BEGUZ = GT_T550P-PABEG.
ELSE.
IF LT_TPROG-GDJBB1 IS NOT INITIAL.
PERFORM DEZIMAL USING LT_TPROG-GDJBB1.
ANWKONTI-BEGUZ = LT_TPROG-GDJBB1.
ELSE.
ANWKONTI-BEGUZ = GT_T550P-PAEND.
ENDIF.
ENDIF.
IF LT_TPROG-ENDTM1 IS NOT INITIAL AND LT_TPROG-BEGTM3 IS INITIAL.
ANWKONTI-ENDUZ = LT_TPROG-ENDTM1.
ELSE.
ANWKONTI-ENDUZ = '240000'.
ENDIF.
MODIFY ANWKONTI.
* "针对班段3 再做处理 20230914 注释掉
* IF LT_TPROG-BEGTM3 IS NOT INITIAL AND LT_TPROG-BEGTM3 > LT_TPROG-ENDTM1.
* ANWKONTI-BEGUZ = LT_TPROG-BEGTM3.
* ANWKONTI-ENDUZ = '240000'.
* ENDIF.
ENDIF.
ENDIF.
IF ANWKONTI-ENDUZ IS INITIAL.
ANWKONTI-BEGUZ = TZP-ZEIT.
ANWKONTI-ENDUZ = '240000'.
MODIFY ANWKONTI.
ENDIF.
EXIT.
ELSEIF LT_TPROG-BEGTM3 IS NOT INITIAL AND LT_TPROG-ENDTM3 IS NOT INITIAL . " 1 . 有班段三的情况
PERFORM DEZIMAL USING LT_TPROG-BEGTM3.
PERFORM DEZIMAL USING LT_TPROG-ENDTM3.
* PERFORM DEZIMAL USING LT_TPROG-ENDTM1. "
READ TABLE TZP WITH KEY CODE = '02'. "取班次开始时间
IF SY-SUBRC = 0.
IF LT_TPROG-BEGTM3 < TZP-ZEIT.
ADD 24 TO LT_TPROG-BEGTM3+0(2).
ADD 24 TO LT_TPROG-ENDTM3+0(2).
ENDIF.
ENDIF.
IF LT_TPROG-ENDTM3 < LT_TPROG-BEGTM3.
ADD 24 TO LT_TPROG-ENDTM3+0(2).
ENDIF.
IF PSP-FTKLA = '1' OR PSP-TPROG = 'OFF'. "法定假日加班,从班次开始时间算起
ANWKONTI-BEGUZ = TZP-ZEIT.
DATA:ZENDTM(6) TYPE C,
ZHRS TYPE I.
ZENDTM = ANWKONTI-BEGUZ.
ZHRS = ANWKONTI-ANZHL * 10000.
ADD ZHRS TO ZENDTM.
IF ANWKONTI-ENDUZ IS NOT INITIAL AND ANWKONTI-ENDUZ < ZENDTM.
ANWKONTI-ENDUZ = ZENDTM.
ENDIF.
ELSEIF ANWKONTI-BEGUZ IS INITIAL OR ANWKONTI-BEGUZ <= LT_TPROG-BEGTM3.
ANWKONTI-BEGUZ = LT_TPROG-BEGTM3.
ENDIF.
IF ANWKONTI-ENDUZ IS INITIAL OR ANWKONTI-ENDUZ >= LT_TPROG-ENDTM3 OR ANWKONTI-ENDUZ < ANWKONTI-BEGUZ.
ANWKONTI-ENDUZ = LT_TPROG-ENDTM3.
ENDIF.
MODIFY ANWKONTI.
* ELSEIF LT_TPROG-ENDTM1 is not INITIAL or LT_TPROG-SOLLZ1 is NOT INITIAL. " 2. 没有班段3 但有延时下班的情况
* "这种情况是不存在连班的
* PERFORM DEZIMAL USING LT_TPROG-ENDTM1.
* READ TABLE TZP WITH KEY CODE = '02'. "取班次开始时间
* IF SY-SUBRC = 0.
* IF LT_TPROG-ENDTM1 < TZP-ZEIT.
* ADD 24 TO LT_TPROG-ENDTM1+0(2).
* ENDIF.
* ENDIF.
*
* ANWKONTI-ENDUZ = LT_TPROG-ENDTM1.
*
* IF PSP-FTKLA = '1' OR PSP-TPROG = 'OFF'. "法定假日加班,从班次开始时间算起
* ANWKONTI-BEGUZ = TZP-ZEIT.
* ELSE.
* LOOP AT TZP WHERE CODE = '01'. "取班次结束时间(最后一条)
* ENDLOOP.
* ANWKONTI-BEGUZ = TZP-ZEIT.
* ENDIF.
* MODIFY ANWKONTI.
ELSEIF PSP-FTKLA = '1' OR PSP-TPROG = 'OFF' or p2003-VTART = '03'. " 3. 没有班段3、 没有延时下班, 且为法定假或周末的情况
READ TABLE TZP WITH KEY CODE = '02'. "取班次开始时间
IF SY-SUBRC = 0.
ANWKONTI-BEGUZ = TZP-ZEIT.
ENDIF.
LOOP AT TZP WHERE CODE = '01'. "取班次结束时间(最后一条)
ENDLOOP.
ANWKONTI-ENDUZ = TZP-ZEIT.
MODIFY ANWKONTI.
ENDIF.
ENDLOOP.
"关于固定延时加班
IF LT_TPROG-ENDTM1 IS NOT INITIAL AND LT_TPROG-ENDTM1 NE '' AND TIP[] IS NOT INITIAL . "固定延时加班
SORT TZP BY ZEIT.
DATA IDX TYPE I.
READ TABLE TES WITH KEY ZTART = 'Z201'.
CHECK SY-SUBRC NE 0. "上了下午连班的,则不能有固定延时加班
SORT TIP BY BEGTM DESCENDING. "取班次结束时间
READ TABLE TIP WITH KEY PTYPE = '1' ZTYPE = '02' VTYPE = 'S'.
DATA: ZVERSL TYPE VRSCH.
ZVERSL = ANWKONTI-VERSL.
CLEAR ANWKONTI.
ANWKONTI-INFTY = '2007'.
ANWKONTI-SUBTY = '02'.
ANWKONTI-KTART = '02'. "固定延时加班
ANWKONTI-BEGDA = PSP-DATUM.
ANWKONTI-ENDDA = PSP-DATUM.
ANWKONTI-VERSL = ZVERSL.
IDX = LINES( TZP ).
READ TABLE TZP INDEX IDX.
ANWKONTI-BEGUZ = TZP-ZEIT.
PERFORM DEZIMAL USING LT_TPROG-ENDTM1.
READ TABLE TZP WITH KEY CODE = '02'.
IF SY-SUBRC = 0.
IF LT_TPROG-ENDTM1 < TZP-ZEIT.
ADD 24 TO LT_TPROG-ENDTM1+0(2).
ENDIF.
ENDIF.
"固定延时加班的逻辑全部改为: 配置表中最大允许的加班时数 (20190801改)
* DATA HOURS TYPE P DECIMALS 4. "实际上班打卡的班段数目
HOURS = 1 / 6 . "10 分钟
READ TABLE TZP INDEX IDX.
READ TABLE TIP WITH KEY BEGTM = TZP-ZEIT BSART = 'P10' ORIGS = 'E'.
IF SY-SUBRC = 0 AND TIP-ANZHL >= hours .
if TIP-ANZHL < LT_TPROG-SOLLZ1. "1. 按实际打卡来计算加班时间期间
HOURS = HOURS + 1.
if TIP-ANZHL >= HOURS .
ANWKONTI-ENDUZ = TIP-ENDTM .
ANWKONTI-ANZHL = TIP-ANZHL.
else. "2. 只限定 1 小时的加班时间期间
ANWKONTI-ENDUZ = TIP-BEGTM .
ADD 1 TO ANWKONTI-ENDUZ+0(2) .
ANWKONTI-ANZHL = 1.
endif.
else. "3. 按班次配置表中的配置设定加班时间期间
ANWKONTI-ENDUZ = LT_TPROG-ENDTM1 .
ANWKONTI-ANZHL = LT_TPROG-SOLLZ1.
HOURS = 100.
endif.
ANWKONTI-ZEINH = '001'.
ANWKONTI-REWRI = '1'.
ANWKONTI-DESTA = PSP-DATUM.
ANWKONTI-DEEND = PSP-DATUM.
APPEND ANWKONTI.
DATA : ZBEGTM2(6),ZENDTM2(6).
ZBEGTM2 = ANWKONTI-BEGUZ .
ZENDTM2 = ANWKONTI-ENDUZ .
"ADD BY YANGYQ 解决班次配置表中只填了固定延时下班时间,未填班段3的开始和结束时间时考勤核算加班时数不正确的问题 (把延时下班的开始时间、结束时间更新到 01类型的加班申请中去)
IF LT_TPROG-BEGTM3 IS INITIAL AND LT_TPROG-ENDTM3 IS INITIAL.
LOOP AT ANWKONTI WHERE KTART = '01' AND BEGDA <= PSP-DATUM AND ENDDA >= PSP-DATUM.
IF ZBEGTM2 IS INITIAL AND ZENDTM2 IS INITIAL.
SELECT SINGLE SOBEG INTO ( ZBEGTM2 ) FROM T550A WHERE MOTPR = '28' AND TPROG = PSP-ZMODN AND BEGDA LE PSP-DATUM AND ENDDA GE PSP-DATUM.
SELECT SINGLE * INTO CORRESPONDING FIELDS OF LT_TPROG FROM ZHR_TPROG WHERE TPROG = ZTPROG AND BEGDA <= PSP-DATUM AND ENDDA >= PSP-DATUM.
IF SY-SUBRC = 0.
ZENDTM2 = LT_TPROG-ENDTM3.
IF LT_TPROG-ENDTM3 < LT_TPROG-BEGTM3.
ADD 24 TO ZENDTM2+0(2).
ENDIF.
ENDIF.
PERFORM DEZIMAL USING ZBEGTM2.
PERFORM DEZIMAL USING ZENDTM2.
ENDIF.
ANWKONTI-ENDUZ = ZENDTM2 .
ANWKONTI-BEGUZ = ZBEGTM2.
MODIFY ANWKONTI.
ENDLOOP.
ENDIF.
"ADD BY YANGYQ on 20200402 “上班段3没有上班的情况下,直落班次时加班时数不超过设置的上限 (LT_TPROG-SOLLZ1),取消班段3的加班区间
READ TABLE TIP index 1.
IF HOURS = 100 AND TIP-BEGTM LE TZP-ZEIT AND ( LT_TPROG-BEGTM3 IS NOT INITIAL OR LT_TPROG-ENDTM3 IS NOT INITIAL ).
LOOP AT ANWKONTI WHERE KTART = '01' AND BEGDA <= PSP-DATUM AND ENDDA >= PSP-DATUM.
IF ANWKONTI-BEGUZ > ZBEGTM2.
ANWKONTI-BEGUZ = ZBEGTM2.
ENDIF.
IF ANWKONTI-ENDUZ > ZENDTM2.
ANWKONTI-ENDUZ = ZENDTM2.
ENDIF.
IF ANWKONTI-BEGUZ > ANWKONTI-ENDUZ.
ANWKONTI-BEGUZ = ANWKONTI-ENDUZ.
ENDIF.
MODIFY ANWKONTI.
ENDLOOP.
ENDIF.
ENDIF.
ENDIF.
"补充中午时段的固定延时加班--begin
IF LT_TPROG-GDJBB1 IS NOT INITIAL AND LT_TPROG-GDJBE1 IS NOT INITIAL . "补充固定延时加班不为空
IF LT_TPROG-GDJBB1 <> LT_TPROG-GDJBE1.
PERFORM DEZIMAL USING LT_TPROG-GDJBB1.
PERFORM DEZIMAL USING LT_TPROG-GDJBE1.
READ TABLE TZP WITH KEY CODE = '02'.
IF SY-SUBRC = 0.
IF LT_TPROG-GDJBB1 < TZP-ZEIT.
ADD 24 TO LT_TPROG-GDJBB1+0(2).
ADD 24 TO LT_TPROG-GDJBE1+0(2).
ENDIF.
ENDIF.
IF LT_TPROG-GDJBE1 < LT_TPROG-GDJBB1.
ADD 24 TO LT_TPROG-GDJBE1+0(2).
ENDIF.
READ TABLE TZP WITH KEY ZEIT = LT_TPROG-GDJBB1
CODE = '05'.
IF SY-SUBRC = 0.
ANWKONTI-INFTY = '2007'.
ANWKONTI-SUBTY = '02'.
ANWKONTI-KTART = '02'.
ANWKONTI-BEGDA = PSP-DATUM.
ANWKONTI-ENDDA = PSP-DATUM.
ANWKONTI-VERSL = ZVERSL.
ANWKONTI-BEGUZ = LT_TPROG-GDJBB1.
ANWKONTI-ENDUZ = LT_TPROG-GDJBE1.
ANWKONTI-ZEINH = '001'.
ANWKONTI-REWRI = '1'.
ANWKONTI-DESTA = PSP-DATUM.
ANWKONTI-DEEND = PSP-DATUM.
APPEND ANWKONTI.
ENDIF.
ENDIF.
ENDIF.
"补充中午时段的固定延时加班--end
ENDIF.
ENDFORM.
"特殊加班处理:连班处理2
FORM FU_Z006.
DATA:LS_TIP LIKE TIP.
LOOP AT TIP INTO LS_TIP WHERE ZTYPE = '10' OR ZTYPE = '07'.
IF LS_TIP-ZTYPE = '10'.
LS_TIP-ZTYPE = '05'.
ELSEIF LS_TIP-ZTYPE = '07'.
LS_TIP-ZTYPE = '09'.
ENDIF.
MODIFY TIP FROM LS_TIP.
CLEAR LS_TIP.
ENDLOOP.
ENDFORM.
"未刷卡动态排班处理
FORM FU_Z007.
DATA:LS_TIP LIKE TIP.
IF as-parm2 EQ 'ZDY1'. "动态排班处理
CLEAR LS_TIP.
LOOP AT TIP INTO LS_TIP WHERE PTYPE = '2' OR PTYPE = '3' .
LS_TIP-PTYPE = '1'.
MODIFY TIP FROM LS_TIP.
CLEAR LS_TIP.
ENDLOOP.
ELSEIF as-parm2 EQ 'ZDY2'. "动态排班处理还原
CLEAR LS_TIP.
LOOP AT TIP INTO LS_TIP WHERE PTYPE = '1' AND ORIGS <> 'E' .
IF LS_TIP-ORIGS = 'A'.
LS_TIP-PTYPE = '2'.
ELSEIF LS_TIP-ORIGS = 'P'.
LS_TIP-PTYPE = '3'.
ENDIF.
MODIFY TIP FROM LS_TIP.
CLEAR LS_TIP.
ENDLOOP.
ENDIF.
ENDFORM.
FORM FU_Z008. "周末加班申请,需按排班时间段
IF as-parm2 EQ 'OFF1'. "周末加班判断
LOOP AT ANWKONTI WHERE KTART = '01'
AND BEGDA <= PSP-DATUM
AND ENDDA >= PSP-DATUM.
ENDLOOP.
IF SY-SUBRC = 0 AND ( PSP-TPKLA = '0' or PSP-FTKLA = '1' ). "周末或者法定节假日
CLEAR TES.
TES-ZTART = 'Z016'. "休息日加班
TES-ANZHL = '1'.
APPEND TES.
ENDIF.
ELSEIF as-parm2 EQ 'OFF2'. "周末加班标识替换
LOOP AT ANWKONTI WHERE KTART = '01'
AND BEGDA <= PSP-DATUM
AND ENDDA >= PSP-DATUM.
ENDLOOP.
LOOP AT TIP WHERE ( PTYPE = '1' OR PTYPE = '3' )
AND ( ZTYPE = '02' OR ZTYPE = '06' OR ZTYPE = '05') .
IF TIP-ZTYPE = '05'.
READ TABLE TZP WITH KEY ZEIT = TIP-BEGTM
CODE = '05'.
IF SY-SUBRC = 0 AND TZP-PDBEZ IS NOT INITIAL.
TIP-INTKY = TIP-VTYPE.
TIP-VTYPE = 'M'.
TIP-VERSL = ANWKONTI-VERSL.
MODIFY TIP.
ENDIF.
ELSE.
TIP-INTKY = TIP-VTYPE.
TIP-VTYPE = 'M'.
TIP-VERSL = ANWKONTI-VERSL.
MODIFY TIP.
ENDIF.
ENDLOOP.
ELSEIF as-parm2 EQ 'OFF3'. "周末加班标识还原
LOOP AT TIP WHERE INTKY IS NOT INITIAL .
TIP-VTYPE = TIP-INTKY .
CLEAR TIP-INTKY.
MODIFY TIP.
ENDLOOP.
ENDIF.
ENDFORM.
FORM FU_Z009.
Delete ANWKONTI where KTART = '02' and begda = psp-datum. "删除添加的02缺勤类型。
DELETE ZKO WHERE SUBTY = '02' AND BEGDA = psp-datum. "删除添加的02缺勤类型。
CHECK TIP[] IS NOT INITIAL.
READ TABLE ANWKONTI WITH KEY BEGDA = PSP-DATUM ."如果当日有加班申请
IF SY-SUBRC = 0 AND ANWKONTI-BEGUZ > '000001'.
DATA:ZHRS TYPE ANZ34,
Z013 TYPE ANZ34,
Z018 TYPE ANZ34,
tipanzhl type anz34,
idx type i.
CLEAR:ZHRS,Z013,Z018.
READ TABLE TES WITH KEY ZTART = 'Z013'.
IF SY-SUBRC = 0.
Z013 = TES-ANZHL.
ENDIF.
READ TABLE TES WITH KEY ZTART = 'Z018'.
IF SY-SUBRC = 0.
Z018 = TES-ANZHL.
ENDIF.
ZHRS = 1 / 6 . "10分钟
DATA: TMP_JIABAN_BEG(6).
READ TABLE TES WITH KEY ZTART = 'Z203'.
IF SY-SUBRC = 0.
TMP_JIABAN_BEG = ANWKONTI-BEGUZ.
ADD 1 TO TMP_JIABAN_BEG+0(2).
ELSE .
data: LT_TPROG like TABLE OF ZHR_TPROG WITH HEADER LINE.
CLEAR:LT_TPROG[],LT_TPROG.
SELECT SINGLE * INTO CORRESPONDING FIELDS OF LT_TPROG FROM ZHR_TPROG WHERE TPROG = psp-tprog AND BEGDA <= PSP-DATUM AND ENDDA >= PSP-DATUM.
if LT_TPROG-SOLLZ1 > ZHRS.
TMP_JIABAN_BEG = tzp-ZEIT.
else.
TMP_JIABAN_BEG = ANWKONTI-BEGUZ.
endif.
ENDIF.
IF Z013 > 0 AND Z013 = Z018 .
LOOP AT TIP WHERE BEGTM >= TMP_JIABAN_BEG AND ORIGS = 'E' AND ANZHL > ZHRS .
tipanzhl = tipanzhl + TIP-ANZHL.
ENDLOOP.
IF tipanzhl > 0 .
loop at TES Where ZTART = 'Z018'.
idx = sy-tabix.
endloop.
TES-ANZHL = tipanzhl .
MODIFY TES INDEX idx.
ENDIF.
ENDIF.
ELSE. "如果没有加班申请
DATA: WA_TPROG LIKE ZHR_TPROG.
IF PSP-TPROG NE 'OFF'.
SELECT SINGLE * INTO CORRESPONDING FIELDS OF WA_TPROG FROM ZHR_TPROG WHERE TPROG = PSP-TPROG.
IF SY-SUBRC = 0 AND WA_TPROG-BEGTM3 > '000001'.
if WA_TPROG-ENDTM3 < WA_TPROG-BEGTM3.
add 24 to WA_TPROG-ENDTM3+0(2).
endif.
PERFORM DEZIMAL USING WA_TPROG-BEGTM3.
PERFORM DEZIMAL USING WA_TPROG-ENDTM3.
LOOP AT TIP WHERE ENDTM > WA_TPROG-BEGTM3 AND ORIGS = 'E'.
IF TIP-BEGTM < WA_TPROG-BEGTM3.
TIP-BEGTM = WA_TPROG-BEGTM3.
ENDIF.
IF TIP-ENDTM > WA_TPROG-ENDTM3.
TIP-ENDTM = WA_TPROG-ENDTM3.
ENDIF.
TES-ZTART = 'Z018'.
TES-ANZHL = ( TIP-ENDTM - TIP-BEGTM ) / 10000 .
APPEND TES.
ENDLOOP.
ENDIF.
ELSE.
READ TABLE TES with key ZTART = 'Z018'.
IF SY-SUBRC <> 0.
TES-ZTART = 'Z018'.
CLEAR TES-ANZHL.
LOOP AT TIP WHERE ORIGS = 'E'.
TES-ANZHL = TES-ANZHL + TIP-ANZHL.
ENDLOOP.
APPEND TES.
ENDIF.
ENDIF.
ENDIF.
ENDFORM.
FORM FU_Z010.
DATA: INDX TYPE I,
INDX2 TYPE I,
INDX3 TYPE I,
HOURS TYPE PTM_QUONUM,
ZLIANBAN(1),
ZLGART TYPE LGART.
CLEAR:INDX,INDX2,INDX3,HOURS,ZLIANBAN,ZLGART.
LOOP AT ANWKONTI WHERE KTART = '01' AND BEGDA = PSP-DATUM AND VERSL = '3' . "如果加班类型为调休。
INDX = SY-TABIX.
ENDLOOP.
* READ TABLE ANWKONTI WITH KEY KTART = '01' BEGDA = PSP-DATUM VERSL = '3' . "如果加班类型为调休。
IF INDX IS NOT INITIAL AND INDX > 0.
LOOP AT TES WHERE ZTART = 'Z101' OR ZTART = 'Z201' OR ZTART = 'Z009' OR ZTART = 'Z010' OR ZTART = 'Z011'.
CASE TES-ZTART.
WHEN 'Z101'.
ZLIANBAN = 'X'.
WHEN 'Z201'.
ZLIANBAN = 'X'.
WHEN 'Z009'.
HOURS = TES-ANZHL.
INDX3 = SY-TABIX.
ZLGART = '5000'.
WHEN 'Z010'.
HOURS = TES-ANZHL.
INDX3 = SY-TABIX.
ZLGART = '5001'.
WHEN 'Z011'.
HOURS = TES-ANZHL.
INDX3 = SY-TABIX.
ZLGART = '5003'.
WHEN OTHERS.
ENDCASE.
ENDLOOP.
IF ZLIANBAN = 'X' AND HOURS > 0.
ANWKONTI-KVERB = ANWKONTI-KVERB + HOURS.
MODIFY ANWKONTI INDEX INDX.
"增加 ZKO 中的加班时数
LOOP AT ZKO WHERE REDAY = PSP-DATUM+6(2) AND SUBTY = '01' AND BEGDA = PSP-DATUM.
INDX2 = SY-TABIX.
ENDLOOP.
IF NOT INDX2 IS INITIAL AND INDX2 > 0.
ZKO-ANZHL = ZKO-ANZHL + HOURS.
MODIFY ZKO INDEX INDX2.
ENDIF.
"删除TES 中的加班时数
DELETE TES INDEX INDX3.
DELETE TES WHERE ZTART = 'Z013'.
"增加 ZML 中的加班时数
* CLEAR INDX2.
* LOOP AT ZML WHERE VERSL = '3'.
* INDX2 = SY-TABIX.
* ENDLOOP.
* IF NOT INDX2 IS INITIAL AND INDX2 > 0.
* ZML-ANZHL = ZML-ANZHL + HOURS.
* MODIFY ZML INDEX INDX2.
* ELSE.
CLEAR ZML.
ZML-LGART = ZLGART.
ZML-VERSL = '3'.
ZML-ANZHL = HOURS.
ZML-IFTYP = 'M'.
APPEND ZML.
* ENDIF.
ENDIF.
ENDIF.
* DELETE ZKO WHERE SUBTY = '02' AND BEGDA = psp-datum. "删除添加的02缺勤类型。
ENDFORM.
FORM FU_Z011.
DATA: INDX TYPE I.
LOOP AT TIP WHERE VTYPE = 'M' AND ANZHL < 0 .
INDX = SY-TABIX.
DELETE TIP INDEX INDX.
ENDLOOP.
ENDFORM.
HCM 考勤PT60 RPTMOZ00
于 2025-02-13 12:09:02 首次发布