Sunday, March 18, 2018

ABAP - Program template

REPORT z_template_update MESSAGE-ID zp2p LINE-SIZE 512.

INCLUDE z_template_top.
INCLUDE z_template_scr.
INCLUDE z_template_cls.
INCLUDE z_template_sub.

*---------------------------------------------------------------------*
* Initialization
*---------------------------------------------------------------------
INITIALIZATION.
  CALL METHOD lcl_map_update=>init_screen.

**********************************************************************
* At selection screen
**********************************************************************
AT SELECTION-SCREEN.
* Validate screen input
  CALL METHOD lcl_map_update=>check_scr.

* User is picking a file from the PC local drive
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_uload.
  CALL METHOD lcl_map_update=>upload_file.

* User is picking via dropdown a Reason code
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_kongr.
  CALL METHOD lcl_map_update=>show_kongr_dropdown_box.

**********************************************************************
* Start of selection
**********************************************************************
START-OF-SELECTION.

  CALL METHOD lcl_map_update=>main_process
    EXPORTING
      pv_job = p_job.

*&---------------------------------------------------------------------*
*&      Form  END_OF_LIST
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM end_of_list                   ##CALLED.

  CALL METHOD lcl_map_update=>end_of_list.

ENDFORM.
---------------------------------------------------------------------------------------------------------------
z_template_top
*----------------------------------------------------------------------

DATA: go_container            TYPE REF TO cl_gui_custom_container,
      go_container_top        TYPE REF TO cl_gui_container,
      go_container_bottom     TYPE REF TO cl_gui_container,
      go_container_splitter   TYPE REF TO cl_gui_splitter_container,
      go_alv_grid_top         TYPE REF TO cl_gui_alv_grid,
      go_alv_grid_bottom      TYPE REF TO cl_gui_alv_grid,
      go_excep_cls TYPE REF TO zcx_p2p_excep_cls,
      go_log       TYPE REF TO zcl_logger.

CONSTANTS:
  gc_true      TYPE char1           VALUE 'X',
  gc_false     TYPE char1           VALUE ' ',
  gc_x         TYPE char01          VALUE 'X',
  gc_i         TYPE char01          VALUE 'I',
  gc_csv       TYPE string          VALUE '.CSV',
  gc_aktyp     TYPE activ_auth      VALUE '01',
  gc_zp2p      TYPE syst_msgid      VALUE 'ZP2P',
  gc_a         TYPE char01          VALUE 'A',
  gc_c         TYPE char01          VALUE 'C',
  gc_e         TYPE char01          VALUE 'E',
  gc_f         TYPE char01          VALUE 'F',
  gc_m         TYPE char01          VALUE 'M',
  gc_s         TYPE char01          VALUE 'S',
  gc_v         TYPE char01          VALUE 'V',
  gc_10        TYPE spart           VALUE '10',
  gc_exit      TYPE SYST_UCOMM      VALUE 'EXIT',
  gc_back      TYPE SYST_UCOMM      VALUE 'BACK',
  gc_canc      TYPE SYST_UCOMM      VALUE 'CANC',
  gc_c_folder  TYPE char04          VALUE 'C:\',
  gc_num11     TYPE syst_msgno      VALUE 11,
  gc_row       TYPE string          VALUE 'Row:',
  gc_article   TYPE string          VALUE 'Article:',
  gc_site      TYPE string          VALUE 'Site:',
  gc_alv_struc TYPE string          VALUE 'ZP2P_43060_CR00_MASS_MAP_UPDT',
  gc_alv_msgs  TYPE string          VALUE 'BAPIRETURN1',
  gc_update    TYPE string          VALUE 'UPDATE',
  gc_messages  TYPE string          VALUE 'MESSAGES'.

* TYPES
* The types below will be used for getting the data from csv files
TYPES: BEGIN OF ts_mass_map_input,
         site    TYPE werks_d,            " Site (Plant)
         article TYPE matnr,              " Material
         map     TYPE verpr_bapi,         " Moving Avg Price
         curr    TYPE waers,              " currency
         punit   TYPE peinh,              " Price Unit
         msehi   TYPE msehi.              " Unit of Measure
TYPES: END OF ts_mass_map_input.

* The types below are for final reporting of results of updates
TYPES: BEGIN OF ts_mass_map_update,
         lineref    TYPE i,                  " Line reference for input file
         comp       TYPE bukrs,              " Company code
         budat      TYPE budat,              " Posting Date
         kongr      TYPE ckml_kongr,         " Account Assignment Reason
         article    TYPE matnr,              " Material
         site       TYPE werks_d,            " Site (Plant)
         map        TYPE verpr_bapi,         " Moving Avg Price
         curr       TYPE waers,              " currency
         punit      TYPE peinh,              " Price Unit
         msehi      TYPE msehi,              " Unit of Measure
         curtp      TYPE curtp,              " Type of Currency for evaluation
         doc_year   TYPE bapi2027_pc_ex-ml_doc_year,
         doc_num    TYPE bapi2027_pc_ex-ml_doc_num,
         error_flag TYPE char01,             " Error flag  'X' or ' ' or 'S'
         valid_msg  TYPE string,             " Pre-load Validation check message
         update_msg TYPE string.             " BAPI message
TYPES: END OF ts_mass_map_update.

* Type for site to article master
TYPES: BEGIN OF ts_site_article,
         site    TYPE werks_d,
         article TYPE matnr.
TYPES: END OF ts_site_article.

* Type for site to article master for MAP value
TYPES: BEGIN OF ts_matnr_site_map,
         MATNR   TYPE MATNR,
         BWKEY   TYPE BWKEY,
         BWTAR   TYPE BWTAR_D,
         MEINH   TYPE MEINH,
         VERPR   type VERPR,
         PEINH   type PEINH,
         WAERS   TYPE WAERS.
TYPES: END OF ts_matnr_site_map.

TYPES: BEGIN OF ts_ckmlkont_help,
         grund TYPE ckmlkont-kongr,
         text  TYPE ckmlkont-grtxt,
       END OF ts_ckmlkont_help.

* Table Types
DATA:
  gt_file_table        TYPE filetable.

* Variables
DATA:
  gv_errors            TYPE wfcs_boolean,     " only for errors when validating
  gv_empty             TYPE wfcs_boolean,     " File was found as empty
  gv_title             TYPE string,
  gv_initial_directory TYPE string,
  gv_bukrs             TYPE bukrs,            " company code
  gv_budat             TYPE budat,            " posting Date
  gv_kongr             TYPE ckml_kongr,       " Account Assignment Reason
  gv_rc                TYPE i,
  gv_ckmlkont_init(1)  TYPE c,
  gv_first_call(1)     TYPE c VALUE 'X',
  gv_user_action       TYPE i,
  gv_okcode            TYPE sy-ucomm.

* Internal tables
DATA:
  gt_mass_map_input       TYPE TABLE OF ts_mass_map_input,
  gt_mass_map_update      TYPE TABLE OF ts_mass_map_update,
  gt_site_article         TYPE TABLE OF ts_site_article,
  gt_matnr_site_map       TYPE table of ts_matnr_site_map,
  gt_mass_map_update_msgs TYPE TABLE OF bapireturn1,
  gt_email_ids            TYPE ztech_t_table_value,
  gt_attachment_update    TYPE STANDARD TABLE OF solisti1,
  gt_attachment_msgs      TYPE STANDARD TABLE OF solisti1,
  gt_ckmlkon              TYPE ckmpr_t_ckmlkon,
  gt_ckmlkont             TYPE ckmpr_t_ckmlkont,
  gt_ckmlkont_help        TYPE STANDARD TABLE OF ts_ckmlkont_help,
  gt_data                 TYPE TABLE OF zp2p_43060_cr00_mass_map_updt.

* Structures
DATA:
  gs_file_table           TYPE file_table,
  gs_mass_map_input       TYPE ts_mass_map_input,
  gs_mass_map_update      TYPE ts_mass_map_update,
  gs_mass_map_update_msgs TYPE bapireturn1,
  gs_site_article         TYPE ts_site_article,
  gs_matnr_site_map       TYPE ts_matnr_site_map,
  gs_ckmlkont_help        TYPE ts_ckmlkont_help.
--------------------------------------------------------------------------------------------------------------------------
z_template_scr
*----------------------------------------------------------------------
*
* ZP2P_BAPI_CREATEPRICECHG (copy of BAPI_M_REVAL_CREATEPRICECHANGE )
*----------------------------------------------------------------------

PARAMETERS:
  p_job   TYPE CHAR01     NO-DISPLAY,     "controls if the program running as a background job or not
  p_srtfd TYPE indx_srtfd NO-DISPLAY.     "special index preference for background submit

SELECTION-SCREEN BEGIN OF BLOCK S01 WITH FRAME TITLE text-S01.  "Input File Location

PARAMETERS:
  p_uload TYPE  rlgrap-filename OBLIGATORY DEFAULT gc_c_folder, " File Name Upload
  p_hdlin TYPE  i OBLIGATORY DEFAULT 1.

SELECTION-SCREEN END OF BLOCK S01.

SELECTION-SCREEN BEGIN OF BLOCK S04 WITH FRAME TITLE text-S04.  "Input Options

  PARAMETERS: p_BUKRS type BUKRS    OBLIGATORY,     "Company Code
              p_BUDAT type BUDAT    OBLIGATORY,     "Posting Date
              p_KONGR TYPE CKML_KONGR.              "Account Assignment Reason

  selection-screen skip 1.

  PARAMETERS: p_site RADIOBUTTON GROUP site DEFAULT 'X',   "Process for Site in File
              p_all  RADIOBUTTON GROUP site.               "Process for all Sites for Articles in File

SELECTION-SCREEN END OF BLOCK S04.

SELECTION-SCREEN BEGIN OF BLOCK S02 WITH FRAME TITLE text-S02.  "Processing Option

PARAMETERS:

  p_online RADIOBUTTON GROUP pro DEFAULT 'X',       " Online processing
  p_backgr RADIOBUTTON GROUP pro.                   " Background processing

selection-screen skip 1.
PARAMETERS:
  p_ulimit TYPE i default 100.                      "Max rows per bapi Update

SELECTION-SCREEN END OF BLOCK S02.

SELECTION-SCREEN BEGIN OF BLOCK S03 WITH FRAME TITLE text-S03.  "Output Options
PARAMETERS:

  p_alv   RADIOBUTTON GROUP out DEFAULT 'X',        " Display ALV online
  p_spool RADIOBUTTON GROUP out.                    " spool output only

selection-screen skip 1.

PARAMETERS:
  p_email as checkbox,                              " Email Report
  p_eaddr TYPE ad_smtpadr.

selection-screen skip 1.

PARAMETERS:
  p_slg1  as checkbox default 'X'.                  " create SLG1 entries during run

SELECTION-SCREEN END OF BLOCK S03.
------------------------------------------------------------------------------------------------------------------------
z_template_sub
------------------------------------------------------------------------------------------------------------------------
*     Uses custom bapi for updating: ZP2P_BAPI_CREATEPRICECHG (copy of BAPI_M_REVAL_CREATEPRICECHANGE )
*----------------------------------------------------------------------
*
*
*----------------------------------------------------------------------

*&---------------------------------------------------------------------*
*&      Module  STATUS_0101  OUTPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE status_0101 OUTPUT.
  CALL METHOD lcl_map_update=>set_status_0101.
ENDMODULE.
*&---------------------------------------------------------------------*
*&      Module  INIT_ALV_0101  OUTPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE init_alv_0101 OUTPUT.
  CALL METHOD lcl_map_update=>init_alv_0101.
ENDMODULE.

*----------------------------------------------------------------------*
*       Module  exit_command  INPUT
*----------------------------------------------------------------------*
MODULE exit_command_0101 INPUT.
  CALL METHOD lcl_map_update=>exit_command_0101.
ENDMODULE.                             " exit_command  INPUT

*----------------------------------------------------------------------*
*       Module  user_command  INPUT
*----------------------------------------------------------------------*
MODULE user_command_0101 INPUT.
  CALL METHOD lcl_map_update=>user_command_0101 CHANGING pcv_okcode = gv_okcode.
ENDMODULE.                 " user_command  INPUT

---------------------------------------------------------------------------------------------------------------------------
z_template_cls
---------------------------------------------------------------------------------------------------------------------------


CLASS lcl_email DEFINITION FINAL.

  PUBLIC SECTION.

    CLASS-METHODS: build_xls_data_table_update.

    CLASS-METHODS: build_xls_data_table_msgs.

    CLASS-METHODS: send_class_email.

ENDCLASS.


