How to use the BAPI_BUPA_ADDRESS_CHANGE

BAPI_BUPA_ADDRESS_CHANGE


This BAPI is used to update the address information of business partner(更新業務合作伙伴地址). The update action usually includes three actions: insert, delete, and update.(新增,刪除,更新)


For example, the telephone number. At first there is only one telephone number, then you delete, update, create the number.


First is to get all the addresses. As a business partner ( bp )  can have several addresses. Function Module: BUA_BUT020_SELECT_WITH_PARTNER. The address number is stored in the table BUT020.


Second is to get the details for every address. use the function module BAPI_BUPA_ADDRESS_GETDETAIL.


Third is to compare the existing data and the updated data.

When you compare the details, you'd better sort the data by sequence number. You can create a subroutine to compare the data. As all the data structure is similar.

for example: 

SORT lt_tel BY consnumber.
SORT pt_tel BY consnumber.
FORM deal_address USING pt_addr_old  TYPE INDEX TABLE
               CHANGING pt_addr_new  TYPE INDEX TABLE
                        pt_addr_flag TYPE INDEX TABLE.
  DATA: lv_count01 LIKE sy-index,
        lv_count02 LIKE sy-index,
        lv_tabix   LIKE sy-index,
        lv_index   LIKE sy-index.

  FIELD-SYMBOLS: <fs_address01> TYPE any,
                 <fs_address02> TYPE any,
                 <fs_consnumber_v1> TYPE any,
                 <fs_consnumber_v2> TYPE any,
                 <fs_addr_flag>   TYPE any,
                 <fs_updateflag_v>  TYPE any.

*  SORT pt_addr_old BY consnumber.
*  SORT pt_addr_new BY consnumber.
  DESCRIBE TABLE pt_addr_old LINES lv_count01.
  DESCRIBE TABLE pt_addr_new LINES lv_count02.
  IF lv_count02 >= lv_count01."insert and update
    LOOP AT pt_addr_old ASSIGNING <fs_address01>."update
      lv_index = sy-tabix.
      ASSIGN COMPONENT 'CONSNUMBER' OF STRUCTURE <fs_address01> TO <fs_consnumber_v1>.
      READ TABLE pt_addr_new ASSIGNING <fs_address02> INDEX lv_index.
      ASSIGN COMPONENT 'CONSNUMBER' OF STRUCTURE <fs_address02> TO <fs_consnumber_v2>.
      <fs_consnumber_v2> = <fs_consnumber_v1>.
