SD 信用模拟检查增强


一、业务流程中需要进行信用模拟检查,但逻辑梳理较为复杂,因此借用交货单创建时信用检查逻辑。但是当交货单信用检查通过时,不创建交货单,因此需要对BAPI:BAPI_OUTB_DELIVERY_CREATE_SLS进行改造,拦截创建交货单逻辑

二、在BAPI包含的函数SD_DELIVERY_CREDIT_CHECK中,找到信用校验逻辑,创建隐式增强

首先接收程序抛的内存,如果是校验(不创建交货单),则走以下逻辑

 当返回消息ID为UKM_CHECK,消息号为001或034,证明信用校验不通过

当返回消息为其他的,则证明信用校验通过,可以返回自定义消息,但是仍然报异常,RAISE ERROR,阻止下一步创建交货单

三、在程序中,抛内存,证明是进行信用校验,而不是创建交货单

 程序调用创建交货单BAPI,当返回结果是自定义消息,证明信用校验通过,如果是UKM_CHECK,消息号为001或034,证明校验未通过

CALL FUNCTION 'BAPI_OUTB_DELIVERY_CREATE_SLS'
      EXPORTING
        ship_point        = lv_ship_point
        due_date          = lv_due_date
*       DEBUG_FLG         = ''
*       NO_DEQUEUE        = ' '
      IMPORTING
        delivery          = lv_delivery
*       NUM_DELIVERIES    =
      TABLES
        sales_order_items = lt_sales
*       SERIAL_NUMBERS    =
*       EXTENSION_IN      =
*       DELIVERIES        =
*       created_items     = lt_created
*       EXTENSION_OUT     =
        return            = lt_return.

    LOOP AT lt_return INTO ls_return WHERE type = 'E'.
      IF ls_return-id = 'UKM_CHECK' AND ( ls_return-number = '000' OR ls_return-number = '034' ).
        e_return-type = 'E'.
        e_return-message = ls_return-message.
        RETURN.
      ENDIF.

      IF ls_return-id = 'ZSD01' AND ls_return-number = '006'.
        e_return-type = 'S'.
        e_return-message = '信用校验通过'.
        RETURN.
      ELSE.
        e_return-type = 'E'.
        e_return-message = ls_return-message.
        RETURN.
      ENDIF.
      CLEAR:ls_return.
    ENDLOOP.