CLASS lcl_map_update DEFINITION FINAL.

  PUBLIC SECTION.

    CLASS-METHODS: main_process IMPORTING REFERENCE(pv_job) TYPE char01.

    CLASS-METHODS: init_screen.

    CLASS-METHODS: check_scr.

    CLASS-METHODS: upload_file.

    CLASS-METHODS: show_kongr_dropdown_box.

    CLASS-METHODS: prepare_container_background.

    CLASS-METHODS: run_message IMPORTING REFERENCE(pv_type) TYPE char01
                                         REFERENCE(pv_text) TYPE string.

    CLASS-METHODS: end_of_list.

    CLASS-METHODS: exit_command_0101.

    CLASS-METHODS: user_command_0101 CHANGING pcv_okcode TYPE sy-ucomm.

    CLASS-METHODS: set_status_0101 .

    CLASS-METHODS: init_alv_0101.

    CLASS-METHODS: exclude_toolbar_icons IMPORTING REFERENCE(p_type)      TYPE string
                                         CHANGING  pct_excl_toolbar_icons TYPE ui_functions.


    CLASS-METHODS: prepare_layout IMPORTING REFERENCE(p_type) TYPE string
                                  CHANGING  pcs_layout        TYPE lvc_s_layo.

    CLASS-METHODS: prepare_layout_bg IMPORTING REFERENCE(p_type) TYPE string
                                     CHANGING  pcs_layout        TYPE slis_layout_alv.

    CLASS-METHODS: set_grid_list_0101 IMPORTING REFERENCE(p_type) TYPE string
                                      CHANGING  ct_list           TYPE lvc_t_fcat.


    CLASS-METHODS: set_grid_list_bg  IMPORTING REFERENCE(p_type) TYPE string
                                     CHANGING  ct_list           TYPE slis_t_fieldcat_alv.

  PRIVATE SECTION.

    CLASS-METHODS: prepare_kongr_popup .

    CLASS-METHODS: save_message IMPORTING REFERENCE(pv_text)      TYPE string
                                CHANGING  ps_record               TYPE ts_mass_map_update.

    CLASS-METHODS: success_message IMPORTING REFERENCE(ps_mass_map_update) TYPE ts_mass_map_update
                                   CHANGING  ps_return                     TYPE bapiret1.

    CLASS-METHODS: General_info_message IMPORTING REFERENCE(pv_text)            TYPE string
                                        CHANGING  ps_return                     TYPE bapiret1.

    CLASS-METHODS: Info_message IMPORTING REFERENCE(pv_text)            TYPE string
                                          REFERENCE(ps_mass_map_update) TYPE ts_mass_map_update
                                CHANGING  ps_return                     TYPE bapiret1.

    CLASS-METHODS: get_data_memory.

    CLASS-METHODS: get_data_ps.

    CLASS-METHODS: validate_data.

    CLASS-METHODS: output_method.

    CLASS-METHODS: auth_check.

    CLASS-METHODS: prepare_job_and_submit.

    CLASS-METHODS: process_results.

    CLASS-METHODS: process_bapi.

ENDCLASS.                    "lcl_map_update DEFINITION


CLASS lcl_email IMPLEMENTATION.

  METHOD build_xls_data_table_update.

* Types
    TYPES:
      ts_attachment   TYPE  solisti1.

* Workareas
    DATA :
      ls_attachment TYPE  ts_attachment,
      ls_dfies      TYPE  dfies.

* Internal Tables
    DATA :
      lt_dfies    TYPE STANDARD TABLE OF dfies.

    CONSTANTS:
      lc_fm_ddif      TYPE    rs38l_fnam    VALUE   'DDIF_FIELDINFO_GET',
      lc_tabname_list TYPE    ddobjname     VALUE   'ZP2P_43060_CR00_MASS_MAP_UPDT'.

    CLASS cl_abap_char_utilities DEFINITION LOAD.

    DATA:
      lv_tabname      TYPE ddobjname,
      lv_kbetr        TYPE string,
      lv_kpein        TYPE string,
      lv_map_string   TYPE char10,
      lv_punit_string TYPE char10.

    CONSTANTS:
      con_tab  TYPE c VALUE cl_abap_char_utilities=>horizontal_tab,
      con_cret TYPE c VALUE cl_abap_char_utilities=>cr_lf.

    lv_tabname = lc_tabname_list.

    CALL FUNCTION lc_fm_ddif
      EXPORTING
        tabname   = lv_tabname
      TABLES
        dfies_tab = lt_dfies.

    LOOP AT lt_dfies INTO ls_dfies.
      IF ls_attachment-line IS INITIAL.
        ls_attachment-line  = ls_dfies-reptext.
      ELSE.
        CASE ls_dfies-fieldname.
          WHEN 'COMP'.
            ls_dfies-reptext   = 'Company Code'.
          WHEN 'BUDAT'.
            ls_dfies-reptext   = 'Posting Date'.
          WHEN 'KONGR'.
            ls_dfies-reptext   = 'Assign Reason'.
          WHEN 'ARTICLE'.
            ls_dfies-reptext   = 'Article'.
          WHEN 'SITE'.
            ls_dfies-reptext   = 'Site'.
          WHEN 'MAP'.
            ls_dfies-reptext   = 'MovAvgPrice'.
          WHEN 'CURR'.
            ls_dfies-reptext   = 'Currency'.
          WHEN 'PUNIT'.
            ls_dfies-reptext   = 'Price Unit'.
          WHEN 'MSEHI'.
            ls_dfies-reptext   = 'Unit of Measure'.
          WHEN 'DOC_YEAR'.
            ls_dfies-reptext   = 'DOC Year'.
          WHEN 'DOC_NUM'.
            ls_dfies-reptext   = 'DOC Number'.
          WHEN 'ERROR_FLAG'.
            ls_dfies-reptext   = 'Error Flag'.
          WHEN 'VALID_MSG'.
            ls_dfies-reptext   = 'Valid Message'.
          WHEN 'UPDATE_MSG'.
            ls_dfies-reptext   = 'Update Message'.
          WHEN OTHERS.
            CLEAR: ls_dfies-reptext.
        ENDCASE.
        IF ls_dfies-reptext IS NOT INITIAL.
          CONCATENATE ls_attachment-line ls_dfies-reptext
            INTO ls_attachment-line
            SEPARATED BY con_tab.
        ENDIF.
      ENDIF.
    ENDLOOP.

    CONCATENATE con_cret ls_attachment-line
      INTO ls_attachment-line.

    APPEND ls_attachment TO gt_attachment_update.
    CLEAR  ls_attachment.

    LOOP AT gt_mass_map_update INTO gs_mass_map_update.

      WRITE gs_mass_map_update-map TO lv_map_string.
      WRITE gs_mass_map_update-punit TO lv_punit_string.

      CONCATENATE gs_mass_map_update-comp                   " Company Code
                  gs_mass_map_update-budat                  " Posting date
                  gs_mass_map_update-kongr                  " Assigned reason
                  gs_mass_map_update-article                " Material
                  gs_mass_map_update-site                   " Site (Plant)
                  lv_map_string                             " Moving Avg Price
                  gs_mass_map_update-curr                   " currency
                  lv_punit_string                           " Price Unit
                  gs_mass_map_update-msehi                  " Unit of Measure
                  gs_mass_map_update-doc_year               " Doc Year
                  gs_mass_map_update-doc_num                " Doc Number
                  gs_mass_map_update-error_flag             " Error flag  'X' or ' '
                  gs_mass_map_update-valid_msg              " Pre-load Validation check message
                  gs_mass_map_update-update_msg             " BAPI message
             INTO ls_attachment-line
             SEPARATED BY con_tab.

      CONCATENATE con_cret ls_attachment-line
             INTO ls_attachment-line.

      APPEND ls_attachment TO gt_attachment_update.
      CLEAR  ls_attachment.

    ENDLOOP.

  ENDMETHOD.

  METHOD build_xls_data_table_msgs.

* Types
    TYPES:
      ts_attachment   TYPE  solisti1.

* Workareas
    DATA :
      ls_attachment TYPE  ts_attachment,
      ls_dfies      TYPE  dfies.

* Internal Tables
    DATA :
      lt_dfies    TYPE STANDARD TABLE OF dfies.

    CONSTANTS:
      lc_fm_ddif      TYPE    rs38l_fnam    VALUE   'DDIF_FIELDINFO_GET',
      lc_tabname_list TYPE    ddobjname     VALUE   'BAPIRETURN1'.

    CLASS cl_abap_char_utilities DEFINITION LOAD.

    DATA:
      lv_tabname      TYPE ddobjname,
      lv_kbetr        TYPE string,
      lv_kpein        TYPE string,
      lv_map_string   TYPE char10,
      lv_punit_string TYPE char10.

    CONSTANTS:
      con_tab  TYPE c VALUE cl_abap_char_utilities=>horizontal_tab,
      con_cret TYPE c VALUE cl_abap_char_utilities=>cr_lf.

    lv_tabname = lc_tabname_list.

    CALL FUNCTION lc_fm_ddif
      EXPORTING
        tabname   = lv_tabname
      TABLES
        dfies_tab = lt_dfies.

    LOOP AT lt_dfies INTO ls_dfies.
      IF ls_attachment-line IS INITIAL.
        ls_attachment-line  = ls_dfies-reptext.
      ELSE.
        CASE ls_dfies-fieldname.
          WHEN 'TYPE'.
            ls_dfies-reptext   = 'Type'.
          WHEN 'ID'.
            ls_dfies-reptext   = 'Msg ID'.
          WHEN 'NUMBER'.
            ls_dfies-reptext   = 'MSG No'.
          WHEN 'MESSAGE'.
            ls_dfies-reptext   = 'Message Text'.
*        WHEN 'LOG_NO'.
*          ls_dfies-reptext   = 'Log No'.
*        WHEN 'LOG_MSG_NO'.
*          ls_dfies-reptext   = 'Log Msg No'.
*        WHEN 'MESSAGE_V1'.
*          ls_dfies-reptext   = 'MSG Var 1'.
*        WHEN 'MESSAGE_V2'.
*          ls_dfies-reptext   = 'MSG Var 2'.
*        WHEN 'MESSAGE_V3'.
*          ls_dfies-reptext   = 'MSG Var 3'.
*        WHEN 'MESSAGE_V4'.
*          ls_dfies-reptext   = 'MSG Var 4'.
          WHEN OTHERS.
            CLEAR: ls_dfies-reptext.
        ENDCASE.

        IF ls_dfies-reptext IS NOT INITIAL.
          CONCATENATE ls_attachment-line ls_dfies-reptext
            INTO ls_attachment-line
            SEPARATED BY con_tab.
        ENDIF.
      ENDIF.
    ENDLOOP.

    CONCATENATE con_cret ls_attachment-line
      INTO ls_attachment-line.

    APPEND ls_attachment TO gt_attachment_msgs.
    CLEAR  ls_attachment.

    LOOP AT gt_mass_map_update_msgs INTO gs_mass_map_update_msgs.

      CONCATENATE gs_mass_map_update_msgs-type              " Type of message
                  gs_mass_map_update_msgs-id                " Message ID
                  gs_mass_map_update_msgs-number            " Message Number
                  gs_mass_map_update_msgs-message           " Full message text
*                gs_mass_map_update_msgs-LOG_NO            " Log Number
*                gs_mass_map_update_msgs-LOG_MSG_NO        " Log message Number
*                gs_mass_map_update_msgs-MESSAGE_V1        " MSG Var 1
*                gs_mass_map_update_msgs-MESSAGE_V2        " MSG Var 2
*                gs_mass_map_update_msgs-MESSAGE_V3        " MSG Var 3
*                gs_mass_map_update_msgs-MESSAGE_V4        " MSG Var 4
             INTO ls_attachment-line
             SEPARATED BY con_tab.

      CONCATENATE con_cret ls_attachment-line
             INTO ls_attachment-line.

      APPEND ls_attachment TO gt_attachment_msgs.
      CLEAR  ls_attachment.

    ENDLOOP.

  ENDMETHOD.

  METHOD send_class_email.

* Objects reference declaration to prepare Mail Object
    DATA :
      lo_send_request    TYPE REF TO cl_bcs           VALUE IS INITIAL,
      lo_document        TYPE REF TO cl_document_bcs  VALUE IS INITIAL, "document object
      lo_sender          TYPE REF TO if_sender_bcs    VALUE IS INITIAL, "sender
      lo_recipient       TYPE REF TO if_recipient_bcs VALUE IS INITIAL, "recipient
      lo_cx_document_bcs TYPE REF TO cx_document_bcs,
      lo_cx_address_bcs  TYPE REF TO cx_address_bcs,
      lo_bcs_exception   TYPE REF TO cx_send_req_bcs.

* Variables declarations.
    DATA:
      lv_data_string  TYPE string,
      lv_xstring      TYPE xstring,
      lv_message_text TYPE string,
      lv_string       TYPE string,
      lv_msgv1        TYPE sy-msgv1,
      lv_attsubject   TYPE sood-objdes,
      lv_size         TYPE so_obj_len,
      lv_obj_descr    TYPE so_obj_des.

* Tables declarations
    DATA:
      lt_recip          TYPE STANDARD TABLE OF zotct_ts_recip,
      lt_text           TYPE bcsy_text, "Table for body
      lt_binary_content TYPE solix_tab,
      lt_email_ids      TYPE ztech_t_table_value.

* Structures declarations.
    DATA:
      ls_recip TYPE         zotct_ts_recip,
      ls_text  LIKE LINE OF lt_text. "work area for message body

* Fields symbols declarations.
    FIELD-SYMBOLS:
      <ls_recip>    TYPE zotct_ts_recip,
      <ls_email_id> LIKE LINE OF lt_email_ids.

* Contants declarations.
    CONSTANTS :
      lc_so_obj_tp    TYPE so_obj_tp        VALUE 'HTM',
      lc_key_email_id TYPE ztech_table_key  VALUE 'OTC-33100-G211-01-R01:EMAIL_ID:RECEIVER:',
      lc_table        TYPE tabname          VALUE 'ZPRICE_SETTINGS',
      lc_ext          TYPE so_obj_tp        VALUE 'XLS',
      lc_period       TYPE char01           VALUE '.',
      lc_major_x      TYPE char01           VALUE 'X'.


    CLASS cl_bcs DEFINITION LOAD.

    CHECK p_email = 'X'.    "Do not send email if not requested

