TMS Mini Project - Step - 1 - TMS Master data

Scenario: This application will help to set up the initial TMS Master data, primarily maintaining the cost objects and linking the same with Vendors and projects.


Approach: First, i have created Project master table, Vendor master table, custom EKKO table ( to store PO details ).

Project Master table:







Vendor Master table:








Material master table:









TMS Master table: table in which report data is stored















Master report:









TOP include:

*&---------------------------------------------------------------------*
*& Include          ZREP_MAS_ALL_TOP
*&---------------------------------------------------------------------*

TYPES: BEGIN OF ty_final,
         projno     TYPE zdt_demo_mas-projno,
         projname   TYPE zprojmas-projname,
         zvendno    TYPE zdt_demo_mas-zvendno,
         zvendname  TYPE zvendmas-zvendname,
         service    TYPE zdt_demo_mas-service,
         projph     TYPE zdt_demo_mas-projph,
         ebeln      TYPE zdt_demo_mas-ebeln,
         pacdes     TYPE zdt_demo_mas-pacdes,
         wo         TYPE zdt_demo_mas-wo,
         wodes      TYPE zdt_demo_mas-wodes,
         sins       TYPE zdt_demo_mas-sins,
         sisub      TYPE zdt_demo_mas-sisub,
         est_startd TYPE zdt_demo_mas-est_startd,
         es_endd    TYPE zdt_demo_mas-es_endd,
         workloc    TYPE zdt_demo_mas-workloc,
         workcd     TYPE zdt_demo_mas-workcd,
         celltab    TYPE lvc_t_styl,
       END OF ty_final,
       tt_final TYPE TABLE OF ty_final.

TYPES: BEGIN OF ty_mail_att,
         projno     TYPE zdt_demo_mas-projno,
         projname   TYPE zprojmas-projname,
         zvendno    TYPE zdt_demo_mas-zvendno,
         zvendname  TYPE zvendmas-zvendname,
         service    TYPE zdt_demo_mas-service,
         projph     TYPE zdt_demo_mas-projph,
         ebeln      TYPE zdt_demo_mas-ebeln,
         pacdes     TYPE zdt_demo_mas-pacdes,
         wo         TYPE zdt_demo_mas-wo,
         wodes      TYPE zdt_demo_mas-wodes,
         sins       TYPE zdt_demo_mas-sins,
         sisub      TYPE zdt_demo_mas-sisub,
         est_startd TYPE zdt_demo_mas-est_startd,
         es_endd    TYPE zdt_demo_mas-es_endd,
         workloc    TYPE zdt_demo_mas-workloc,
         workcd     TYPE zdt_demo_mas-workcd,
       END OF ty_mail_att,
       tt_mail_att TYPE TABLE OF ty_mail_att.

types: begin of ty_demo_mas,
         mandt type mandt,
         projno     TYPE zdt_demo_mas-projno,
         zvendno    TYPE zdt_demo_mas-zvendno,
         service    TYPE zdt_demo_mas-service,
         ebeln      TYPE zdt_demo_mas-ebeln,
         wo         TYPE zdt_demo_mas-wo,
         sins       TYPE zdt_demo_mas-sins,
         projph     TYPE zdt_demo_mas-projph,
         pacdes     TYPE zdt_demo_mas-pacdes,
         wodes      TYPE zdt_demo_mas-wodes,
         sisub      TYPE zdt_demo_mas-sisub,
         est_startd TYPE zdt_demo_mas-est_startd,
         es_endd    TYPE zdt_demo_mas-es_endd,
         purob type zdt_demo_mas-purob,
         workloc    TYPE zdt_demo_mas-workloc,
         workcd     TYPE zdt_demo_mas-workcd,
  end of ty_demo_mas.

DATA: git_final  TYPE tt_final,
      gwa_final  TYPE ty_final,
      go_grid    TYPE REF TO cl_gui_alv_grid,
      git_fcat   TYPE lvc_t_fcat,
      gwa_fcat   TYPE lvc_s_fcat,
      mail_id type char100,
      git_mail_att type tt_mail_att.

Class Include:
Local class definition:


CLASS lcl DEFINITION.
  PUBLIC SECTION.
    CLASS-METHODS: prep_fcat,
      data_chng FOR EVENT data_changed OF cl_gui_alv_grid
        IMPORTING er_data_changed
                  e_onf4
                  e_onf4_before
                  e_onf4_after
                  e_ucomm,
      f4_help FOR EVENT onf4 OF cl_gui_alv_grid
        IMPORTING e_fieldname
                  e_fieldvalue
                  es_row_no
                  er_event_data
                  et_bad_cells
                  e_display,
      save_data,
      create_data,
      delete_data,
      change_data,
      send_mail,
      fill_ui_exc EXPORTING e_func TYPE ui_functions.

  PROTECTED SECTION.
    CLASS-METHODS: set_current_cell IMPORTING i_no  TYPE i
                                              i_fld TYPE lvc_fname,
      refresh_table,
      set_row_edit IMPORTING it_row_no TYPE lvc_t_roid.


ENDCLASS.

Local class implementation:


