信息记录批量导入

调用类为了测试bdc

report z_hd_test.

data(lcl) = new ZCL_HTTP_P0ST_003( ).


data lv_json type string.
data lv_resp type string.

lv_json = '{   "ZSRMPO" : "1111",'&&
    '"EBELN" :"",'&&
    '"INFNR" :"",'&&
    '"LIFNR" :"200525",'&&
    '"MATNR" :"8102009996",'&&
    '"MATKL" :"100000",'&&
    '"EKORG" :"1000",  '&&
    '"ESOKZ" :"0",  '&&
    '"EKGRP" :"009",  '&&
    '"MWSKZ" :"J9",  '&&
    '"WAERS" :"CNY",  '&&
    '"PEINH" :"1",  '&&
    '"APLFZ" :"10",  '&&
    '"SORTL" :"100000",  '&&
    '"NORBM" :"1",  '&&
    '"MINBM" :"",  '&&
    '"BSTAE" :"",  '&&
    '"UNTTO" :"",  '&&
    '"UEBTO" :"",  '&&
    '"UEBTK" :"",  '&&
    '"IDNLF" :"",  '&&
    '"WGLIF" :"",  '&&
    '"NETPR" :"100",  '&&
    '"WEBRE" :"X",  '&&
    '"TXZ01" :"123", '&&
    '"MEINS" :"PC", '&&
    '"UMREN" :"1",  '&&
    '"UMREZ" :"1",  '&&
    '"BPRME" :"PC",  '&&
    '"BPUMZ" :"1",  '&&
    '"BPUMN" :"1",  '&&
    '"DATAB" :"20241111",  '&&
    '"DATBI" :"99991231", '&&
    '"KONWA" :"CNY", '&&
    '"KPEIN" :"1",  '&&
    '"KBETR" :"8",  '&&
    '"KMEIN" :"PC",  '&&
    '"LONG_TXT" :"", '&&
    '"ZDEL" :"",  '&&
    '"CONDITION" :[{'&&
    '    "KSTBM":"1",'&&
    '    "KBETR":"30"'&&
    '}'&&
    ']'&&
'}'.


lv_resp = lcl->post( lv_json ).

BREAK-POINT.

 发布成url

  method if_http_extension~handle_request.

    data lv_json type string.
    data lv_resp type string.


    lv_json =  server->request->get_cdata( ).

    if lv_json is initial.
      server->response->set_status(
      exporting
        code   =  404                         " HTTP STATUS CODE
        reason =  '未解析到BODY参数,请检查'   " HTTP STATUS DESCRIPTION
        ).
      return.
    endif.

*---获取 调用方法 GET or post
    data(lv_method) = server->request->get_method( ).



    case lv_method.
      when 'GET'.
        me->get( server ).
      when 'POST'.
        lv_resp = me->post( lv_json ).


        server->response->set_cdata( lv_resp ).

*&----设置成功得返回状态
        server->response->set_status(
        exporting
          code   =  200   " HTTP STATUS CODE
          reason =  'OK'   " HTTP STATUS DESCRIPTION
          ).

*------设置返回参数排列形式 [{"TYPE":"S","MESSAGE":"SUCCESS"}] 这种返回形式看着不方便
        server->response->set_content_type( content_type = 'APPLICATION/JSON;CHARSET=UTF-8' ).

      when others.
        server->response->set_status( code = 405 reason = '请求方法不支持,请联系管理员' ).
    endcase.
  endmethod.

 

METHOD POST.

  DATA:I_REQ   TYPE ZMMS_005_IN,
       O_RESP  TYPE ZMMS_005_OUT,
       LV_JSON TYPE STRING,
       ZFLAG   TYPE C,
       ZLOEKZ  TYPE C.

  DATA: LV_MEINS TYPE MARA-MEINS,
        LV_MSG   TYPE BAPI_MSG,
        LV_INFNR TYPE EINA-INFNR.

  DATA: BEGIN OF LS_WERKS_SET,
          WERKS TYPE WERKS_D,
        END OF LS_WERKS_SET,
        LT_WERKS_SET LIKE TABLE OF LS_WERKS_SET.

* BAPI创建参数
  DATA:LT_EINA          TYPE MEWIEINA_T,         "一般数据
       LS_EINA          TYPE MEWIEINA,           "一般数据
       LT_EINAX         TYPE MEWIEINAX_T,
       LS_EINAX         TYPE MEWIEINAX_TY,
       LT_EINE          TYPE MEWIEINE_T,             "采购组织数据
       LS_EINE          TYPE MEWIEINE_TY,            "采购组织数据
       LT_EINEX         TYPE MEWIEINEX_T,
       LS_EINEX         TYPE MEWIEINEX_TY,
       LT_COND_VALIDITY TYPE MEWIVALIDITY_TT,        "条件有效期
       LS_COND_VALIDITY TYPE MEWIVALIDITY_TY,        "条件有效期
       LT_CONDITION     TYPE MEWICONDITION_TT,       "条件明细
       LS_CONDITION     TYPE MEWICONDITION_TY,       "条件明细
       LT_PIRTEXT       TYPE MEWIPIRTEXT_TT,         "文本
       LS_PIRTEXT       TYPE MEWIPIRTEXT_TY,
       LT_EINA_E        TYPE MEWIEINA_T,         "创建返回-一般数据
       LT_EINE_E        TYPE MEWIEINE_T,             "创建返回-采购组织数据
       LT_RETURN        TYPE MEWI_TT_RETURN, "FS4MIG_T_BAPIRET2.      "创建返回消息
       LT_QUAN          TYPE MEWISCALEQUAN_TT,
       LS_QUAN          TYPE MEWISCALEQUAN_TY.
*       lv_number        TYPE i.
*&---分割文本
  DATA:LV_TXT    TYPE STRING,
       LV_LENGTH TYPE N LENGTH 4,
       LV_NUM    TYPE N LENGTH 4,
       LV_COUNT  TYPE N LENGTH 4,
       LV_INDEX  TYPE N LENGTH 2,
       LV_START  TYPE N LENGTH 4.

  DATA:LV_STATUS TYPE BAPI_MTYPE.

  DEFINE  MESSAEG.
*&------内表逻辑处理 ---------
    e_json = /ui2/cl_json=>serialize(
                                    data        = &1
                                    compress    = abap_true                  "返回参数为空的情况就不展示
                                    pretty_name = 'X'                        "大写:'' 小写:'L' 遇到下划线得第一个字母变大写,并且下划线消失,其他情况是小写:'X'
                                    ).
  END-OF-DEFINITION.


  LV_JSON = I_JSON.

  DATA:LV_CHAR(10) TYPE C.
  LV_CHAR = CL_ABAP_CHAR_UTILITIES=>HORIZONTAL_TAB.  "09 TAB符
  REPLACE ALL OCCURRENCES OF LV_CHAR IN LV_JSON WITH ''.

  LV_CHAR = CL_ABAP_CHAR_UTILITIES=>CR_LF.  "0D0A 回车换行
  REPLACE ALL OCCURRENCES OF LV_CHAR IN LV_JSON WITH ''.

  LV_CHAR = CL_ABAP_CHAR_UTILITIES=>VERTICAL_TAB.  "0B 垂直制表符
  REPLACE ALL OCCURRENCES OF LV_CHAR IN LV_JSON WITH ''.

  LV_CHAR = CL_ABAP_CHAR_UTILITIES=>NEWLINE.  "0A 换行
  REPLACE ALL OCCURRENCES OF LV_CHAR IN LV_JSON WITH ''.

  LV_CHAR = CL_ABAP_CHAR_UTILITIES=>FORM_FEED.  "0C 换页
  REPLACE ALL OCCURRENCES OF LV_CHAR IN LV_JSON WITH ''.

  LV_CHAR = CL_ABAP_CHAR_UTILITIES=>BACKSPACE.  "08 退格符
  REPLACE ALL OCCURRENCES OF LV_CHAR IN LV_JSON WITH ''.

  LV_CHAR = CL_ABAP_CHAR_UTILITIES=>BYTE_ORDER_MARK_LITTLE.  "(UTF-16LE)的文件头
  REPLACE ALL OCCURRENCES OF LV_CHAR IN LV_JSON WITH ''.

  LV_CHAR = CL_ABAP_CHAR_UTILITIES=>BYTE_ORDER_MARK_UTF8.  "(UTF-8)的文件头
  REPLACE ALL OCCURRENCES OF LV_CHAR IN LV_JSON WITH ''.