* Create instance of the email class
    TRY .
        lo_send_request = cl_bcs=>create_persistent( ).
      CATCH cx_send_req_bcs INTO lo_bcs_exception .
        IF lo_bcs_exception IS BOUND.
          lv_message_text = lo_bcs_exception->get_text( ).
          MOVE lv_message_text TO lv_msgv1.
          MESSAGE a064(zotc) WITH lv_msgv1.
        ENDIF.
    ENDTRY.

    ls_recip = p_eaddr.
    APPEND ls_recip TO lt_recip.

*   Message body and subject
    lv_obj_descr = text-102.   "P2P-43060-CR00 Mass Article Moving Ave Price Update
    ls_text-line = text-100.   "P2P-43060-CR00
    APPEND ls_text TO lt_text.
    CLEAR ls_text.

*   Create email document inc type, subject and body text
    TRY .
        lo_document = cl_document_bcs=>create_document(         "create document
                         i_type      = lc_so_obj_tp             "Type of document HTM, TXT etc
                         i_text      = lt_text                  "email body internal table
                         i_subject   = lv_obj_descr ).          "email subject here p_sub input parameter
      CATCH cx_document_bcs INTO lo_cx_document_bcs.
        IF lo_cx_document_bcs IS BOUND.
          lv_message_text = lo_cx_document_bcs->get_text( ).
          MOVE lv_message_text TO lv_msgv1.
          MESSAGE a064(zotc) WITH lv_msgv1.
        ENDIF.
    ENDTRY.

*   Assign document and all its details to the email
    TRY .
        lo_send_request->set_document( lo_document ).
      CATCH cx_send_req_bcs INTO lo_bcs_exception .
        IF lo_bcs_exception IS BOUND.
          lv_message_text = lo_bcs_exception->get_text( ).
          MOVE lv_message_text TO lv_msgv1.
          MESSAGE a064(zotc) WITH lv_msgv1.
        ENDIF.
    ENDTRY.

*   Create columns basis and data on the Report Type
    CALL METHOD lcl_email=>build_xls_data_table_update.

    CALL FUNCTION 'SWA_STRING_FROM_TABLE'
      EXPORTING
        character_table            = gt_attachment_update
      IMPORTING
        character_string           = lv_data_string
      EXCEPTIONS
        no_flat_charlike_structure = 1
        OTHERS                     = 2.

    IF sy-subrc <> 0.
      MESSAGE a303(me) WITH 'Error in sending mail.'(050) text-051.
    ENDIF.

*   Convert string to xstring
    CALL FUNCTION 'HR_KR_STRING_TO_XSTRING'
      EXPORTING
        unicode_string   = lv_data_string
      IMPORTING
        xstring_stream   = lv_xstring
      EXCEPTIONS
        invalid_codepage = 1
        invalid_string   = 2
        OTHERS           = 3.

    IF sy-subrc NE 0.
      MESSAGE a303(me) WITH 'Error in sending mail.'(050) text-051.
    ENDIF.

*   Convert Xstring to binary
    CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
      EXPORTING
        buffer     = lv_xstring
      TABLES
        binary_tab = lt_binary_content.

    CONCATENATE
              'Report_Mass_MAP_Upload_'
              sy-datum+4(2)
              lc_period
              sy-datum+6
              lc_period
              sy-datum(4)
              INTO lv_attsubject.

*   Calculate size of attachment
    lv_size = xstrlen( lv_xstring ).

*   Add the attachment table to the document
    TRY .
        lo_document->add_attachment( EXPORTING
                                  i_attachment_type    = lc_ext
                                  i_attachment_subject = lv_attsubject
                                  i_attachment_size    = lv_size
                                  i_att_content_hex    = lt_binary_content  ).
      CATCH cx_document_bcs INTO lo_cx_document_bcs.
        IF lo_cx_document_bcs IS BOUND.
          lv_message_text = lo_cx_document_bcs->get_text( ).
          MOVE lv_message_text TO lv_msgv1.
          MESSAGE a064(zotc) WITH lv_msgv1.
        ENDIF.
    ENDTRY.

*   Now attach the second table
*   Create columns basis and data on the Report Type
    CALL METHOD lcl_email=>build_xls_data_table_msgs.

    CLEAR: lv_data_string.
    CALL FUNCTION 'SWA_STRING_FROM_TABLE'
      EXPORTING
        character_table            = gt_attachment_msgs
      IMPORTING
        character_string           = lv_data_string
      EXCEPTIONS
        no_flat_charlike_structure = 1
        OTHERS                     = 2.

    IF sy-subrc <> 0.
      MESSAGE a303(me) WITH 'Error in sending mail.'(050) text-051.
    ENDIF.

*   Convert string to xstring
    CLEAR: lv_xstring.
    CALL FUNCTION 'HR_KR_STRING_TO_XSTRING'
      EXPORTING
        unicode_string   = lv_data_string
      IMPORTING
        xstring_stream   = lv_xstring
      EXCEPTIONS
        invalid_codepage = 1
        invalid_string   = 2
        OTHERS           = 3.

    IF sy-subrc NE 0.
      MESSAGE a303(me) WITH 'Error in sending mail.'(050) text-051.
    ENDIF.

*   Convert Xstring to binary
    CLEAR: lt_binary_content.
    CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
      EXPORTING
        buffer     = lv_xstring
      TABLES
        binary_tab = lt_binary_content.

    CONCATENATE
              'Report_Mass_MAP_Upload_Messages_'
              sy-datum+4(2)
              lc_period
              sy-datum+6
              lc_period
              sy-datum(4)
              INTO lv_attsubject.

*   Calculate size of attachment
    lv_size = xstrlen( lv_xstring ).

*   Add the 2nd attachment table to the document
    TRY .
        lo_document->add_attachment( EXPORTING
                                  i_attachment_type    = lc_ext
                                  i_attachment_subject = lv_attsubject
                                  i_attachment_size    = lv_size
                                  i_att_content_hex    = lt_binary_content  ).
      CATCH cx_document_bcs INTO lo_cx_document_bcs.
        IF lo_cx_document_bcs IS BOUND.
          lv_message_text = lo_cx_document_bcs->get_text( ).
          MOVE lv_message_text TO lv_msgv1.
          MESSAGE a064(zotc) WITH lv_msgv1.
        ENDIF.
    ENDTRY.

*   Sender is the logged in user
    TRY .
        TRY .
            lo_sender = cl_sapuser_bcs=>create( sy-uname ).
          CATCH cx_address_bcs INTO lo_cx_address_bcs.
            IF lo_cx_address_bcs IS BOUND.
              lv_message_text = lo_cx_address_bcs->get_text( ).
              MOVE lv_message_text TO lv_msgv1.
              MESSAGE a064(zotc) WITH lv_msgv1.
            ENDIF.
        ENDTRY.

*       Set sender to send request
        lo_send_request->set_sender(
          EXPORTING
            i_sender = lo_sender ).
      CATCH cx_send_req_bcs INTO lo_bcs_exception .
        IF lo_bcs_exception IS BOUND.
          lv_message_text = lo_bcs_exception->get_text( ).
          MOVE lv_message_text TO lv_msgv1.
          MESSAGE a064(zotc) WITH lv_msgv1.
        ENDIF.
    ENDTRY.

    DELETE lt_recip WHERE email_id IS INITIAL.

*   Add recipient (e-mail address)
    LOOP AT lt_recip ASSIGNING <ls_recip>.
      TRY .
          lo_recipient = cl_cam_address_bcs=>create_internet_address(
                                                      <ls_recip>-email_id ).
        CATCH cx_address_bcs INTO lo_cx_address_bcs.
          IF lo_cx_address_bcs IS BOUND.
            lv_message_text = lo_cx_address_bcs->get_text( ).
            MOVE lv_message_text TO lv_msgv1.
            MESSAGE a064(zotc) WITH lv_msgv1.
          ENDIF.
      ENDTRY.

*     Add recipient with its respective attributes to send request
      TRY .
          CALL METHOD lo_send_request->add_recipient
            EXPORTING
              i_recipient = lo_recipient
              i_express   = lc_major_x.
        CATCH cx_send_req_bcs INTO lo_bcs_exception .
          IF lo_bcs_exception IS BOUND.
            lv_message_text = lo_bcs_exception->get_text( ).
            MOVE lv_message_text TO lv_msgv1.
            MESSAGE a064(zotc) WITH lv_msgv1.
          ENDIF.
      ENDTRY.
    ENDLOOP.

    TRY .
        CALL METHOD lo_send_request->set_send_immediately
          EXPORTING
            i_send_immediately = lc_major_x.
      CATCH cx_send_req_bcs INTO lo_bcs_exception .
        IF lo_bcs_exception IS BOUND.
          lv_message_text = lo_bcs_exception->get_text( ).
          MOVE lv_message_text TO lv_msgv1.
          MESSAGE a064(zotc) WITH lv_msgv1.
        ENDIF.
    ENDTRY.

*   Send email
    TRY .
        lo_send_request->send(
          EXPORTING
            i_with_error_screen = lc_major_x ).
        COMMIT WORK.
      CATCH cx_send_req_bcs INTO lo_bcs_exception .
        IF lo_bcs_exception IS BOUND.
          lv_message_text = lo_bcs_exception->get_text( ).
          MOVE lv_message_text TO lv_msgv1.
          MESSAGE a064(zotc) WITH lv_msgv1.
        ENDIF.
    ENDTRY.

    CALL METHOD lcl_map_update=>run_message
      EXPORTING
        pv_type = 'I'
        pv_text = 'Email sent with results of MASS MAP Update'.

  ENDMETHOD.

ENDCLASS.

CLASS lcl_map_update IMPLEMENTATION.

  METHOD main_process.

*   select * from T001 where BUKRS = P_BUKRS.

    IF p_slg1 = 'X'.   "see sample program ZP2P_LOAD_ORG_UNITS OR ZP2P_JOBS_TO_POSITIONS for usage of this class SLG1 logging
      " call logger class with object and subobject to log the success and failed messages in SLG1
      go_log = zcl_logger=>new( object = 'ZP2P_43060_CR00'
                             subobject = 'MASS_MAP_UPDATE'
                                  desc = text-t03 ).
    ENDIF.

    IF pv_job IS INITIAL.  "this is the forground run step of the program
      CALL METHOD get_data_ps.
      IF p_backgr = 'X'.  "Save the above received data from the input file to a memory ID
        CALL METHOD prepare_job_and_submit.
      ELSE.
        CALL METHOD validate_data.
        CALL METHOD process_bapi.
        CALL METHOD process_results.
      ENDIF.
    ELSE.
      CALL METHOD get_data_memory. "get data from memory ID
      CALL METHOD validate_data.
      CALL METHOD process_bapi.
      CALL METHOD process_results.
    ENDIF.

  ENDMETHOD.                    "main_process

  METHOD init_screen.

    CALL METHOD prepare_kongr_popup.

  ENDMETHOD.                    "main_process

  METHOD check_scr.

*     Do the following checks at all times

    CALL METHOD auth_check.

    IF sy-batch = 'X' AND p_job = space.
      MESSAGE e011(zp2p) WITH 'Do not run this program as a background task'.
    ENDIF.

    IF p_email = 'X' AND p_eaddr = space.
      MESSAGE e011(zp2p) WITH 'Email requested but email address is blank'.
    ENDIF.

    CHECK sy-ucomm = 'ONLIN'.   "ONLY DO THE FOLLOWING CHECKS ON forground EXECUTE BUTTON

    IF p_uload CS gc_csv.
    ELSE.
      MESSAGE e011(zp2p) WITH 'File name to upload must be a .CSV file'.
    ENDIF.

    IF P_ulimit < 1.
      MESSAGE e011(zp2p) WITH 'Update limit must be a value greater than zero'.
    ENDIF.

  ENDMETHOD.                    "main_process

  METHOD upload_file.

    DATA:
      ls_dynpfields  TYPE dynpread,
      lt_dynpfields  TYPE TABLE OF dynpread,
      lv_title       TYPE string,
      lv_rc          TYPE i,
      lv_user_action TYPE i.

    lv_title = text-008.

    REFRESH lt_dynpfields.
    ls_dynpfields-fieldname = 'P_ULOAD'.
    APPEND ls_dynpfields TO lt_dynpfields.

*     Get file upload value on the selection screen
    CALL FUNCTION 'DYNP_VALUES_READ'
      EXPORTING
        dyname               = sy-repid
        dynumb               = sy-dynnr
      TABLES
        dynpfields           = lt_dynpfields
      EXCEPTIONS
        invalid_abapworkarea = 1
        invalid_dynprofield  = 2
        invalid_dynproname   = 3
        invalid_dynpronummer = 4
        invalid_request      = 5
        no_fielddescription  = 6
        invalid_parameter    = 7
        undefind_error       = 8
        double_conversion    = 9
        stepl_not_found      = 10
        OTHERS               = 11.

    if sy-subrc <> 0.
    ENDIF.

    READ TABLE lt_dynpfields INTO ls_dynpfields
           WITH KEY fieldname = 'P_ULOAD'.
    IF sy-subrc = 0.
      gv_initial_directory = ls_dynpfields-fieldvalue.
    ENDIF.

    CLEAR: gt_file_table[].

    CALL METHOD cl_gui_frontend_services=>file_open_dialog
      EXPORTING
        window_title            = lv_title
        default_extension       = gc_csv
        initial_directory       = gv_initial_directory
      CHANGING
        file_table              = gt_file_table
        rc                      = lv_rc
        user_action             = lv_user_action " User Action (See Class Constants ACTION_OK, ACTION_CANCEL)
      EXCEPTIONS
        file_open_dialog_failed = 1
        cntl_error              = 2
        error_no_gui            = 3
        not_supported_by_gui    = 4
        OTHERS                  = 5.

    IF sy-subrc <> 0.
