PLM->SAP 物料状态修改接口

本文介绍了如何通过PLM接口来修改物料在不同层级的状态,涉及接口搭建、核心逻辑如检查物料存在性和集团/非集团操作,以及执行删除操作的函数和子例程。
摘要由CSDN通过智能技术生成

PLM 通过接口实现 物料各层级状态修改

接口搭建

功能实现

FUNCTION zfm_plm_001.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     VALUE(INPUT) TYPE  ZSTPLM_001_INPUT
*"  EXPORTING
*"     VALUE(OUTPUT) TYPE  ZSTPLM_001_OUTPUT
*"----------------------------------------------------------------------

*--init
  PERFORM frm_init USING 'ZFM_PLM_001'.

*--json in
  gv_json_in = zcl_common=>abap_to_json( input ).

*--if active check
  PERFORM frm_check_active USING gc_i.

  IF gv_active EQ abap_true.

*--input check
    IF input[] IS INITIAL.

      APPEND VALUE #( code = 'E' msg = '输入数据为空,请检查!') TO output.

    ELSE.

      PERFORM frm_material_del_flag_chg TABLES input output.

    ENDIF.

  ELSE.

    PERFORM frm_001_ret_e TABLES input output.

  ENDIF.

*--json out
  gv_json_out = zcl_common=>abap_to_json( output ).

*--set log
  PERFORM frm_set_log USING gc_i.


ENDFUNCTION.

核心逻辑


ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_material_del_flag_chg
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> INPUT
*&      --> OUTPUT
*&---------------------------------------------------------------------*
FORM frm_material_del_flag_chg  TABLES  pt_input  TYPE zstplm_001_input
                                        pt_output TYPE zstplm_001_output.

  DATA:lv_fjt_flag TYPE c.

  LOOP AT pt_input.

    gv_matnr = |{ pt_input-matnr ALPHA = IN }|.

    APPEND INITIAL LINE TO pt_output ASSIGNING FIELD-SYMBOL(<fs_output>).

    <fs_output>-matnr = pt_input-matnr.

    SELECT SINGLE * FROM mara INTO @DATA(ls_mara) WHERE matnr EQ @gv_matnr.

    IF sy-subrc NE 0.
      <fs_output> = VALUE #( BASE <fs_output>
                             code  = gc_e
                             msg   = '该物料不存在,请检查' )  .
      gv_type = gc_e.
      CONTINUE.
    ENDIF.

    "物料检查是否进行集团级别删除
    PERFORM frm_material_del_jtcheck USING pt_input gv_matnr CHANGING lv_fjt_flag.

    IF lv_fjt_flag EQ abap_true."非集团操作

      PERFORM frm_material_del_njt USING pt_input gv_matnr CHANGING <fs_output>.

    ELSE."集团层级操作

      PERFORM frm_material_del_jt  USING pt_input gv_matnr CHANGING <fs_output>.

    ENDIF.

    READ TABLE <fs_output>-o_werks INTO DATA(ls_werks) WITH KEY code = gc_e.
    IF sy-subrc EQ 0.
      <fs_output> = VALUE #( BASE <fs_output> code = gc_e msg = '处理失败' ).
    ELSE.
      <fs_output> = VALUE #( BASE <fs_output> code = gc_s msg = '处理成功' ).
    ENDIF.

    IF gv_type NE gc_e.
      gv_type = <fs_output>-code.
    ENDIF.

  ENDLOOP.

ENDFORM.

定义


CONSTANTS:gc_i TYPE zietype    VALUE 'I',
          gc_o TYPE zietype    VALUE 'O',
          gc_w TYPE zietype    VALUE 'W',
          gc_e TYPE zietype    VALUE 'E',
          gc_s TYPE zietype    VALUE 'S'.

DATA: gv_sysid    TYPE ze_sysid01,
      gv_id       TYPE ze_zid01,
      gv_zname    TYPE rs38l_fnam,
      gv_guid     TYPE sysuuid_c,
      gv_active   TYPE c,
      gv_msg      TYPE string,
      gv_type     TYPE c,
      gv_json_in  TYPE string,
      gv_json_out TYPE string.

DATA:gv_matnr TYPE char18.

TYPES:BEGIN OF typ_001_input_trans,
        matnr    TYPE string,
        werks    TYPE string,
        matnr_in TYPE matnr,
      END OF typ_001_input_trans.

DEFINE material_input.

  CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
    EXPORTING
      input        = &1
    IMPORTING
      output       = &1
    EXCEPTIONS
      length_error = 1
      OTHERS       = 2.

END-OF-DEFINITION .

子例程