*----日志RES写入
*  SELECT SINGLE URL INTO @DATA(LV_URL) FROM ZTSRM_URL WHERE IF_ID = 'ZSRM003' AND HOST = @SY-HOST.
  SELECT SINGLE * FROM ZTCOM_IF_LIST INTO @DATA(LS_LIST) WHERE IF_ID = 'ZSRM003'.
  DATA(LV_URL) = LS_LIST-IF_HOST && LS_LIST-IF_URL.
  IF LS_LIST-IF_LOG_ACTIVE = 'X'.   "->Create Log Start
    TRY.
        CL_SYSTEM_UUID=>IF_SYSTEM_UUID_STATIC~CREATE_UUID_X16( RECEIVING UUID = DATA(LV_GUID) ).
      CATCH CX_UUID_ERROR INTO DATA(LO_ERR).
    ENDTRY.
  ENDIF.
  IF LS_LIST-IF_LOG_ACTIVE = 'X'.
    DATA(LO_TOOLKIT) = NEW ZCL_TOOLKIT( ).
    LO_TOOLKIT->CREATE_IF_LOG( EXPORTING IV_GUID = LV_GUID IV_IFID = 'ZSRM003' IV_DATA =  LV_JSON IV_STEP = 'REQ' IV_METHOD = 'POST' IV_URL = CONV #( LV_URL ) ).
  ENDIF.

*&------将JSON转换成内表
  /UI2/CL_JSON=>DESERIALIZE(
    EXPORTING
      JSON        = LV_JSON
    CHANGING
      DATA          = I_REQ
          ).

*&------内表逻辑处理 STRAT-------
  "前导0
  I_REQ-LIFNR = |{ I_REQ-LIFNR ALPHA = IN }|.
  "前导0
  I_REQ-BSTAE = |{ I_REQ-BSTAE ALPHA = IN }|.

  IF I_REQ-MATNR IS NOT INITIAL.
    "物料前导零
    CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
      EXPORTING
        INPUT        = I_REQ-MATNR
      IMPORTING
        OUTPUT       = I_REQ-MATNR
      EXCEPTIONS
        LENGTH_ERROR = 1
        OTHERS       = 2.

*&-----如果有物料就扩marc上面的,如果没有物料就扩1002 1012
    SELECT WERKS INTO TABLE @LT_WERKS_SET FROM MARC WHERE MATNR = @I_REQ-MATNR AND  WERKS IN ( '1002' , '1012' ).

  ELSE.

    IF I_REQ-INFNR IS INITIAL ."增加信息记录号必传校验
      SELECT SINGLE * INTO @DATA(LS_INFNR) FROM EINA WHERE MATKL = @I_REQ-MATKL AND  LIFNR = @I_REQ-LIFNR AND TXZ01 = @I_REQ-TXZ01.
      IF SY-SUBRC = 0.
        O_RESP-MSGTY = 'E'.
        O_RESP-MSGTX = '无物料价格修改的请输入原有采购信息记录号'.
        MESSAEG O_RESP.
        EXIT.
      ENDIF.
    ENDIF.

    LT_WERKS_SET = VALUE #(
                            ( WERKS = '1002' )
                            ( WERKS = '1012' )
                          ).

  ENDIF.


  LOOP AT LT_WERKS_SET INTO LS_WERKS_SET.

    IF O_RESP-MSGTY = 'E'.
      MESSAEG O_RESP.
      EXIT.
    ENDIF.
    CLEAR:LV_MSG,LS_EINA,LS_EINAX,LS_EINE,LS_EINEX, LS_COND_VALIDITY,LS_CONDITION,LS_PIRTEXT,LS_QUAN.
    REFRESH :LT_EINA,LT_EINAX,LT_EINE,LT_EINEX,LT_COND_VALIDITY,LT_CONDITION,LT_PIRTEXT,LT_EINA_E,LT_EINE_E, LT_RETURN,LT_QUAN.

    I_REQ-WERKS = LS_WERKS_SET-WERKS.

    IF I_REQ-MATNR IS NOT INITIAL.
      "获取历史采购信息记录
      SELECT A~INFNR,
             A~MATNR,    "物料
             A~LIFNR,    "供应商
             B~EKORG,    "采购组织
             B~ESOKZ,    "信息类别
             B~WERKS,    "工厂
             B~LOEKZ,    "采购组织数据是否删除
             A~LOEKZ AS  LOEKZ_Y    "一般数据是否删除
        INTO TABLE @DATA(LT_INFOREC_OLD)
              FROM EINA AS A
              LEFT JOIN EINE AS B ON A~INFNR = B~INFNR
              WHERE A~MATNR = @I_REQ-MATNR
              AND A~LIFNR = @I_REQ-LIFNR.

    ENDIF.
    SORT LT_INFOREC_OLD BY MATNR LIFNR EKORG ESOKZ WERKS.

    IF I_REQ-ZDEL IS INITIAL.
      CALL FUNCTION 'ZFM_DEL_BDC'
        EXPORTING
          I_REQ  = I_REQ
        IMPORTING
          O_RESP = O_RESP.

    ENDIF.

    IF I_REQ-MATNR IS NOT INITIAL.
      "判断走bdc原来是否存在条件(无物料:A025 有物料:A017)
      SELECT A~LIFNR,       "供应商
             A~MATNR,       "物料
             A~EKORG,       "采购组织
             A~WERKS,       "工厂
             A~ESOKZ,       "信息类型
             A~DATAB,       "有效期自
             A~DATBI,       "有效期至
             A~KNUMH       "条件记录编号
        INTO TABLE @DATA(LG_A017)
              FROM A017 AS A
              WHERE A~MATNR = @I_REQ-MATNR
              AND A~LIFNR = @I_REQ-LIFNR
              AND A~EKORG = @I_REQ-EKORG
              AND A~ESOKZ = @I_REQ-ESOKZ
              AND A~WERKS = @I_REQ-WERKS
              AND A~KSCHL = 'PB00'.
      IF LG_A017 IS NOT INITIAL.
        ZFLAG = 'X'.
      ENDIF.
    ENDIF.
    "<<--采购信息记录删除
    IF I_REQ-ZDEL IS NOT INITIAL.
      LS_EINA-DELETE_IND  = 'X'.
      LS_EINAX-DELETE_IND = ABAP_TRUE.
      LS_EINE-DELETE_IND  = 'X'.
      LS_EINEX-DELETE_IND = ABAP_TRUE.
      LS_CONDITION-DELETION_IND = 'X'.
    ENDIF.
    "-->>采购信息记录删除

    IF I_REQ-INFNR IS NOT INITIAL.
      "更新-基本数据
      LS_EINA-INFO_REC           = I_REQ-INFNR. "采购信息记录编号
      LS_EINAX-INFO_RECN         = I_REQ-INFNR. "采购信息记录编号
      LS_EINAX-INFO_REC          = 'X'. "采购信息记录编号

      "更新-采购数据
      LS_EINE-INFO_REC           = I_REQ-INFNR. "采购信息记录编号
      LS_EINEX-INFO_RECN         = I_REQ-INFNR. "采购信息记录编号
      LS_EINEX-INFO_REC          = 'X'. "采购信息记录编号

    ELSE.

      "判断是否存在历史采购信息记录(有物料的,无物料走bdc)
      READ TABLE LT_INFOREC_OLD INTO DATA(LS_INFOREC_OLD) WITH KEY MATNR = I_REQ-MATNR
                                                                   LIFNR = I_REQ-LIFNR
*                                                                 EKORG = I_REQ-EKORG
*                                                                 ESOKZ = I_REQ-ESOKZ
*                                                                 WERKS = I_REQ-WERKS
                                                                   BINARY SEARCH.
      IF SY-SUBRC = 0.
        "更新-基本数据
        LS_EINA-INFO_REC           = LS_INFOREC_OLD-INFNR. "采购信息记录编号
        LS_EINAX-INFO_RECN         = LS_INFOREC_OLD-INFNR. "采购信息记录编号
        LS_EINAX-INFO_REC          = 'X'. "采购信息记录编号
        "更新-采购数据
        LS_EINE-INFO_REC           = LS_INFOREC_OLD-INFNR. "采购信息记录编号
        LS_EINEX-INFO_RECN         = LS_INFOREC_OLD-INFNR. "采购信息记录编号
        LS_EINEX-INFO_REC          = 'X'. "采购信息记录编号
        "更新-条件价格有效期
*      LS_COND_VALIDITY-INFO_REC  = LS_INFOREC_OLD-INFNR. "采购信息记录编号
        "更新-条件价格信息
*      LS_CONDITION-INFO_REC      = LS_INFOREC_OLD-INFNR. "采购信息记录编号
        "更新-文本信息
        LS_PIRTEXT-INFO_REC        = LS_INFOREC_OLD-INFNR. "采购信息记录编号
        LV_INFNR = LS_INFOREC_OLD-INFNR.
        I_REQ-INFNR = LS_INFOREC_OLD-INFNR.
      ENDIF.

    ENDIF.
    "创建&更新-基本数据
    IF I_REQ-MATNR IS NOT INITIAL.
      LS_EINA-MATERIAL = I_REQ-MATNR. "物料号
      LS_EINAX-MATERIAL = 'X'.
    ENDIF.

    IF I_REQ-LIFNR IS NOT INITIAL.
      LS_EINA-VENDOR   = I_REQ-LIFNR. "供应商
      LS_EINAX-VENDOR   = 'X'.
    ENDIF.
*&---采购信息记录的短文本
    IF I_REQ-TXZ01 IS NOT INITIAL.
      LS_EINA-SHORT_TEXT = I_REQ-TXZ01.
      LS_EINAX-SHORT_TEXT = 'X'.
    ENDIF.