*       Unable to open dialog to browse a directory
      MESSAGE text-021 TYPE gc_i.
    ELSE.
      IF lv_user_action = cl_gui_frontend_services=>action_cancel .
*         action: cancel
      ELSE.
        READ TABLE gt_file_table INTO gs_file_table INDEX 1.
        IF sy-subrc = 0.
          p_uload     = gs_file_table-filename.
        ELSE.
*           Unable to open dialog to browse a directory
          MESSAGE text-021 TYPE gc_i.
        ENDIF.

      ENDIF.
    ENDIF.

  ENDMETHOD.                    "main_process

  METHOD prepare_kongr_popup.

    Data:
      ls_ckmlkon         TYPE ckmlkon,
      ls_ckmlkont        TYPE ckmlkont.

*   CLEAR gv_ckmlkont_items.
    CLEAR gv_ckmlkont_init.

    CLEAR: ls_ckmlkont, ls_ckmlkon, gs_ckmlkont_help.
    REFRESH: gt_ckmlkont, gt_ckmlkon, gt_ckmlkont_help.

*   Transaktionsspezifische interne Tabellen füllen

    CALL FUNCTION 'GET_TABLES_FOR_KOMOK'
      EXPORTING
        i_tcode    = 'MR21'  "sy-tcode
      IMPORTING
        e_ckmlkon  = gt_ckmlkon
        e_ckmlkont = gt_ckmlkont
      EXCEPTIONS
        no_data    = 1.

*   Prüfung ob Benutzer var. KOMOK vorgesehen hat, interne Tabelle für
*   F4-Hilfe
    IF sy-subrc = 1.
      gv_ckmlkont_init = 'X'.
    ELSE.
      LOOP AT gt_ckmlkont INTO ls_ckmlkont.
        gs_ckmlkont_help-grund = ls_ckmlkont-kongr.
        gs_ckmlkont_help-text  = ls_ckmlkont-grtxt.
        APPEND gs_ckmlkont_help TO gt_ckmlkont_help.
      ENDLOOP.
    ENDIF.

*   Setup the initial value for reason code for input screen
    IF gv_first_call = 'X'.

      LOOP AT gt_ckmlkon INTO ls_ckmlkon WHERE tcode = sy-tcode AND
                                               flg_def = 'X' .
        LOOP AT gt_ckmlkont INTO ls_ckmlkont
          WHERE kongr = ls_ckmlkon-kongr.
          p_kongr = ls_ckmlkont-kongr.
        ENDLOOP.
      ENDLOOP.

      CLEAR gv_first_call.

    ENDIF.

  ENDMETHOD.                    "main_process

  METHOD show_kongr_dropdown_box.

    CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
      EXPORTING
*       DDIC_STRUCTURE         = ' '
        retfield               = 'GRUND'
*       PVALKEY                = ' '
        DYNPPROG               = sy-repid
        dynpnr                 = sy-dynnr
        DYNPROFIELD            = 'P_KONGR'
*       STEPL                  = 0
*       WINDOW_TITLE           =
*       VALUE                  = ''
        value_org              = 'S'
*       MULTIPLE_CHOICE        = ' '
*       DISPLAY                = ' '
*       CALLBACK_PROGRAM       = ' '
*       CALLBACK_FORM          = ' '
*       MARK_TAB               =
*     IMPORTING
*       USER_RESET             =
      TABLES
        value_tab              = gt_ckmlkont_help
*       FIELD_TAB              = gt_ckmlkont_help
*       RETURN_TAB             =
*       DYNPFLD_MAPPING        =
      EXCEPTIONS                                                "note840507
        PARAMETER_ERROR        = 1                              "note840507
        NO_VALUES_FOUND        = 2                              "note840507
        OTHERS                 = 3                              "note840507
            .
    IF sy-subrc <> 0                            ##NEEDED.
*     MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*             WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
    ENDIF.

  ENDMETHOD.

  METHOD Success_message.

    DATA: lv_par1     TYPE syst_msgv,
          lv_par2     TYPE syst_msgv,
          lv_par3     TYPE syst_msgv,
          lv_par4     TYPE syst_msgv,
          lv_char5    TYPE char5,
          lv_bapiret1 TYPE bapiret1,
          lv_article  type matnr,
          lv_site     type werks_d.

    check p_slg1 = 'X'.  "Only write to message table when slg1 is requested on selection screen

    WRITE ps_mass_map_update-lineref TO lv_char5.
    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'
      EXPORTING
        input         = ps_mass_map_update-article
      IMPORTING
        OUTPUT        = lv_article.
    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'
      EXPORTING
        input         = ps_mass_map_update-site
      IMPORTING
        OUTPUT        = lv_site.
    CONCATENATE gc_row     lv_char5   INTO lv_par1.
    CONCATENATE gc_Article lv_article INTO lv_par2.
    CONCATENATE gc_Site    lv_site    INTO lv_par3.
    CONCATENATE 'Updated MAP to article/site Doc:' ps_mass_map_update-doc_year '/' ps_mass_map_update-doc_num
           INTO lv_par4.
    CALL FUNCTION 'BALW_BAPIRETURN_GET1'
      EXPORTING
        type       = gc_i
        cl         = gc_zp2p
        number     = gc_num11
        par1       = lv_par1
        par2       = lv_par2
        par3       = lv_par3
        par4       = lv_par4
      IMPORTING
        bapireturn = ps_return.

  ENDMETHOD.

  METHOD General_info_message.

    DATA: lv_par1     TYPE syst_msgv.

    lv_par1 = pv_text.
    CALL FUNCTION 'BALW_BAPIRETURN_GET1'
      EXPORTING
        type       = gc_i
        cl         = gc_zp2p
        number     = gc_num11
        par1       = lv_par1
      IMPORTING
        bapireturn = ps_return.

  ENDMETHOD.


  METHOD Info_message.

    DATA: lv_par1     TYPE syst_msgv,
          lv_par2     TYPE syst_msgv,
          lv_par3     TYPE syst_msgv,
          lv_par4     TYPE syst_msgv,
          lv_char5    TYPE char5,
          lv_bapiret1 TYPE bapiret1,
          lv_article  type matnr,
          lv_site     type werks_d.

    check p_slg1 = 'X'.  "Only write to message table when slg1 is requested on selection screen

    WRITE ps_mass_map_update-lineref TO lv_char5.
    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'
      EXPORTING
        input         = ps_mass_map_update-article
      IMPORTING
        OUTPUT        = lv_article.
    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'
      EXPORTING
        input         = ps_mass_map_update-site
      IMPORTING
        OUTPUT        = lv_site.
    CONCATENATE gc_row     lv_char5   INTO lv_par1.
    CONCATENATE gc_Article lv_article INTO lv_par2.
    CONCATENATE gc_Site    lv_site    INTO lv_par3.
    lv_par4 = pv_text.
    CALL FUNCTION 'BALW_BAPIRETURN_GET1'
      EXPORTING
        type       = gc_i
        cl         = gc_zp2p
        number     = gc_num11
        par1       = lv_par1
        par2       = lv_par2
        par3       = lv_par3
        par4       = lv_par4
      IMPORTING
        bapireturn = ps_return.

  ENDMETHOD.


  METHOD save_message.

    DATA: lv_par1     TYPE syst_msgv,
          lv_par2     TYPE syst_msgv,
          lv_par3     TYPE syst_msgv,
          lv_par4     TYPE syst_msgv,
          lv_char5    TYPE char5,
          lv_bapiret1 TYPE bapiret1,
          lv_article  type matnr,
          lv_site     type werks_d.

    ps_record-error_flag = gc_x.
    ps_record-valid_msg  = 'Error in validation, Load is stopped'.
    gv_errors = gc_x.

    WRITE ps_record-lineref TO lv_char5.
    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'
      EXPORTING
        input         = ps_record-article
      IMPORTING
        OUTPUT        = lv_article.
    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'
      EXPORTING
        input         = ps_record-site
      IMPORTING
        OUTPUT        = lv_site.
    CONCATENATE gc_row     lv_char5   INTO lv_par1.
    CONCATENATE gc_Article lv_article INTO lv_par2.
    CONCATENATE gc_Site    lv_site    INTO lv_par3.
    lv_par4 = pv_text.
    CALL FUNCTION 'BALW_BAPIRETURN_GET1'
      EXPORTING
        type       = gc_e
        cl         = gc_zp2p
        number     = gc_num11
        par1       = lv_par1
        par2       = lv_par2
        par3       = lv_par3
        par4       = lv_par4
      IMPORTING
        bapireturn = lv_bapiret1.
    APPEND lv_bapiret1 TO gt_mass_map_update_msgs.

  ENDMETHOD.

  METHOD run_message.

    MESSAGE ID 'ZP2P'
          TYPE pv_type
        NUMBER 11
          WITH pv_text.

    "Inform SLG1
    IF p_slg1 = 'X'.
      " Add log
      go_log->add( ).
    ENDIF.

  ENDMETHOD.

  METHOD get_data_memory .

* Get data from memory data cluster that was built before background job started.
    IMPORT gt_mass_map_input to gt_mass_map_input from database zp2p_cluster(zp) ID p_srtfd.
    IF sy-subrc <> 0.
      CALL METHOD run_message
        EXPORTING
          pv_type = 'E'
          pv_text = 'Failed to Import Data for Background Job Receive'.
      WRITE: /001 'Failed to Import Data for Background Job Receive'.
    ELSE.
      DELETE FROM DATABASE zp2p_cluster(zp) ID p_srtfd.
      IF sy-subrc <> 0.
        CALL METHOD run_message
          EXPORTING
            pv_type = 'E'
            pv_text = 'Failed to Remove memory Data for Background Job Receive'.
        WRITE: /001 'Failed to Remove memory Data for Background Job Receive'.
      ENDIF.
    ENDIF.

  ENDMETHOD.

  METHOD get_data_ps .

* Variables
    DATA:
      lv_filename TYPE string,
      lv_tabix    TYPE sy-tabix,
      lv_sequence TYPE crmt_bsp_sequence_6.

* Structures
    DATA:
      ls_data_tab TYPE string.

* Internal tables
    DATA:
      lt_data_tab TYPE TABLE OF string.

* Classes
    DATA:
      lo_conv     TYPE REF TO cl_rsda_csv_converter.

    CHECK gv_errors = abap_false.

    CHECK p_uload IS NOT INITIAL.

    lv_filename = p_uload.

    IF lv_filename CS gc_csv.
    ELSE.
      CALL METHOD run_message
        EXPORTING
          pv_type = 'E'
          pv_text = 'File name to upload must be a .CSV file'.
    ENDIF.

    CLEAR: lt_data_tab[], gt_mass_map_input[].

    CALL METHOD cl_gui_frontend_services=>gui_upload
      EXPORTING
        filename                = lv_filename
        read_by_line            = 'X'
      CHANGING
        data_tab                = lt_data_tab
      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
        not_supported_by_gui    = 17
        error_no_gui            = 18
        OTHERS                  = 19.

    IF sy-subrc <> 0.
      CALL METHOD run_message
        EXPORTING
          pv_type = 'E'
          pv_text = 'Error when uploading the flat file'.
    ELSE.

      CALL METHOD cl_rsda_csv_converter=>create
        RECEIVING
          r_r_conv = lo_conv.

      LOOP AT lt_data_tab INTO ls_data_tab.

        lv_tabix = sy-tabix.

        IF lv_tabix > p_hdlin.          " we skip the first four lines (header)
          CALL METHOD lo_conv->csv_to_structure
            EXPORTING
              i_data   = ls_data_tab
            IMPORTING
              e_s_data = gs_mass_map_input.

          APPEND gs_mass_map_input TO gt_mass_map_input.
        ENDIF.

      ENDLOOP.

    ENDIF.

  ENDMETHOD.

  METHOD validate_data .

* Structures
    DATA:
      BEGIN OF ls_wlk1,
        artnr TYPE matnr,              " material/article
        filia TYPE asort,              " site
      END OF ls_wlk1,

      BEGIN of ls_map,
         MATNR   TYPE MATNR,
         BWKEY   TYPE BWKEY,
         BWTAR   TYPE BWTAR_D,
         VERPR   type VERPR,
         PEINH   type PEINH,
*         WAERS   TYPE WAERS,
      END OF ls_map,

      BEGIN OF ls_werks,
        werks    TYPE werks_d,            " site
      END OF ls_werks,

      BEGIN OF ls_article_site,
        artnr TYPE matnr,              " material/article
        filia TYPE asort,              " site
      END OF ls_article_site,

      BEGIN OF ls_mbew_article_site,
        matnr TYPE matnr,              " material/article
        bwkey TYPE bwkey,              " site
      END OF ls_mbew_article_site,

      BEGIN OF ls_article,
        artnr TYPE matnr,              " material
      END OF ls_article,

      BEGIN OF ls_article_site_count,
        article TYPE matnr,
        site    TYPE werks_d,
        counts  TYPE i,
      END OF ls_article_site_count,

      BEGIN OF ls_article_meinh,
        matnr TYPE matnr,
        meinh TYPE lrmei,
      END OF ls_article_meinh.

