SAP增强中最好禁用COMMIT!!

需求:

外部第三方系统传数据进SAP,创建销售订单。但有条件卡控,SAP必须已扩充过MRP与库位。

需求1:卡控条件写在SD增强中;

需求2:针对未扩充MRP与库位的,写进自建表中(insert);

需求3:写进自建表中的数据,需要进行自动扩充MRP与库位;

需求4:其实就是以上3个综合起来,针对未扩充数据,进行返回报错“SAP未扩充MRP与库位,请稍后再试!”,且销售订单无法生成!!

问题点:

  1. 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' 会开启一个新的会话进程,从而达到异步执行效果,即不影响到增强中的程序代码执行!

  • 16
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值