设中国护士网为首页 | 中国护士网专注于知识的分享,因为专注,所以更好!
分享到:

Payroll function开发实例

来源:  作者:ma qiyong

香港劳工法律规定,法定节假日要继续付薪,薪水标准为过去12个月的平均日薪。
要完成这样的需求,第一步就是拿到某个期间内总计的法定节假日天数。
香港法定是每周六天工作制,周日休息,公务员和银行一般每周上班五天半,外国公司一般五天,这样就有一个问题,如果节假日落到星期六去呢?星期六是非工作 日,郁闷的是,SAP的operation NUM=TKAX**和NUM=TAAX**取出的结果是一样的,即把calendar days和working days这两个计量标准同等对待了,不考虑落在非工作日的节假日。问SAP,SAP回答说流程不对,落在非工作日的节假日是应该被调整到工作日去的,可是 客户说不同意啊,因为法定每周六天,他们只每周五天,已经比法定少了所以无需补偿!
于是从系统想办法,去看看subroutine FORM OPNUM,一路追查下来,情况是这样的:当NUM=TKAX**的时候,取值来自于内表cabc的字段k,cabc是哪里的呢?
在subschema XT00中,必定有两个重要的function: GENPS和PARTT,前者生成内表PSP,即每个人在整月中每天的计划工作时间明细,在payroll log中可见,PARTT随后根据PSP生成内表cabc,cabc就保存了节假日的累计,不过在payroll log里cabc显示出来是叫PARX。
要想改NUM=TKAX**的取值,还得从源头下手,修改function PARTT。
不能直接修改SAP的标准function,所以把PARTT复制到ZPART,在payroll driver中加入subroutine FUZPART,copy自FUPARTT。
FORM FUZPART.
PERFORM tmdivi.
PERFORM z_tmsoll. “原来为tmsoll
PERFORM set_switches.
ENDFORM.
FORM z_tmsoll. “copy自tmsoll
……
LOOP AT wpbp. “循环每一个wpbp split
……
LOOP AT psp WHERE datum GE wpbp-begda
AND datum LE wpbp-endda. “循环PSP中的每一天
……
CHECK psp-activ EQ ‘X’. “如果这一天还在职
……
IF psp-stdaz GT 0. “如果这一天原计划工作时间大于0
……
IF psp-tagty NE ‘0′ AND psp-tagty NE ‘2′. “day type=1,不工作
……
IF psp-ftkla NE ‘0′. “如果public holiday class大于0,是节假日
cabc-atype = ‘X’.
cabc-class+0(1) = ‘0′.
cabc-class+1(1) = psp-ftkla.
cabc-apznr = wpbp-apznr.
cabc-k = cabc-a = 1. “K计数和A计数被一样计数+1
cabc-s = psp-stdaz. “S计数记录日工作时间
op = space.
PERFORM collect_cabc USING wpbp-apznr. “把这一天累加进内表cabc
ENDIF.
ENDIF.
=============以下为插入的代码=============
ELSE. “若工作时间=0,非工作日
IF psp-ftkla NE ‘0′. “且是一个节假日
cabc-atype = ‘X’.
cabc-class+0(1) = ‘0′.
cabc-class+1(1) = psp-ftkla.
cabc-apznr = wpbp-apznr.
cabc-k = 1. “K计数+1
cabc-a = 0. “A计数清零
cabc-s = psp-stdaz. “S计数清零
op = space.
PERFORM collect_cabc USING wpbp-apznr. “累加进内表cabc
ENDIF.
=============以上为插入的代码=============
ENDIF.
……
ENDLOOP. “结束PSP的循环
……
ENDLOOP. “结束WPBP的循环
……
ENDFORM. “结束FROM Z_TMSOLL.
最后,在transaction PE04中新建function ZPART,并选国家激活。