Updating Delivery Completion Indicator through Mass Uplaod

 

New mass upload program has to be developed to allow users to perform on/off toggling of Delivery Complete Indicator on PO line item through Mass Upload  using BAPI_PO_CHANGE.


*&---------------------------------------------------------------------*
*& Report ZVB_DCI
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZVB_DCI.

TYPES: BEGIN OF ty_file,
         ebeln(10) TYPE c,
         ebelp(5)  TYPE c,
         elikz(1)  TYPE c,
       END OF ty_file.

TYPES: BEGIN OF ty_final,
         ebeln(10)     TYPE c,
         ebelp(5)      TYPE c,
         elikz(1)      TYPE c,
         remarks(1000) TYPE c,
         uname         TYPE sy-uname,
         date          TYPE sy-datum,
         status_icon   TYPE char4,
       END OF ty_final.

DATA: gt_file TYPE STANDARD TABLE OF ty_file,
      gw_file TYPE ty_file.
DATA:it_final TYPE TABLE OF ty_final,
     iw_final TYPE ty_final.

DATA: it_listheader TYPE slis_t_listheader,
      wa_listheader TYPE slis_listheader.

DATA: iv_dummy  TYPE ekko-ebeln,
      iv_dummy1 TYPE ekpo-ebelp.

FIELD-SYMBOLS : <gt_data> TYPE STANDARD TABLE .

PARAMETERS : p_file TYPE ibipparms-path OBLIGATORY,
               p_ncol TYPE i OBLIGATORY DEFAULT 3.
PARAMETERS p_test AS CHECKBOX DEFAULT ''.

** AT SELECTION-SCREEN ON VALUE-REQUEST FOR
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
 CALL FUNCTION 'F4_FILENAME'
    EXPORTING
      field_name = 'P_FILE'
    IMPORTING
      file_name  = p_file.


 START-OF-SELECTION .

  PERFORM read_file .
  PERFORM process_file.

  PERFORM call_bapi_po_change.

  PERFORM call_reuse_alv_display.

FORM get_file .
  DATA: lv_rc TYPE i.
  DATA: lt_file_table TYPE filetable,
        ls_file_table TYPE file_table.
  DATA:lv_window_title TYPE string.
  lv_window_title = TEXT-021.

  CALL METHOD cl_gui_frontend_services=>file_open_dialog
    EXPORTING
      window_title = lv_window_title
    CHANGING
      file_table   = lt_file_table
      rc           = lv_rc.
  IF sy-subrc = 0.
    READ TABLE lt_file_table INTO ls_file_table INDEX 1.
    p_file = ls_file_table-filename.
  ENDIF.
ENDFORM.

*&---------------------------------------------------------------------*
*& Form read_file
*&---------------------------------------------------------------------*
FORM read_file .
 DATA : lv_filename      TYPE string,
         lt_records       TYPE solix_tab,
         lv_headerxstring TYPE xstring,
         lv_filelength    TYPE i.

  lv_filename = p_file.

  CALL FUNCTION 'GUI_UPLOAD'
    EXPORTING
      filename                = lv_filename
      filetype                = 'BIN'
    IMPORTING
      filelength              = lv_filelength
      header                  = lv_headerxstring
    TABLES
      data_tab                = lt_records
    EXCEPTIONS
      file_open_error         = 1
      file_read_error         = 2
      no_batch                = 3
      gui_refuse_filetransfer = 4
      invalid_type            = 5
      no_authority            = 6
      unknown_error           = 7
      bad_data_format         = 8
      header_not_allowed      = 9
      separator_not_allowed   = 10
      header_too_long         = 11
      unknown_dp_error        = 12
      access_denied           = 13
      dp_out_of_memory        = 14
      disk_full               = 15
      dp_timeout              = 16
      OTHERS                  = 17.

  "convert binary data to xstring
  "if you are using cl_fdt_xl_spreadsheet in odata then skips this step
  "as excel file will already be in xstring
  CALL FUNCTION 'SCMS_BINARY_TO_XSTRING'
    EXPORTING
      input_length = lv_filelength
    IMPORTING
      buffer       = lv_headerxstring
    TABLES
      binary_tab   = lt_records
    EXCEPTIONS
      failed       = 1
      OTHERS       = 2.

  IF sy-subrc <> 0.
    "Implement suitable error handling here
  ENDIF.

  DATA : lo_excel_ref TYPE REF TO cl_fdt_xl_spreadsheet .

  TRY .
      lo_excel_ref = NEW cl_fdt_xl_spreadsheet(
                              document_name = lv_filename
                              xdocument     = lv_headerxstring ) .
    CATCH cx_fdt_excel_core.
      "Implement suitable error handling here
  ENDTRY .

  "Get List of Worksheets
  lo_excel_ref->if_fdt_doc_spreadsheet~get_worksheet_names(
    IMPORTING
      worksheet_names = DATA(lt_worksheets) ).

  IF NOT lt_worksheets IS INITIAL.
    READ TABLE lt_worksheets INTO DATA(lv_woksheetname) INDEX 1.

    DATA(lo_data_ref) = lo_excel_ref->if_fdt_doc_spreadsheet~get_itab_from_worksheet(
                                             lv_woksheetname ).
    "now you have excel work sheet data in dyanmic internal table
    ASSIGN lo_data_ref->* TO <gt_data>.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form process_file