*&---供应商物料编号
    IF I_REQ-IDNLF IS NOT INITIAL.
      LS_EINA-VEND_MAT = I_REQ-IDNLF.
      LS_EINAX-VEND_MAT = 'X'.
    ENDIF.
*&---物料组
    IF I_REQ-MATKL IS NOT INITIAL.
      LS_EINA-MAT_GRP = I_REQ-MATKL.
      LS_EINAX-MAT_GRP = 'X'.
    ENDIF.
*&---排序字段
    IF I_REQ-SORTL IS NOT INITIAL.
      LS_EINA-SORTED_BY = I_REQ-SORTL.
      LS_EINAX-SORTED_BY = 'X'.
    ENDIF.
*&---供应商物料组
    IF I_REQ-WGLIF IS NOT INITIAL.
      LS_EINA-VEND_MATG = I_REQ-WGLIF.
      LS_EINAX-VEND_MATG = 'X'.
    ENDIF.

    IF I_REQ-MATNR IS NOT INITIAL.
*&---价格转换分母
      IF I_REQ-UMREN IS NOT INITIAL.
        LS_EINA-CONV_DEN1 = I_REQ-UMREN.
        LS_EINAX-CONV_DEN1 = 'X'.
      ENDIF.
      IF I_REQ-UMREZ IS NOT INITIAL.
*&---价格转换分子
        LS_EINA-CONV_NUM1 = I_REQ-UMREZ.
        LS_EINAX-CONV_NUM1 = 'X'.
      ENDIF.
    ENDIF.

*&---单位
    IF I_REQ-MEINS IS NOT INITIAL.
      CLEAR:LV_MEINS.
      CALL FUNCTION 'CONVERSION_EXIT_CUNIT_INPUT'
        EXPORTING
          INPUT          = I_REQ-MEINS
        IMPORTING
          OUTPUT         = LV_MEINS
        EXCEPTIONS
          UNIT_NOT_FOUND = 1
          OTHERS         = 2.
*      LS_EINA-BASE_UOM = LV_MEINS.
*      LS_EINAX-BASE_UOM = 'X'.

      LS_EINA-PO_UNIT = LV_MEINS.
      LS_EINAX-PO_UNIT = 'X'.

    ENDIF.

    APPEND LS_EINA TO LT_EINA.
    APPEND LS_EINAX TO LT_EINAX.

*&=====================================================&*
*&                  采购组织数据1                      &*
*&=====================================================&*
    IF I_REQ-EKORG IS NOT INITIAL.

      LS_EINE-EINE_INDX  = '01'. "顺序编号
      LS_EINEX-EINE_INDX  = '01'.
      IF I_REQ-EKORG IS NOT INITIAL.
        LS_EINE-PURCH_ORG  = I_REQ-EKORG.         "采购组织
        LS_EINEX-PURCH_ORG  = ABAP_TRUE.
      ENDIF.
      IF I_REQ-ESOKZ IS NOT INITIAL.
        LS_EINE-INFO_TYPE  = I_REQ-ESOKZ.  "采购信息记录分类
        LS_EINEX-INFO_TYPE  = ABAP_TRUE.
      ENDIF.
      IF I_REQ-WERKS IS NOT INITIAL.
        LS_EINE-PLANT      = I_REQ-WERKS.  "工厂
        LS_EINEX-PLANT      = ABAP_TRUE.
      ENDIF.

      "计划交货时间(天)
      IF I_REQ-APLFZ IS NOT INITIAL.
        LS_EINE-PLND_DELRY  = I_REQ-APLFZ.
        LS_EINEX-PLND_DELRY = ABAP_TRUE.
      ENDIF.
      "采购组
      IF I_REQ-EKGRP IS NOT INITIAL.
        LS_EINE-PUR_GROUP  = I_REQ-EKGRP.
        LS_EINEX-PUR_GROUP = ABAP_TRUE.
      ENDIF.
      "标准数量
      IF I_REQ-NORBM IS NOT INITIAL.
        LS_EINE-NRM_PO_QTY = I_REQ-NORBM.
        LS_EINEX-NRM_PO_QTY = ABAP_TRUE.
      ENDIF.
      "最小采购订单数量
      IF I_REQ-MINBM IS NOT INITIAL.
        LS_EINE-MIN_PO_QTY  = I_REQ-MINBM.
        LS_EINEX-MIN_PO_QTY = ABAP_TRUE.
      ENDIF.
      "控制代码
      IF I_REQ-BSTAE IS NOT INITIAL.
        LS_EINE-CONF_CTRL  = I_REQ-BSTAE.
        LS_EINEX-CONF_CTRL = ABAP_TRUE.
      ENDIF.
      "基于收货的发票校验
      IF I_REQ-WEBRE IS NOT INITIAL.
        LS_EINE-GR_BASEDIV  = I_REQ-WEBRE.
        LS_EINEX-GR_BASEDIV = ABAP_TRUE.
      ENDIF.
      "税码
      IF I_REQ-MWSKZ IS NOT INITIAL.
        LS_EINE-TAX_CODE  = I_REQ-MWSKZ.
        LS_EINEX-TAX_CODE = ABAP_TRUE.
      ENDIF.
      "净价
      IF I_REQ-NETPR IS NOT INITIAL.
        LS_EINE-NET_PRICE = I_REQ-NETPR.
        LS_EINEX-NET_PRICE = ABAP_TRUE.
      ENDIF.
      "货币码
*  IF I_REQ-WAERS IS NOT INITIAL.
*    LS_EINE-CURRENCY = I_REQ-WAERS.
*    LS_EINEX-CURRENCY = ABAP_TRUE.
*  ENDIF.
      "价格单位
      IF I_REQ-PEINH IS NOT INITIAL.
        LS_EINE-PRICE_UNIT = I_REQ-PEINH.
        LS_EINEX-PRICE_UNIT = ABAP_TRUE.
      ENDIF.
      "订单价格单位(采购)
      IF I_REQ-BPRME IS NOT INITIAL.
        CLEAR:LV_MEINS.
*&---价格单位
        CALL FUNCTION 'CONVERSION_EXIT_CUNIT_INPUT'
          EXPORTING
            INPUT          = I_REQ-BPRME
          IMPORTING
            OUTPUT         = LV_MEINS
          EXCEPTIONS
            UNIT_NOT_FOUND = 1
            OTHERS         = 2.
        LS_EINE-ORDERPR_UN = LV_MEINS.
        LS_EINEX-ORDERPR_UN = ABAP_TRUE.
        "价格单位与采购订单单位的转换分子
*    IF I_REQ-BPUMZ IS NOT INITIAL.
*      LS_EINE-CONV_NUM1 = I_REQ-BPUMZ.
*      LS_EINEX-CONV_NUM1 = ABAP_TRUE.
*    ENDIF.
*    "价格单位与采购订单单位的转换分母
*    IF I_REQ-BPUMN IS NOT INITIAL.
*      LS_EINE-CONV_DEN1 = I_REQ-BPUMN.
*      LS_EINEX-CONV_DEN1 = ABAP_TRUE.
*    ENDIF.
      ENDIF.
*是否自动溯源
      IF I_REQ-AUT_SOURCE IS NOT INITIAL.
        LS_EINE-AUTO_SOURCE  = I_REQ-AUT_SOURCE.
        LS_EINEX-AUTO_SOURCE = ABAP_TRUE.
      ENDIF.

      APPEND LS_EINE TO LT_EINE.
      APPEND LS_EINEX TO LT_EINEX.
    ENDIF.
