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 = 0 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 + 1 )."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 = 0 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 = 0 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 + 1 )."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 = 0 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.