* Tables
    DATA:
      lt_temp               LIKE TABLE OF        gs_mass_map_update,
      lt_werks              LIKE HASHED TABLE OF ls_werks               WITH UNIQUE KEY werks,
      lt_map                LIKE HASHED TABLE of ls_map                 WITH UNIQUE KEY MATNR BWKEY,  "BWTAR,
      lt_article_site_count LIKE HASHED TABLE OF ls_article_site_count  WITH UNIQUE KEY article site,
      lt_wlk1               LIKE TABLE OF        ls_article_site,
      lt_mbew               LIKE TABLE OF        ls_mbew_article_site,
      lt_mbew_article_site  like hashed table of ls_mbew_article_site   with unique key matnr bwkey,
      lt_article_site       LIKE HASHED TABLE OF ls_article_site        WITH UNIQUE KEY artnr filia,
      lt_article            LIKE HASHED TABLE OF ls_article             WITH UNIQUE KEY artnr,
      lt_article_meinh      LIKE HASHED TABLE OF ls_article_meinh       WITH UNIQUE KEY matnr meinh.

* Variables
    DATA:
      lv_error_exist        TYPE wfcs_boolean,
      lv_msehi              TYPE msehi.

* Do not gather nor validate if input file is empty of any articles for update
    IF gt_mass_map_input[] IS INITIAL.
      gv_errors = abap_true.
      gv_empty  = abap_true.
      RETURN.
    ENDIF.

* Collect count of article/site in input file for duplicate article/site check
    LOOP AT gt_mass_map_input INTO gs_mass_map_input.
      CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
        EXPORTING
          input  = gs_mass_map_input-article
        IMPORTING
          output = gs_mass_map_input-article.
      MOVE-CORRESPONDING gs_mass_map_input TO ls_article_site_count.
      ls_article_site_count-counts = 1.
      COLLECT ls_article_site_count INTO lt_article_site_count.   "adds 1 to the count if found
      MODIFY gt_mass_map_input FROM gs_mass_map_input.
    ENDLOOP.

* gather current uofm values for input file articles
    SELECT matnr meinh INTO TABLE lt_article_meinh
        FROM marm
        FOR ALL ENTRIES IN gt_mass_map_input
        WHERE matnr = gt_mass_map_input-article.

* gather current sites as per input file for validation purposes
    SELECT werks INTO TABLE lt_werks
       FROM t001w
       FOR ALL ENTRIES IN gt_mass_map_input
       WHERE werks = gt_mass_map_input-site.

* Get all active article/site from MBEW for those articles found in uploaded
* input file
    SELECT matnr BWKEY BWTAR VERPR PEINH into table lt_map
        from MBEW
        for ALL ENTRIES in gt_mass_map_input
        where matnr = gt_mass_map_input-article
          and BWTAR = ' '.                        "only blank BWTAR is needed

    LOOP AT lt_map INTO ls_map.
      ls_article-artnr = ls_map-matnr.
      COLLECT ls_article INTO lt_article.   "Creating a hash table by article only (has at least one site)
    ENDLOOP.

* Check each entry in input file for specific errors before processing for update
* Build table for later updating to bapi and reporting
    LOOP AT gt_mass_map_input INTO gs_mass_map_input.

      CLEAR: gs_mass_map_update.
      MOVE-CORRESPONDING gs_mass_map_input TO gs_mass_map_update.  "building the table of entries and update status
      gs_mass_map_update-lineref = sy-tabix.                       "Line number of input file
      gs_mass_map_update-comp  = p_bukrs.
      gs_mass_map_update-budat = p_budat.
      gs_mass_map_update-kongr = p_kongr.
      gs_mass_map_update-curtp = gc_10.

*   Validate site input in file only if run option is NOT "ALL Sites"
      IF p_all <> gc_x.
        IF gs_mass_map_input-site IS INITIAL.
          CALL METHOD save_message
            EXPORTING
              pv_text   = 'Blank Site not allowed, load stopped'
            CHANGING
              ps_record = gs_mass_map_update.
        ELSE.
          READ TABLE lt_werks INTO ls_werks
               WITH KEY werks = gs_mass_map_input-site.
          IF sy-subrc <> 0.
            CALL METHOD save_message
              EXPORTING
                pv_text   = 'Site is not a valid, load stopped'
              CHANGING
                ps_record = gs_mass_map_update.
          ENDIF.
        ENDIF.
      ELSE.
        IF gs_mass_map_input-site IS NOT INITIAL.
          CALL METHOD save_message
            EXPORTING
              pv_text   = 'Site input not allowed if ALL Site option used, load stopped'
            CHANGING
              ps_record = gs_mass_map_update.
        ENDIF.
      ENDIF.

*   Validate article/site not to be duplicated in file
      READ TABLE lt_article_site_count INTO ls_article_site_count
         WITH KEY article = gs_mass_map_input-article
                  site    = gs_mass_map_input-site.
      IF ls_article_site_count-counts > 1.
        CALL METHOD save_message
          EXPORTING
            pv_text   = 'Article/Site is duplicated in file, load stopped'
          CHANGING
            ps_record = gs_mass_map_update.
      ENDIF.

*   Validate Article to material master with at least one site present
      READ TABLE lt_article INTO ls_article
           WITH KEY artnr = gs_mass_map_input-article.
      IF sy-subrc <> 0.
        CALL METHOD save_message
          EXPORTING
            pv_text   = 'Article not valid with an assigned site, load stopped'
          CHANGING
            ps_record = gs_mass_map_update.
      ENDIF.

*   Validate for existing site and article assignment
      IF gs_mass_map_input-site IS NOT INITIAL.
        READ TABLE lt_map INTO ls_map
             WITH KEY matnr   = gs_mass_map_input-article
                      bwkey   = gs_mass_map_input-site.
        IF sy-subrc <> 0.
          CALL METHOD save_message
            EXPORTING
              pv_text   = 'Article not assigned to the site, load stopped'
            CHANGING
              ps_record = gs_mass_map_update.
        ENDIF.
      ENDIF.

* zero now allowed
*   Validate the map value
*      IF gs_mass_map_input-map IS INITIAL.
*        CALL METHOD save_message
*          EXPORTING
*            pv_text   = 'Moving Average Price is missing'
*          CHANGING
*            ps_record = gs_mass_map_update.
*      ENDIF.

*   Validate the price Unit value
      IF gs_mass_map_input-punit IS INITIAL.
        CALL METHOD save_message
          EXPORTING
            pv_text   = 'Price Unit is missing'
          CHANGING
            ps_record = gs_mass_map_update.
      ENDIF.

*   Validate the Unit of measure code
      IF gs_mass_map_input-msehi IS INITIAL.
        CALL METHOD save_message
          EXPORTING
            pv_text   = 'Unit of Measure must be present'
          CHANGING
            ps_record = gs_mass_map_update.
      ENDIF.
      IF gs_mass_map_input-msehi IS NOT INITIAL.
*       convert the msehi input value to a native value for db check
        CALL FUNCTION 'CONVERSION_EXIT_CUNIT_INPUT'
          EXPORTING
            input                = gs_mass_map_input-msehi
            LANGUAGE             = SY-LANGU
          IMPORTING
            OUTPUT               = lv_msehi
          EXCEPTIONS
            UNIT_NOT_FOUND       = 1
            OTHERS               = 2.
        IF sy-subrc <> 0.
          CALL METHOD save_message
            EXPORTING
              pv_text   = 'Unit of measure is not valid, load stopped'
            CHANGING
              ps_record = gs_mass_map_update.
        else.
          READ TABLE lt_article_meinh INTO ls_article_meinh
               WITH KEY matnr   = gs_mass_map_input-article
                        meinh   = lv_msehi.
          IF sy-subrc <> 0.
            CALL METHOD save_message
              EXPORTING
                pv_text   = 'Article not assigned to unit of measure, load stopped'
              CHANGING
                ps_record = gs_mass_map_update.
          ENDIF.
        ENDIF.
      ENDIF.
*   Validate currency
      IF gs_mass_map_input-curr <> 'CAD'.
        CALL METHOD save_message
          EXPORTING
            pv_text   = 'Currency not valid'
          CHANGING
            ps_record = gs_mass_map_update.
      ENDIF.

      IF gs_mass_map_update-error_flag IS INITIAL.
        gs_mass_map_update-valid_msg  = 'Entry valid'.
      ELSE.
        gs_mass_map_update-update_msg = 'Update was not attempted'.
      ENDIF.
      APPEND gs_mass_map_update TO gt_mass_map_update.

    ENDLOOP.

* Process to insert sites entries for articles if all sites are to be processed per article
* result is an input file larger than original with sites assigned
    IF gv_errors IS INITIAL AND p_all = gc_x.  "Only if input file is 100% validated
      lt_temp[] = gt_mass_map_update[].
      CLEAR: gt_mass_map_update[].
      LOOP AT lt_temp INTO gs_mass_map_update.
        LOOP AT lt_map INTO ls_map WHERE matnr = gs_mass_map_update-article.
          gs_mass_map_update-site = ls_map-bwkey.
          gs_mass_map_update-valid_msg  = 'Entry valid, Site auto assigned'.
          APPEND gs_mass_map_update TO gt_mass_map_update.
        ENDLOOP.
      ENDLOOP.
    ENDIF.

    if gv_errors is initial.

*     Mark all input records that need to be skipped as MAP value on DB matches what
*     is in input file for same article/site/UofM
      loop at gt_mass_map_update into gs_mass_map_update.
        read table lt_map INTO ls_map
          with table key matnr = gs_mass_map_update-article
                         bwkey = gs_mass_map_update-site.
                         " BWTAR = ' '.
        if sy-subrc = 0.
          if ls_map-VERPR = gs_mass_map_update-map and
             ls_map-PEINH = gs_mass_map_update-punit.
            gs_mass_map_update-error_flag = 'S'.
            gs_mass_map_update-valid_msg  = 'Entry valid, but MAP/UNIT same, thus skipped'.
            modify gt_mass_map_update from gs_mass_map_update.
          endif.
        endif.
      endloop.
    ENDIF.

  ENDMETHOD.

*----------------------------------------------------------------------*
  METHOD output_method .

    IF p_backgr = 'X' OR p_spool = 'X'.
      CALL METHOD prepare_container_background.
    ELSE.
      CALL METHOD init_alv_0101.
      CALL SCREEN 0101.
    ENDIF.

  ENDMETHOD.

  METHOD auth_check.

    AUTHORITY-CHECK OBJECT 'F_BKPF_BUK'
           ID 'BUKRS' FIELD p_bukrs    " from selection screen - Company code
           ID 'ACTVT' FIELD gc_aktyp.  " 01creen - Company code
    IF sy-subrc = 0.
      gv_errors = abap_false.
    ELSE.
      gv_errors = abap_true.
      MESSAGE text-024 TYPE gc_e.   "No authorization to run this program
    ENDIF.

  ENDMETHOD.

  METHOD prepare_job_and_submit.

    CONSTANTS:
          lc_jobname   TYPE btcjob VALUE 'ZP2P_MASS_MAP_UPDATE_JOB'.

    DATA: lv_string    TYPE string,
          lv_finished  TYPE btcstatus,
          lv_running   TYPE btcstatus,
          lv_scheduled TYPE btcstatus,
          lv_aborted   TYPE btcstatus,
          lv_ready     TYPE btcstatus,
          lv_jobcount  TYPE btcjobcnt,
          lv_srtfd     TYPE indx_srtfd.

    CALL FUNCTION 'JOB_OPEN'
      EXPORTING
        jobname          = lc_jobname
      IMPORTING
        jobcount         = lv_jobcount
      EXCEPTIONS
        cant_create_job  = 1
        invalid_job_data = 2
        jobname_missing  = 3
        OTHERS           = 4.
    IF sy-subrc = 0.
*     save the data that was prior uploaded from presentation server to a memory data cluster
      lv_srtfd = lv_jobcount.   "Use job count to establish the ID of the data cluster, thus mutliple users
