1. 程式人生 > >bp標準方法寫不進資料解決辦法

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.