需求:
外部第三方系统传数据进SAP,创建销售订单。但有条件卡控,SAP必须已扩充过MRP与库位。
需求1:卡控条件写在SD增强中;
需求2:针对未扩充MRP与库位的,写进自建表中(insert);
需求3:写进自建表中的数据,需要进行自动扩充MRP与库位;
需求4:其实就是以上3个综合起来,针对未扩充数据,进行返回报错“SAP未扩充MRP与库位,请稍后再试!”,且销售订单无法生成!!
问题点:
-
SD中的MV45AFZZ增强,在FORM USEREXIT_SAVE_DOCUMENT下(前台点保存按钮时);
这是之前开发的编写的代码,当Check到SAP未扩充MRP与库位,就把传过来的库位及MRP记录,insert自建表,便返回报错“系统未扩充此库位与MRP”。
问题就出现了,发现SAP成功创建了销售订单。
debug得知,原来是insert自建表有写过commit work,默认提交生成了销售订单。
2.因为commit work在此处不得不写,紧跟着就是从自建表取数,创建自动后台JOB,让去自动扩充MRP与库位。
所以用commit work会出现问题,不用也会出现问题;
解决方案:
想了一下,在塞表时,不要在增强中写commit work,可不可以另起一个后台程序去塞表,以及扩充MRP与库位。
想到了RFC函数,可以设定远程调用,且还可以新建一个任务去运行。
1.SE37开发一支RFC,前端逻辑塞表,紧接着后面排后台Job,自动扩充库位,这就不会影响到增强里commit work了;
后台Job运行图,提一下:用户账号要有跑后台的权限哈!
源码:
DATA: LV_JOBNAME TYPE TBTCJOB-JOBNAME,
LV_JOBCOUNT TYPE TBTCJOB-JOBCOUNT,
LV_INFO TYPE I,
LV_RET TYPE I.
IF GT_LOCAMRP[] IS NOT INITIAL .
INSERT ZZT_LOCAMRP FROM TABLE GT_LOCAMRP ACCEPTING DUPLICATE KEYS.
IF SY-SUBRC = 0.
COMMIT WORK.
ELSE.
ROLLBACK WORK.
ENDIF.
CLEAR: LV_JOBNAME,LV_JOBCOUNT.
LV_JOBNAME = SY-DATUM && SY-UZEIT && '_' && 'CREATE LGORT AND MRP' && '_' && SY-UNAME.
CALL FUNCTION 'JOB_OPEN'
EXPORTING
JOBNAME = LV_JOBNAME
IMPORTING
JOBCOUNT = LV_JOBCOUNT
EXCEPTIONS
CANT_CREATE_JOB = 1
INVALID_JOB_DATA = 2
JOBNAME_MISSING = 3
OTHERS = 4.
IF SY-SUBRC = 0.
"直接采用 SUBMIT 的方式,让报表程序在后台运行
SUBMIT ZMM0010_JC
WITH P_BATCH = 'X' "Paramters参数
VIA JOB LV_JOBNAME NUMBER LV_JOBCOUNT AND RETURN.
SUBMIT ZMM0011_JC
WITH P_BATCH = 'X' "Paramters参数
VIA JOB LV_JOBNAME NUMBER LV_JOBCOUNT AND RETURN.
CALL FUNCTION 'JOB_CLOSE'
EXPORTING
JOBCOUNT = LV_JOBCOUNT
JOBNAME = LV_JOBNAME
STRTIMMED = 'X'
EXCEPTIONS
CANT_START_IMMEDIATE = 1
INVALID_STARTDATE = 2
JOBNAME_MISSING = 3
JOB_CLOSE_FAILED = 4
JOB_NOSTEPS = 5
JOB_NOTEX = 6
LOCK_FAILED = 7
INVALID_TARGET = 8
INVALID_TIME_ZONE = 9
OTHERS = 10.
IF SY-SUBRC <> 0.
* Implement suitable error handling here
ENDIF.
ENDIF.
ENDIF .
2.RFC设定参数;
3.增强中改为下图所示:
IF LV_ERROR = 'X'.
SORT LT_LOCAMRP[] BY WERKS MATNR LGORT BERID.
CALL FUNCTION 'ZSD_LOCAMRP_01' STARTING NEW TASK 'UPDATE'
TABLES
GT_LOCAMRP = LT_LOCAMRP.
LV_MESSAGE = '系统正在自动扩库位与MRP范围,请稍后再试!' && LV_MESSAGE .
MESSAGE LV_MESSAGE TYPE 'E'.
ENDIF.
STARTING NEW TASK 'UPDATE' 会开启一个新的会话进程,从而达到异步执行效果,即不影响到增强中的程序代码执行!