bp標準方法寫不進資料解決辦法
阿新 • • 發佈:2018-10-31
業務場景:在建立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.