bp标准方法写不进数据解决办法

业务场景:在创建BP的时候,我们会使用CALL METHOD vmd_ei_api=>maintain_bapi来创建BP,但是有的时候项目上会碰到有些字段is_master_data的接口里没有或者有并且赋值了但是却写不进去的情况,在这项目上刚好碰到了这2种情况,这里做一下分享。

1、有结构字段但是写不进去的情况:如字段(ADRC) extension1 、extension2、REMARK     

参考程序:

*&---------------------------------------------------------------------*
*& Form CHANGE_EXTEN1
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> GIT_RETURN
*&      --> U_W_GEN_FILE_VNDR_PARTNER_NUMB
*&      --> U_W_GEN_FILE_VNDR_EXTENSION1
*&      <-- C_FLG_END
*&---------------------------------------------------------------------*
form change_exten1  tables   p_git_return structure bapiret2
                    using    PARTNER
                            extension1
                    CHANGING c_flg_end          TYPE flag.

   DATA:
      l_addr1_sel        LIKE addr1_sel
     ,l_addr1_val        LIKE addr1_val
     ,t_adagroups        TYPE STANDARD TABLE OF adagroups
     ,t_addr_error       TYPE STANDARD TABLE OF addr_error
     ,t_addr_vers        TYPE STANDARD TABLE OF addr_vers

     ,l_addr1_data       TYPE addr1_data

     .


   REFRESH: t_adagroups ,t_addr_error ,t_addr_vers .
   CLEAR:l_addr1_sel ,l_addr1_val ,l_addr1_data .

   SELECT SINGLE addrnumber
     INTO l_addr1_sel-addrnumber
     FROM but020
    WHERE partner = PARTNER.
   IF 0 = sy-subrc .
*     pc_addrnumber = l_addr1_sel-addrnumber .
   ELSE.

     RETURN .
   ENDIF.


   CALL FUNCTION 'ADDR_GET'
     EXPORTING
       address_selection = l_addr1_sel
       address_group     = 'BP'
    IMPORTING
       address_value     = l_addr1_val
    TABLES
       address_groups    = t_adagroups
       error_table       = t_addr_error
       versions          = t_addr_vers
     EXCEPTIONS
       parameter_error   = 1
       address_not_exist = 2
       version_not_exist = 3
       internal_error    = 4
       address_blocked   = 5
       OTHERS            = 6.
   IF sy-subrc <> 0.

     RETURN .
   ENDIF.

   MOVE-CORRESPONDING l_addr1_val TO l_addr1_data .
   l_addr1_data-extension1 = extension1 .



  CALL FUNCTION 'ADDR_UPDATE'
     EXPORTING
       address_data         = l_addr1_data
       address_number       = l_addr1_sel-addrnumber
       date_from            = '00010101'
       language             = sy-langu
      check_empty_address  = 'X'
       check_address        = ''
       check_other_versions = ''  "'X'

    TABLES
       error_table          = t_addr_error
     EXCEPTIONS
       address_not_exist    = 1
       parameter_error      = 2
       version_not_exist    = 3
       internal_error       = 4
       address_blocked      = 5
       OTHERS               = 6.
   IF sy-subrc <> 0.
     RETURN .
   ENDIF.


   CALL FUNCTION 'ADDR_MEMORY_SAVE'
     EXPORTING
       execute_in_update_task = ''
     EXCEPTIONS
       address_number_missing = 1
       person_number_missing  = 2
       internal_error         = 3
       database_error         = 4
       reference_missing      = 5
       OTHERS                 = 6.
   IF sy-subrc <> 0.
     RETURN .
   ENDIF.


   CALL FUNCTION 'ADDR_MEMORY_CLEAR'
     EXPORTING
       force              = ' '
     EXCEPTIONS
       unsaved_data_exist = 1
       internal_error     = 2
       OTHERS             = 3.
   IF sy-subrc <> 0.
   ENDIF.
endform.