*&---------------------------------------------------------------------*
*& Form frm_material_del_flag_chg
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> INPUT
*&      --> OUTPUT
*&---------------------------------------------------------------------*
FORM frm_material_del_flag_chg  TABLES  pt_input  TYPE zstplm_001_input
                                        pt_output TYPE zstplm_001_output.

  DATA:lv_fjt_flag TYPE c.

  LOOP AT pt_input.

    gv_matnr = |{ pt_input-matnr ALPHA = IN }|.

    APPEND INITIAL LINE TO pt_output ASSIGNING FIELD-SYMBOL(<fs_output>).

    <fs_output>-matnr = pt_input-matnr.

    SELECT SINGLE * FROM mara INTO @DATA(ls_mara) WHERE matnr EQ @gv_matnr.

    IF sy-subrc NE 0.
      <fs_output> = VALUE #( BASE <fs_output>
                             code  = gc_e
                             msg   = '该物料不存在,请检查' )  .
      gv_type = gc_e.
      CONTINUE.
    ENDIF.

    "物料检查是否进行集团级别删除
    PERFORM frm_material_del_jtcheck USING pt_input gv_matnr CHANGING lv_fjt_flag.

    IF lv_fjt_flag EQ abap_true."非集团操作

      PERFORM frm_material_del_njt USING pt_input gv_matnr CHANGING <fs_output>.

    ELSE."集团层级操作

      PERFORM frm_material_del_jt  USING pt_input gv_matnr CHANGING <fs_output>.

    ENDIF.

    READ TABLE <fs_output>-o_werks INTO DATA(ls_werks) WITH KEY code = gc_e.
    IF sy-subrc EQ 0.
      <fs_output> = VALUE #( BASE <fs_output> code = gc_e msg = '处理失败' ).
    ELSE.
      <fs_output> = VALUE #( BASE <fs_output> code = gc_s msg = '处理成功' ).
    ENDIF.

    IF gv_type NE gc_e.
      gv_type = <fs_output>-code.
    ENDIF.

  ENDLOOP.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_MATERIAL_DEL_JTCHECK
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> PT_INPUT
*&      <-- LV_JT_FLAG
*&---------------------------------------------------------------------*
FORM frm_material_del_jtcheck  USING    ps_input TYPE zsplm_001_input
                                        gv_matnr TYPE char18
                               CHANGING cv_flag  TYPE char1.

  CLEAR:cv_flag."不进行集团操作

  DATA:lt_marc_in TYPE STANDARD TABLE OF marc WITH HEADER LINE,
       lt_marc    TYPE STANDARD TABLE OF marc WITH HEADER LINE.

  lt_marc_in[] = CORRESPONDING #( ps_input-i_marc ).
  SORT lt_marc_in.

  SELECT *
    FROM marc
    INTO TABLE lt_marc
   WHERE matnr = gv_matnr.

  LOOP AT lt_marc.

    "传入物料对应工厂,包含物料已扩充的所有工厂,则进行集团层级操作
    READ TABLE lt_marc_in WITH KEY werks = lt_marc-werks BINARY SEARCH.

    IF sy-subrc NE 0.

      cv_flag = abap_true.

    ENDIF.

  ENDLOOP.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_MATERIAL_DEL_NJT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> PT_INPUT
