Application Development and Automation Discussions
Join the discussions or start your own on all things application development, including tools and APIs, programming models, and keeping your skills sharp.
cancel
Showing results for 
Search instead for 
Did you mean: 

Partner function updation in MV45AFZZ

Former Member
0 Kudos
1,785

Hello Experts,

I am trying to update the VBPA table by changing the entries in the XVBPA structure in the sales order user-exit MV45AFZZ.I have set the updation flag as 'I' for the UPDKZ field.

The problem I am facing is that there is a termination which occurs in the standard code due to the insert.The termination occurs in the 'SD_PARTNER_UPDATE' function module line 480.I wish to know if there is any validation which I can execute on the partner function determination procedure before I actually try to update the partner function.

Kindly give your pointerts for the same.

Thank you.

Best Regards,

Gaurav.

4 REPLIES 4

naimesh_patel
Active Contributor
0 Kudos
999

You should write your code to update the partner function in the USEREXIT_MOVE_DATA_VBPA.

Regards,

Naimesh Patel

0 Kudos
999

Hi Naimesh,

Thank you for your reply, could you please give more details as to where I can find this user exit.

Thank you.

Best regards,

Gaurav.

Raphael_Sommer
Participant
0 Kudos
999

Hello, I had to change region of Shipt To Party from ADRC in MV45AFZZ when sales order gets saved.

I tried it with changing xvbadr but i did not work.

The solution which worked for me is with function modules around ADDR_UPDATE if address exists on database and ADDR_MAINTAIN_COMPLETE if only address handle exits but not on databse. I added the form in MV45AFZZ USER_SAVE_DOCUMENT_PREPARE:

*&---------------------------------------------------------------------*
*&      Form  UPDATE_WE_ADDRESS_REGION
*&---------------------------------------------------------------------*
*       Update Region of WE
*----------------------------------------------------------------------*

FORM update_we_address_region USING p_region.

  FIELD-SYMBOLS: <fs_badr> LIKE xvbadr,
                 <fs_vbpa> LIKE xvbpa.

  DATA: ls_addr1_sel      TYPE ADDR1_SEL,
        ls_addr1_value    TYPE ADDR1_VAL,
        ls_addr1_data     TYPE ADDR1_DATA,
        lt_return         TYPE TABLE OF ADDR_ERROR,
        lv_return_code    TYPE AD_RETCODE,
        lv_address_handle TYPE AD_HANDLE.

  LOOP AT xvbpa[] ASSIGNING <fs_vbpa> WHERE parvw = 'WE'.
    READ TABLE xvbadr[] ASSIGNING <fs_badr> WITH KEY adrnr = <fs_vbpa>-adrnr.
    IF sy-subrc eq 0.
      <fs_badr>-regio = p_region.
      clear: ls_addr1_sel, ls_addr1_value, ls_addr1_data, lv_return_code.
      ls_addr1_sel-addrnumber  =  <fs_badr>-adrnr.
      call function 'ADDR_GET'
        exporting
          address_selection = ls_addr1_sel
        importing
          address_value     = ls_addr1_value
        exceptions
          parameter_error   = 1
          address_not_exist = 2
          version_not_exist = 3
          internal_error    = 4
          others            = 5.

      " case if address exists on database already
      IF sy-subrc EQ 0.
        MOVE-CORRESPONDING ls_addr1_value TO ls_addr1_data.
        ls_addr1_data-region = p_region.
        REFRESH lt_return.
        CALL FUNCTION 'ADDR_UPDATE'
          EXPORTING
            address_data              = ls_addr1_data
            address_number            = ls_addr1_value-addrnumber
            nation                    = ls_addr1_value-nation
            check_empty_address       = ' '
            check_address             = ' '
          IMPORTING
            returncode                = lv_return_code
          TABLES
            error_table               = lt_return
          EXCEPTIONS
            address_not_exist         = 1
            parameter_error           = 2
            version_not_exist         = 3
            internal_error            = 4
            OTHERS                    = 5.
        IF sy-subrc EQ 0 AND lv_return_code NE 'E'.
          CALL FUNCTION 'ADDR_MEMORY_SAVE'
            EXCEPTIONS
              address_number_missing       = 1
              person_number_missing        = 2
              internal_error               = 3
              database_error               = 4
              reference_missing            = 5
            OTHERS                         = 6.
          IF sy-subrc EQ 0.
            CALL FUNCTION 'ADDR_MEMORY_CLEAR'
             EXCEPTIONS
               unsaved_data_exist       = 1
               internal_error           = 2
               OTHERS                   = 3.
            IF sy-subrc <> 0.
            ENDIF.
          ENDIF.
        ENDIF.
      ELSE.
        " case if address handle exists but not on database
        lv_address_handle = <fs_badr>-adrnr.
        DATA: lt_addr_complete TYPE SZADR_ADDR1_COMPLETE.
        CALL FUNCTION 'ADDR_GET_COMPLETE'
         EXPORTING
           ADDRHANDLE                    = lv_address_handle
         IMPORTING
           ADDR1_COMPLETE                = lt_addr_complete
         EXCEPTIONS
           PARAMETER_ERROR               = 1
           ADDRESS_NOT_EXIST             = 2
           INTERNAL_ERROR                = 3
           WRONG_ACCESS_TO_ARCHIVE       = 4
           ADDRESS_BLOCKED               = 5
           OTHERS                        = 6.

        IF sy-subrc EQ 0.
          READ TABLE lt_addr_complete-addr1_tab INDEX 1 ASSIGNING FIELD-SYMBOL(<fs_complete_addr>).
          IF sy-subrc EQ 0.
            <fs_complete_addr>-data-region = p_region.
            REFRESH lt_return.

            DATA: lv_update_kz TYPE AD_UPDFLAG.
            lv_update_kz = 'U'.
            CALL FUNCTION 'ADDR_MAINTAIN_COMPLETE'
              EXPORTING
                updateflag                          = lv_update_kz
                addr1_complete                      = lt_addr_complete
                address_group                       = 'SD01'
               CONSIDER_CONSNUMBER_FOR_INSERT       = 'X'
               IV_TIME_DEPENDENT_COMM_DATA          = 'X'
             IMPORTING
               RETURNCODE                           = lv_return_code
             TABLES
               ERROR_TABLE                          = lt_return
             EXCEPTIONS
               PARAMETER_ERROR                      = 1
               ADDRESS_NOT_EXIST                    = 2
               HANDLE_EXIST                         = 3
               INTERNAL_ERROR                       = 4
               ADDRESS_BLOCKED                      = 5
               OTHERS                               = 6.
            IF sy-subrc <> 0.
* Implement suitable error handling here
            ENDIF.
           ENDIF.
        ENDIF.
      ENDIF.
    ENDIF.
  ENDLOOP.
ENDFORM.

0 Kudos
999

Again, don't use old question

and posting several time the same question, is not a good practice