*      append <fs_addr_flag> to pt_addr_flag.
      APPEND INITIAL LINE TO pt_addr_flag ASSIGNING <fs_addr_flag>.
      DO.
        ASSIGN COMPONENT sy-index OF STRUCTURE <fs_addr_flag> TO <fs_updateflag_v>.
        IF sy-subrc = AND <fs_updateflag_v> IS ASSIGNED.
          <fs_updateflag_v> = abap_true.
        ELSE.
          EXIT.
        ENDIF.
      ENDDO.
      ASSIGN COMPONENT 'UPDATEFLAG' OF STRUCTURE <fs_addr_flag> TO <fs_updateflag_v>.
      <fs_updateflag_v> = 'U'.
    ENDLOOP.

    LOOP AT pt_addr_new ASSIGNING <fs_address02> FROM ( lv_index + )."insert
      ASSIGN COMPONENT 'CONSNUMBER' OF STRUCTURE <fs_address02> TO <fs_consnumber_v2>.
      lv_tabix = lv_tabix + 1.
      IF <fs_consnumber_v1> IS ASSIGNED.
        <fs_consnumber_v2> = <fs_consnumber_v1> + lv_tabix.
      ENDIF.

      APPEND INITIAL LINE TO pt_addr_flag ASSIGNING <fs_addr_flag>.
      DO.
        ASSIGN COMPONENT sy-index OF STRUCTURE <fs_addr_flag> TO <fs_updateflag_v>.
        IF sy-subrc = AND <fs_updateflag_v> IS ASSIGNED.
          <fs_updateflag_v> = abap_true.
        ELSE.
          EXIT.
        ENDIF.
      ENDDO.
      ASSIGN COMPONENT 'UPDATEFLAG' OF STRUCTURE <fs_addr_flag> TO <fs_updateflag_v>.
      <fs_updateflag_v> = 'I'.
    ENDLOOP.
    CLEAR: lv_index.
  ELSEIF lv_count02 < lv_count01."delete and update
    LOOP AT pt_addr_new ASSIGNING <fs_address02>."update
      lv_index = sy-tabix.
      ASSIGN COMPONENT 'CONSNUMBER' OF STRUCTURE <fs_address02> TO <fs_consnumber_v2>.
      READ TABLE pt_addr_old ASSIGNING <fs_address01> INDEX lv_index.
      ASSIGN COMPONENT 'CONSNUMBER' OF STRUCTURE <fs_address01> TO <fs_consnumber_v1>.
      <fs_consnumber_v2> = <fs_consnumber_v1>.
      APPEND INITIAL LINE TO pt_addr_flag ASSIGNING <fs_addr_flag>.
      DO.
        ASSIGN COMPONENT sy-index OF STRUCTURE <fs_addr_flag> TO <fs_updateflag_v>.
        IF sy-subrc = AND <fs_updateflag_v> IS ASSIGNED.
          <fs_updateflag_v> = abap_true.
        ELSE.
          EXIT.
        ENDIF.
      ENDDO.
      ASSIGN COMPONENT 'UPDATEFLAG' OF STRUCTURE <fs_addr_flag> TO <fs_updateflag_v>.
      <fs_updateflag_v> = 'U'.
    ENDLOOP.

    LOOP AT pt_addr_old ASSIGNING <fs_address01> FROM ( lv_index + )."delete
      APPEND <fs_address01> TO pt_addr_new.

      APPEND INITIAL LINE TO pt_addr_flag ASSIGNING <fs_addr_flag>.
      DO.
        ASSIGN COMPONENT sy-index OF STRUCTURE <fs_addr_flag> TO <fs_updateflag_v>.
        IF sy-subrc = AND <fs_updateflag_v> IS ASSIGNED.
          <fs_updateflag_v> = abap_true.
        ELSE.
          EXIT.
        ENDIF.
      ENDDO.
      ASSIGN COMPONENT 'UPDATEFLAG' OF STRUCTURE <fs_addr_flag> TO <fs_updateflag_v>.
      <fs_updateflag_v> = 'D'.
    ENDLOOP.
  ENDIF.
  CLEAR: lv_tabix, lv_index.

ENDFORM.                    "deal_address


注意每個動作的flag不同:update - U, delete - D, insert - I.

而且要保證sequence number 相同。

關於usage的表,處理方式不太相同,可以另寫代碼處理。

  DESCRIBE TABLE lt_use LINES lv_count01.
  DESCRIBE TABLE pt_use LINES lv_count02.
  IF lv_count02 >= lv_count01."insert and update
    DO lv_count01 TIMES.
*      ls_aduse_x-updateflag = 'U'.
      APPEND ls_aduse_x TO pt_aduse_x.
    ENDDO.

    DO ( lv_count02 - lv_count01 ) TIMES.
      ls_aduse_x-updateflag = 'I'.
      APPEND ls_aduse_x TO pt_aduse_x.
    ENDDO.
  ELSEIF lv_count02 < lv_count01."delete and update
    DO lv_count02 TIMES.
*      ls_aduse_x-updateflag = 'U'.
      APPEND ls_aduse_x TO pt_aduse_x.
    ENDDO.

    DO ( lv_count01 - lv_count02 ) TIMES.
      ls_aduse_x-updateflag = 'D'.
      APPEND ls_aduse_x TO pt_aduse_x.
    ENDDO.
  ENDIF.

After the compare, you can call the function BAPI_BUPA_ADDRESS_CHANGE to update the data.

If there is no error, you can call the function BAPI_TRANSACTION_COMMIT to modify the database.


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章