*&=====================================================&*
*&                       条件                          &*
*&=====================================================&*
*    IF I_REQ-ZDEL IS INITIAL.
*
*      LS_COND_VALIDITY-EINE_INDX  = '01'.                "顺序编号
*      LS_COND_VALIDITY-PLANT      = I_REQ-WERKS. "工厂
*      LS_COND_VALIDITY-VALID_FROM = I_REQ-DATAB. "有效期从
*      LS_COND_VALIDITY-VALID_TO   = I_REQ-DATBI. "有效期至
*      APPEND LS_COND_VALIDITY TO LT_COND_VALIDITY.
**  创建&更新-条件明细
*      LS_CONDITION-EINE_INDX  = '01'.               "顺序编号
*      LS_CONDITION-COND_TYPE  = 'PB00'.             "条件类型
*      LS_CONDITION-COND_VALUE = I_REQ-KBETR. "净价
*      LS_CONDITION-CURRENCY   = I_REQ-KONWA."货币码
*      IF I_REQ-KONWA IS INITIAL.
*        LS_CONDITION-CURRENCY   = 'CNY'."货币码
*      ENDIF.
*      LS_CONDITION-COND_P_UNT = I_REQ-KPEIN."条件定价单位
*      IF I_REQ-KMEIN IS NOT INITIAL.
*        CLEAR:LV_MEINS.
**&---价格单位
*        CALL FUNCTION 'CONVERSION_EXIT_CUNIT_INPUT'
*          EXPORTING
*            INPUT          = I_REQ-KMEIN
*          IMPORTING
*            OUTPUT         = LV_MEINS
*          EXCEPTIONS
*            UNIT_NOT_FOUND = 1
*            OTHERS         = 2.
*        LS_CONDITION-COND_UNIT  = LV_MEINS."条件单位
*      ENDIF.
*      APPEND LS_CONDITION TO LT_CONDITION.
*    ENDIF.
*&=====================================================&*
*&                       长文本                        &*
*&=====================================================&*
    IF I_REQ-LONG_TXT IS NOT INITIAL.
      CLEAR:LV_LENGTH,LV_NUM,LV_COUNT,LV_START,LV_TXT.
      "获取抬头字段文本总长度
      LV_LENGTH = STRLEN( I_REQ-LONG_TXT ).
      "每132字符分割,需要分割多少整数次
      LV_NUM = LV_LENGTH DIV 132.
      LV_NUM = LV_NUM + 1.
      DO LV_NUM TIMES.
        CLEAR: LV_TXT.
        LV_COUNT  = LV_COUNT + 1.
        LV_INDEX = LV_INDEX + 1.
        LV_START  = ( LV_COUNT - 1 ) * 132 .
        IF LV_LENGTH = 0.
          EXIT.
        ENDIF.
        IF LV_NUM = LV_COUNT.
          LV_TXT = I_REQ-LONG_TXT+LV_START(LV_LENGTH).
        ELSE.
          LV_LENGTH = LV_LENGTH - 132.
          LV_TXT = I_REQ-LONG_TXT+LV_START(132).
        ENDIF.
        IF LV_INFNR IS NOT INITIAL.
          LS_PIRTEXT-INFO_REC  = LV_INFNR.
        ENDIF.
        LS_PIRTEXT-TDLINE    = LV_TXT.
        LS_PIRTEXT-TDOBJECT  = 'EINA'.
        LS_PIRTEXT-TDSPRAS  = SY-LANGU.
        LS_PIRTEXT-TDFORMAT  = '*'.
        APPEND LS_PIRTEXT TO LT_PIRTEXT.
        CLEAR LS_PIRTEXT.
      ENDDO.
    ENDIF.

    DATA:LINE TYPE KLFN1 VALUE 0001.
    LOOP AT I_REQ-CONDITION INTO DATA(LW_CONDITION).
      LS_QUAN-INFO_REC = LS_INFOREC_OLD-INFNR.
      LS_QUAN-EINE_INDX = '01'.
*      LS_QUAN-COND_COUNT = '01'.
      LS_QUAN-LINE_NO = LINE .
      LS_QUAN-SCALE_BASE_QTY = LW_CONDITION-KSTBM.
      LS_QUAN-COND_VALUE = LW_CONDITION-KBETR.
      APPEND LS_QUAN TO LT_QUAN.
      CLEAR:LS_QUAN.
      LINE = LINE + 1.
    ENDLOOP.

    IF  I_REQ-MATNR IS NOT INITIAL .

      CALL FUNCTION 'ME_INFORECORD_MAINTAIN_MULTI'
        IMPORTING
          ET_EINA   = LT_EINA_E
          ET_EINE   = LT_EINE_E
        TABLES
          T_EINA    = LT_EINA
          T_EINAX   = LT_EINAX
          T_EINE    = LT_EINE
          T_EINEX   = LT_EINEX
          TXT_LINES = LT_PIRTEXT
          RETURN    = LT_RETURN.

      LOOP AT LT_RETURN INTO DATA(LS_RETURN) WHERE TYPE CA 'EXA'.
        LV_MSG = ` ` && LV_MSG && ` ` && LS_RETURN-MESSAGE .
      ENDLOOP.

      IF SY-SUBRC <> 0.
        CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
          EXPORTING
            WAIT = 'X'.
        O_RESP-MSGTY = 'S'.
        O_RESP-MSGTX = '信息记录成功'.
        READ TABLE LT_EINA_E INTO DATA(LS_EINA_E) INDEX 1.
        O_RESP-INFNR = |{ LS_EINA_E-INFO_REC ALPHA = OUT }|.
        I_REQ-INFNR =  |{ LS_EINA_E-INFO_REC ALPHA = IN }|.
        IF ZFLAG <> 'X'.
*-----记录日志
          LV_STATUS = 'S'.
          IF LS_LIST-IF_LOG_ACTIVE = 'X'.   "->Create Log End
            LO_TOOLKIT->CREATE_IF_LOG( EXPORTING IV_GUID = LV_GUID IV_IFID = 'ZSRM003'
              IV_DATA = /UI2/CL_JSON=>SERIALIZE(
                                                  DATA        = O_RESP
                                                  COMPRESS    = ABAP_TRUE                  "返回参数为空的情况就不展示
                                                  PRETTY_NAME = 'X'                        "大写:'' 小写:'L' 遇到下划线得第一个字母变大写,并且下划线消失,其他情况是小写:'X'
                                                  )
                                                  IV_STEP = 'RSP' IV_STATUS = LV_STATUS ).
          ENDIF.
        ENDIF.
      ELSE.
        CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
        O_RESP-MSGTY = 'E'.
        O_RESP-MSGTX = I_REQ-WERKS && '工厂信息记录失败' &&  LV_MSG.
*-----记录日志
        LV_STATUS = 'E'.
        IF LS_LIST-IF_LOG_ACTIVE = 'X'.   "->Create Log End
          LO_TOOLKIT->CREATE_IF_LOG( EXPORTING IV_GUID = LV_GUID IV_IFID = 'ZSRM003'
            IV_DATA = /UI2/CL_JSON=>SERIALIZE(
                                              DATA        = O_RESP
                                              COMPRESS    = ABAP_TRUE                  "返回参数为空的情况就不展示
                                              PRETTY_NAME = 'X'                        "大写:'' 小写:'L' 遇到下划线得第一个字母变大写,并且下划线消失,其他情况是小写:'X'
                                              )
                                              IV_STEP = 'RSP' IV_STATUS = LV_STATUS ).
        ENDIF.
        CONTINUE.
      ENDIF.
    ELSE.
      IF I_REQ-ZDEL IS NOT INITIAL.."删除ME15
        CALL FUNCTION 'ZFM_DEL_BDC_NOMATNR'
          EXPORTING
            I_REQ  = I_REQ
          IMPORTING
            O_RESP = O_RESP.
        O_RESP-INFNR = I_REQ-INFNR.
      ELSE.
        SELECT SINGLE * FROM EINE INTO @DATA(LW_EINE) WHERE INFNR = @I_REQ-INFNR AND EKORG = @I_REQ-EKORG AND ESOKZ = @I_REQ-ESOKZ AND WERKS = @I_REQ-WERKS.
        IF SY-SUBRC <> 0 .
          CALL FUNCTION 'ZFM_BASIS_BDC'
            EXPORTING
              I_REQ  = I_REQ
            IMPORTING
              O_RESP = O_RESP.
          I_REQ-INFNR = O_RESP-INFNR.
        ELSE.
          CALL FUNCTION 'ZFM_CHANGE_BDC'
            EXPORTING
              I_REQ  = I_REQ
            IMPORTING
              O_RESP = O_RESP.
        ENDIF.
        "判断走bdc原来是否存在条件(无物料:A025 有物料:A017)
        SELECT *
          INTO TABLE @DATA(LG_A025)
                FROM A025 AS A
                WHERE A~INFNR = @I_REQ-INFNR
                AND A~LIFNR = @I_REQ-LIFNR
                AND A~EKORG = @I_REQ-EKORG
                AND A~ESOKZ = @I_REQ-ESOKZ
                AND A~WERKS = @I_REQ-WERKS
                AND A~MATKL = @I_REQ-MATKL
                AND A~KSCHL = 'PB00'
                AND A~KAPPL = 'M'.

        IF LG_A025 IS NOT INITIAL.
          ZFLAG = 'X'.
        ENDIF.
      ENDIF.
    ENDIF.
*-------------修改条件价格
    IF I_REQ-ZDEL IS  INITIAL.."排除删除标记
      CALL FUNCTION 'ZFM_CONDITION_BDC'
        EXPORTING
          I_REQ  = I_REQ
          I_FLAG = ZFLAG
        IMPORTING
          O_RESP = O_RESP.
    ENDIF.
*----日志RESP写入
    LV_STATUS = O_RESP-MSGTY.
    IF LS_LIST-IF_LOG_ACTIVE = 'X'.   "->Create Log End
      LO_TOOLKIT->CREATE_IF_LOG( EXPORTING IV_GUID = LV_GUID IV_IFID = 'ZSRM003'
        IV_DATA = /UI2/CL_JSON=>SERIALIZE(
                                          DATA        = O_RESP
                                          COMPRESS    = ABAP_TRUE                  "返回参数为空的情况就不展示
                                          PRETTY_NAME = 'X'                        "大写:'' 小写:'L' 遇到下划线得第一个字母变大写,并且下划线消失,其他情况是小写:'X'
                                          )
                                          IV_STEP = 'RSP' IV_STATUS = LV_STATUS ).
    ENDIF.
    CLEAR:ZFLAG .

    REFRESH :LT_INFOREC_OLD,LG_A017.
    CLEAR:LS_INFOREC_OLD.

  ENDLOOP."endloop at gt_werks_set

  MESSAEG O_RESP.