*     Can run same program at same time.. no conflicts.
      EXPORT gt_mass_map_input from gt_mass_map_input to DATABASE zp2p_cluster(zp) ID lv_srtfd.
      IF sy-subrc <> 0.
        CALL METHOD run_message
          EXPORTING
            pv_type = 'E'
            pv_text = 'Failed to Save Data for Pending Background Job'.
        WRITE: /001 'Failed to Save Data for Pending Background Job'.
      ELSE.
        SUBMIT zp2p_cr00_mass_map_update
          USING SELECTION-SCREEN 1000
          WITH p_job    EQ 'X'                "must use X to let job know it running 2nd step as background
          WITH p_srtfd  EQ lv_srtfd           "the data cluster id to be passed to the submited program
          WITH p_uload  EQ p_uload
          WITH p_hdlin  EQ p_hdlin
          WITH p_online EQ p_online
          WITH p_backgr EQ p_backgr
          WITH p_alv    EQ ' '
          WITH p_spool  EQ 'X'
          WITH p_email  EQ p_email
          WITH p_eaddr  EQ p_eaddr
          WITH p_slg1   EQ p_slg1
          WITH p_bukrs  EQ p_bukrs
          WITH p_budat  EQ p_budat
          WITH p_kongr  EQ p_kongr
          WITH p_site   EQ p_site
          WITH p_all    EQ p_all
          VIA JOB lc_jobname   " JOBNAME
          NUMBER lv_jobcount   " UNIQUE ID OF JOB
          AND RETURN.
        IF sy-subrc = 0.
          CALL FUNCTION 'JOB_CLOSE'
            EXPORTING
              jobcount             = lv_jobcount
              jobname              = lc_jobname
              strtimmed            = 'X'
            EXCEPTIONS
              cant_start_immediate = 1
              invalid_startdate    = 2
              jobname_missing      = 3
              job_close_failed     = 4
              job_nosteps          = 5
              job_notex            = 6
              lock_failed          = 7
              invalid_target       = 8
              OTHERS               = 9.
          IF sy-subrc <> 0.
            MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
               WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
            DELETE FROM DATABASE zp2p_cluster(zp) ID p_srtfd.
            IF sy-subrc <> 0.
              CALL METHOD run_message
                EXPORTING
                  pv_type = 'E'
                  pv_text = 'Failed to Remove memory Data for Background Job Receival'.
              WRITE: /001 'Failed to Remove memory Data for Background Job Receival'.
            ENDIF.
          ELSE.
            "Inform SLG1 that job was been sumitted.
            CALL METHOD run_message
              EXPORTING
                pv_type = 'I'
                pv_text = 'Background Job successfully submitted for MASS MAP Update'.
            WRITE: /001 'Background Job successfully submitted for MASS MAP Update:', lc_jobname.

            CALL FUNCTION 'SHOW_JOBSTATE'
              EXPORTING
                jobcount         = lv_jobcount
                jobname          = lc_jobname
              IMPORTING
                finished         = lv_finished
                running          = lv_running
                ready            = lv_ready
                scheduled        = lv_scheduled
                aborted          = lv_aborted
              EXCEPTIONS
                jobcount_missing = 1
                jobname_missing  = 2
                job_notex        = 3
                OTHERS           = 4.
            IF sy-subrc = 0.
              IF lv_running IS NOT INITIAL.
                CALL METHOD run_message
                  EXPORTING
                    pv_type = 'I'
                    pv_text = 'Background Job is running for MASS MAP Update'.
                WRITE: /001 'Background Job is running MASS MAP Update:', lc_jobname.
              ELSE.
                IF lv_finished IS NOT INITIAL.
                  CALL METHOD run_message
                    EXPORTING
                      pv_type = 'I'
                      pv_text = 'Background Job has run and is completed for MASS MAP Update'.
                  WRITE: /001 'Background Job has run and is is completed for MASS MAP Update:', lc_jobname.
                ELSE.
                  IF lv_aborted IS NOT INITIAL.
                    CALL METHOD run_message
                      EXPORTING
                        pv_type = 'I'
                        pv_text = 'Background Job has aborted its run for MASS MAP Update'.
                    WRITE: /001 'Background Job has aborted its run for MASS MAP Update:', lc_jobname.
                  ELSE.
                    IF lv_scheduled IS NOT INITIAL.
                      CALL METHOD run_message
                        EXPORTING
                          pv_type = 'I'
                          pv_text = 'Background Job is scheduled for MASS MAP Update'.
                      WRITE: /001 'Background Job is scheduled for MASS MAP Update:', lc_jobname.
                    ELSE.
                      IF lv_ready IS NOT INITIAL.
                        CALL METHOD run_message
                          EXPORTING
                            pv_type = 'I'
                            pv_text = 'Background Job is ready to start for MASS MAP Update'.
                        WRITE: /001 'Background Job is ready to start for MASS MAP Update:', lc_jobname.
                      ELSE.
                        CALL METHOD run_message
                          EXPORTING
                            pv_type = 'I'
                            pv_text = 'Background Job is pending for start for MASS MAP Update'.
                        WRITE: /001 'Background Job is pending for start for MASS MAP Update:', lc_jobname.
                      ENDIF.
                    ENDIF.
                  ENDIF.
                ENDIF.
              ENDIF.
              RETURN.  "success for job submit, return to calling routine
            ENDIF.
          ENDIF.
        ENDIF.
      ENDIF.
    ENDIF.

* If logic got to this point, Issue error message that background job did not get submitted.
    CALL METHOD run_message
      EXPORTING
        pv_type = 'E'
        pv_text = 'Job MASS MAP Update failed to be submitted'.

    WRITE: /001 'Job MASS MAP Update failed to be submitted:', lc_jobname.

  ENDMETHOD.

  METHOD process_results .

    DATA: ls_messages TYPE bapireturn1.
    DATA: lv_string   TYPE BAPI_MSG.

* Output all generated messages to the SLG1 if requested by user
    IF p_slg1 = 'X'.
      LOOP AT gt_mass_map_update_msgs INTO ls_messages.
        MESSAGE ID ls_messages-id
              TYPE ls_messages-type
            NUMBER ls_messages-number
              WITH ls_messages-MESSAGE_V1
                   ls_messages-MESSAGE_V2
                   ls_messages-MESSAGE_V3
                   ls_messages-MESSAGE_V4
              INTO lv_string.

        " Add log
        go_log->add( ).
      ENDLOOP.
    ENDIF.


* We create an ALV to display on Spool Request the each user and email results
    IF p_email = abap_true.
      CALL METHOD lcl_email=>send_class_email.
    ENDIF.

    CALL METHOD output_method.

  ENDMETHOD.

  METHOD process_bapi.

    DATA: lv_comp  TYPE bapi2027_pc_hd-comp_code,
          lv_pdate TYPE bapi2027_pc_hd-pstng_date,
          lv_kongr TYPE ckml_kongr,
          lv_curtp TYPE curtp,
          lv_year  TYPE bapi2027_pc_ex-ml_doc_year,
          lv_doc   TYPE bapi2027_pc_ex-ml_doc_num,
          lv_error TYPE char1,
          lv_line_limit type i,
          lv_par1  TYPE SYMSGV,
          lv_par2  TYPE SYMSGV,
          lv_par3  TYPE SYMSGV,
          lv_par4  TYPE SYMSGV.

    DATA: lv_char5 type char05.

    DATA: lt_update              TYPE TABLE OF ts_mass_map_update,
          ls_update              TYPE ts_mass_map_update,
          lt_update_pend         TYPE TABLE OF ts_mass_map_update,
          ls_update_pend         TYPE ts_mass_map_update,
          lt_material_price_list TYPE TABLE OF bapi2027_pc_list,
          ls_material_price_list TYPE bapi2027_pc_list,
          lt_return              TYPE TABLE OF bapireturn1,
          ls_return              TYPE bapireturn1,
          lv_message             TYPE string,
          lv_linecount           TYPE i,
          lv_update_count        TYPE i.


* Do not process for update if validation errors exists
    CHECK gv_errors = abap_false.

    lv_line_limit = p_ulimit.

    lv_comp  = p_bukrs.
    lv_pdate = p_budat.
    lv_kongr = p_kongr.

    lt_update[] = gt_mass_map_update[].
    CLEAR: gt_mass_map_update[].        "We update for final later on each call bapi cycle

    LOOP AT lt_update INTO ls_update.

      if ls_update-error_flag = 'S'.  "input record was marked for pending skip from update
        gs_mass_map_update            = ls_update.
        gs_mass_map_update-update_msg = 'MAP UPDATE:No Update required, Skipped'.
        gs_mass_map_update-error_flag = 'S'.
        APPEND gs_mass_map_update TO gt_mass_map_update.
        call method info_message exporting pv_text = 'MAP UPDATE:No Update required, Skipped'
                                           ps_mass_map_update = gs_mass_map_update
                                 changing  ps_return = ls_return.
        append ls_return to gt_mass_map_update_msgs.
        continue.  "loop to the next input record to process
      endif.

      ls_update_pend = ls_update.
      APPEND ls_update_pend TO lt_update_pend.

*   Fill out BAPI outbound call structure
      ls_material_price_list-plant              = ls_update-site.
      ls_material_price_list-material           = ls_update-article.
      ls_material_price_list-val_type           = ' '.
      ls_material_price_list-sales_ord          = ' '.
      ls_material_price_list-s_ord_item         = ' '.
      ls_material_price_list-wbs_element        = ' '.
      ls_material_price_list-curr_type          = ls_update-curtp.
      ls_material_price_list-change_std_price   = ' '.
      ls_material_price_list-std_price          = 0.
      ls_material_price_list-change_mov_price   = gc_x.
      ls_material_price_list-moving_pr          = ls_update-map.
      ls_material_price_list-currency           = ls_update-curr.
      ls_material_price_list-iso_code           = ' '.
      ls_material_price_list-price_unit         = ls_update-punit.
      CALL FUNCTION 'CONVERSION_EXIT_CUNIT_INPUT'
          EXPORTING
            input                = ls_update-msehi
            LANGUAGE             = SY-LANGU
          IMPORTING
            OUTPUT               = ls_material_price_list-quantity_unit
          EXCEPTIONS
            UNIT_NOT_FOUND       = 1
            OTHERS               = 2.
      IF sy-subrc <> 0.
      ENDIF.
      ls_material_price_list-isocode_unit       = ' '.
      APPEND ls_material_price_list TO lt_material_price_list.
      ADD 1 TO lv_linecount.

      IF lv_linecount = lv_line_limit.    "Maximum line count reached, do the bapi call

        CLEAR: lv_year, lv_doc, lt_return.

*     Call bapi and perform MAP Update
        CALL FUNCTION 'ZP2P_BAPI_CREATEPRICECHG'
          EXPORTING
            comp_code           = lv_comp
            pstng_date          = lv_pdate
            zkongr              = lv_kongr
          IMPORTING
            ml_doc_year         = lv_year
            ml_doc_num          = lv_doc
          TABLES
            material_price_list = lt_material_price_list
            return              = lt_return.

*     Test the results of the bapi call and build the result message
        IF lv_doc IS NOT INITIAL.
          lv_message = 'MAP UPDATE:Batch Successful'.
          lv_error   = space.
        ELSE.
          lv_message = 'MAP UPDATE:Batch Failed - Consult Error records returned'.
          lv_error   = 'X'.
        ENDIF.
*     Transfer the results of the bapi call to the result article lines used in the call
        LOOP AT lt_update_pend INTO ls_update_pend.
          gs_mass_map_update            = ls_update_pend.
          gs_mass_map_update-doc_year   = lv_year.
          gs_mass_map_update-doc_num    = lv_doc.
          gs_mass_map_update-update_msg = lv_message.
          gs_mass_map_update-error_flag = lv_error.
          APPEND gs_mass_map_update TO gt_mass_map_update.
          if p_slg1 = 'X' and lv_error = space.  "as there is no error we need to create success message
             call method success_message exporting ps_mass_map_update = gs_mass_map_update
                                         changing  ps_return = ls_return.
             append ls_return to lt_return.
          endif.
          if lv_error = space.
              lv_update_count = lv_update_count + 1.
          endif.
        ENDLOOP.

*     Transfer the results of the bapi call messages to the result messages
        APPEND LINES OF lt_return TO gt_mass_map_update_msgs.

        CLEAR: lt_update_pend, lv_linecount, lt_return.
        refresh: lt_update_pend, lt_return.
        CLEAR: lt_material_price_list. refresh lt_material_price_list.

        if lv_doc is not initial.
          CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
*           EXPORTING
*             WAIT          =
*           IMPORTING
*             RETURN        =
          .
        else.
          CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'
*           EXPORTING
*             WAIT          =
*           IMPORTING
*             RETURN        =
          .
        endif.

      ENDIF.

    ENDLOOP.

    IF lt_material_price_list[] IS NOT INITIAL.  "Still have unprocessed entries, do final bapi call

      CLEAR: lv_year, lv_doc, lt_return.

*   Call bapi and perform MAP Update
      CALL FUNCTION 'ZP2P_BAPI_CREATEPRICECHG'
        EXPORTING
          comp_code           = lv_comp
          pstng_date          = lv_pdate
          zkongr              = lv_kongr
        IMPORTING
          ml_doc_year         = lv_year
          ml_doc_num          = lv_doc
        TABLES
          material_price_list = lt_material_price_list
          return              = lt_return.

*   Test the results of the bapi call and build the result message
      IF lv_doc IS NOT INITIAL.
        lv_message = 'MAP UPDATE:Batch Successful'.
        lv_error   = space.
      ELSE.
        lv_message = 'MAP UPDATE:Batch Failed - Consult Error records returned'.
        lv_error   = 'X'.
      ENDIF.
*   Transfer the results of the bapi call to the result article lines used in the call
      LOOP AT lt_update_pend INTO ls_update_pend.

        gs_mass_map_update            = ls_update_pend.
        gs_mass_map_update-doc_year   = lv_year.
        gs_mass_map_update-doc_num    = lv_doc.
        gs_mass_map_update-update_msg = lv_message.
        gs_mass_map_update-error_flag = lv_error.
        APPEND gs_mass_map_update TO gt_mass_map_update.
        if p_slg1 = 'X' and lv_error = space.  "as there is no error we need to create success message
          call method success_message exporting ps_mass_map_update = gs_mass_map_update
                                      changing  ps_return = ls_return.
          append ls_return to lt_return.
        endif.
        if lv_error = space.
          lv_update_count = lv_update_count + 1.
        endif.

      ENDLOOP.