2、BP001-UNW_REMARK,使用了别的BAPI去更改,而且必须有值才能改,若没值的话更改会不成功(不会dump,不报错,但是数据没进去)

*&---------------------------------------------------------------------*
*& Form CHANGE_BP001
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> GIT_RETURN
*&      --> U_W_GEN_FILE_VNDR_PARTNER_NUMB
*&---------------------------------------------------------------------*
form change_bp001  tables   p_git_return structure bapiret2
                   using    PARTNER
                            UNW_REMARK
                   CHANGING c_flg_end          TYPE flag
                  .


    DATA : lv_key         TYPE char100,
           lw_return      TYPE bapiret2,
           lw_message     TYPE cvis_message.


    DATA IV_PARTNER      TYPE BU_PARTNER.
    DATA IV_PARTNER_GUID TYPE BU_PARTNER_GUID.
    DATA IS_GENERAL      TYPE BUSISB990_GEN.
    DATA IV_TESTRUN      TYPE CHAR1.
    DATA IT_BP001        TYPE STANDARD TABLE OF BP001.
    DATA IT_BP001_X      TYPE STANDARD TABLE OF BP001_X.
    DATA ET_RETURN       TYPE STANDARD TABLE OF BAPIRET2.
    DATA:LS_BP001        LIKE LINE OF IT_BP001.
    DATA:LS_BP001X       LIKE LINE OF IT_BP001_X.

      SELECT SINGLE
           PARTNER
           PARTNER_GUID
      INTO (IV_PARTNER,IV_PARTNER_GUID)
      FROM BUT000
     WHERE PARTNER EQ PARTNER
    .

    SELECT *
      INTO CORRESPONDING FIELDS OF TABLE @it_bp001
      FROM BP001
     WHERE PARTNER EQ @PARTNER.
    IF SY-SUBRC EQ 0.
      READ TABLE it_bp001 ASSIGNING FIELD-SYMBOL(<FW_BP001>) INDEX 1.
      <FW_BP001>-UNW_REMARK = UNW_REMARK.
    ELSE.
      LS_BP001-partner = PARTNER.
      LS_BP001-UNW_REMARK = UNW_REMARK.
      APPEND LS_BP001 TO it_bp001.
    ENDIF.

    LS_BP001X-UNW_REMARK = 'X'.
    APPEND LS_BP001X TO it_bp001_x.

    call function 'FS_API_BP001_CHANGE'
     EXPORTING
       IV_PARTNER            = IV_PARTNER
       IV_PARTNER_GUID       = IV_PARTNER_GUID
       IS_GENERAL            = IS_GENERAL
       IV_TESTRUN            = IV_TESTRUN
      tables
        it_bp001              = it_bp001
        it_bp001_x            = it_bp001_x
        ET_RETURN             = ET_RETURN
              .
    READ TABLE ET_RETURN ASSIGNING FIELD-SYMBOL(<FW_RETURN>) WITH KEY TYPE = 'E'.
    IF SY-SUBRC EQ 0.
      CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.

      c_flg_end = abap_on.
      lw_return-type = c_e.
      lw_return-id = c_yh_fi1.
      lw_return-number = 014.
      MESSAGE s014(yh_fi1)
         WITH TEXT-m04
              lv_key
              TEXT-m05
              TEXT-m06
         INTO lw_return-message.
      lw_return-message_v1 = TEXT-m04.
      lw_return-message_v2 = lv_key.
      lw_return-message_v3 = TEXT-m05.
      lw_return-message_v4 = TEXT-m06.
      lw_return-parameter = lv_key.
      LOOP AT lw_message-messages ASSIGNING FIELD-SYMBOL(<fs_return>).
        <fs_return>-parameter = lv_key.
      ENDLOOP.
      APPEND lw_return TO git_return.
      APPEND LINES OF lw_message-messages TO git_return.
    ELSE.
      CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
        EXPORTING
          wait = abap_true.
    ENDIF.
endform.

 

posted @ 2018-10-25 16:32  linhuang  阅读(19)  评论(0编辑  收藏  举报  来源