ENDMETHOD.

去掉删除标记BDC:
 

FUNCTION ZFM_DEL_BDC.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     VALUE(I_REQ) TYPE  ZMMS_005_IN OPTIONAL
*"  EXPORTING
*"     VALUE(O_RESP) TYPE  ZMMS_005_OUT
*"----------------------------------------------------------------------
  CONSTANTS:
    CNS_MODE   TYPE C VALUE 'N',
    CNS_UPDATE TYPE C VALUE 'S',
    CNS_TCODE  TYPE TCODE VALUE 'ME15'.
  DATA: BDCDATA    TYPE TABLE OF BDCDATA WITH HEADER LINE,
        BDCMSGCOLL TYPE TABLE OF BDCMSGCOLL WITH HEADER LINE,
        MSG        TYPE TABLE OF BAPIRETURN WITH HEADER LINE.

*---------------------------------------------------------------------*
  PERFORM BDC_DYNPRO TABLES BDCDATA
  USING 'SAPMM06I'
        '0100'.
  PERFORM BDC_FIELD TABLES BDCDATA
  USING 'BDC_OKCODE'
        '/00'.
  PERFORM BDC_FIELD TABLES BDCDATA
  USING 'EINA-LIFNR'
        I_REQ-LIFNR.
  PERFORM BDC_FIELD TABLES BDCDATA
  USING 'EINA-MATNR'
        I_REQ-MATNR.
  PERFORM BDC_FIELD TABLES BDCDATA
  USING 'EINE-EKORG'
        I_REQ-EKORG.
  PERFORM BDC_FIELD TABLES BDCDATA
  USING 'EINE-WERKS'
        I_REQ-WERKS.
  PERFORM BDC_FIELD TABLES BDCDATA
  USING 'EINA-INFNR'
        I_REQ-INFNR.
  IF I_REQ-ESOKZ = 0."标准
    PERFORM BDC_FIELD TABLES BDCDATA
    USING 'RM06I-NORMB'
          'X'.
  ELSEIF I_REQ-ESOKZ = 2."寄售
    PERFORM BDC_FIELD TABLES BDCDATA
    USING 'RM06I-KONSI'
          'X'.
  ELSEIF I_REQ-ESOKZ = 3."外协(分包)
    PERFORM BDC_FIELD TABLES BDCDATA
    USING 'RM06I-LOHNB'
          'X'.
  ENDIF.
*---------------------------------------------------------------------*
  PERFORM BDC_DYNPRO TABLES BDCDATA
  USING 'SAPMM06I'
        '0104'.
  PERFORM BDC_FIELD TABLES BDCDATA
  USING 'BDC_OKCODE'
        '=BU'.
  PERFORM BDC_FIELD TABLES BDCDATA
  USING 'EINA-LOEKZ'
        ''.
  PERFORM BDC_FIELD TABLES BDCDATA
  USING 'EINE-LOEKZ'
        ''.

  CALL TRANSACTION CNS_TCODE USING BDCDATA[]
        MODE CNS_MODE
        UPDATE CNS_UPDATE
        MESSAGES INTO BDCMSGCOLL[].
  LOOP AT BDCMSGCOLL.
    CALL FUNCTION 'MESSAGE_TEXT_BUILD'
      EXPORTING
        MSGID               = BDCMSGCOLL-MSGID
        MSGNR               = BDCMSGCOLL-MSGNR
        MSGV1               = BDCMSGCOLL-MSGV1
        MSGV2               = BDCMSGCOLL-MSGV2
        MSGV3               = BDCMSGCOLL-MSGV3
        MSGV4               = BDCMSGCOLL-MSGV4
      IMPORTING
        MESSAGE_TEXT_OUTPUT = MSG-MESSAGE.

    IF BDCMSGCOLL-MSGTYP CA 'EXA' .
      O_RESP-MSGTX =  ` ` && MSG-MESSAGE && ` ` && O_RESP-MSGTX..
      O_RESP-MSGTY = 'E'.
    ENDIF.
  ENDLOOP.

  IF  O_RESP-MSGTY <> 'E'.
    O_RESP-MSGTY = 'S'.
    O_RESP-MSGTX = '信息记录更新成功'..
  ENDIF.

ENDFUNCTION.

无物料打上删除标记BDC:

FUNCTION ZFM_DEL_BDC_NOMATNR.
*"--------------------------------------------------------------------
*"*"局部接口:
*"  IMPORTING
*"     VALUE(I_REQ) TYPE  ZMMS_005_IN OPTIONAL
*"  EXPORTING
*"     VALUE(O_RESP) TYPE  ZMMS_005_OUT
*"--------------------------------------------------------------------
  CONSTANTS:
    CNS_MODE   TYPE C VALUE 'N',
    CNS_UPDATE TYPE C VALUE 'S',
    CNS_TCODE  TYPE TCODE VALUE 'ME15'.
  DATA: BDCDATA    TYPE TABLE OF BDCDATA WITH HEADER LINE,
        BDCMSGCOLL TYPE TABLE OF BDCMSGCOLL WITH HEADER LINE,
        MSG        TYPE TABLE OF BAPIRETURN WITH HEADER LINE.

*---------------------------------------------------------------------*
  PERFORM BDC_DYNPRO TABLES BDCDATA
  USING 'SAPMM06I'
        '0100'.
  PERFORM BDC_FIELD TABLES BDCDATA
  USING 'BDC_OKCODE'
        '/00'.
  PERFORM BDC_FIELD TABLES BDCDATA
  USING 'EINA-LIFNR'
        I_REQ-LIFNR.
  PERFORM BDC_FIELD TABLES BDCDATA
  USING 'EINA-INFNR'
        I_REQ-INFNR.
  PERFORM BDC_FIELD TABLES BDCDATA
  USING 'EINE-EKORG'
        I_REQ-EKORG.
  PERFORM BDC_FIELD TABLES BDCDATA
  USING 'EINE-WERKS'
        I_REQ-WERKS.

  IF I_REQ-ESOKZ = 0."标准
    PERFORM BDC_FIELD TABLES BDCDATA
    USING 'RM06I-NORMB'
          'X'.
  ELSEIF I_REQ-ESOKZ = 2."寄售
    PERFORM BDC_FIELD TABLES BDCDATA
    USING 'RM06I-KONSI'
          'X'.
  ELSEIF I_REQ-ESOKZ = 3."外协(分包)
    PERFORM BDC_FIELD TABLES BDCDATA
    USING 'RM06I-LOHNB'
          'X'.
  ENDIF.
*---------------------------------------------------------------------*
  PERFORM BDC_DYNPRO TABLES BDCDATA
  USING 'SAPMM06I'
        '0104'.
  PERFORM BDC_FIELD TABLES BDCDATA
  USING 'BDC_OKCODE'
        '=BU'.
  PERFORM BDC_FIELD TABLES BDCDATA
  USING 'EINA-LOEKZ'
        'X'.
  PERFORM BDC_FIELD TABLES BDCDATA
  USING 'EINE-LOEKZ'
        'X'.

  CALL TRANSACTION CNS_TCODE USING BDCDATA[]
        MODE CNS_MODE
        UPDATE CNS_UPDATE
        MESSAGES INTO BDCMSGCOLL[].
  LOOP AT BDCMSGCOLL.
    CALL FUNCTION 'MESSAGE_TEXT_BUILD'
      EXPORTING
        MSGID               = BDCMSGCOLL-MSGID
        MSGNR               = BDCMSGCOLL-MSGNR
        MSGV1               = BDCMSGCOLL-MSGV1
        MSGV2               = BDCMSGCOLL-MSGV2
        MSGV3               = BDCMSGCOLL-MSGV3
        MSGV4               = BDCMSGCOLL-MSGV4
      IMPORTING
        MESSAGE_TEXT_OUTPUT = MSG-MESSAGE.

    IF BDCMSGCOLL-MSGTYP CA 'EXA' .
      O_RESP-MSGTX =  ` ` && MSG-MESSAGE && ` ` && O_RESP-MSGTX..
      O_RESP-MSGTY = 'E'.
    ENDIF.
  ENDLOOP.

  IF  O_RESP-MSGTY <> 'E'.
    O_RESP-MSGTY = 'S'.
    O_RESP-MSGTX = '信息记录更新成功'..
  ENDIF.

ENDFUNCTION.

 无物料基础数据:

FUNCTION ZFM_BASIS_BDC.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     VALUE(I_REQ) TYPE  ZMMS_005_IN OPTIONAL
*"  EXPORTING
*"     VALUE(O_RESP) TYPE  ZMMS_005_OUT
*"----------------------------------------------------------------------

  CONSTANTS:
    CNS_MODE   TYPE C VALUE 'N',
    CNS_UPDATE TYPE C VALUE 'S',
    CNS_TCODE  TYPE TCODE VALUE 'ME11'.
  DATA: BDCDATA    TYPE TABLE OF BDCDATA WITH HEADER LINE,
        BDCMSGCOLL TYPE TABLE OF BDCMSGCOLL WITH HEADER LINE,
        MSG        TYPE TABLE OF BAPIRETURN WITH HEADER LINE.
  DATA:APLFZ(30)  TYPE C,
       NORBM(30) TYPE C,
       NETPR(30) TYPE C,