CLASS lcl IMPLEMENTATION.

  METHOD fill_ui_exc. "method to hide toolbar icons
    e_func = VALUE #( ( cl_gui_alv_grid=>mc_fc_detail )
                      ( cl_gui_alv_grid=>mc_fc_refresh )
                      ( cl_gui_alv_grid=>mc_fc_loc_cut )
                      ( cl_gui_alv_grid=>mc_fc_loc_copy )
                      ( cl_gui_alv_grid=>mc_fc_loc_paste )
                      ( cl_gui_alv_grid=>mc_fc_loc_insert_row )
                      ( cl_gui_alv_grid=>mc_fc_loc_append_row )
                      ( cl_gui_alv_grid=>mc_fc_loc_delete_row )
                      ( cl_gui_alv_grid=>mc_fc_loc_copy_row )
                      ( cl_gui_alv_grid=>mc_fc_find )
                      ( cl_gui_alv_grid=>mc_fc_filter )
                      ( cl_gui_alv_grid=>mc_mb_sum )
                      ( cl_gui_alv_grid=>mc_fc_subtot )
                      ( cl_gui_alv_grid=>mc_fc_print )
                      ( cl_gui_alv_grid=>mc_mb_variant )
                      ( cl_gui_alv_grid=>mc_fc_graph )
                      ( cl_gui_alv_grid=>mc_mb_view )
                      ( cl_gui_alv_grid=>mc_fc_loc_undo )
                      ( cl_gui_alv_grid=>mc_fc_loc_paste_new_row )
                       ).

  ENDMETHOD.

  METHOD set_row_edit.
    " This method will make the selected rows editable.
    LOOP AT it_row_no INTO DATA(is_row_no).
      CASE git_final[ is_row_no-row_id ]-service.
        WHEN 'CONS'.
          git_final[ is_row_no-row_id ]-celltab = VALUE #( ( fieldname = 'PROJNO' style = cl_gui_alv_grid=>mc_style_disabled )
                                             ( fieldname = 'PROJNAME' style = cl_gui_alv_grid=>mc_style_disabled )
                                             ( fieldname = 'ZVENDNO' style = cl_gui_alv_grid=>mc_style_disabled )
                                             ( fieldname = 'ZVENDNAME' style = cl_gui_alv_grid=>mc_style_disabled )
                                             ( fieldname = 'SERVICE' style = cl_gui_alv_grid=>mc_style_disabled )
                                             ( fieldname = 'PROJPH' style = cl_gui_alv_grid=>mc_style_disabled )
                                             ( fieldname = 'EBELN' style = cl_gui_alv_grid=>mc_style_disabled )
                                             ( fieldname = 'PACDES' style = cl_gui_alv_grid=>mc_style_disabled )
                                             ( fieldname = 'WO' style = cl_gui_alv_grid=>mc_style_disabled )
                                             ( fieldname = 'WODES' style = cl_gui_alv_grid=>mc_style_disabled )
                                             ( fieldname = 'SINS' style = cl_gui_alv_grid=>mc_style_disabled )
                                             ( fieldname = 'SISUB' style = cl_gui_alv_grid=>mc_style_enabled )
                                             ( fieldname = 'EST_STARTD' style = cl_gui_alv_grid=>mc_style_enabled )
                                             ( fieldname = 'ES_ENDD' style = cl_gui_alv_grid=>mc_style_enabled )
                                             ( fieldname = 'WORKLOC' style = cl_gui_alv_grid=>mc_style_enabled )
                                             ( fieldname = 'WORKCD' style =  cl_gui_alv_grid=>mc_style_enabled ) ).
        WHEN 'ENG'.
          git_final[ is_row_no-row_id ]-celltab = VALUE #( ( fieldname = 'PROJNO' style = cl_gui_alv_grid=>mc_style_disabled )
                                             ( fieldname = 'PROJNAME' style = cl_gui_alv_grid=>mc_style_disabled )
                                             ( fieldname = 'ZVENDNO' style = cl_gui_alv_grid=>mc_style_disabled )
                                             ( fieldname = 'ZVENDNAME' style = cl_gui_alv_grid=>mc_style_disabled )
                                             ( fieldname = 'SERVICE' style = cl_gui_alv_grid=>mc_style_disabled )
                                             ( fieldname = 'PROJPH' style = cl_gui_alv_grid=>mc_style_disabled )
                                             ( fieldname = 'EBELN' style = cl_gui_alv_grid=>mc_style_disabled )
                                             ( fieldname = 'PACDES' style = cl_gui_alv_grid=>mc_style_enabled )
                                             ( fieldname = 'WO' style = cl_gui_alv_grid=>mc_style_disabled )
                                             ( fieldname = 'WODES' style = cl_gui_alv_grid=>mc_style_disabled )
                                             ( fieldname = 'SINS' style = cl_gui_alv_grid=>mc_style_disabled )
                                             ( fieldname = 'SISUB' style = cl_gui_alv_grid=>mc_style_disabled )
                                             ( fieldname = 'EST_STARTD' style = cl_gui_alv_grid=>mc_style_enabled )
                                             ( fieldname = 'ES_ENDD' style = cl_gui_alv_grid=>mc_style_enabled )
                                             ( fieldname = 'WORKLOC' style = cl_gui_alv_grid=>mc_style_enabled )
                                             ( fieldname = 'WORKCD' style =  cl_gui_alv_grid=>mc_style_enabled ) ).
        WHEN 'TECH'.
          git_final[ is_row_no-row_id ]-celltab = VALUE #( ( fieldname = 'PROJNO' style = cl_gui_alv_grid=>mc_style_disabled )
                                             ( fieldname = 'PROJNAME' style = cl_gui_alv_grid=>mc_style_disabled )
                                             ( fieldname = 'ZVENDNO' style = cl_gui_alv_grid=>mc_style_disabled )
                                             ( fieldname = 'ZVENDNAME' style = cl_gui_alv_grid=>mc_style_disabled )
                                             ( fieldname = 'SERVICE' style = cl_gui_alv_grid=>mc_style_disabled )
                                             ( fieldname = 'PROJPH' style = cl_gui_alv_grid=>mc_style_disabled )
                                             ( fieldname = 'EBELN' style = cl_gui_alv_grid=>mc_style_disabled )
                                             ( fieldname = 'PACDES' style = cl_gui_alv_grid=>mc_style_disabled )
                                             ( fieldname = 'WO' style = cl_gui_alv_grid=>mc_style_disabled )
                                             ( fieldname = 'WODES' style = cl_gui_alv_grid=>mc_style_enabled )
                                             ( fieldname = 'SINS' style = cl_gui_alv_grid=>mc_style_disabled )
                                             ( fieldname = 'SISUB' style = cl_gui_alv_grid=>mc_style_disabled )
                                             ( fieldname = 'EST_STARTD' style = cl_gui_alv_grid=>mc_style_enabled )
                                             ( fieldname = 'ES_ENDD' style = cl_gui_alv_grid=>mc_style_enabled )
                                             ( fieldname = 'WORKLOC' style = cl_gui_alv_grid=>mc_style_enabled )
                                             ( fieldname = 'WORKCD' style =  cl_gui_alv_grid=>mc_style_enabled ) ).
      ENDCASE.
    ENDLOOP.


  ENDMETHOD. "end fo set row edit method

  METHOD refresh_table.
    " this method will refresh alv display
    DATA(ls_stbl) = VALUE lvc_s_stbl( row = 'X' col = 'X' ).

    go_grid->refresh_table_display(
      EXPORTING
        is_stable      =  ls_stbl               " With Stable Rows/Columns
*        i_soft_refresh =                  " Without Sort, Filter, etc.
      EXCEPTIONS
        finished       = 1                " Display was Ended (by Export)
        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 set_current_cell.
    "This method will make sure the cursor is at the current cell which needs to be edited
    go_grid->set_current_cell_via_id(
      EXPORTING
         is_row_id    = VALUE #( index = i_no )                 " Row
         is_column_id = VALUE #( fieldname = i_fld )                 " Column
*         is_row_no    =                  " Numeric Row ID
     ).

    "this method will set focus to the grid.
    go_grid->set_focus(
      EXPORTING
        control           = go_grid                 " Control
      EXCEPTIONS
        cntl_error        = 1                " cntl_error
        cntl_system_error = 2                " cntl_system_error
        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.


  ENDMETHOD. "end of set current cell method.

  METHOD create_data.
    " This method will create a new editable row.
    CLEAR gwa_final.
    gwa_final-celltab = VALUE #( ( fieldname = 'PROJNO' style = cl_gui_alv_grid=>mc_style_enabled )
                                             ( fieldname = 'PROJNAME' style = cl_gui_alv_grid=>mc_style_disabled )
                                             ( fieldname = 'ZVENDNO' style = cl_gui_alv_grid=>mc_style_enabled )
                                             ( fieldname = 'ZVENDNAME' style = cl_gui_alv_grid=>mc_style_disabled )
                                             ( fieldname = 'SERVICE' style = cl_gui_alv_grid=>mc_style_enabled )
                                             ( fieldname = 'PROJPH' style = cl_gui_alv_grid=>mc_style_enabled )
                                             ( fieldname = 'EBELN' style = cl_gui_alv_grid=>mc_style_enabled )
                                             ( fieldname = 'PACDES' style = cl_gui_alv_grid=>mc_style_enabled )
                                             ( fieldname = 'WO' style = cl_gui_alv_grid=>mc_style_enabled )
                                             ( fieldname = 'WODES' style = cl_gui_alv_grid=>mc_style_enabled )
                                             ( fieldname = 'SINS' style = cl_gui_alv_grid=>mc_style_enabled )
                                             ( fieldname = 'SISUB' style = cl_gui_alv_grid=>mc_style_enabled )
                                             ( fieldname = 'EST_STARTD' style = cl_gui_alv_grid=>mc_style_enabled )
                                             ( fieldname = 'ES_ENDD' style = cl_gui_alv_grid=>mc_style_enabled )
                                             ( fieldname = 'WORKLOC' style = cl_gui_alv_grid=>mc_style_enabled )
                                             ( fieldname = 'WORKCD' style =  cl_gui_alv_grid=>mc_style_enabled ) ).
    APPEND gwa_final TO git_final.

    DATA(lv_count) = lines( git_final ).

    lcl=>refresh_table( ).

    lcl=>set_current_cell(
      EXPORTING
        i_no  = lv_count
        i_fld = 'PROJNO'
    ).

  ENDMETHOD. "create_data method end.

  METHOD delete_data.
    DATA: lv_ans TYPE c.
    go_grid->get_selected_rows(
      IMPORTING
*        et_index_rows =                  " Indexes of Selected Rows
        et_row_no     = DATA(lt_row_no)                 " Numeric IDs of Selected Rows
    ).

    IF lt_row_no IS NOT INITIAL.
      SORT lt_row_no BY row_id DESCENDING.
      IF sy-subrc = 0.
        CALL FUNCTION 'POPUP_TO_CONFIRM'
          EXPORTING
            text_question  = 'Are you sure you want to delete the selected records?'
            text_button_1  = 'Yes'
            text_button_2  = 'No'
          IMPORTING
            answer         = lv_ans
          EXCEPTIONS
            text_not_found = 1
            OTHERS         = 2.
        IF sy-subrc <> 0.
* Implement suitable error handling here
        ENDIF.

        IF lv_ans = '1'.
          "proceed with deletion
          LOOP AT lt_row_no INTO DATA(ls_row_no).
            DATA(gs_del) = git_final[ ls_row_no-row_id ].
            DATA(lwa_demo_mas) = VALUE ty_demo_mas( mandt = sy-mandt
                                                projno = gs_del-projno
                                                zvendno = gs_del-zvendno
                                                service = gs_del-service
                                                ebeln = gs_del-ebeln
                                                wo = gs_del-wo
                                                sins = gs_del-sins
                                                 ).
            IF lwa_demo_mas IS NOT INITIAL.
              DELETE zdt_demo_mas FROM lwa_demo_mas.
              IF sy-subrc = 0.
                COMMIT WORK.
                DELETE TABLE git_final FROM gs_del.
                CLEAR gs_del.
              ELSE.
                MESSAGE 'record could not be deleted' TYPE 'I'.
              ENDIF.
            ENDIF.
          ENDLOOP.
          lcl=>refresh_table( ).
        ENDIF.
      ENDIF.
    ENDIF.


  ENDMETHOD. "delete data method end.

  METHOD change_data.
    "This method will get the selected rows and make the non key fields editable based on the service type of each row.
    go_grid->get_selected_rows(
      IMPORTING
*        et_index_rows =   data(lt_idx_rows)              " Indexes of Selected Rows
        et_row_no     =   DATA(lt_row_no)               " Numeric IDs of Selected Rows
    ).

    IF lt_row_no IS NOT INITIAL.
      lcl=>set_row_edit( it_row_no = lt_row_no ).

      lcl=>refresh_table( ).

    ENDIF.

  ENDMETHOD. "change_data method end.
Send mail method:






















 LOOP AT git_mail_att INTO DATA(wa_mail).
      lv_string = |{ lv_string }{ wa_mail-projno }{ cl_abap_char_utilities=>horizontal_tab }{ wa_mail-projname }{ cl_abap_char_utilities=>horizontal_tab }{ wa_mail-zvendno }{ cl_abap_char_utilities=>horizontal_tab }{ wa_mail-zvendname }|.
      lv_string = |{ lv_string }{ cl_abap_char_utilities=>horizontal_tab }{ wa_mail-service }{ cl_abap_char_utilities=>horizontal_tab }{ wa_mail-projph }{ cl_abap_char_utilities=>horizontal_tab }{ wa_mail-ebeln }|.
      lv_string = |{ lv_string }{ cl_abap_char_utilities=>horizontal_tab }{ wa_mail-pacdes }{ cl_abap_char_utilities=>horizontal_tab }{ wa_mail-wo }{ cl_abap_char_utilities=>horizontal_tab }{ wa_mail-wodes }|.
      lv_string = |{ lv_string }{ cl_abap_char_utilities=>horizontal_tab }{ wa_mail-sins }{ cl_abap_char_utilities=>horizontal_tab }{ wa_mail-sisub }{ cl_abap_char_utilities=>horizontal_tab }{ wa_mail-est_startd }|.
      lv_string = |{ lv_string }{ cl_abap_char_utilities=>horizontal_tab }{ wa_mail-es_endd }{ cl_abap_char_utilities=>horizontal_tab }{ wa_mail-workloc }{ cl_abap_char_utilities=>horizontal_tab }{ wa_mail-workcd }{ cl_abap_char_utilities=>newline }|.
    ENDLOOP.

    lv_xstring = cl_bcs_convert=>string_to_xstring(
                   iv_string     = lv_string
*                 iv_convert_cp = 'X'
*                 iv_codepage   =
*                 iv_add_bom    =
                 ).
*               CATCH cx_bcs. " BCS: General Exceptions

    DATA(lt_binary_content) = cl_bcs_convert=>xstring_to_solix( iv_xstring = lv_xstring ).
    TRY.
        lo_doc_bcs->add_attachment(
          EXPORTING
            i_attachment_type     = 'XLS'                 " Document Class for Attachment
            i_attachment_subject  = 'Project Data'                 " Attachment Title
*      i_attachment_size     =                  " Size of Document Content
*      i_attachment_language = space            " Language in Which Attachment Is Created
*      i_att_content_text    =                  " Content (Text-Like)
            i_att_content_hex     = lt_binary_content                 " Content (Binary)
*      i_attachment_header   =                  " Attachment Header Data
*      iv_vsi_profile        =                  " Virus Scan Profile
        ).
      CATCH cx_document_bcs. " BCS: Document Exceptions
    ENDTRY.

    lv_mailid = mail_id.
    DATA(lo_recipient) = cl_cam_address_bcs=>create_internet_address(
                           i_address_string = lv_mailid
*                           i_address_name   =
*                           i_incl_sapuser   =
                         ).
*                         CATCH cx_address_bcs. " BCS: Address Exceptions

    lo_bcs->add_recipient(
      EXPORTING
        i_recipient  = lo_recipient                 " Recipient of Message
*        i_express    =                  " Send As Express Message
*        i_copy       =                  " Send Copy
*        i_blind_copy =                  " Send As Blind Copy
*        i_no_forward =                  " No Forwarding
    ).
*    CATCH cx_send_req_bcs. " BCS: Send Request Exceptions

    lo_bcs->set_document( i_document = lo_doc_bcs ).
*    CATCH cx_send_req_bcs. " BCS: Send Request Exceptions

    DATA(lv_ret) = lo_bcs->send(
        i_with_error_screen = 'X'
    ).
*    CATCH cx_send_req_bcs. " BCS: Send Request Exceptions
    COMMIT WORK.
    MESSAGE 'Email sent successfully' TYPE 'S'.
    LEAVE TO SCREEN 0.

  ENDMETHOD. "send mail method end.


Save data method:







































Rest of the implementation:

  METHOD f4_help.
    " this method is used to display F4 help and populate selected values to the screen.
    TYPES: begin of ty_pph,
            prph type char25,
           end of ty_pph,
           tt_pph TYPE TABLE OF ty_pph WITH EMPTY KEY.
    DATA: lt_return TYPE TABLE OF ddshretval.

    REFRESH lt_return.
    IF git_final[ es_row_no-row_id ]-celltab IS NOT INITIAL.

      CASE e_fieldname.

        WHEN 'ZVENDNO'.
          REFRESH lt_return[].
          SELECT FROM zvendmas
            FIELDS zvendno,
                   zvendname
            INTO TABLE @DATA(lt_vendmas).

          CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
            EXPORTING
              retfield         = 'ZVENDNO'
              dynpprog         = sy-repid
              dynpnr           = sy-dynnr
              dynprofield      = 'ZVENDNO'
              value_org        = 'S'
              callback_program = sy-repid
            TABLES
              value_tab        = lt_vendmas
*             FIELD_TAB        =
              return_tab       = lt_return
*             DYNPFLD_MAPPING  =
            EXCEPTIONS
              parameter_error  = 1
              no_values_found  = 2
              OTHERS           = 3.
          IF sy-subrc <> 0.
* Implement suitable error handling here
          ENDIF.
          IF lt_return IS NOT INITIAL.
            git_final[ es_row_no-row_id ]-zvendno = lt_vendmas[ zvendno = lt_return[ 1 ]-fieldval ]-zvendno.
            git_final[ es_row_no-row_id ]-zvendname = lt_vendmas[ zvendno = lt_return[ 1 ]-fieldval ]-zvendname.
          ENDIF.

        WHEN 'PROJPH'.


          " gave dummy data as  of now
          DATA(lt_data) = VALUE tt_pph( ( prph = 'ABCDEFGH' ) ( prph = 'IJKLMNOP' ) ( prph = 'BUILD' ) ( prph = 'ASSEMBLY' ) ( prph = 'DESIGN' ) ( prph = 'RESEARCH' ) ).

          CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
            EXPORTING
              retfield         = 'PROJPH'
              dynpprog         = sy-repid
              dynpnr           = sy-dynnr
              dynprofield      = 'PROJPH'
              value_org        = 'S'
              callback_program = sy-repid
            TABLES
              value_tab        = lt_data
*             FIELD_TAB        =
              return_tab       = lt_return
*             DYNPFLD_MAPPING  =
            EXCEPTIONS
              parameter_error  = 1
              no_values_found  = 2
              OTHERS           = 3.
          IF sy-subrc <> 0.
* Implement suitable error handling here
          ENDIF.
          IF lt_return IS NOT INITIAL.
            git_final[ es_row_no-row_id ]-projph = lt_return[ 1 ]-fieldval.
          ENDIF.

        WHEN 'EBELN'.
          SELECT FROM zekko
            FIELDS ebeln,
            bukrs
            INTO TABLE @DATA(lt_zekko).

          CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
            EXPORTING
              retfield         = 'EBELN'
              dynpprog         = sy-repid
              dynpnr           = sy-dynnr
              dynprofield      = 'EBELN'
              value_org        = 'S'
              callback_program = sy-repid
            TABLES
              value_tab        = lt_zekko
*             FIELD_TAB        =
              return_tab       = lt_return
*             DYNPFLD_MAPPING  =
            EXCEPTIONS
              parameter_error  = 1
              no_values_found  = 2
              OTHERS           = 3.

          IF sy-subrc <> 0.
* Implement suitable error handling here
          ENDIF.
          IF lt_return IS NOT INITIAL.
            git_final[ es_row_no-row_id ]-ebeln = lt_return[ 1 ]-fieldval.
          ENDIF.

      ENDCASE.

      CASE git_final[ es_row_no-row_id ]-service.
        WHEN 'CONS'.
          git_final[ es_row_no-row_id ]-celltab[ fieldname = 'EBELN' ]-style = cl_gui_alv_grid=>mc_style_disabled.
          git_final[ es_row_no-row_id ]-celltab[ fieldname = 'PACDES' ]-style = cl_gui_alv_grid=>mc_style_disabled.
          git_final[ es_row_no-row_id ]-celltab[ fieldname = 'WO' ]-style = cl_gui_alv_grid=>mc_style_disabled.
          git_final[ es_row_no-row_id ]-celltab[ fieldname = 'WODES' ]-style = cl_gui_alv_grid=>mc_style_disabled.
          git_final[ es_row_no-row_id ]-celltab[ fieldname = 'SINS' ]-style = cl_gui_alv_grid=>mc_style_enabled.
          git_final[ es_row_no-row_id ]-celltab[ fieldname = 'SISUB' ]-style = cl_gui_alv_grid=>mc_style_enabled.

        WHEN 'TECH'.
          git_final[ es_row_no-row_id ]-celltab[ fieldname = 'EBELN' ]-style = cl_gui_alv_grid=>mc_style_disabled.
          git_final[ es_row_no-row_id ]-celltab[ fieldname = 'PACDES' ]-style = cl_gui_alv_grid=>mc_style_disabled.
          git_final[ es_row_no-row_id ]-celltab[ fieldname = 'WO' ]-style = cl_gui_alv_grid=>mc_style_enabled.
          git_final[ es_row_no-row_id ]-celltab[ fieldname = 'WODES' ]-style = cl_gui_alv_grid=>mc_style_enabled.
          git_final[ es_row_no-row_id ]-celltab[ fieldname = 'SINS' ]-style = cl_gui_alv_grid=>mc_style_disabled.
          git_final[ es_row_no-row_id ]-celltab[ fieldname = 'SISUB' ]-style = cl_gui_alv_grid=>mc_style_disabled.

        WHEN 'ENG'.
          git_final[ es_row_no-row_id ]-celltab[ fieldname = 'EBELN' ]-style = cl_gui_alv_grid=>mc_style_enabled.
          git_final[ es_row_no-row_id ]-celltab[ fieldname = 'PACDES' ]-style = cl_gui_alv_grid=>mc_style_enabled.
          git_final[ es_row_no-row_id ]-celltab[ fieldname = 'WO' ]-style = cl_gui_alv_grid=>mc_style_disabled.
          git_final[ es_row_no-row_id ]-celltab[ fieldname = 'WODES' ]-style = cl_gui_alv_grid=>mc_style_disabled.
          git_final[ es_row_no-row_id ]-celltab[ fieldname = 'SINS' ]-style = cl_gui_alv_grid=>mc_style_disabled.
          git_final[ es_row_no-row_id ]-celltab[ fieldname = 'SISUB' ]-style = cl_gui_alv_grid=>mc_style_disabled.

      ENDCASE.

    ENDIF.

    lcl=>refresh_table( ).

    lcl=>set_current_cell(
      EXPORTING
        i_no  = es_row_no-row_id
        i_fld = e_fieldname
    ).

  ENDMETHOD. "f4 help method end.


  METHOD  data_chng.

    IF er_data_changed->mt_mod_cells IS NOT INITIAL.
      DATA(lv_value) = er_data_changed->mt_mod_cells[ 1 ]-value.
      CASE er_data_changed->mt_mod_cells[ 1 ]-fieldname.
        WHEN 'PROJNO'.
          SELECT SINGLE FROM zprojmas
            FIELDS projname
            WHERE projno = @lv_value
            INTO @DATA(lv_projname).
          IF sy-subrc = 0.
            git_final[ er_data_changed->mt_mod_cells[ 1 ]-row_id ]-projname = lv_projname.

          ELSE.
            MESSAGE 'Invalid project Number' TYPE 'E' DISPLAY LIKE 'S'.
          ENDIF.


        WHEN 'ZVENDNO'.
          SELECT SINGLE FROM zvendmas
            FIELDS zvendname
            WHERE zvendno = @lv_value
            INTO @DATA(lv_vendname).
          IF sy-subrc = 0.
            git_final[ er_data_changed->mt_mod_cells[ 1 ]-row_id ]-zvendname = lv_vendname.
          ELSE.
            MESSAGE 'Invalid Vendor Number' TYPE 'E' DISPLAY LIKE 'S'.
          ENDIF.

        WHEN 'SERVICE'.

*          if lv_value NE 'CONS' and lv_value NE 'TECH' and lv_value NE 'ENG'.
*            MESSAGE 'Invalid service' type 'E' DISPLAY LIKE 'S'.
*          endif.
          git_final[ er_data_changed->mt_mod_cells[ 1 ]-row_id ]-service = lv_vendname.
          CASE lv_value.
            WHEN 'CONS'.

              git_final[ er_data_changed->mt_mod_cells[ 1 ]-row_id ]-celltab[ fieldname = 'EBELN' ]-style = cl_gui_alv_grid=>mc_style_disabled.
              git_final[ er_data_changed->mt_mod_cells[ 1 ]-row_id ]-celltab[ fieldname = 'PACDES' ]-style = cl_gui_alv_grid=>mc_style_disabled.
              git_final[ er_data_changed->mt_mod_cells[ 1 ]-row_id ]-celltab[ fieldname = 'WO' ]-style = cl_gui_alv_grid=>mc_style_disabled.
              git_final[ er_data_changed->mt_mod_cells[ 1 ]-row_id ]-celltab[ fieldname = 'WODES' ]-style = cl_gui_alv_grid=>mc_style_disabled.
              git_final[ er_data_changed->mt_mod_cells[ 1 ]-row_id ]-celltab[ fieldname = 'SINS' ]-style = cl_gui_alv_grid=>mc_style_enabled.
              git_final[ er_data_changed->mt_mod_cells[ 1 ]-row_id ]-celltab[ fieldname = 'SISUB' ]-style = cl_gui_alv_grid=>mc_style_enabled.

            WHEN 'TECH'.
              git_final[ er_data_changed->mt_mod_cells[ 1 ]-row_id ]-celltab[ fieldname = 'EBELN' ]-style = cl_gui_alv_grid=>mc_style_disabled.
              git_final[ er_data_changed->mt_mod_cells[ 1 ]-row_id ]-celltab[ fieldname = 'PACDES' ]-style = cl_gui_alv_grid=>mc_style_disabled.
              git_final[ er_data_changed->mt_mod_cells[ 1 ]-row_id ]-celltab[ fieldname = 'WO' ]-style = cl_gui_alv_grid=>mc_style_enabled.
              git_final[ er_data_changed->mt_mod_cells[ 1 ]-row_id ]-celltab[ fieldname = 'WODES' ]-style = cl_gui_alv_grid=>mc_style_enabled.
              git_final[ er_data_changed->mt_mod_cells[ 1 ]-row_id ]-celltab[ fieldname = 'SINS' ]-style = cl_gui_alv_grid=>mc_style_disabled.
              git_final[ er_data_changed->mt_mod_cells[ 1 ]-row_id ]-celltab[ fieldname = 'SISUB' ]-style = cl_gui_alv_grid=>mc_style_disabled.

            WHEN 'ENG'.
              git_final[ er_data_changed->mt_mod_cells[ 1 ]-row_id ]-celltab[ fieldname = 'EBELN' ]-style = cl_gui_alv_grid=>mc_style_enabled.
              git_final[ er_data_changed->mt_mod_cells[ 1 ]-row_id ]-celltab[ fieldname = 'PACDES' ]-style = cl_gui_alv_grid=>mc_style_enabled.
              git_final[ er_data_changed->mt_mod_cells[ 1 ]-row_id ]-celltab[ fieldname = 'WO' ]-style = cl_gui_alv_grid=>mc_style_disabled.
              git_final[ er_data_changed->mt_mod_cells[ 1 ]-row_id ]-celltab[ fieldname = 'WODES' ]-style = cl_gui_alv_grid=>mc_style_disabled.
              git_final[ er_data_changed->mt_mod_cells[ 1 ]-row_id ]-celltab[ fieldname = 'SINS' ]-style = cl_gui_alv_grid=>mc_style_disabled.
              git_final[ er_data_changed->mt_mod_cells[ 1 ]-row_id ]-celltab[ fieldname = 'SISUB' ]-style = cl_gui_alv_grid=>mc_style_disabled.

            WHEN OTHERS.
              MESSAGE 'Invalid service' TYPE 'E' DISPLAY LIKE 'S'.
          ENDCASE.

        WHEN 'PROJPH'.

        WHEN 'EBELN'.
          SELECT SINGLE FROM zekko
            FIELDS ebeln
            WHERE ebeln = @lv_value
            INTO @DATA(lv_ebeln).

          IF sy-subrc <> 0.
            MESSAGE 'Invalid PO Number' TYPE 'E' DISPLAY LIKE 'S'.
          ENDIF.


        WHEN 'PACDES'.

        WHEN 'WO'.

        WHEN 'WODES'.

        WHEN 'SINS'.

        WHEN 'SISUB'.

        WHEN 'EST_STARTD'.

        WHEN 'ES_ENDD'.

        WHEN 'PUROB'.

        WHEN 'WORKLOC'.

        WHEN 'WORKCD'.

      ENDCASE.

      CASE git_final[ er_data_changed->mt_mod_cells[ 1 ]-row_id ]-service.
        WHEN 'CONS'.
          git_final[ er_data_changed->mt_mod_cells[ 1 ]-row_id ]-celltab[ fieldname = 'EBELN' ]-style = cl_gui_alv_grid=>mc_style_disabled.
          git_final[ er_data_changed->mt_mod_cells[ 1 ]-row_id ]-celltab[ fieldname = 'PACDES' ]-style = cl_gui_alv_grid=>mc_style_disabled.
          git_final[ er_data_changed->mt_mod_cells[ 1 ]-row_id ]-celltab[ fieldname = 'WO' ]-style = cl_gui_alv_grid=>mc_style_disabled.
          git_final[ er_data_changed->mt_mod_cells[ 1 ]-row_id ]-celltab[ fieldname = 'WODES' ]-style = cl_gui_alv_grid=>mc_style_disabled.
          git_final[ er_data_changed->mt_mod_cells[ 1 ]-row_id ]-celltab[ fieldname = 'SINS' ]-style = cl_gui_alv_grid=>mc_style_enabled.
          git_final[ er_data_changed->mt_mod_cells[ 1 ]-row_id ]-celltab[ fieldname = 'SISUB' ]-style = cl_gui_alv_grid=>mc_style_enabled.

        WHEN 'TECH'.
          git_final[ er_data_changed->mt_mod_cells[ 1 ]-row_id ]-celltab[ fieldname = 'EBELN' ]-style = cl_gui_alv_grid=>mc_style_disabled.
          git_final[ er_data_changed->mt_mod_cells[ 1 ]-row_id ]-celltab[ fieldname = 'PACDES' ]-style = cl_gui_alv_grid=>mc_style_disabled.
          git_final[ er_data_changed->mt_mod_cells[ 1 ]-row_id ]-celltab[ fieldname = 'WO' ]-style = cl_gui_alv_grid=>mc_style_enabled.
          git_final[ er_data_changed->mt_mod_cells[ 1 ]-row_id ]-celltab[ fieldname = 'WODES' ]-style = cl_gui_alv_grid=>mc_style_enabled.
          git_final[ er_data_changed->mt_mod_cells[ 1 ]-row_id ]-celltab[ fieldname = 'SINS' ]-style = cl_gui_alv_grid=>mc_style_disabled.
          git_final[ er_data_changed->mt_mod_cells[ 1 ]-row_id ]-celltab[ fieldname = 'SISUB' ]-style = cl_gui_alv_grid=>mc_style_disabled.

        WHEN 'ENG'.
          git_final[ er_data_changed->mt_mod_cells[ 1 ]-row_id ]-celltab[ fieldname = 'EBELN' ]-style = cl_gui_alv_grid=>mc_style_enabled.
          git_final[ er_data_changed->mt_mod_cells[ 1 ]-row_id ]-celltab[ fieldname = 'PACDES' ]-style = cl_gui_alv_grid=>mc_style_enabled.
          git_final[ er_data_changed->mt_mod_cells[ 1 ]-row_id ]-celltab[ fieldname = 'WO' ]-style = cl_gui_alv_grid=>mc_style_disabled.
          git_final[ er_data_changed->mt_mod_cells[ 1 ]-row_id ]-celltab[ fieldname = 'WODES' ]-style = cl_gui_alv_grid=>mc_style_disabled.
          git_final[ er_data_changed->mt_mod_cells[ 1 ]-row_id ]-celltab[ fieldname = 'SINS' ]-style = cl_gui_alv_grid=>mc_style_disabled.
          git_final[ er_data_changed->mt_mod_cells[ 1 ]-row_id ]-celltab[ fieldname = 'SISUB' ]-style = cl_gui_alv_grid=>mc_style_disabled.

      ENDCASE.

      lcl=>refresh_table( ).

      lcl=>set_current_cell(
        EXPORTING
          i_no  = er_data_changed->mt_mod_cells[ 1 ]-row_id
          i_fld = er_data_changed->mt_mod_cells[ 1 ]-fieldname
      ).


    ENDIF.

*    ENDIF.

  ENDMETHOD.

  METHOD prep_fcat.
    DATA: lo_data  TYPE REF TO data,
          lo_descr TYPE REF TO cl_abap_structdescr.

    CREATE DATA lo_data LIKE LINE OF git_final.

    lo_descr ?= cl_abap_structdescr=>describe_by_data_ref( p_data_ref = lo_data ).

    DATA(lt_dfies) = cl_salv_data_descr=>read_structdescr(
    r_structdescr = lo_descr ).

    LOOP AT lt_dfies INTO DATA(lwa_dfies).
      CLEAR gwa_fcat.
      gwa_fcat = CORRESPONDING #( lwa_dfies ).
      gwa_fcat-f4availabl = 'X'.
      CASE gwa_fcat-fieldname.
        WHEN 'PROJNO' OR 'SERVICE' OR 'EST_STARTD' OR 'ES_ENDD' OR 'WORKLOC' OR 'WORKCD'.
          gwa_fcat-ref_table = 'ZDT_DEMO_MAS'.
          gwa_fcat-ref_field = gwa_fcat-fieldname.
*        WHEN 'ZVENDNO' OR 'PROJPH'.
*          gwa_fcat-ref_table = 'ZDT_DEMO_MAS'.
*          gwa_fcat-ref_field = gwa_fcat-fieldname.
        WHEN 'PROJNAME'.
          gwa_fcat-ref_table = 'ZPROJMAS'.
          gwa_fcat-ref_field = gwa_fcat-fieldname.
        WHEN 'ZVENDNAME'.
          gwa_fcat-ref_table = 'ZVENDMAS'.
          gwa_fcat-ref_field = gwa_fcat-fieldname.
      ENDCASE.

      APPEND gwa_fcat TO git_fcat.
    ENDLOOP.

  ENDMETHOD.

ENDCLASS.

PBO and PAI modules:


MODULE status_1001 OUTPUT.
  SET PF-STATUS 'ZPF_STAT1'.
  SET TITLEBAR 'ZTITLE1'.

  IF go_grid IS NOT BOUND.

    DATA(go_cont) = NEW cl_gui_docking_container( repid = sy-repid
                                                  dynnr = sy-dynnr
                                                  side = cl_gui_docking_container=>dock_at_left
                                                  extension = 3000 ).

    go_grid = NEW #( i_parent = go_cont ).

    SELECT FROM zdt_demo_mas AS dm
      INNER JOIN zprojmas AS pm ON dm~projno = pm~projno
      INNER JOIN zvendmas AS vm ON dm~zvendno = vm~zvendno
      FIELDS
        dm~projno,
        pm~projname,
        dm~zvendno,
        vm~zvendname,
        dm~service,
        dm~ebeln,
        dm~wo,
        dm~sins,
        dm~projph,
        dm~pacdes,
        dm~wodes,
        dm~sisub,
        dm~est_startd,
        dm~es_endd,
        dm~workloc,
        dm~workcd
      INTO CORRESPONDING FIELDS OF TABLE @git_final.

    lcl=>prep_fcat( ).

    DATA(lwa_layout) = VALUE lvc_s_layo( zebra = 'X'
                                         col_opt = 'X'
                                         stylefname = 'CELLTAB'
*                                         no_toolbar = 'X'
                                          ).

    go_grid->register_edit_event(
      EXPORTING
        i_event_id =  cl_gui_alv_grid=>mc_evt_modified                " Event ID
      EXCEPTIONS
        error      = 1                " Errors
        OTHERS     = 2
    ).

    DATA(it_f4flds) = VALUE lvc_t_f4( ( fieldname = 'PROJNO' register = 'X' )
                                      ( fieldname = 'ZVENDNO' register = 'X' )
                                      ( fieldname = 'PROJPH' register = 'X' )
                                      ( fieldname = 'EBELN' register = 'X' ) ).

    go_grid->register_f4_for_fields( it_f4 = it_f4flds ).

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

    SET HANDLER lcl=>f4_help FOR go_grid.
    SET HANDLER lcl=>data_chng FOR go_grid.

    lcl=>fill_ui_exc(
      IMPORTING
        e_func = DATA(lt_excl)
    ).

    go_grid->set_table_for_first_display(
      EXPORTING
        is_layout                     = lwa_layout
        it_toolbar_excluding          = lt_excl       " Layout
      CHANGING
        it_outtab                     = git_final                 " Output Table
        it_fieldcatalog               = git_fcat                 " Field Catalog
*        it_sort                       =                  " Sort Criteria
*        it_filter                     =                  " Filter Criteria
      EXCEPTIONS
        invalid_parameter_combination = 1                " Wrong Parameter
        program_error                 = 2                " Program Errors
        too_many_lines                = 3                " Too many Rows in Ready for Input Grid
        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.


    go_grid->set_ready_for_input(
        i_ready_for_input = 1
    ).

  ENDIF.
ENDMODULE.
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_1001  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE user_command_1001 INPUT.
  CASE sy-ucomm.
    WHEN 'BACK' OR 'EXIT'.
      LEAVE TO SCREEN 0.
    WHEN 'SAVE'.
      lcl=>save_data( ).
    WHEN 'CREATE'.
      lcl=>create_data( ).
    WHEN 'EDIT'.
      lcl=>change_data( ).
    WHEN 'DELETE'.
      lcl=>delete_data( ).
    WHEN 'MAIL'.
      CALL SCREEN 1002 STARTING AT 10 10 ENDING AT 80 15.

  ENDCASE.

ENDMODULE.
*&---------------------------------------------------------------------*
*& Module STATUS_1002 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE status_1002 OUTPUT.
  SET PF-STATUS 'ZPF_STAT1002'.
* SET TITLEBAR 'xxx'.
ENDMODULE.
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_1002  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE user_command_1002 INPUT.
  CASE sy-ucomm.
    WHEN 'BACK' OR 'EXIT'.
      LEAVE TO SCREEN 0.
    WHEN 'SNDMAIL'.
      lcl=>send_mail( ).
  ENDCASE.

ENDMODULE.

Execution of report:












Creating new row:

































Pop up when deleting:














Asking for a email ID when sending mail:



















This is the first step of our customized time management system. Stay tuned for step 2.




Comments

Popular posts from this blog

Simple AMDP program for CRUD opertaions

Select options in AMDP

Interactive ALV report using ALV IDA