声明:本文章仅用于SAP软件的应用与学习,不代表SAP公司。(注:文中所示截图来源SAP软件,相应著作权归SAP所有。)
大家是否遇到过这样的问题,SM30维护视图的时候,系统提示被其他用户锁了,即使两个用户维护的不是同一条主键也不行。
这时候我们看看SM12,有一条锁表记录,看看锁参数
确实是把全表都锁了,锁参数里没有主键。
于是跟踪了锁函数VIEW_ENQUEUE,发现最后的锁参数传的值是变量generic_key
继续往前追溯到了函数93行变量tabkey
F5进入子例程fill_tabkey看到代码272行的一个判断,当ENQUEUE_RANGE = ‘X’ ,281行SELLIST-DDIC = ‘S’或者’B’则会将SELLIST里的字段加入到锁参数中,也就是说将筛选条件加入到了锁参数里,这正是我需要的。
于是我复制了函数VIEW_MAINTENANCE_CALL到ZVIEW_MAINTENANCE_CALL里,调用VIEW_ENQUEUE前更改了参数ENQUEUE_RANGE和SELLIST,将ENQUEUE_RANGE = ‘X’,内表SELLIST的每一行的DDIC = ‘S’,加锁和解锁都要改。
我写了一个例子,调用函数ZVIEW_MAINTENANCE_CALL来维护视图,运行结果来看一下:先修改公司2001
窗口保持编辑状态不退出,
再打开一个窗口,运行程序,更改公司2003,是可以更改的。
再看看SM12,有两条不一样的记录
锁表参数里有公司
说明成功了,修改了函数后允许同时多人更改不同的公司(主键)。
下面是代码:第一个是调用函数ZVIEW_MAINTENANCE_CALL的例子。