*   Transfer the results of the bapi call messages to the result messages
      APPEND LINES OF lt_return TO gt_mass_map_update_msgs.

      if lv_doc is not initial.
         CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
*           EXPORTING
*             WAIT          =
*           IMPORTING
*             RETURN        =
         .
      else.
         CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'
*           EXPORTING
*             WAIT          =
*           IMPORTING
*             RETURN        =
         .
      endif.

    ENDIF.

    if lv_update_count = 0.
        call method general_info_message exporting pv_text = 'MAP UPDATE:No Update occurred for any records'
                                         changing  ps_return = ls_return.
        append ls_return to gt_mass_map_update_msgs.
    else.
        call method general_info_message exporting pv_text = 'MAP UPDATE:Updates occurred'
                                         changing  ps_return = ls_return.
        append ls_return to gt_mass_map_update_msgs.
    endif.

  ENDMETHOD.

  METHOD prepare_container_background .

    DATA:
      lt_fcat1   TYPE lvc_t_fcat,
      lt_fcat2   TYPE lvc_t_fcat,
      ls_dock1   TYPE REF TO cl_gui_docking_container,
      ls_dock2   TYPE REF TO cl_gui_docking_container,
      ls_layout1 TYPE lvc_s_layo,
      ls_layout2 TYPE lvc_s_layo.

    DATA:
      wa_cat     TYPE slis_fieldcat_alv,      " WA catálogo
      ti_cat1    TYPE slis_t_fieldcat_alv,    " TI catálogo
      ti_cat2    TYPE slis_t_fieldcat_alv,    " TI catálogo
      wa_sort    TYPE slis_sortinfo_alv,      " WA sort
      ti_sort    TYPE slis_t_sortinfo_alv,    " TI sort
      wa_layout1 TYPE slis_layout_alv,        " WA opciones lista
      wa_layout2 TYPE slis_layout_alv,        " WA opciones lista
      wa_events  TYPE slis_alv_event,         " WA eventos lista
      ti_events  TYPE slis_t_event,           " TI eventos lista
      wa_header  TYPE slis_listheader,        " WA cabecera lista
      ti_header  TYPE slis_t_listheader.      " TI cabecera lista

    DATA:
      ls_data TYPE zp2p_43060_cr00_mass_map_updt,
      lt_data TYPE TABLE OF zp2p_43060_cr00_mass_map_updt.

    DATA: t_events TYPE slis_t_event.
    DATA: w_events TYPE slis_alv_event.
    DATA: l_print  TYPE slis_print_alv.

    l_print-print              = 'X'. "Print ALV
    l_print-no_print_listinfos = 'X'.
    w_events-name = 'END_OF_LIST'.    "Call event
    w_events-form = 'END_OF_LIST'.
    APPEND w_events TO t_events.

    CALL METHOD set_grid_list_bg
      EXPORTING
        p_type  = gc_update
      CHANGING
        ct_list = ti_cat1.

    CALL METHOD prepare_layout_bg
      EXPORTING
        p_type     = gc_update
      CHANGING
        pcs_layout = wa_layout1.

* transfer data table to ALV table
    LOOP AT gt_mass_map_update INTO gs_mass_map_update.
      MOVE-CORRESPONDING gs_mass_map_update TO ls_data.
      APPEND ls_data TO lt_data.
    ENDLOOP.

    CALL FUNCTION 'REUSE_ALV_LIST_DISPLAY'
      EXPORTING
        i_callback_program = sy-repid
        i_structure_name   = 'ZP2P_43060_CR00_MASS_MAP_UPDT'
        it_events          = t_events[]
        is_print           = l_print
        is_layout          = wa_layout1
        it_fieldcat        = ti_cat1
      TABLES
        t_outtab           = lt_data
      EXCEPTIONS
        program_error      = 1
        OTHERS             = 2.

    IF sy-subrc <> 0.
      MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
              WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    ENDIF.

  ENDMETHOD.

  METHOD end_of_list.

    DATA:
      lt_fcat1   TYPE lvc_t_fcat,
      lt_fcat2   TYPE lvc_t_fcat,
      ls_dock1   TYPE REF TO cl_gui_docking_container,
      ls_dock2   TYPE REF TO cl_gui_docking_container,
      ls_layout1 TYPE lvc_s_layo,
      ls_layout2 TYPE lvc_s_layo.

    DATA:
      wa_cat     TYPE slis_fieldcat_alv,      " WA catálogo
      ti_cat1    TYPE slis_t_fieldcat_alv,    " TI catálogo
      ti_cat2    TYPE slis_t_fieldcat_alv,    " TI catálogo
      wa_sort    TYPE slis_sortinfo_alv,      " WA sort
      ti_sort    TYPE slis_t_sortinfo_alv,    " TI sort
      wa_layout1 TYPE slis_layout_alv,        " WA opciones lista
      wa_layout2 TYPE slis_layout_alv,        " WA opciones lista
      wa_events  TYPE slis_alv_event,         " WA eventos lista
      ti_events  TYPE slis_t_event,           " TI eventos lista
      wa_header  TYPE slis_listheader,        " WA cabecera lista
      ti_header  TYPE slis_t_listheader.      " TI cabecera lista

    DATA:
      ls_data TYPE zp2p_43060_cr00_mass_map_updt.

    DATA: t_events TYPE slis_t_event.
    DATA: w_events TYPE slis_alv_event.
    DATA: l_print  TYPE slis_print_alv.

    CALL METHOD set_grid_list_bg
      EXPORTING
        p_type  = gc_messages
      CHANGING
        ct_list = ti_cat2.

    CALL METHOD prepare_layout_bg
      EXPORTING
        p_type     = gc_messages
      CHANGING
        pcs_layout = wa_layout2.

    CALL FUNCTION 'REUSE_ALV_LIST_DISPLAY'
      EXPORTING
        i_callback_program = sy-repid
        i_structure_name   = 'bapireturn1'
        is_layout          = wa_layout2
        it_fieldcat        = ti_cat2
      TABLES
        t_outtab           = gt_mass_map_update_msgs
      EXCEPTIONS
        program_error      = 1
        OTHERS             = 2.

    IF sy-subrc <> 0.
      MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
              WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    ENDIF.

  ENDMETHOD.

  METHOD: init_alv_0101.

    DATA:
      ls_data TYPE zp2p_43060_cr00_mass_map_updt,
      lt_data TYPE TABLE OF zp2p_43060_cr00_mass_map_updt.

    DATA: lvs_variant            TYPE disvariant,
          lvs_variant2           TYPE disvariant,
          lvf_save               TYPE char1,
          lvf_save2              TYPE char1,
          lvt_fieldcat           TYPE lvc_t_fcat,
          lvt_fieldcat2          TYPE lvc_t_fcat,
          lvt_excl_toolbar_icons TYPE ui_functions,
          lvs_stable             TYPE lvc_s_stbl,
          lvs_layout             TYPE lvc_s_layo,
          lvs_layout2            TYPE lvc_s_layo.

* Initial creation of containers and data prep for the resulting grids
    IF go_container IS INITIAL.

      CREATE OBJECT go_container
        EXPORTING
*         PARENT                      =
          container_name              = 'CONTAINER'
*         STYLE                       =
*         LIFETIME                    = lifetime_default
*         REPID                       =
*         DYNNR                       =
*         NO_AUTODEF_PROGID_DYNNR     =
        EXCEPTIONS
          cntl_error                  = 1
          cntl_system_error           = 2
          create_error                = 3
          lifetime_error              = 4
          lifetime_dynpro_dynpro_link = 5
          OTHERS                      = 6.

      IF sy-subrc <> 0.
        MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
                   WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
      ENDIF.

      CREATE OBJECT go_container_splitter
        EXPORTING
*          link_dynnr        = '0101'
*          link_repid        = sy-repid
*         SHELLSTYLE        =
*         LEFT              =
*         TOP               =
*         WIDTH             =
*         HEIGHT            =
*         METRIC            = cntl_metric_dynpro
          parent            = go_container
          rows              = 2
          columns           = 1
          align             = 15  " (splitter fills the hole custom container)
*         NO_AUTODEF_PROGID_DYNNR =
*         NAME              =
        EXCEPTIONS
          cntl_error        = 1
          cntl_system_error = 2
          OTHERS            = 3.

      IF sy-subrc <> 0.
        MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
                   WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
      ENDIF.

      CALL METHOD go_container_splitter->get_container
        EXPORTING
          row       = 1
          column    = 1
        RECEIVING
          container = go_container_top.

      CALL METHOD go_container_splitter->get_container
        EXPORTING
          row       = 2
          column    = 1
        RECEIVING
          container = go_container_bottom.

    ENDIF.

    IF go_alv_grid_top IS INITIAL.

*   transfer data table to ALV table
      LOOP AT gt_mass_map_update INTO gs_mass_map_update.
        MOVE-CORRESPONDING gs_mass_map_update TO ls_data.
        APPEND ls_data TO gt_data.
      ENDLOOP.

      CREATE OBJECT go_alv_grid_top
        EXPORTING
*         I_SHELLSTYLE      = 0
*         I_LIFETIME        =
          i_parent          = go_container_top
*         I_APPL_EVENTS     = space
*         I_PARENTDBG       =
*         I_APPLOGPARENT    =
*         I_GRAPHICSPARENT  =
*         I_USE_VARIANT_CLASS = SPACE
*         I_NAME            =
        EXCEPTIONS
          error_cntl_create = 1
          error_cntl_init   = 2
          error_cntl_link   = 3
          error_dp_create   = 4
          OTHERS            = 5.

      IF sy-subrc <> 0.
        MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
                   WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
      ENDIF.

*      CALL METHOD exclude_toolbar_icons
*        EXPORTING
*          p_type                 = gc_update
*        CHANGING
*          pct_excl_toolbar_icons = lvt_excl_toolbar_icons.

      CALL METHOD set_grid_list_0101
        EXPORTING
          p_type  = gc_update
        CHANGING
          ct_list = lvt_fieldcat.

      CALL METHOD prepare_layout
        EXPORTING
          p_type     = gc_update
        CHANGING
          pcs_layout = lvs_layout.

      GET PARAMETER ID 'SD_VARIANT_MAINTAIN' FIELD lvf_save.
      lvs_variant-report   = sy-repid.
      lvs_variant-username = sy-uname.
      lvs_variant-variant  = 'TOP'.
      lvf_save = 'A'.

*     lvs_variant-handle = gc_update.

      CALL METHOD go_alv_grid_top->set_table_for_first_display
        EXPORTING
*         I_BYPASSING_BUFFER            =
*         I_BUFFER_ACTIVE               =
*         I_CONSISTENCY_CHECK           =
*         I_STRUCTURE_NAME              =
          is_variant                    = lvs_variant
          i_save                        = lvf_save
          I_DEFAULT                     = 'X'
          is_layout                     = lvs_layout
*         IS_PRINT                      =
*         IT_SPECIAL_GROUPS             =
**        it_toolbar_excluding          = lvt_excl_toolbar_icons
*         IT_HYPERLINK                  =
*         IT_ALV_GRAPHICS               =
*         IT_EXCEPT_QINFO               =
        CHANGING
          it_outtab                     = gt_data[]
          it_fieldcatalog               = lvt_fieldcat
*         IT_SORT                       =
*         IT_FILTER                     =
        EXCEPTIONS
          invalid_parameter_combination = 1
          program_error                 = 2
          too_many_lines                = 3
          OTHERS                        = 4.

      IF sy-subrc <> 0.
        MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
                   WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
      ENDIF.

*      CREATE OBJECT go_event_handler_top.
*      SET HANDLER go_event_handler_top->handle_user_command
*                  go_event_handler_top->handle_toolbar
*                  go_event_handler_top->on_double_click
*                  go_event_handler_top->on_hotspot_click
*                                        FOR go_alv_grid_top.

*     CALL METHOD go_alv_grid_top->set_toolbar_interactive.
    ELSE.
      lvs_stable-row = gc_true.
      lvs_stable-col = gc_true.

      CALL METHOD go_alv_grid_top->refresh_table_display
        EXPORTING
          is_stable      = lvs_stable
          i_soft_refresh = gc_true
        EXCEPTIONS
          finished       = 1
          OTHERS         = 2.

      IF sy-subrc <> 0.
        MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
                   WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
      ENDIF.

    ENDIF.

    IF go_alv_grid_bottom IS INITIAL.
      CREATE OBJECT go_alv_grid_bottom
        EXPORTING
*         I_SHELLSTYLE      = 0
*         I_LIFETIME        =
          i_parent          = go_container_bottom
*         I_APPL_EVENTS     = space
*         I_PARENTDBG       =
*         I_APPLOGPARENT    =
*         I_GRAPHICSPARENT  =
*         I_USE_VARIANT_CLASS = SPACE
*         I_NAME            =
        EXCEPTIONS
          error_cntl_create = 1
          error_cntl_init   = 2
          error_cntl_link   = 3
          error_dp_create   = 4
          OTHERS            = 5.

      IF sy-subrc <> 0.
        MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
                   WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
      ENDIF.