*       PEINH(30)  TYPE C,
       ZPEINH(30) TYPE C.
*---------------------------------------------------------------------*
  PERFORM BDC_DYNPRO TABLES BDCDATA
  USING 'SAPMM06I'
        '0100'.
  PERFORM BDC_FIELD TABLES BDCDATA
  USING 'BDC_OKCODE'
        '/00'.
  PERFORM BDC_FIELD TABLES BDCDATA
  USING 'EINA-LIFNR'
        I_REQ-LIFNR.
  PERFORM BDC_FIELD TABLES BDCDATA
  USING 'EINE-EKORG'
        I_REQ-EKORG.
  PERFORM BDC_FIELD TABLES BDCDATA
  USING 'EINE-WERKS'
        I_REQ-WERKS.
  PERFORM BDC_FIELD TABLES BDCDATA
  USING 'EINA-INFNR'
        I_REQ-INFNR.

  IF I_REQ-ESOKZ = 0."标准
    PERFORM BDC_FIELD TABLES BDCDATA
    USING 'RM06I-NORMB'
          'X'.
  ELSEIF I_REQ-ESOKZ = 2."寄售
    PERFORM BDC_FIELD TABLES BDCDATA
    USING 'RM06I-KONSI'
          'X'.
  ELSEIF I_REQ-ESOKZ = 3."外协(分包)
    PERFORM BDC_FIELD TABLES BDCDATA
    USING 'RM06I-LOHNB'
          'X'.
  ENDIF.

*---------------------------------------------------------------------*
  PERFORM BDC_DYNPRO TABLES BDCDATA
  USING 'SAPMM06I'
        '0101'.
  PERFORM BDC_FIELD TABLES BDCDATA
  USING 'BDC_OKCODE'
        '/00'.
  PERFORM BDC_FIELD TABLES BDCDATA
  USING 'EINA-TXZ01'
        I_REQ-TXZ01.
  IF I_REQ-INFNR IS INITIAL.
    PERFORM BDC_FIELD TABLES BDCDATA
    USING 'EINA-MATKL'
          I_REQ-MATKL.
  ENDIF.

*  PERFORM BDC_FIELD TABLES BDCDATA
*  USING 'EINA-URZLA'
*        'CN'.
  PERFORM BDC_FIELD TABLES BDCDATA
  USING 'EINA-MEINS'
        I_REQ-MEINS.
  PERFORM BDC_FIELD TABLES BDCDATA
  USING 'EINA-SORTL'
        I_REQ-SORTL.
*---------------------------------------------------------------------*
  PERFORM BDC_DYNPRO TABLES BDCDATA
  USING 'SAPMM06I'
        '0102'.
  PERFORM BDC_FIELD TABLES BDCDATA
  USING 'BDC_OKCODE'
        '=KO'.
  APLFZ = I_REQ-APLFZ.
  CONDENSE APLFZ.
  PERFORM BDC_FIELD TABLES BDCDATA
  USING 'EINE-APLFZ'
         APLFZ.
  PERFORM BDC_FIELD TABLES BDCDATA
  USING 'EINE-EKGRP'
        I_REQ-EKGRP.
  NORBM = I_REQ-NORBM.
  CONDENSE NORBM.
  PERFORM BDC_FIELD TABLES BDCDATA
  USING 'EINE-NORBM'
         NORBM.
  PERFORM BDC_FIELD TABLES BDCDATA
  USING 'EINE-AUT_SOURCE'
        I_REQ-AUT_SOURCE.
***-- modify  Start     by  lmq   04.12.2024 16:03:37  Start—
  NETPR = I_REQ-NETPR.
  CONDENSE NETPR.
  PERFORM BDC_FIELD TABLES BDCDATA
  USING 'EINE-NETPR'
        NETPR.
***--modify  End      by  lmq   04.12.2024 16:03:37   End—
  PERFORM BDC_FIELD TABLES BDCDATA
  USING 'EINE-WEBRE'
        I_REQ-WEBRE.
  PERFORM BDC_FIELD TABLES BDCDATA
  USING 'EINE-MWSKZ'
        I_REQ-MWSKZ.
*  PERFORM BDC_FIELD TABLES BDCDATA
*  USING 'EINE-IPRKZ'
*        'D'.
***-- modify  Start     by  lmq   08.12.2024 15:24:43  Start—//如果不加这段会出现默认为当前时间到9999.12.81的情况
  ZPEINH = I_REQ-PEINH.
  CONDENSE zpeinh.
  PERFORM BDC_DYNPRO TABLES BDCDATA
  USING 'SAPMV13A'
        '1025'.
  PERFORM BDC_FIELD TABLES BDCDATA
  USING 'BDC_OKCODE'
        '=SICH'.
  PERFORM BDC_FIELD TABLES BDCDATA
  USING 'KONP-KONWA(01)'
        I_REQ-WAERS.
  PERFORM BDC_FIELD TABLES BDCDATA
  USING 'KONP-KPEIN(01)'
        ZPEINH.
  PERFORM BDC_FIELD TABLES BDCDATA
  USING 'KONP-KMEIN(01)'
        I_REQ-BPRME."采购单位
  PERFORM BDC_FIELD TABLES BDCDATA
  USING 'RV13A-DATAB(01)'
        I_REQ-DATAB.
  PERFORM BDC_FIELD TABLES BDCDATA
  USING 'RV13A-DATBI(01)'
        I_REQ-DATBI.

***--modify  End      by  lmq   08.12.2024 15:24:43   End—
  CALL TRANSACTION CNS_TCODE USING BDCDATA[]
        MODE CNS_MODE
        UPDATE CNS_UPDATE
        MESSAGES INTO BDCMSGCOLL[].
  LOOP AT BDCMSGCOLL.
    CALL FUNCTION 'MESSAGE_TEXT_BUILD'
      EXPORTING
        MSGID               = BDCMSGCOLL-MSGID
        MSGNR               = BDCMSGCOLL-MSGNR
        MSGV1               = BDCMSGCOLL-MSGV1
        MSGV2               = BDCMSGCOLL-MSGV2
        MSGV3               = BDCMSGCOLL-MSGV3
        MSGV4               = BDCMSGCOLL-MSGV4
      IMPORTING
        MESSAGE_TEXT_OUTPUT = MSG-MESSAGE.

    IF BDCMSGCOLL-MSGTYP CA 'EXA' .
      O_RESP-MSGTX =  ` ` && MSG-MESSAGE && ` ` && O_RESP-MSGTX..
      O_RESP-MSGTY = 'E'.
    ENDIF.
  ENDLOOP.

  IF  O_RESP-MSGTY <> 'E'.
    O_RESP-INFNR = SY-MSGV1.
    O_RESP-MSGTY = 'S'.
    O_RESP-MSGTX = '信息记录创建成功'..
  ENDIF.



ENDFUNCTION.

无物料改变bdc:

FUNCTION ZFM_CHANGE_BDC.
*"--------------------------------------------------------------------
*"*"局部接口:
*"  IMPORTING
*"     VALUE(I_REQ) TYPE  ZMMS_005_IN OPTIONAL
*"  EXPORTING
*"     VALUE(O_RESP) TYPE  ZMMS_005_OUT
*"--------------------------------------------------------------------

  CONSTANTS:
    CNS_MODE   TYPE C VALUE 'N',
    CNS_UPDATE TYPE C VALUE 'S',
    CNS_TCODE  TYPE TCODE VALUE 'ME12'.
  DATA: BDCDATA    TYPE TABLE OF BDCDATA WITH HEADER LINE,
        BDCMSGCOLL TYPE TABLE OF BDCMSGCOLL WITH HEADER LINE,
        MSG        TYPE TABLE OF BAPIRETURN WITH HEADER LINE.
  DATA:APLFZ(30) TYPE C,
       NORBM(30) TYPE C.
*       NETPR(30) TYPE C,
*       PEINH(30)  TYPE C.
*---------------------------------------------------------------------*
  PERFORM BDC_DYNPRO TABLES BDCDATA
  USING 'SAPMM06I'
        '0100'.
  PERFORM BDC_FIELD TABLES BDCDATA
  USING 'BDC_OKCODE'
        '/00'.
  PERFORM BDC_FIELD TABLES BDCDATA
  USING 'EINA-LIFNR'
        I_REQ-LIFNR.
  PERFORM BDC_FIELD TABLES BDCDATA
  USING 'EINE-EKORG'
        I_REQ-EKORG.
  PERFORM BDC_FIELD TABLES BDCDATA
  USING 'EINE-WERKS'
        I_REQ-WERKS.
  PERFORM BDC_FIELD TABLES BDCDATA
  USING 'EINA-INFNR'
        I_REQ-INFNR.

  IF I_REQ-ESOKZ = 0."标准
    PERFORM BDC_FIELD TABLES BDCDATA
    USING 'RM06I-NORMB'
          'X'.
  ELSEIF I_REQ-ESOKZ = 2."寄售
    PERFORM BDC_FIELD TABLES BDCDATA
    USING 'RM06I-KONSI'
          'X'.
  ELSEIF I_REQ-ESOKZ = 3."外协(分包)
    PERFORM BDC_FIELD TABLES BDCDATA
    USING 'RM06I-LOHNB'
          'X'.
  ENDIF.
