导读
锁功能:在SAP HCM模块有针对人的加锁功能,今天遇到的一个问题是,人员无法被锁住,给我第一反应就是代码没有加锁,代码有问题,但是去看代码系统确实已经加锁,但是系统还是提示这个,那问题出现在哪里呢,今天给就来分析下次问题发生的情况,以后大家避免踩坑。
作者:vivi,来源:osinnovation
1 背景
中台做个前端页面,然后调用SAP封装好的逻辑展现出来,同时中台也有和SAP一样的表结构,今天在做人员异动流程的时候,SAP系统返回:SAP返回雇佣/申请人没有被锁定,第一反应就是程序中可能没有加锁,所以执行函数的时候提示这个,但是检查程序里面循环调用的时候确实有加锁,问题就奇怪在这个地方。下图是错误的提示。
2 从代码开始发现问题。
因为是自定义开发的代码,所以问题肯定就在代码上,所以只有剖析代码去发现问题,首先是找到加锁的地方,从47行开始系统是已经加锁的,既然加锁为什么还是提示没锁住,所以首先不要死磕代码,可以想一个办法去验证这个问题,我想到的办法是,代码执行51行的时候去查看PA30,看看系统能不能锁住人,如果能锁住人,说明锁是没问题的,如果不能锁住,就是加锁的函数出问题,但是实际打开PA30,页面确实提示人员被锁住,所以加锁的函数是没问题,那就要继续向下看,看看是那个地方出现的雇员\申请人没有被锁住,HR的人员创建函数比较简单,就那么几个,一般是HR_INFOTYPE_OPERATION与HR_MAINTAIN_MASTERDATA。
后来发现是这个函数提示,人员没被锁住,那是不是可以在这个函数之前打个断点,然后PA30查询下是是不是被锁住,后发现这个时候PA30是能查看到这个人,没有提示锁,那么问题就是在调用HR_INFOTYPE_OPERATION的时候系统已经解锁,所以只有向上去看代码,向上看只有一个标准函数HR_MAINTAIN_MASTERDATA,所以解锁就应该出现在这个函数。
后来发现HR_MAINTAIN_MASTERDATA函数的481行下面的这个form就是解锁的,NO_ENQUEUE默认是传空,所以HR_MAINTAIN_MASTERDATA在执行0000、0001信息类型后系统就会自动取解锁,你要在调用HR_INFOTYPE_OPERATION的时候需要加一次锁。
3 总结。
所以以后遇到这个函数HR_MAINTAIN_MASTERDATA,然后调用HR_INFOTYPE_OPERATION函数的时候记得需要再次加锁。