*&      --> GV_MATNR
*&      --> LV_FJT_FLAG
*&      <-- <FS_OUTPUT>
*&---------------------------------------------------------------------*
FORM frm_material_del_njt  USING    ps_input  TYPE zsplm_001_input
                                    pv_matnr  TYPE char18
                           CHANGING cs_output TYPE zsplm_001_ret.


  LOOP AT ps_input-i_marc INTO DATA(ls_marc).

    PERFORM frm_material_del_single USING ls_marc-werks ps_input CHANGING cs_output.

  ENDLOOP.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_MATERIAL_DEL_SINGLE
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> LS_MARC_WERKS
*&      <-- CS_OUTPUT
*&---------------------------------------------------------------------*
FORM frm_material_del_single  USING    pv_werks
                                       ps_input   TYPE zsplm_001_input
                              CHANGING cs_output  TYPE zsplm_001_ret.

  DATA(ls_rm03g) = VALUE rm03g( matnr = gv_matnr
                                "werks = ls_marc-werks
                                "lvobw = COND #( WHEN pt_input-flag EQ 'Y' THEN space ELSE abap_true )
                                "lvobk = COND #( WHEN pt_input-flag EQ 'Y' THEN space ELSE abap_true )
                                "lvoma = COND #( WHEN pt_input-flag EQ 'Y' THEN space ELSE abap_true )
                                lvowk = COND #( WHEN ps_input-flag EQ 'Y' THEN space ELSE abap_true )
                                lvolg = COND #( WHEN ps_input-flag EQ 'Y' THEN space ELSE abap_true )
                                lvoln = COND #( WHEN ps_input-flag EQ 'Y' THEN space ELSE abap_true )
                                lvolt = COND #( WHEN ps_input-flag EQ 'Y' THEN space ELSE abap_true )
                                lvovk = COND #( WHEN ps_input-flag EQ 'Y' THEN space ELSE abap_true )
                                lvoba = COND #( WHEN ps_input-flag EQ 'Y' THEN space ELSE abap_true )
                               ).

  IF pv_werks IS NOT INITIAL."非集团操作
    ls_rm03g-werks =  pv_werks.
  ELSE."集团层级操作
    ls_rm03g-lvobw = COND #( WHEN ps_input-flag EQ 'Y' THEN space ELSE abap_true ).
    ls_rm03g-lvobk = COND #( WHEN ps_input-flag EQ 'Y' THEN space ELSE abap_true ).
    ls_rm03g-lvoma = COND #( WHEN ps_input-flag EQ 'Y' THEN space ELSE abap_true ).
  ENDIF.

  CALL FUNCTION 'SET_LVORM_MATERIAL'
    EXPORTING
      material_record        = ls_rm03g
      write_change_documents = abap_true
      uname                  = sy-uname
    EXCEPTIONS
      kein_buchungskreis     = 1
      inkons_custom          = 2
      kein_bewertungskreis   = 3
      keine_lagernummer      = 4
      kein_lagerort          = 5
      kein_lagertyp          = 6
      keine_vkorg            = 7
      kein_vertriebsweg      = 8
      kein_werk              = 9
      no_material            = 10
      OTHERS                 = 11.

  IF pv_werks IS NOT INITIAL.
    APPEND VALUE #( werks = pv_werks
                    code  = COND #( WHEN sy-subrc NE 0 THEN gc_e ELSE gc_s )
                    msg   = COND #( WHEN sy-subrc NE 0 THEN COND #( WHEN ps_input-flag EQ 'Y' THEN '取消物料删除' ELSE '物料删除' ) && '操作失败'
                                                       ELSE COND #( WHEN ps_input-flag EQ 'Y' THEN '取消物料删除' ELSE '物料删除' ) && '操作成功' )
                   ) TO cs_output-o_werks .
  ELSE.
    LOOP AT ps_input-i_marc INTO DATA(ls_marc).
      APPEND VALUE #( werks = ls_marc-werks
                      code  = COND #( WHEN sy-subrc NE 0 THEN gc_e ELSE gc_s )
                      msg   = COND #( WHEN sy-subrc NE 0 THEN COND #( WHEN ps_input-flag EQ 'Y' THEN '取消物料删除' ELSE '物料删除' ) && '操作失败'
                                                         ELSE COND #( WHEN ps_input-flag EQ 'Y' THEN '取消物料删除' ELSE '物料删除' ) && '操作成功' )
                     ) TO cs_output-o_werks .
    ENDLOOP.
  ENDIF.

  cs_output-code = COND #( WHEN cs_output-code NE gc_e THEN COND #( WHEN sy-subrc NE 0 THEN gc_e ELSE gc_s )
                           ELSE cs_output-code ).

  cs_output-msg = COND #( WHEN cs_output-code EQ gc_s THEN '操作成功'  ELSE '操作失败' ).

  CLEAR ls_rm03g.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_MATERIAL_DEL_JT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> PT_INPUT
*&      --> GV_MATNR
*&      <-- <FS_OUTPUT>
*&---------------------------------------------------------------------*
FORM frm_material_del_jt  USING    ps_input  TYPE zsplm_001_input
                                   pv_matnr  TYPE char18
                          CHANGING cs_output TYPE zsplm_001_ret.

  PERFORM frm_material_del_single USING '' ps_input CHANGING cs_output.

ENDFORM.

  涉及公共方法

zcl_common=>abap_to_json

ABAP	TYPE ANY	输入abap数据
PRETTY_NAME	TYPE CHAR1 OPTIONAL	j输出json格式
value( JSON )	TYPE STRING	输出json数据

  METHOD abap_to_json.

    TRY.
        json = /ui2/cl_json=>serialize( data = abap pretty_name = pretty_name ).

      CATCH cx_root INTO DATA(lr_root).
        DATA(l_str) = lr_root->get_text( ).
        MESSAGE l_str TYPE 'S'.
    ENDTRY.

  ENDMETHOD.

zcl_common=>abap_to_json

ABAP	TYPE ANY	输入abap数据
PRETTY_NAME	TYPE CHAR1 OPTIONAL	j输出json格式
value( JSON )	TYPE STRING	输出json数据

  METHOD abap_to_json.

    TRY.
        json = /ui2/cl_json=>serialize( data = abap pretty_name = pretty_name ).

      CATCH cx_root INTO DATA(lr_root).
        DATA(l_str) = lr_root->get_text( ).
        MESSAGE l_str TYPE 'S'.
    ENDTRY.

  ENDMETHOD.
    

zcl_common=>get_guid

  METHOD get_guid.

    TRY.
        rv_guid = cl_system_uuid=>create_uuid_c32_static( ).
      CATCH cx_uuid_error.
        rv_guid = cl_fdt_uuid=>get_uuid( ).
    ENDTRY.

  ENDMETHOD.

zcl_common=>bapi_commit

  METHOD bapi_commit.

    IF type <> 'S'.

      CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.

    ELSE.

      CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
        EXPORTING
          wait = 'X'.
    ENDIF.

  ENDMETHOD.

 

  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值