*      CALL METHOD exclude_toolbar_icons
*        EXPORTING
*          p_type                 = gc_messages
*        CHANGING
*          pct_excl_toolbar_icons = lvt_excl_toolbar_icons.

      CALL METHOD set_grid_list_0101
        EXPORTING
          p_type  = gc_messages
        CHANGING
          ct_list = lvt_fieldcat2.

      CALL METHOD prepare_layout
        EXPORTING
          p_type     = gc_messages
        CHANGING
          pcs_layout = lvs_layout2.

      GET PARAMETER ID 'SD_VARIANT_MAINTAIN' FIELD lvf_save.
*     lvs_variant-handle = gc_messages.
      lvs_variant-report   = sy-repid.
      lvs_variant-username = sy-uname.
      lvs_variant-variant  = 'BOT'.
      lvf_save = 'A'.

      CALL METHOD go_alv_grid_bottom->set_table_for_first_display
        EXPORTING
*         I_BYPASSING_BUFFER            =
*         I_BUFFER_ACTIVE               =
*         I_CONSISTENCY_CHECK           =
*         I_STRUCTURE_NAME              =
          is_variant                    = lvs_variant
          i_save                        = lvf_save2
          I_DEFAULT                     = 'X'
          is_layout                     = lvs_layout
*         IS_PRINT                      =
*         IT_SPECIAL_GROUPS             =
*         it_toolbar_excluding          = lvt_excl_toolbar_icons
*         IT_HYPERLINK                  =
*         IT_ALV_GRAPHICS               =
*         IT_EXCEPT_QINFO               =
        CHANGING
          it_outtab                     = gt_mass_map_update_msgs[]
          it_fieldcatalog               = lvt_fieldcat2
*         IT_SORT                       =
*         IT_FILTER                     =
        EXCEPTIONS
          invalid_parameter_combination = 1
          program_error                 = 2
          too_many_lines                = 3
          OTHERS                        = 4.

      IF sy-subrc <> 0.
        MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
                   WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
      ENDIF.

*      CREATE OBJECT go_event_handler_bottom.
*      SET HANDLER go_event_handler_bottom->on_hotspot_click
*                                    FOR go_alv_grid_bottom.

    ELSE.
      lvs_stable-col = gc_true.
      lvs_stable-row = gc_true.
      CALL METHOD go_alv_grid_bottom->refresh_table_display
        EXPORTING
          is_stable      = lvs_stable
          i_soft_refresh = gc_true
        EXCEPTIONS
          finished       = 1
          OTHERS         = 2.

      IF sy-subrc <> 0.
        MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
                   WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
      ENDIF.

    ENDIF.

  ENDMETHOD.

  METHOD exit_command_0101.

    CALL METHOD cl_gui_cfw=>dispatch.

    CASE gv_okcode.
      WHEN gc_exit OR gc_canc OR gc_back.
        CALL METHOD go_container->free.
        CALL METHOD cl_gui_cfw=>flush.
        CLEAR go_container.
        CLEAR go_alv_grid_top.
        CLEAR go_alv_grid_bottom.
        SET SCREEN 0.
        LEAVE SCREEN.
      WHEN OTHERS.
    ENDCASE.

  ENDMETHOD.

  METHOD set_status_0101 .

    SET PF-STATUS '0101'.
    SET TITLEBAR  '0101'.

  ENDMETHOD.


  METHOD user_command_0101.

    DATA: l_okcode LIKE sy-ucomm.

    l_okcode = pcv_okcode.
    CLEAR pcv_okcode.

    CALL METHOD cl_gui_cfw=>dispatch.

    CASE l_okcode.
      WHEN gc_exit OR gc_back OR gc_canc.
        CALL METHOD go_container->free.
        CALL METHOD cl_gui_cfw=>flush.
        CLEAR go_container.
        CLEAR go_alv_grid_top.
        CLEAR go_alv_grid_bottom.
        SET SCREEN 0.
        LEAVE SCREEN.
      WHEN OTHERS.
    ENDCASE.

  ENDMETHOD.

  METHOD exclude_toolbar_icons.

    DATA: lvs_excl_toolbar_icons TYPE ui_func.

    CLEAR: pct_excl_toolbar_icons.

    CASE p_type.
      WHEN gc_update.
        lvs_excl_toolbar_icons = cl_gui_alv_grid=>mc_fc_graph.
        APPEND lvs_excl_toolbar_icons TO pct_excl_toolbar_icons.

        lvs_excl_toolbar_icons = cl_gui_alv_grid=>mc_fc_info.
        APPEND lvs_excl_toolbar_icons TO pct_excl_toolbar_icons.

      WHEN gc_messages.
        lvs_excl_toolbar_icons = cl_gui_alv_grid=>mc_fc_graph.
        APPEND lvs_excl_toolbar_icons TO pct_excl_toolbar_icons.

        lvs_excl_toolbar_icons = cl_gui_alv_grid=>mc_fc_info.
        APPEND lvs_excl_toolbar_icons TO pct_excl_toolbar_icons.

    ENDCASE.
  ENDMETHOD.

  METHOD prepare_layout.

    CLEAR: pcs_layout.

    IF p_type EQ gc_update.
      pcs_layout-grid_title = text-t01.
      pcs_layout-CWIDTH_OPT = abap_true.
      pcs_layout-ZEBRA = abap_true.
      pcs_layout-SMALLTITLE = abap_true.
    ELSEIF p_type EQ gc_messages.
      pcs_layout-grid_title = text-t02.
      pcs_layout-CWIDTH_OPT = abap_true.
      pcs_layout-ZEBRA = abap_true.
      pcs_layout-SMALLTITLE = abap_true.
    ENDIF.

  ENDMETHOD.

*----------------------------------------------------------------------*
*       Form  prepare_layout_bg
*----------------------------------------------------------------------*
  METHOD prepare_layout_bg.

    CLEAR: pcs_layout.

    IF p_type EQ gc_update.
      pcs_layout-window_titlebar = text-t01.
    ELSEIF p_type EQ gc_messages.
      pcs_layout-window_titlebar = text-t02.
      pcs_layout-list_append     = 'X'.       "Append new ALV list
    ENDIF.

  ENDMETHOD.

  METHOD set_grid_list_0101.

    DATA:
      ls_fcat  TYPE lvc_s_fcat,
      ls_struc TYPE tabname.

    IF p_type = gc_update.
      ls_struc = gc_alv_struc.
    ELSE.
      ls_struc = gc_alv_msgs.
    ENDIF.

* STEP 1: retrieve the fieldcatalog
    CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
      EXPORTING
        i_structure_name       = ls_struc
      CHANGING
        ct_fieldcat            = ct_list[]
      EXCEPTIONS
        inconsistent_interface = 1
        program_error          = 2
        OTHERS                 = 3.

    IF sy-subrc EQ 0.

*   STEP 2: modify the fieldcatalog for proper text labels .
      LOOP AT ct_list INTO ls_fcat.
        IF p_type = 'UPDATE'.
          CASE ls_fcat-fieldname.
            WHEN 'COMP'.
              ls_fcat-reptext   = 'Comp Code'.
            WHEN 'BUDAT'.
              ls_fcat-reptext   = 'Post Date'.
            WHEN 'KONGR'.
              ls_fcat-reptext   = 'Assign Reason'.
            WHEN 'SITE'.
              ls_fcat-reptext   = 'Site'.
            WHEN 'MAP'.
              ls_fcat-reptext   = 'MovAvgPrice'.
            WHEN 'CURR'.
              ls_fcat-reptext   = 'Currency'.
            WHEN 'PUNIT'.
              ls_fcat-reptext   = 'Price Unit'.
            WHEN 'MSEHI'.
              ls_fcat-reptext   = 'UofM'.
            WHEN 'ERROR_FLAG'.
              ls_fcat-reptext   = 'Err Flag'.
            WHEN 'VALID_MSG'.
              ls_fcat-reptext   = 'Validate Message'.
            WHEN 'UPDATE_MSG'.
              ls_fcat-reptext   = 'Update Message'.
            WHEN OTHERS.
              CONTINUE.
          ENDCASE.
        ELSE.
          CASE ls_fcat-fieldname.
            WHEN 'TYPE'.
              ls_fcat-reptext   = 'TYPE'.
            WHEN 'ID'.
              ls_fcat-reptext   = 'MSG ID'.
            WHEN 'NUMBER'.
              ls_fcat-reptext   = 'MSG No'.
            WHEN 'MESSAGE'.
              ls_fcat-reptext   = 'Message Text'.
            WHEN 'LOG_NO'.
              ls_fcat-reptext   = 'Log No'.
            WHEN 'LOG_MSG_NO'.
              ls_fcat-reptext   = 'Log Msg No'.
            WHEN 'MESSAGE_V1'.
              ls_fcat-reptext   = 'MSG Var 1'.
            WHEN 'MESSAGE_V2'.
              ls_fcat-reptext   = 'MSG Var 2'.
            WHEN 'MESSAGE_V3'.
              ls_fcat-reptext   = 'MSG Var 3'.
            WHEN 'MESSAGE_V4'.
              ls_fcat-reptext   = 'MSG Var 4'.
            WHEN OTHERS.
              CONTINUE.
          ENDCASE.
        ENDIF.

        ls_fcat-scrtext_l = ls_fcat-scrtext_m = ls_fcat-scrtext_s = ls_fcat-reptext.
        MODIFY ct_list FROM ls_fcat TRANSPORTING reptext scrtext_l scrtext_m scrtext_s
        WHERE fieldname = ls_fcat-fieldname.
      ENDLOOP.

    ENDIF.

  ENDMETHOD.

  METHOD set_grid_list_bg.

    DATA:
      ls_fcat  TYPE slis_fieldcat_alv,
      ls_struc TYPE tabname.

    IF p_type = gc_update.
      ls_struc = gc_alv_struc.
    ELSE.
      ls_struc = gc_alv_msgs.
    ENDIF.

* STEP 1: retrieve the fieldcatalog
    CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
      EXPORTING
        i_structure_name       = ls_struc
      CHANGING
        ct_fieldcat            = ct_list[]
      EXCEPTIONS
        inconsistent_interface = 1
        program_error          = 2
        OTHERS                 = 3.
    IF sy-subrc EQ 0.

*   STEP 2: modify the fieldcatalog for proper text labels .
      LOOP AT ct_list INTO ls_fcat.
        IF p_type = 'UPDATE'.
          CASE ls_fcat-fieldname.
            WHEN 'COMP'.
              ls_fcat-seltext_l = 'Comp Code'.
            WHEN 'BUDAT'.
              ls_fcat-seltext_l = 'Post Date'.
            WHEN 'KONGR'.
              ls_fcat-seltext_l = 'Assign Reason'.
            WHEN 'SITE'.
              ls_fcat-seltext_l = 'Site'.
            WHEN 'MAP'.
              ls_fcat-seltext_l = 'MovAvgPrice'.
            WHEN 'CURR'.
              ls_fcat-seltext_l = 'Currency'.
            WHEN 'PUNIT'.
              ls_fcat-seltext_l = 'Price Unit'.
            WHEN 'MSEHI'.
              ls_fcat-seltext_l = 'UofM'.
            WHEN 'ERROR_FLAG'.
              ls_fcat-seltext_l = 'Err Flag'.
            WHEN 'VALID_MSG'.
              ls_fcat-seltext_l = 'Validate Message'.
            WHEN 'UPDATE_MSG'.
              ls_fcat-seltext_l = 'Update Message'.
            WHEN OTHERS.
              CONTINUE.
          ENDCASE.
        ELSE.
          CASE ls_fcat-fieldname.
            WHEN 'TYPE'.
              ls_fcat-seltext_l   = 'TYPE'.
            WHEN 'ID'.
              ls_fcat-seltext_l   = 'MSG ID'.
            WHEN 'NUMBER'.
              ls_fcat-seltext_l   = 'MSG No'.
            WHEN 'MESSAGE'.
              ls_fcat-seltext_l   = 'Message Text'.
            WHEN 'LOG_NO'.
              ls_fcat-seltext_l   = 'Log No'.
              ls_fcat-no_out      = 'X'.
            WHEN 'LOG_MSG_NO'.
              ls_fcat-seltext_l   = 'Log Msg No'.
              ls_fcat-no_out      = 'X'.
            WHEN 'MESSAGE_V1'.
              ls_fcat-seltext_l   = 'MSG Var 1'.
              ls_fcat-no_out      = 'X'.
            WHEN 'MESSAGE_V2'.
              ls_fcat-seltext_l   = 'MSG Var 2'.
              ls_fcat-no_out      = 'X'.
            WHEN 'MESSAGE_V3'.
              ls_fcat-seltext_l   = 'MSG Var 3'.
              ls_fcat-no_out      = 'X'.
            WHEN 'MESSAGE_V4'.
              ls_fcat-seltext_l   = 'MSG Var 4'.
              ls_fcat-no_out      = 'X'.
            WHEN OTHERS.
              CONTINUE.
          ENDCASE.
        ENDIF.

        ls_fcat-seltext_s = ls_fcat-seltext_m = ls_fcat-seltext_l.
        MODIFY ct_list FROM ls_fcat TRANSPORTING seltext_l seltext_m seltext_s no_out
          WHERE fieldname = ls_fcat-fieldname.
      ENDLOOP.

    ENDIF.

  ENDMETHOD.


ENDCLASS.                    "lcl_MAP_UPDATE IMPLEMENTATION


No comments:

Post a Comment