*&---------------------------------------------------------------------*
FORM process_file .
DATA : lv_numberofcolumns   TYPE i,
         lv_date_string       TYPE string,
         lv_target_date_field TYPE datum.


  FIELD-SYMBOLS : <ls_data>  TYPE any,
                  <lv_field> TYPE any,
                  <lv_field1> TYPE any.

  "you could find out number of columns dynamically from table <gt_data>
  lv_numberofcolumns = p_ncol .

  LOOP AT <gt_data> ASSIGNING <ls_data> FROM 2 .

    "processing columns
    DO lv_numberofcolumns TIMES.
      ASSIGN COMPONENT sy-index OF STRUCTURE <ls_data> TO <lv_field> .
      ASSIGN COMPONENT SY-INDEX OF STRUCTURE GW_FILE TO <lv_field1>.
      IF <lv_field> IS ASSIGNED AND <lv_field1> IS ASSIGNED.
        <lv_field1> = <lv_field>.
      ENDIF.
      UNASSIGN: <lv_field1>, <lv_field>.
    ENDDO .
    APPEND GW_FILE TO GT_FILE.
    CLEAR GW_FILE.
  ENDLOOP .
ENDFORM.
*&---------------------------------------------------------------------*
*& Form call_bapi_po_change
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM call_bapi_po_change .
  DATA: l_ponumber  LIKE bapimepoheader-po_number,
        i_po_items  TYPE TABLE OF bapimepoitem WITH HEADER LINE,
        iw_items    TYPE bapimepoitem,
        i_po_itemsx TYPE TABLE OF bapimepoitemx WITH HEADER LINE,
        iw_itemsx   TYPE bapimepoitemx,
        i_return    TYPE TABLE OF bapiret2 WITH HEADER LINE,
        iw_return   TYPE bapiret2.

  CLEAR: i_po_items, i_po_items[],
       i_po_itemsx, i_po_itemsx[],
       i_return, i_return[].

  DATA:iv_error TYPE c.
  FIELD-SYMBOLS:<fs> TYPE any.

  LOOP AT gt_file INTO gw_file.
    CLEAR:iv_dummy,iv_dummy1.
    SELECT SINGLE ebeln
      FROM ekko
      INTO iv_dummy
      WHERE ebeln = gw_file-ebeln.
    IF sy-subrc NE 0.
      iw_final-remarks = 'po does not exist'.
      iw_final-status_icon = icon_red_light.
      iv_error = 'X'.
    ELSE.
        SELECT SINGLE ebelp
          FROM ekpo
          INTO iv_dummy1
          WHERE ebeln = gw_file-ebeln AND ebelp = gw_file-ebelp.
        IF sy-subrc NE 0.
          iw_final-remarks = 'po item not matching'.
          iw_final-status_icon = icon_red_light.
          iv_error = 'X'.
        ELSE.
          IF gw_file-elikz IS INITIAL.
            iw_final-remarks = 'no change'.
            iw_final-status_icon = icon_yellow_light.
            iv_error = 'X'.
          ENDIF.
        ENDIF.
      ENDIF.
    IF iv_error = 'X'.
      iw_final-ebeln = gw_file-ebeln.
      iw_final-ebelp = gw_file-ebelp.
      iw_final-elikz = gw_file-elikz.
      iw_final-uname = sy-uname.
      iw_final-date = sy-datum.
      APPEND iw_final TO it_final.
    ELSE.

      l_ponumber = gw_file-ebeln.

      iw_items-po_item = gw_file-ebelp.
      IF gw_file-elikz = 'Y'.
        iw_items-no_more_gr = 'X'.
      ELSE.
        iw_items-no_more_gr = ' '.
      ENDIF.
      APPEND iw_items TO i_po_items.
      iw_itemsx-po_item = iw_items-po_item.
      iw_itemsx-po_itemx = 'X'.       "Item holds changes
      iw_itemsx-no_more_gr = 'X'.     "Delivery complete indicator
      APPEND iw_itemsx TO i_po_itemsx.

      CALL FUNCTION 'BAPI_PO_CHANGE'
        EXPORTING
          purchaseorder = l_ponumber
          testrun       = p_test
        TABLES
          poitem        = i_po_items
          poitemx       = i_po_itemsx
          return        = i_return.

      READ TABLE i_return WITH KEY type = 'E'.
      IF sy-subrc EQ 0.
        iw_final-status_icon = icon_red_light.
        LOOP AT i_return INTO iw_return WHERE type = 'E'.
          IF iw_final-remarks IS INITIAL.
            iw_final-remarks = iw_return-message.
          ELSE.
            CONCATENATE iw_final-remarks iw_return-message INTO iw_return-message SEPARATED BY ','.
          ENDIF.
        ENDLOOP.
      ELSE.
      LOOP AT i_return INTO iw_return WHERE type = 'E'.
        IF iw_final-remarks IS INITIAL.
          iw_final-remarks = iw_return-message.
        ELSE.
          CONCATENATE iw_final-remarks iw_return-message INTO iw_final-remarks SEPARATED BY ','.
        ENDIF.
      ENDLOOP.
        CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
          EXPORTING
            wait = 'X'.

        iw_final-REMARKS = 'Success'.
        iw_final-status_icon = icon_green_light.
      ENDIF.

      iw_final-ebeln = gw_file-ebeln.
      iw_final-ebelp = gw_file-ebelp.
      iw_final-elikz = gw_file-elikz.
      iw_final-uname = sy-uname.
      iw_final-date = sy-datum.
      APPEND iw_final TO it_final.
      REFRESH: i_return,i_po_items,i_po_itemsx.
      CLEAR:iw_final,l_ponumber.
    ENDIF.
  ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form CALL_REUSE_ALV_DISPLAY