*---------------------------------------------------------------------*
  PERFORM BDC_DYNPRO TABLES BDCDATA
  USING 'SAPMM06I'
        '0101'.
  PERFORM BDC_FIELD TABLES BDCDATA
  USING 'BDC_OKCODE'
        '/00'.
  PERFORM BDC_FIELD TABLES BDCDATA
  USING 'EINA-TXZ01'
        I_REQ-TXZ01.
*  PERFORM BDC_FIELD TABLES BDCDATA
*  USING 'EINA-URZLA'
*        'CN'.
  PERFORM BDC_FIELD TABLES BDCDATA
  USING 'EINA-MEINS'
        I_REQ-MEINS.
  PERFORM BDC_FIELD TABLES BDCDATA
  USING 'EINA-SORTL'
        I_REQ-SORTL.
*---------------------------------------------------------------------*
  PERFORM BDC_DYNPRO TABLES BDCDATA
  USING 'SAPMM06I'
        '0102'.
  PERFORM BDC_FIELD TABLES BDCDATA
  USING 'BDC_OKCODE'
        '=BU'.

  APLFZ = I_REQ-APLFZ.
  CONDENSE APLFZ.
  PERFORM BDC_FIELD TABLES BDCDATA
  USING 'EINE-APLFZ'
        APLFZ.
  PERFORM BDC_FIELD TABLES BDCDATA
  USING 'EINE-EKGRP'
        I_REQ-EKGRP.
  NORBM = I_REQ-NORBM.
  CONDENSE NORBM.
  PERFORM BDC_FIELD TABLES BDCDATA
  USING 'EINE-NORBM'
        NORBM.
  PERFORM BDC_FIELD TABLES BDCDATA
  USING 'EINE-WEBRE'
        I_REQ-WEBRE.
  PERFORM BDC_FIELD TABLES BDCDATA
  USING 'EINE-MWSKZ'
        I_REQ-MWSKZ.
  PERFORM BDC_FIELD TABLES BDCDATA
  USING 'EINE-AUT_SOURCE'
        I_REQ-AUT_SOURCE.
*  PERFORM BDC_FIELD TABLES BDCDATA
*  USING 'EINE-IPRKZ'
*        'D'.

  CALL TRANSACTION CNS_TCODE USING BDCDATA[]
        MODE CNS_MODE
        UPDATE CNS_UPDATE
        MESSAGES INTO BDCMSGCOLL[].
  LOOP AT BDCMSGCOLL.
    CALL FUNCTION 'MESSAGE_TEXT_BUILD'
      EXPORTING
        MSGID               = BDCMSGCOLL-MSGID
        MSGNR               = BDCMSGCOLL-MSGNR
        MSGV1               = BDCMSGCOLL-MSGV1
        MSGV2               = BDCMSGCOLL-MSGV2
        MSGV3               = BDCMSGCOLL-MSGV3
        MSGV4               = BDCMSGCOLL-MSGV4
      IMPORTING
        MESSAGE_TEXT_OUTPUT = MSG-MESSAGE.

    IF BDCMSGCOLL-MSGTYP CA 'EXA' .
      O_RESP-MSGTX =  ` ` && MSG-MESSAGE && ` ` && O_RESP-MSGTX..
      O_RESP-MSGTY = 'E'.
    ENDIF.
  ENDLOOP.

  IF  O_RESP-MSGTY <> 'E'.
    O_RESP-INFNR = SY-MSGV1.
    O_RESP-MSGTY = 'S'.
    O_RESP-MSGTX = '信息记录修改成功'..
  ENDIF.



ENDFUNCTION.

阶梯价格 增加 BDC:

FUNCTION ZFM_CONDITION_BDC.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     VALUE(I_REQ) TYPE  ZMMS_005_IN OPTIONAL
*"     VALUE(I_FLAG) TYPE  ESOKZ OPTIONAL
*"  EXPORTING
*"     VALUE(O_RESP) TYPE  ZMMS_005_OUT
*"----------------------------------------------------------------------
  DATA:CNS_MODE TYPE C VALUE 'N'.

  CONSTANTS:
*  CNS_MODE TYPE C VALUE 'N',
    CNS_UPDATE TYPE C VALUE 'S',
    CNS_TCODE  TYPE TCODE VALUE 'ME12'.
  DATA: BDCDATA    TYPE TABLE OF BDCDATA WITH HEADER LINE,
        BDCMSGCOLL TYPE TABLE OF BDCMSGCOLL WITH HEADER LINE,
        MSG        TYPE TABLE OF BAPIRETURN WITH HEADER LINE,
        NUM(8)     TYPE I,
        ZKBETR(30) TYPE C,
        ZKSTBM(30) TYPE C,
        ZPEINH(30) TYPE C.
  DATA(LINE) = LINES( I_REQ-CONDITION ).
*---------------------------------------------------------------------*
  PERFORM BDC_DYNPRO TABLES BDCDATA
  USING 'SAPMM06I'
        '0100'.
  PERFORM BDC_FIELD TABLES BDCDATA
  USING 'BDC_OKCODE'
        '/00'.
  PERFORM BDC_FIELD TABLES BDCDATA
  USING 'EINA-LIFNR'
        I_REQ-LIFNR.
  PERFORM BDC_FIELD TABLES BDCDATA
  USING 'EINE-EKORG'
        I_REQ-EKORG.
  PERFORM BDC_FIELD TABLES BDCDATA
  USING 'EINE-WERKS'
        I_REQ-WERKS.
  PERFORM BDC_FIELD TABLES BDCDATA
  USING 'EINA-MATNR'
        I_REQ-MATNR.
  PERFORM BDC_FIELD TABLES BDCDATA
  USING 'EINA-INFNR'
        I_REQ-INFNR.
  IF I_REQ-ESOKZ = 0."标准
    PERFORM BDC_FIELD TABLES BDCDATA
    USING 'RM06I-NORMB'
          'X'.
  ELSEIF I_REQ-ESOKZ = 2."寄售
    PERFORM BDC_FIELD TABLES BDCDATA
    USING 'RM06I-KONSI'
          'X'.
  ELSEIF I_REQ-ESOKZ = 3."外协(分包)
    PERFORM BDC_FIELD TABLES BDCDATA
    USING 'RM06I-LOHNB'
          'X'.
  ENDIF.

*---------------------------------------------------------------------*
*---------------------------------------------------------------------*
  PERFORM BDC_DYNPRO TABLES BDCDATA
  USING 'SAPMM06I'
        '0101'.
  PERFORM BDC_FIELD TABLES BDCDATA
  USING 'BDC_OKCODE'
        '=KO'.
*  PERFORM BDC_FIELD TABLES BDCDATA
*  USING 'EINA-URZLA'
*        'CN'.
*  PERFORM BDC_FIELD TABLES BDCDATA
*  USING 'EINA-MEINS'
*        'PC'.
  IF I_REQ-MATNR IS NOT INITIAL.
*    PERFORM BDC_FIELD TABLES BDCDATA
*    USING 'EINA-UMREZ'
*          '1'.
*    PERFORM BDC_FIELD TABLES BDCDATA
*    USING 'EINA-UMREN'
*          '1'.
  ELSE.
*    PERFORM BDC_FIELD TABLES BDCDATA
*    USING 'EINA-SORTL'
*          I_REQ-MATKL.
  ENDIF.

*---------------------------------------------------------------------*
*---------------------------------------------------------------------*
  IF I_FLAG = 'X'.
    PERFORM BDC_DYNPRO TABLES BDCDATA
    USING 'SAPLV14A'
          '0102'.
    PERFORM BDC_FIELD TABLES BDCDATA
    USING 'BDC_OKCODE'
          '=NEWD'.
  ENDIF.
*---------------------------------------------------------------------*
  ZPEINH = I_REQ-PEINH.
  CONDENSE ZPEINH.
  ZKBETR = I_REQ-NETPR.
  CONDENSE ZKBETR.
  IF I_REQ-MATNR IS NOT INITIAL.
    PERFORM BDC_DYNPRO TABLES BDCDATA
    USING 'SAPMV13A'
          '1017'.
    PERFORM BDC_FIELD TABLES BDCDATA
    USING 'BDC_OKCODE'
          '/00'.
