VinceCoder
2/5/2020 - 2:30 PM

BAPI_SALESORDER_CHANGE

FORM update_quotation USING p_vbeln TYPE vbeln.
  DATA: lt_preventivo     TYPE TABLE OF it_preventivi,
        ls_preventivo     LIKE LINE OF gt_preventivo,
        lv_item           TYPE etenr,
        lv_offerta        TYPE bapivbeln-vbeln,
        ls_header         TYPE bapisdhd1,
        ls_header_x       LIKE bapisdh1x,
        lt_items          TYPE TABLE OF bapisditm,
        ls_items          LIKE LINE OF lt_items,
        lt_items_x        TYPE TABLE OF bapisditmx,
        ls_items_x        LIKE LINE OF lt_items_x,
        lt_sales_partners TYPE TABLE OF bapiparnr,
        ls_sales_partners LIKE LINE OF lt_sales_partners,
        lt_condition      TYPE TABLE OF bapicond,
        ls_condition      LIKE LINE OF lt_condition,
        lt_condition_x    TYPE TABLE OF bapicondx,
        ls_condition_x    LIKE LINE OF lt_condition_x,
        lt_schedules      TYPE TABLE OF bapischdl,
        ls_schedules      LIKE LINE OF lt_schedules,
        lt_schedules_x    TYPE TABLE OF bapischdlx,
        ls_schedules_x    LIKE LINE OF lt_schedules_x,
        lt_extension      TYPE TABLE OF bapiparex,
        ls_extension      LIKE LINE OF lt_extension,
        ls_bape_vbap      TYPE bape_vbap,
        ls_bape_vbapx     TYPE bape_vbapx,
        lv_char_string    TYPE string,
        lt_return         TYPE TABLE OF bapiret2,
        ls_return         LIKE LINE OF lt_return
        .

  FIELD-SYMBOLS: <lfs_preventivo> LIKE LINE OF gt_preventivo
                 .

  LOOP AT gt_preventivo INTO ls_preventivo WHERE sel IS NOT INITIAL.
*Items
    ls_items-itm_number = ls_preventivo-id_riga.
    ls_items-material   = ls_preventivo-matnr.
    ls_items-target_qty = ls_preventivo-quantita.
    ls_items-target_qu  = ls_preventivo-um.
    ls_items-gross_wght = '100'.
    ls_items-net_weight = '80'.
    ls_items-untof_wght = 'KG'.

    APPEND ls_items TO lt_items.
    CLEAR ls_items.

*    ls_items_x-updateflag = 'I'.
    ls_items_x-itm_number = ls_preventivo-id_riga.
    ls_items_x-material   = abap_true.
    ls_items_x-target_qty = abap_true.
    ls_items_x-target_qu  = abap_true.
    ls_items_x-gross_wght = abap_true.
    ls_items_x-net_weight = abap_true.
    ls_items_x-untof_wght = abap_true.

    APPEND ls_items_x TO lt_items_x.
    CLEAR ls_items_x.

*Price Condition
    ls_condition-itm_number = ls_preventivo-id_riga.
    ls_condition-cond_type  = 'ZPR0'.
    ls_condition-cond_value = '12.0'.
    ls_condition-currency   = 'EUR'.

    APPEND ls_condition TO lt_condition.
    CLEAR ls_condition.

*    ls_condition_x-updateflag = 'I'.
    ls_condition_x-itm_number = ls_preventivo-id_riga.
    ls_condition_x-cond_type  = abap_true.
    ls_condition_x-cond_value = abap_true.
    ls_condition_x-currency   = abap_true.

    APPEND ls_condition_x TO lt_condition_x.
    CLEAR ls_condition_x.

*Schedules Items
    ADD 1 TO lv_item.
    ls_schedules-itm_number = ls_preventivo-id_riga.
    ls_schedules-sched_line = lv_item.
    ls_schedules-req_date   = '20200212'.
    ls_schedules-dlv_date   = '20200212'.
    ls_schedules-req_qty    = ls_preventivo-quantita.

    APPEND ls_schedules TO lt_schedules.
    CLEAR ls_schedules.

*    ls_schedules_x-updateflag = 'I'.
    ls_schedules_x-itm_number = ls_preventivo-id_riga.
    ls_schedules_x-sched_line = lv_item.
    ls_schedules_x-req_date   = abap_true.
    ls_schedules_x-dlv_date   = abap_true.
    ls_schedules_x-req_qty    = abap_true.

    APPEND ls_schedules_x TO lt_schedules_x.
    CLEAR ls_schedules_x.

*Extension
    PERFORM fill_extension CHANGING ls_bape_vbap
                                    ls_bape_vbapx
                                    ls_preventivo.

    CALL FUNCTION 'C147_WORKAREA_TO_CHARFIELD'
      EXPORTING
        i_workarea  = ls_bape_vbap
      IMPORTING
        e_charfield = ls_extension+30(960).

    ls_extension-structure = 'BAPE_VBAP'.
    APPEND ls_extension TO lt_extension.
    CLEAR ls_extension.

    ls_extension-structure = 'BAPE_VBAPX'.
    ls_extension+30(960)   = ls_bape_vbapx.
    APPEND ls_extension TO lt_extension.
    CLEAR ls_extension.

  ENDLOOP.

  IF lt_items[] IS NOT INITIAL.
    ls_header_x-updateflag = 'U'.
  ENDIF.

  CALL FUNCTION 'BAPI_SALESORDER_CHANGE'
    EXPORTING
      salesdocument    = p_vbeln
*     ORDER_HEADER_IN  =
      order_header_inx = ls_header_x
*     SIMULATION       =
*     BEHAVE_WHEN_ERROR           = ' '
*     INT_NUMBER_ASSIGNMENT       = ' '
*     LOGIC_SWITCH     =
*     NO_STATUS_BUF_INIT          = ' '
    TABLES
      return           = lt_return
      order_item_in    = lt_items
      order_item_inx   = lt_items_x
*     PARTNERS         =
*     PARTNERCHANGES   =
*     PARTNERADDRESSES =
*     ORDER_CFGS_REF   =
*     ORDER_CFGS_INST  =
*     ORDER_CFGS_PART_OF          =
*     ORDER_CFGS_VALUE =
*     ORDER_CFGS_BLOB  =
*     ORDER_CFGS_VK    =
*     ORDER_CFGS_REFINST          =
      schedule_lines   = lt_schedules
      schedule_linesx  = lt_schedules_x
*     ORDER_TEXT       =
*     ORDER_KEYS       =
      conditions_in    = lt_condition
      conditions_inx   = lt_condition_x
      extensionin      = lt_extension
*     EXTENSIONEX      =
*     NFMETALLITMS     =
    .
  READ TABLE lt_return INTO ls_return
    WITH KEY type = 'E'.
  IF sy-subrc EQ 0.

  ELSE.
    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
      EXPORTING
        wait = abap_true.

    LOOP AT gt_preventivo ASSIGNING <lfs_preventivo> WHERE sel EQ abap_true.

      CLEAR <lfs_preventivo>-sel.
      <lfs_preventivo>-vbeln = lv_offerta.
      <lfs_preventivo>-posnr = <lfs_preventivo>-id_riga.

    ENDLOOP.

    PERFORM save.

  ENDIF.

ENDFORM.