*&---------------------------------------------------------------------*
FORM call_reuse_alv_display .
  DATA:it_fcat TYPE  slis_t_fieldcat_alv,
       is_fcat TYPE slis_fieldcat_alv.


  REFRESH:it_fcat.
  CLEAR:is_fcat.
  is_fcat-fieldname = 'EBELN'.
  is_fcat-seltext_m = 'PO Number'.
  is_fcat-outputlen = '10'.
  APPEND is_fcat TO it_fcat.

  CLEAR:is_fcat.
  is_fcat-fieldname = 'EBELP'.
  is_fcat-seltext_m = 'PO Item'.
  is_fcat-outputlen = '10'.
  APPEND is_fcat TO it_fcat.

  CLEAR:is_fcat.
  is_fcat-fieldname = 'ELIKZ'.
  is_fcat-seltext_m = 'Del Comp Ind'.
  is_fcat-outputlen = '15'.
  APPEND is_fcat TO it_fcat.

  CLEAR:is_fcat.
  is_fcat-fieldname = 'STATUS_ICON'.
  is_fcat-seltext_m = 'Status'.
  is_fcat-outputlen = '10'.
  is_fcat-icon = 'X'.
  APPEND is_fcat TO it_fcat.

  CLEAR:is_fcat.
  is_fcat-fieldname = 'REMARKS'.
  is_fcat-seltext_m = 'Remarks'.
  is_fcat-outputlen = '50'.
  APPEND is_fcat TO it_fcat.

  CLEAR:is_fcat.
  is_fcat-fieldname = 'UNAME'.
  is_fcat-seltext_m = 'Updated By'.
  is_fcat-outputlen = '10'.
  APPEND is_fcat TO it_fcat.

  CLEAR:is_fcat.
  is_fcat-fieldname = 'Date'.
  is_fcat-seltext_m = 'Updated on'.
  is_fcat-outputlen = '10'.
  APPEND is_fcat TO it_fcat.

*  PERFORM top_of_page.

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      i_callback_program       = sy-repid
      i_callback_top_of_page   = 'TOP_OF_PAGE'
      it_fieldcat              = it_fcat
    TABLES
      t_outtab                 = it_final.
ENDFORM.
FORM top_of_page.
  REFRESH:it_listheader.
  CLEAR wa_listheader.
  IF p_test = 'X'.
*  Type H is used to display headers i.e. big font
    wa_listheader-typ  = 'H'.
    wa_listheader-info = 'TEST RUN (Changes are not reflected)'.
  ELSE.
    wa_listheader-typ  = 'H'.
    wa_listheader-info = 'Actual run'.
  ENDIF.
  APPEND wa_listheader TO it_listheader.
  CLEAR wa_listheader.

  CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
    EXPORTING
      it_list_commentary = it_listheader.

ENDFORM.


Input:


Output:

Comments

Popular posts from this blog

CDS Views: Table Functions with Example

ABAP-Managed Database Procedures (AMDP) with Example

Passing Dynamic Variables to SO10 TEXT