*    PERFORM BDC_FIELD TABLES BDCDATA
*    USING 'BDC_OKCODE'
*          '=SICH'.
    PERFORM BDC_FIELD TABLES BDCDATA
    USING 'KONP-KBETR(01)'
          ZKBETR.
    PERFORM BDC_FIELD TABLES BDCDATA
    USING 'KONP-KONWA(01)'
          I_REQ-WAERS.
    PERFORM BDC_FIELD TABLES BDCDATA
    USING 'RV13A-DATAB(01)'
          I_REQ-DATAB.
    PERFORM BDC_FIELD TABLES BDCDATA
    USING 'RV13A-DATBI(01)'
          I_REQ-DATBI.
    PERFORM BDC_FIELD TABLES BDCDATA
    USING 'KONP-KPEIN(01)'
          ZPEINH.
    PERFORM BDC_FIELD TABLES BDCDATA
    USING 'KONP-KMEIN(01)'
          I_REQ-BPRME.
*---------------------------------------------------------------------*
    PERFORM BDC_DYNPRO TABLES BDCDATA
    USING 'SAPMV13A'
          '1017'.
    IF I_REQ-CONDITION[] IS NOT INITIAL.
      PERFORM BDC_FIELD TABLES BDCDATA
      USING 'BDC_OKCODE'
            '=PSTF'.
    ELSE.
      PERFORM BDC_FIELD TABLES BDCDATA
      USING 'BDC_OKCODE'
            '=SICH'.
    ENDIF.
  ELSE.
    PERFORM BDC_DYNPRO TABLES BDCDATA
    USING 'SAPMV13A'
          '1025'.
    PERFORM BDC_FIELD TABLES BDCDATA
    USING 'BDC_OKCODE'
          '/00'.

    PERFORM BDC_FIELD TABLES BDCDATA
    USING 'KONP-KBETR(01)'
          ZKBETR.
    PERFORM BDC_FIELD TABLES BDCDATA
    USING 'KONP-KONWA(01)'
          I_REQ-WAERS.
    PERFORM BDC_FIELD TABLES BDCDATA
    USING 'KONP-KPEIN(01)'
          ZPEINH.
    PERFORM BDC_FIELD TABLES BDCDATA
    USING 'KONP-KMEIN(01)'
          I_REQ-BPRME.
    PERFORM BDC_FIELD TABLES BDCDATA
    USING 'RV13A-DATAB(01)'
          I_REQ-DATAB.
    PERFORM BDC_FIELD TABLES BDCDATA
    USING 'RV13A-DATBI(01)'
          I_REQ-DATBI.
*---------------------------------------------------------------------*
    PERFORM BDC_DYNPRO TABLES BDCDATA
    USING 'SAPMV13A'
          '1025'.
    IF I_REQ-CONDITION[] IS NOT INITIAL.
      PERFORM BDC_FIELD TABLES BDCDATA
      USING 'BDC_OKCODE'
            '=PSTF'.
    ELSE.
      PERFORM BDC_FIELD TABLES BDCDATA
      USING 'BDC_OKCODE'
            '=SICH'.
    ENDIF.
  ENDIF.

*---------------------------------------------------------------------*

  DATA(LV_TABIX) = LINES( I_REQ-CONDITION ).
  LOOP AT I_REQ-CONDITION INTO DATA(LS_CONDITION).
    NUM = NUM + 1.
    ZKBETR = LS_CONDITION-KBETR.
    ZKSTBM = LS_CONDITION-KSTBM.
    CONDENSE ZKBETR NO-GAPS.
    CONDENSE ZKSTBM NO-GAPS.
    IF NUM = 1.
      PERFORM BDC_DYNPRO TABLES BDCDATA
      USING 'SAPMV13A'
            '0303'.
      PERFORM BDC_FIELD TABLES BDCDATA
      USING 'BDC_OKCODE'
            '=EINF'.
      PERFORM BDC_FIELD TABLES BDCDATA
      USING 'RV13A-DATAB'
            I_REQ-DATAB.
      PERFORM BDC_FIELD TABLES BDCDATA
      USING 'RV13A-DATBI'
            I_REQ-DATBI.
      PERFORM BDC_FIELD TABLES BDCDATA
      USING 'KONM-KSTBM(01)'
            ZKSTBM.
      PERFORM BDC_FIELD TABLES BDCDATA
      USING 'KONM-KBETR(01)'
            ZKBETR.
    ELSE.

      PERFORM BDC_DYNPRO TABLES BDCDATA
      USING 'SAPMV13A'
            '0303'.
      PERFORM BDC_FIELD TABLES BDCDATA
      USING 'BDC_OKCODE'
            '/00'.
      PERFORM BDC_FIELD TABLES BDCDATA
      USING 'RV13A-DATAB'
            I_REQ-DATAB.
      PERFORM BDC_FIELD TABLES BDCDATA
      USING 'RV13A-DATBI'
            I_REQ-DATBI.
      PERFORM BDC_FIELD TABLES BDCDATA
      USING 'KONM-KSTBM(01)'
            ZKSTBM.
      PERFORM BDC_FIELD TABLES BDCDATA
      USING 'KONM-KBETR(01)'
            ZKBETR.

    ENDIF.

    IF NUM <> 1 AND NUM <> LINE OR  ( LV_TABIX = 1 AND ZKSTBM = '0.000'  ).

      PERFORM BDC_DYNPRO TABLES BDCDATA
      USING 'SAPMV13A'
            '0303'.
      PERFORM BDC_FIELD TABLES BDCDATA
      USING 'BDC_OKCODE'
            '=EINF'.
      PERFORM BDC_FIELD TABLES BDCDATA
      USING 'RV13A-DATAB'
            I_REQ-DATAB.
      PERFORM BDC_FIELD TABLES BDCDATA
      USING 'RV13A-DATBI'
            I_REQ-DATBI.
    ENDIF.
  ENDLOOP.
  CLEAR:NUM.
*---------------------------------------------------------------------*

  PERFORM BDC_DYNPRO TABLES BDCDATA
  USING 'SAPMV13A'
        '0303'.
  PERFORM BDC_FIELD TABLES BDCDATA
  USING 'BDC_OKCODE'
        '=SICH'.
  PERFORM BDC_FIELD TABLES BDCDATA
  USING 'RV13A-DATAB'
        I_REQ-DATAB.
  PERFORM BDC_FIELD TABLES BDCDATA
  USING 'RV13A-DATBI'
        I_REQ-DATBI.

*  PERFORM BDC_DYNPRO TABLES BDCDATA
*  USING 'SAPMV13A'
*        '0121'.
*  PERFORM BDC_FIELD TABLES BDCDATA
*  USING 'BDC_OKCODE'
*        '= /5'.

  CALL TRANSACTION CNS_TCODE USING BDCDATA[]
        MODE CNS_MODE
        UPDATE CNS_UPDATE
        MESSAGES INTO BDCMSGCOLL[].
  LOOP AT BDCMSGCOLL.
    CALL FUNCTION 'MESSAGE_TEXT_BUILD'
      EXPORTING
        MSGID               = BDCMSGCOLL-MSGID
        MSGNR               = BDCMSGCOLL-MSGNR
        MSGV1               = BDCMSGCOLL-MSGV1
        MSGV2               = BDCMSGCOLL-MSGV2
        MSGV3               = BDCMSGCOLL-MSGV3
        MSGV4               = BDCMSGCOLL-MSGV4
      IMPORTING
        MESSAGE_TEXT_OUTPUT = MSG-MESSAGE.

    IF BDCMSGCOLL-MSGTYP CA 'EXA' OR ( BDCMSGCOLL-MSGID = '00' AND  BDCMSGCOLL-MSGNR = '344' ).
      O_RESP-MSGTX =  ` ` && MSG-MESSAGE && ` ` && O_RESP-MSGTX..
      O_RESP-MSGTY = 'E'.
    ENDIF.
  ENDLOOP.

  IF  O_RESP-MSGTY <> 'E'.
    O_RESP-MSGTY = 'S'.
    O_RESP-MSGTX = '信息记录更新成功'..
  ENDIF.

  O_RESP-INFNR = I_REQ-INFNR.

ENDFUNCTION.
*&---------------------------------------------------------------------*
*& Form bdc_dynpro
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->BDCDATA text
* -->PROGRAM text
* -->DYNPRO text
*----------------------------------------------------------------------*
FORM BDC_DYNPRO TABLES BDCDATA STRUCTURE BDCDATA
USING PROGRAM DYNPRO.
  CLEAR BDCDATA.
  BDCDATA-PROGRAM = PROGRAM.
  BDCDATA-DYNPRO = DYNPRO.
  BDCDATA-DYNBEGIN = 'X'.
  APPEND BDCDATA.
ENDFORM. "bdc_dynpro


*&---------------------------------------------------------------------*
*& Form bdc_field
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->BDCDATA text
* -->FNAM text
* -->FVAL text
*----------------------------------------------------------------------*
FORM BDC_FIELD TABLES BDCDATA STRUCTURE BDCDATA
USING FNAM FVAL.
  CLEAR BDCDATA.
  BDCDATA-FNAM = FNAM.
  BDCDATA-FVAL = FVAL.
  APPEND BDCDATA.
ENDFORM. "bdc_field

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值