Skip to Content
Technical Articles
Author's profile photo James Lim

Enhanced BPC Mass User Management Tool including delete functions for BPC 10.X NW

While I was working at the customer site for BPC NW 7.5 for implementing BPC secutiry, I found ‘BPC Mass User Management Tool’ doesn’t support deleting functions!

So I asked a question to customer and she said she had to delete user, profiles and teams one by one using BPC admin console…… 😥

In addition, at the same time, one of my colleague asked same question to me so I decided to enhance it.

I am not an expert ABAP developer but thanks to my development experience with other programming languages, I could enhance it.

After I made it, I tried to make it as a transport file but I gave up because it may trigger maintenance issue.

If a lot of BPC administrators / consultants need this tool, I will post it later including document so please leave a comment.

== Updated Aug.18th 2014

I attached a source code that I modified.

I used it for a customer and it worked well without any critical issue ( Even though it works, it should be used carefully after test in your environment)

Disclaimer:

1. This is not a code/program that SAP supports.

2. SAP will not support this code as a product. so it should be used as a custom code.

3. I am not responsible anything about this code as well as the result from this code.

== Updated Jul.1st 2020

I found the attachment was missing a long time ago while SCN was migrated to new platform so I attached it again.

I am not sure it will work in BPC 10.X but please try it.

*&---------------------------------------------------------------------*
*& Report  ZUJE_MASS_USER_MGMT
*&
*&---------------------------------------------------------------------*
*& Created By: Rich Heilman  SAP Labs, LLC
*& Modified By: James Lim  SAP Americas
*& Created On: 08/2/2010
*& Modified On: 12/6/2013
*&---------------------------------------------------------------------*

REPORT  ZUJE_MASS_USER_DELETE.

TYPE-POOLS: abap, vrm.

*----------------------------------------------------------------------*
*       CLASS lcl_application DEFINITION
*----------------------------------------------------------------------*
CLASS lcl_application DEFINITION FINAL.

  PUBLIC SECTION.

    CONSTANTS: lc_comma TYPE char01 VALUE ',',
               lc_pipe TYPE char01 VALUE '|',
               lc_tab TYPE char10 VALUE 'TAB'.

    TYPES: BEGIN OF t_appldim,
            appl_id TYPE uj_appl_id,
            dimension TYPE uj_dim_name,
          END OF t_appldim.

    TYPES: BEGIN OF t_appldimmembers,
            appl_id TYPE uj_appl_id,
            dimension TYPE uj_dim_name,
            member TYPE uj_dim_member,
          END OF t_appldimmembers.

    CLASS-METHODS: file_f4 RETURNING value(r_file) TYPE string,
                   directory_f4 RETURNING value(r_path) TYPE string,
                   get_initial_directory RETURNING value(r_path) TYPE string,
                   set_delimiter_listbox,
                   set_delimiter,
                   export_users_to_file,
                   import_users_from_file,
                   export_teams_to_file,
                   import_teams_from_file,
                   export_team_assign_to_file,
                   import_team_assign_from_file,
                   export_task_profiles_to_file,
                   import_task_profiles_from_file,
                   export_mem_profiles_to_file,
                   import_mem_profiles_from_file,
                   export_tap_assign_to_file,
                   import_tap_assign_from_file,
                   export_map_assign_to_file,
                   import_map_assign_from_file,
                   delete_users_from_file,
                   delete_teams_from_file,
                   delete_task_profiles_from_file,                   "TSK
                   delete_mem_profiles_from_file,                    "MBR

                   get_bpc_component_version,
                   get_appset_data IMPORTING i_appset_id TYPE uj_appset_id
                                   EXCEPTIONS appset_not_found .

  PRIVATE SECTION.

    CLASS-DATA: lv_appset_id TYPE uja_s_appset_info-appset_id.
    CLASS-DATA: lv_delimiter TYPE string.
    CLASS-DATA: lv_release TYPE saprelease.
    CLASS-DATA: lv_splevel TYPE sappatchlv.
    CLASS-DATA: ls_appset_info TYPE uja_s_appset_info.

    CLASS-DATA: lt_appl_info TYPE uja_t_appl_info.
    CLASS-DATA: lt_appl_dim TYPE TABLE OF t_appldim.
    CLASS-DATA: lt_members TYPE TABLE OF t_appldimmembers.
    CLASS-DATA: lt_teams_list TYPE uje_t_team.
    CLASS-DATA: lt_users_list TYPE uje_t_user.
    CLASS-DATA: lt_tprofs TYPE uje_t_api_profile_id.
    CLASS-DATA: lt_mprofs TYPE uje_t_api_profile_id.
    CLASS-DATA: lt_mprofs_tmp TYPE uje_t_profile.
    CLASS-DATA: lt_tasks TYPE uje_t_role_tskasg.
    CLASS-DATA: lt_roles TYPE uje_t_role.

    CLASS-DATA: lo_context TYPE REF TO if_uj_context.
    CLASS-DATA: lt_alv_messages TYPE uj0_t_message.

    CLASS-METHODS: set_global_context,
                   render_alv,
                   upload IMPORTING i_filepath TYPE any
                          RETURNING value(rt_strtab) TYPE stringtab,
                   download IMPORTING i_filepath TYPE any
                                     it_datatab TYPE STANDARD TABLE,
                   user_is_valid IMPORTING i_user_id TYPE any
                                 RETURNING value(r_boolean) TYPE abap_bool,
                   team_is_valid IMPORTING i_team_id TYPE any
                                 RETURNING value(r_boolean) TYPE abap_bool,
                   tprofile_is_valid IMPORTING i_profile_id TYPE any
                                     RETURNING value(r_boolean) TYPE abap_bool,
                   mprofile_is_valid IMPORTING i_profile_id TYPE any
                                     RETURNING value(r_boolean) TYPE abap_bool,
                   role_is_valid IMPORTING i_role_id TYPE any
                                 RETURNING value(r_boolean) TYPE abap_bool,
                   task_is_valid IMPORTING i_task_id TYPE any
                                 RETURNING value(r_boolean) TYPE abap_bool.

ENDCLASS.                    "lcl_application DEFINITION

SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-001.
PARAMETERS: p_export RADIOBUTTON GROUP grp1 DEFAULT 'X' USER-COMMAND chk.
PARAMETERS: p_import RADIOBUTTON GROUP grp1.
PARAMETERS: p_delete RADIOBUTTON GROUP grp1.
SELECTION-SCREEN END OF BLOCK b1.
SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE text-002.
PARAMETERS: p_appset TYPE uja_appset_info-appset_id.
PARAMETERS: p_file TYPE string LOWER CASE.
PARAMETERS: p_delmt TYPE char10 AS LISTBOX VISIBLE LENGTH 20
                       DEFAULT lcl_application=>lc_comma.  "delimiter
SELECTION-SCREEN END OF BLOCK b2.
SELECTION-SCREEN BEGIN OF BLOCK b3 WITH FRAME TITLE text-003.
PARAMETERS: p_eusers RADIOBUTTON GROUP grp2 MODIF ID exp.
PARAMETERS: p_eteams RADIOBUTTON GROUP grp2 MODIF ID exp.
PARAMETERS: p_eteama RADIOBUTTON GROUP grp2 MODIF ID exp.
PARAMETERS: p_etprof RADIOBUTTON GROUP grp2 MODIF ID exp.
PARAMETERS: p_emprof RADIOBUTTON GROUP grp2 MODIF ID exp.
PARAMETERS: p_etprfa RADIOBUTTON GROUP grp2 MODIF ID exp.
PARAMETERS: p_emprfa RADIOBUTTON GROUP grp2 MODIF ID exp.
SELECTION-SCREEN END OF BLOCK b3.

SELECTION-SCREEN BEGIN OF BLOCK b4 WITH FRAME TITLE text-004.
PARAMETERS: p_iusers RADIOBUTTON GROUP grp3 MODIF ID imp.
PARAMETERS: p_iteams RADIOBUTTON GROUP grp3 MODIF ID imp.
PARAMETERS: p_iteama RADIOBUTTON GROUP grp3 MODIF ID imp.
PARAMETERS: p_itprof RADIOBUTTON GROUP grp3 MODIF ID imp.
PARAMETERS: p_improf RADIOBUTTON GROUP grp3 MODIF ID imp.
PARAMETERS: p_itprfa RADIOBUTTON GROUP grp3 MODIF ID imp.
PARAMETERS: p_imprfa RADIOBUTTON GROUP grp3 MODIF ID imp.
SELECTION-SCREEN END OF BLOCK b4.

SELECTION-SCREEN BEGIN OF BLOCK b5 WITH FRAME TITLE text-005.
PARAMETERS: p_dusers RADIOBUTTON GROUP grp4 MODIF ID del.
PARAMETERS: p_dteams RADIOBUTTON GROUP grp4 MODIF ID del.
PARAMETERS: p_dtprof RADIOBUTTON GROUP grp4 MODIF ID del.
PARAMETERS: p_dmprof RADIOBUTTON GROUP grp4 MODIF ID del.
SELECTION-SCREEN END OF BLOCK b5.

INITIALIZATION.

  p_file = lcl_application=>get_initial_directory( ).
  lcl_application=>set_delimiter_listbox( ).
  lcl_application=>get_bpc_component_version( ).

AT SELECTION-SCREEN OUTPUT.

  LOOP AT SCREEN.
    IF p_export = abap_true.
      IF  screen-group1 = 'IMP' OR screen-group1 = 'DEL'.
          screen-active = '0'.
      ENDIF.
    ENDIF.
    IF p_import = abap_true.
      IF screen-group1 = 'EXP' OR screen-group1 = 'DEL'.
         screen-active = '0'.
      ENDIF.
    ENDIF.
    IF p_delete = abap_true.
      IF screen-group1 = 'IMP' OR screen-group1 = 'EXP'.
         screen-active = '0'.
      ENDIF.
    ENDIF.
    MODIFY SCREEN.
  ENDLOOP.

AT SELECTION-SCREEN.
  CASE abap_true.
    WHEN p_export.
      CLEAR: p_iusers, p_iteams, p_iteama, p_itprof,
             p_improf, p_itprfa, p_imprfa,
             p_dusers, p_dteams, p_dtprof,p_dmprof.

    WHEN p_import.
      CLEAR: p_eusers, p_eteams, p_eteama, p_etprof,
             p_emprof, p_etprfa, p_emprfa,
             p_dusers, p_dteams, p_dtprof,p_dmprof.

    WHEN p_delete.
      CLEAR: p_eusers, p_eteams, p_eteama, p_etprof,
             p_emprof, p_etprfa, p_emprfa,
             p_iusers, p_iteams, p_iteama, p_itprof,
             p_improf, p_itprfa, p_imprfa.
  ENDCASE.

  IF sy-ucomm <> 'CHK'.

    IF p_appset IS INITIAL.
      MESSAGE e001(00) WITH 'Please enter an AppSet Id'.
    ENDIF.
    IF p_file IS INITIAL.
      MESSAGE e001(00) WITH 'Please enter a valid directory or file'.
    ENDIF.
    IF p_delmt IS INITIAL.
      MESSAGE e001(00) WITH 'Please specify a delimiter'.
    ENDIF.

  ENDIF.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.

  CASE abap_true.
    WHEN p_export.  p_file = lcl_application=>directory_f4( ).
    WHEN p_import.  p_file = lcl_application=>file_f4( ).
    WHEN p_delete.  p_file = lcl_application=>file_f4( ).  "import and delete based on file
  ENDCASE.

START-OF-SELECTION.

  lcl_application=>set_delimiter( ).

  lcl_application=>get_appset_data(
              EXPORTING
                   i_appset_id =  p_appset
              EXCEPTIONS
                   appset_not_found  = 1 ).
  IF sy-subrc <> 0.
    RETURN.
  ENDIF.

  CASE abap_true.
    WHEN p_eusers.  lcl_application=>export_users_to_file( ).
    WHEN p_iusers.  lcl_application=>import_users_from_file( ).
    WHEN p_eteams.  lcl_application=>export_teams_to_file( ).
    WHEN p_iteams.  lcl_application=>import_teams_from_file( ).
    WHEN p_eteama.  lcl_application=>export_team_assign_to_file( ).
    WHEN p_iteama.  lcl_application=>import_team_assign_from_file( ).
    WHEN p_etprof.  lcl_application=>export_task_profiles_to_file( ).
    WHEN p_itprof.  lcl_application=>import_task_profiles_from_file( ).
    WHEN p_emprof.  lcl_application=>export_mem_profiles_to_file( ).
    WHEN p_improf.  lcl_application=>import_mem_profiles_from_file( ).
    WHEN p_etprfa.  lcl_application=>export_tap_assign_to_file( ).
    WHEN p_itprfa.  lcl_application=>import_tap_assign_from_file( ).
    WHEN p_emprfa.  lcl_application=>export_map_assign_to_file( ).
    WHEN p_imprfa.  lcl_application=>import_map_assign_from_file( ).

    " for delete functions
    WHEN p_dusers.   lcl_application=>delete_users_from_file( ).
    WHEN p_dteams.   lcl_application=>delete_teams_from_file( ).
    WHEN p_dtprof.   lcl_application=>delete_task_profiles_from_file( ).
    WHEN p_dmprof.   lcl_application=>delete_mem_profiles_from_file( ).

  ENDCASE.

*----------------------------------------------------------------------*
*       CLASS lcl_application IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS lcl_application IMPLEMENTATION.

  METHOD file_f4.

    DATA: lt_file_table TYPE filetable.
    DATA: ls_file_table LIKE LINE OF lt_file_table.

    DATA: lv_rc TYPE sy-subrc.

    cl_gui_frontend_services=>file_open_dialog(
      CHANGING
        file_table = lt_file_table
        rc         = lv_rc ).
    CLEAR ls_file_table .
    READ TABLE lt_file_table INTO ls_file_table INDEX 1.
    IF sy-subrc  = 0.
      r_file = ls_file_table-filename.
    ENDIF.

  ENDMETHOD.                                                "file_f4

  METHOD directory_f4.

    cl_gui_frontend_services=>directory_browse(
        CHANGING
          selected_folder      = r_path
        EXCEPTIONS
          OTHERS               = 4 ).

  ENDMETHOD.                    "directory_f4

  METHOD upload.

    cl_gui_frontend_services=>gui_upload(
          EXPORTING
            filename = i_filepath
          CHANGING
            data_tab = rt_strtab
          EXCEPTIONS
            OTHERS   = 19 ).
    IF sy-subrc <> 0.
      MESSAGE e001(00) WITH 'File not found, check file path and name'.
    ENDIF.

    DELETE rt_strtab WHERE table_line IS INITIAL.

  ENDMETHOD.                    "upload

  METHOD download.

    DATA: lt_datatab TYPE stringtab.
    DATA: ls_datatab LIKE LINE OF lt_datatab.

    FIELD-SYMBOLS: <ls_data> TYPE ANY.
    FIELD-SYMBOLS: <lv_field> TYPE ANY.

* Convert table to delimited string table
    LOOP AT it_datatab ASSIGNING <ls_data>.
      CLEAR ls_datatab.
      DO.
        ASSIGN COMPONENT sy-index
                         OF STRUCTURE <ls_data> TO <lv_field>.
        IF sy-subrc <> 0.
          EXIT.
        ENDIF.
        IF ls_datatab IS INITIAL.
          ls_datatab = <lv_field>.
        ELSE.
          CONCATENATE ls_datatab <lv_field>
                          INTO ls_datatab SEPARATED BY lcl_application=>lv_delimiter.
        ENDIF.
      ENDDO.
      APPEND ls_datatab TO lt_datatab.
    ENDLOOP.

    cl_gui_frontend_services=>gui_download(
       EXPORTING
         filename = i_filepath
       CHANGING
         data_tab = lt_datatab
       EXCEPTIONS
         OTHERS   = 24 ).
    IF sy-subrc <> 0.
      MESSAGE e001(00)
          WITH 'File not downloaded, check file path and name'.
    ENDIF.

  ENDMETHOD.                    "download

  METHOD get_initial_directory.

    cl_gui_frontend_services=>get_desktop_directory(
      CHANGING
        desktop_directory    = r_path ).
    cl_gui_cfw=>flush( ).

    CONCATENATE r_path '\*.csv' INTO r_path.

  ENDMETHOD.                    "get_initial_directory

  METHOD export_users_to_file.

    TYPES: BEGIN OF t_output,
            user_id TYPE uje_user-user_id,
            fullname TYPE uje_user-fullname,
            email TYPE uje_user-email,
           END OF t_output.

    DATA: lt_user_id TYPE uje_t_api_user_id.

    DATA: lt_users TYPE uje_t_user.
    DATA: ls_users LIKE LINE OF lt_users.

    DATA: lt_output TYPE TABLE OF t_output.
    DATA: ls_output LIKE LINE OF lt_output.

    lcl_application=>set_global_context( ).

    CALL FUNCTION 'UJE_API_GET_LIST_USERS'
      EXPORTING
        i_appset_id = lcl_application=>lv_appset_id
        is_user     = lcl_application=>lo_context->ds_user
        it_user_id  = lt_user_id
      IMPORTING
        et_user     = lt_users.

    REFRESH lt_output.
    LOOP AT lt_users INTO ls_users.
      MOVE-CORRESPONDING ls_users TO ls_output.
      APPEND ls_output TO lt_output.
    ENDLOOP.

* Download table
    lcl_application=>download( EXPORTING i_filepath = p_file
                                         it_datatab = lt_output ).

  ENDMETHOD.                    "export_users_to_file

  METHOD import_users_from_file.

    DATA: lv_action TYPE uj_action.
    DATA: lv_success TYPE uj_bool.

    DATA: ls_user_info TYPE uje_s_userinfo.

    DATA: lt_messages TYPE uj0_t_message.
    DATA: ls_alv_messages LIKE LINE OF lt_alv_messages.

    DATA: lt_team_asin TYPE uje_t_user_team.
    DATA: lt_tprofiles TYPE uje_t_profile_id_act.
    DATA: lt_mprofiles TYPE uje_t_profile_id_act.

    DATA: lt_strtab TYPE stringtab.
    DATA: ls_strtab LIKE LINE OF lt_strtab.

    lt_strtab = lcl_application=>upload( p_file ).

    LOOP AT lt_strtab INTO ls_strtab.

      SPLIT ls_strtab AT lcl_application=>lv_delimiter INTO ls_user_info-user_id
                                  ls_user_info-fullname
                                  ls_user_info-email.

* Check if user already exists, and set action accordingly.
      IF lcl_application=>user_is_valid( ls_user_info-user_id ) = abap_false.
        lv_action = 'I'.
      ELSE.
        lv_action = 'M'.
      ENDIF.

      CALL FUNCTION 'UJE_API_MANAGE_USER2'
        EXPORTING
          i_appset_id      = lcl_application=>lv_appset_id
          is_user          = lcl_application=>lo_context->ds_user
          is_user_info     = ls_user_info
          i_action         = lv_action
          it_team_asin     = lt_team_asin
          it_tprofile_id   = lt_tprofiles
          it_mprofile_id   = lt_mprofiles
        IMPORTING
          e_success        = lv_success
          et_message_lines = lt_messages.

      IF lv_success = 'Y'.
        CLEAR ls_alv_messages.
        ls_alv_messages-msgid = '00'.
        ls_alv_messages-msgty = 'S'.
        ls_alv_messages-msgno = '001'.
        CONCATENATE 'User ID' ls_user_info-user_id
                    'has been created/updated successfully'
                            INTO ls_alv_messages-message SEPARATED BY space.
        APPEND ls_alv_messages TO lt_alv_messages.
      ELSE.
        APPEND LINES OF lt_messages TO lt_alv_messages.
        CLEAR ls_alv_messages.
        ls_alv_messages-msgid = '00'.
        ls_alv_messages-msgty = 'E'.
        ls_alv_messages-msgno = '001'.
        CONCATENATE 'User ID' ls_user_info-user_id
                    'not created/updated due to error'
                             INTO ls_alv_messages-message SEPARATED BY space.
        APPEND ls_alv_messages TO lt_alv_messages.
      ENDIF.

    ENDLOOP.

    lcl_application=>render_alv( ).

  ENDMETHOD.                    "create_users_from_file

  METHOD delete_users_from_file.

    DATA: lv_action TYPE uj_action.
    DATA: lv_success TYPE uj_bool.

    DATA: ls_user_info TYPE uje_s_userinfo.

    DATA: lt_messages TYPE uj0_t_message.
    DATA: ls_alv_messages LIKE LINE OF lt_alv_messages.

    DATA: lt_team_asin TYPE uje_t_user_team.
    DATA: lt_tprofiles TYPE uje_t_profile_id_act.
    DATA: lt_mprofiles TYPE uje_t_profile_id_act.

    DATA: lt_strtab TYPE stringtab.
    DATA: ls_strtab LIKE LINE OF lt_strtab.

    lt_strtab = lcl_application=>upload( p_file ).

    LOOP AT lt_strtab INTO ls_strtab.

      SPLIT ls_strtab AT lcl_application=>lv_delimiter INTO ls_user_info-user_id
                                  ls_user_info-fullname
                                  ls_user_info-email.


      CALL FUNCTION 'UJE_API_DELETE_USER'
        EXPORTING
          i_appset_id      = lcl_application=>lv_appset_id
          is_user          = lcl_application=>lo_context->ds_user
          i_user_id        = ls_user_info-user_id
        IMPORTING
          e_success        = lv_success
          et_message_lines = lt_messages.

      IF lv_success = 'Y'.
        CLEAR ls_alv_messages.
        ls_alv_messages-msgid = '00'.
        ls_alv_messages-msgty = 'S'.
        ls_alv_messages-msgno = '001'.
        CONCATENATE 'User ID' ls_user_info-user_id
                    'has been removed successfully'
                            INTO ls_alv_messages-message SEPARATED BY space.
        APPEND ls_alv_messages TO lt_alv_messages.
      ELSE.
        APPEND LINES OF lt_messages TO lt_alv_messages.
        CLEAR ls_alv_messages.
        ls_alv_messages-msgid = '00'.
        ls_alv_messages-msgty = 'E'.
        ls_alv_messages-msgno = '001'.
        CONCATENATE 'User ID' ls_user_info-user_id
                    'could not be removed due to error'
                             INTO ls_alv_messages-message SEPARATED BY space.
        APPEND ls_alv_messages TO lt_alv_messages.
      ENDIF.

    ENDLOOP.

    lcl_application=>render_alv( ).

  ENDMETHOD.                    "delete_users_from_file

  METHOD export_teams_to_file.

    TYPES: BEGIN OF t_output,
            team_id TYPE uje_s_team-team_id,
            description TYPE uje_s_team-description,
           END OF t_output.

    DATA: lt_teams TYPE uje_t_team.
    DATA: ls_teams LIKE LINE OF lt_teams.

    DATA: lt_output TYPE TABLE OF t_output.
    DATA: ls_output LIKE LINE OF lt_output.

    CALL FUNCTION 'UJE_API_GET_TEAMS'
      EXPORTING
        i_appset_id = lcl_application=>lv_appset_id
        is_user     = lcl_application=>lo_context->ds_user
      IMPORTING
        et_team     = lt_teams.

    REFRESH lt_output.
    LOOP AT lt_teams INTO ls_teams.
      MOVE-CORRESPONDING ls_teams TO ls_output.
      APPEND ls_output TO lt_output.
    ENDLOOP.

* Download table
    lcl_application=>download( EXPORTING i_filepath = p_file
                                         it_datatab = lt_output ).

  ENDMETHOD.                    "export_teams_to_file

  METHOD import_teams_from_file.

    DATA: lv_action TYPE uj_action.
    DATA: lv_success TYPE uj_bool.

    DATA: ls_team TYPE uje_s_team.

    DATA: lt_messages TYPE uj0_t_message.
    DATA: ls_alv_messages LIKE LINE OF lt_alv_messages.

    DATA: lt_users TYPE uje_t_user_team.
    DATA: lt_tprofiles TYPE uje_t_profile_id_act.
    DATA: lt_mprofiles TYPE uje_t_profile_id_act.

    DATA: lt_strtab TYPE stringtab.
    DATA: ls_strtab LIKE LINE OF lt_strtab.

    lt_strtab = lcl_application=>upload( p_file ).

    LOOP AT lt_strtab INTO ls_strtab.

      SPLIT ls_strtab AT lcl_application=>lv_delimiter INTO ls_team-team_id
                                  ls_team-description.

* Check if team is already a valid team, set action appropriatly
      IF lcl_application=>team_is_valid( ls_team-team_id ) = abap_false.
        lv_action = 'I'.
      ELSE.
        lv_action = 'M'.
      ENDIF.

      CALL FUNCTION 'UJE_API_MANAGE_TEAM2'
        EXPORTING
          i_appset_id      = lcl_application=>lv_appset_id
          is_user          = lcl_application=>lo_context->ds_user
          is_team          = ls_team
          i_action         = lv_action
          it_users         = lt_users
          it_tprofile_id   = lt_tprofiles
          it_mprofile_id   = lt_mprofiles
        IMPORTING
          e_success        = lv_success
          et_message_lines = lt_messages.

      IF lv_success = 'Y'.
        CLEAR ls_alv_messages.
        ls_alv_messages-msgid = '00'.
        ls_alv_messages-msgty = 'S'.
        ls_alv_messages-msgno = '001'.
        CONCATENATE 'Team' ls_team-team_id
                     'has been created/updated successfully'
                         INTO ls_alv_messages-message SEPARATED BY space.
        APPEND ls_alv_messages TO lt_alv_messages.
      ELSE.
        APPEND LINES OF lt_messages TO lt_alv_messages.
        CLEAR ls_alv_messages.
        ls_alv_messages-msgid = '00'.
        ls_alv_messages-msgty = 'E'.
        ls_alv_messages-msgno = '001'.
        CONCATENATE 'Team' ls_team-team_id
                    'not created/updated due to error'
                          INTO ls_alv_messages-message SEPARATED BY space.
        APPEND ls_alv_messages TO lt_alv_messages.
      ENDIF.

    ENDLOOP.

    lcl_application=>render_alv( ).

  ENDMETHOD.                    "create_teams_from_file
  METHOD delete_teams_from_file.

    DATA: lv_action TYPE uj_action.
    DATA: lv_success TYPE uj_bool.

    DATA: ls_team TYPE uje_s_team.

    DATA: lt_messages TYPE uj0_t_message.
    DATA: ls_alv_messages LIKE LINE OF lt_alv_messages.

    DATA: lt_users TYPE uje_t_user_team.
    DATA: lt_tprofiles TYPE uje_t_profile_id_act.
    DATA: lt_mprofiles TYPE uje_t_profile_id_act.

    DATA: lt_strtab TYPE stringtab.
    DATA: ls_strtab LIKE LINE OF lt_strtab.

    lt_strtab = lcl_application=>upload( p_file ).

    LOOP AT lt_strtab INTO ls_strtab.

      SPLIT ls_strtab AT lcl_application=>lv_delimiter INTO ls_team-team_id
                                  ls_team-description.

      CALL FUNCTION 'UJE_API_DELETE_TEAM'
        EXPORTING
          i_appset_id      = lcl_application=>lv_appset_id
          is_user          = lcl_application=>lo_context->ds_user
          i_team_id        = ls_team-team_id
        IMPORTING
          e_success        = lv_success
          et_message_lines = lt_messages.

      IF lv_success = 'Y'.
        CLEAR ls_alv_messages.
        ls_alv_messages-msgid = '00'.
        ls_alv_messages-msgty = 'S'.
        ls_alv_messages-msgno = '001'.
        CONCATENATE 'Team' ls_team-team_id
                     'has been removed successfully'
                         INTO ls_alv_messages-message SEPARATED BY space.
        APPEND ls_alv_messages TO lt_alv_messages.
      ELSE.
        APPEND LINES OF lt_messages TO lt_alv_messages.
        CLEAR ls_alv_messages.
        ls_alv_messages-msgid = '00'.
        ls_alv_messages-msgty = 'E'.
        ls_alv_messages-msgno = '001'.
        CONCATENATE 'Team' ls_team-team_id
                    'could not be removed due to error'
                          INTO ls_alv_messages-message SEPARATED BY space.
        APPEND ls_alv_messages TO lt_alv_messages.
      ENDIF.

    ENDLOOP.

    lcl_application=>render_alv( ).

  ENDMETHOD.                    "delete_teams_from_file

  METHOD export_team_assign_to_file.

    TYPES: BEGIN OF t_user_assign,
            user_id TYPE uje_s_user_team-user_id,
            team_id TYPE uje_s_user_team-team_id,
            teamleader TYPE uje_s_user_team-teamleader,
           END OF t_user_assign.

    DATA: lt_user_det TYPE uje_t_user_detail.
    DATA: ls_user_det LIKE LINE OF lt_user_det.

    DATA: ls_user_team TYPE uje_s_user_team.

    DATA: lt_team_assign TYPE TABLE OF t_user_assign.
    DATA: ls_team_assign LIKE LINE OF lt_team_assign.

    CALL FUNCTION 'UJE_API_GET_USERDATA'
      EXPORTING
        i_appset_id = lcl_application=>lv_appset_id
        is_user     = lcl_application=>lo_context->ds_user
      IMPORTING
        et_user     = lt_user_det.

    LOOP AT lt_user_det INTO ls_user_det.
      LOOP AT ls_user_det-t_team_id INTO ls_user_team.
        MOVE-CORRESPONDING ls_user_team TO ls_team_assign.
        APPEND ls_team_assign TO lt_team_assign.
      ENDLOOP.
    ENDLOOP.

* Download table
    lcl_application=>download( EXPORTING i_filepath = p_file
                                         it_datatab = lt_team_assign ).

  ENDMETHOD.                    "export_team_assign_to_file

  METHOD import_team_assign_from_file.

    TYPES: BEGIN OF t_user_assign,
            user_id TYPE uje_s_user_team-user_id,
            team_id TYPE uje_s_user_team-team_id,
            teamleader TYPE uje_s_user_team-teamleader,
           END OF t_user_assign.

    DATA: lv_success TYPE uj_bool.

    DATA: lt_user_team_temp TYPE uje_t_user_team.
    DATA: ls_user_team_temp TYPE uje_s_user_team.

    DATA: lt_user_team TYPE uje_t_user_team.
    DATA: ls_user_team TYPE uje_s_user_team.

    DATA: ls_team_assign TYPE uje_s_user_team.

    DATA: lt_messages TYPE uj0_t_message.
    DATA: ls_alv_messages LIKE LINE OF lt_alv_messages.

    DATA: lt_tprofiles TYPE uje_t_profile_id_act.
    DATA: ls_tprofiles LIKE LINE OF lt_tprofiles.

    DATA: lt_mprofiles TYPE uje_t_profile_id_act.
    DATA: ls_mprofiles LIKE LINE OF lt_mprofiles.

    DATA: lt_tprofile_ids TYPE uje_t_api_profile_id.
    DATA: ls_tprofile_ids LIKE LINE OF lt_tprofile_ids.

    DATA: lt_mprofile_ids TYPE uje_t_api_profile_id.
    DATA: ls_mprofile_ids LIKE LINE OF lt_mprofile_ids.

    DATA: lt_strtab TYPE stringtab.
    DATA: ls_strtab LIKE LINE OF lt_strtab.

    DATA: ls_teams_list LIKE LINE OF lt_teams_list.

    lt_strtab = lcl_application=>upload( p_file ).

    LOOP AT lt_strtab INTO ls_strtab.

      SPLIT ls_strtab AT lcl_application=>lv_delimiter INTO ls_team_assign-user_id
                                  ls_team_assign-team_id
                                  ls_team_assign-teamleader.

      CLEAR ls_user_team.
      ls_user_team-user_id = ls_team_assign-user_id.
      ls_user_team-team_id = ls_team_assign-team_id.
      ls_user_team-teamleader = ls_team_assign-teamleader.
      TRANSLATE ls_user_team-teamleader USING 'YXyX1XxXN n 0 '. "Translate to X or space
      APPEND ls_user_team TO lt_user_team.

      IF lcl_application=>team_is_valid( ls_team_assign-team_id ) = abap_false.
        CLEAR ls_alv_messages.
        ls_alv_messages-msgid = '00'.
        ls_alv_messages-msgty = 'E'.
        ls_alv_messages-msgno = '001'.
        CONCATENATE 'Team' ls_team_assign-team_id 'does not yet exist.'
                    'No user assigments done.'
                          INTO ls_alv_messages-message SEPARATED BY space.
        APPEND ls_alv_messages TO lt_alv_messages.
        lcl_application=>render_alv( ).
        RETURN.
      ENDIF.

      IF lcl_application=>user_is_valid( ls_team_assign-user_id ) = abap_false.
        CLEAR ls_alv_messages.
        ls_alv_messages-msgid = '00'.
        ls_alv_messages-msgty = 'E'.
        ls_alv_messages-msgno = '001'.
        CONCATENATE 'User' ls_team_assign-user_id 'does not yet exist.'
                    'No user assigments done.'
                          INTO ls_alv_messages-message SEPARATED BY space.
        APPEND ls_alv_messages TO lt_alv_messages.
        lcl_application=>render_alv( ).
        RETURN.
      ENDIF.

    ENDLOOP.

    LOOP AT lcl_application=>lt_teams_list INTO ls_teams_list.

      REFRESH lt_user_team_temp.
      REFRESH lt_tprofile_ids.
      REFRESH lt_mprofile_ids.

* Check that there is data for team assignment, otherwise skip
      READ TABLE lt_user_team TRANSPORTING NO FIELDS
                        WITH KEY team_id = ls_teams_list-team_id.
      IF sy-subrc <> 0.
        CONTINUE.
      ENDIF.

* Get existing team data for this team.
      CALL FUNCTION 'UJE_API_GET_TEAMDATA'
        EXPORTING
          i_appset_id    = lcl_application=>lv_appset_id
          is_user        = lcl_application=>lo_context->ds_user
          i_team_id      = ls_teams_list-team_id
        IMPORTING
          et_user_team   = lt_user_team_temp
          et_tprofile_id = lt_tprofile_ids
          et_mprofile_id = lt_mprofile_ids.

* Update with new users.
      LOOP AT lt_user_team INTO ls_user_team
                       WHERE team_id = ls_teams_list-team_id.
        MOVE-CORRESPONDING ls_user_team TO ls_user_team_temp.
        APPEND ls_user_team_temp TO lt_user_team_temp.
      ENDLOOP.

* Keep existing profiles.
      REFRESH lt_tprofiles.
      LOOP AT lt_tprofile_ids INTO ls_tprofile_ids.
        ls_tprofiles-profile_id = ls_tprofile_ids-profile_id.
        APPEND ls_tprofiles TO lt_tprofiles.
      ENDLOOP.
      REFRESH lt_mprofiles.
      LOOP AT lt_mprofile_ids INTO ls_mprofile_ids.
        ls_mprofiles-profile_id = ls_mprofile_ids-profile_id.
        APPEND ls_mprofiles TO lt_mprofiles.
      ENDLOOP.

* now update the user/team assignments
      CALL FUNCTION 'UJE_API_MANAGE_TEAM2'
        EXPORTING
          i_appset_id      = lcl_application=>lv_appset_id
          is_user          = lcl_application=>lo_context->ds_user
          is_team          = ls_teams_list
          i_action         = 'M'
          it_users         = lt_user_team_temp
          it_tprofile_id   = lt_tprofiles
          it_mprofile_id   = lt_mprofiles
        IMPORTING
          e_success        = lv_success
          et_message_lines = lt_messages.

      IF lv_success = 'Y'.
        CLEAR ls_alv_messages.
        ls_alv_messages-msgid = '00'.
        ls_alv_messages-msgty = 'S'.
        ls_alv_messages-msgno = '001'.
        CONCATENATE 'Team' ls_teams_list-team_id 'user assignments'
                    'have been updated successfully'
                         INTO ls_alv_messages-message SEPARATED BY space.
        APPEND ls_alv_messages TO lt_alv_messages.
      ELSE.
        APPEND LINES OF lt_messages TO lt_alv_messages.
        CLEAR ls_alv_messages.
        ls_alv_messages-msgid = '00'.
        ls_alv_messages-msgty = 'E'.
        ls_alv_messages-msgno = '001'.
        CONCATENATE 'Team' ls_teams_list-team_id 'user assignments'
                    'not updated due to error'
                         INTO ls_alv_messages-message SEPARATED BY space.
        APPEND ls_alv_messages TO lt_alv_messages.
      ENDIF.

    ENDLOOP.

    lcl_application=>render_alv( ).

  ENDMETHOD.                    "import_team_assign_from_file

  METHOD export_task_profiles_to_file.

    TYPES: BEGIN OF t_output,
            identifier TYPE char01, " Row Identifer
            profile TYPE uj_profile_id,
            values TYPE string,
           END OF t_output.

    DATA: ls_tprofs LIKE LINE OF lt_tprofs.
    DATA: lv_profile TYPE uj_profile_id.

    DATA: ls_profile TYPE uje_s_profile.
    DATA: lt_role_id TYPE uje_t_api_role_id.
    DATA: ls_role_id LIKE LINE OF lt_role_id.

    DATA: lt_task_info TYPE  uje_t_task_info.
    DATA: ls_task_info LIKE LINE OF lt_task_info.

    DATA: lt_users_asin TYPE uje_t_api_user_id.
    DATA: ls_users_asin LIKE LINE OF lt_users_asin.

    DATA: lt_teams_asin TYPE uje_t_api_team_id.
    DATA: ls_teams_asin LIKE LINE OF lt_teams_asin.

    DATA: lt_output TYPE TABLE OF t_output.
    DATA: ls_output LIKE LINE OF lt_output.

    LOOP AT lcl_application=>lt_tprofs INTO ls_tprofs.

      lv_profile = ls_tprofs-profile_id.

* Get relevant data for task profile
      CLEAR ls_profile.
      REFRESH: lt_role_id, lt_task_info, lt_users_asin, lt_teams_asin.
      CALL FUNCTION 'UJE_API_GET_TPROFILEDATA2'
        EXPORTING
          i_appset_id  = lcl_application=>lv_appset_id
          is_user      = lcl_application=>lo_context->ds_user
          i_profile_id = lv_profile
        IMPORTING
          es_profile   = ls_profile
          et_role_id   = lt_role_id
          et_task_info = lt_task_info
          et_user_id   = lt_users_asin
          et_team_id   = lt_teams_asin.

* Write Header row
      CLEAR ls_output.
      ls_output-identifier = 'H'.
      ls_output-profile  = lv_profile.
      ls_output-values = ls_profile-description.
      APPEND ls_output TO lt_output.

* Write task assigments
      CLEAR ls_output.
      ls_output-identifier = 'K'.
      ls_output-profile  = lv_profile.
      LOOP AT lt_task_info INTO ls_task_info.
        ls_output-values = ls_task_info-task_id.
        APPEND ls_output TO lt_output.
      ENDLOOP.

* Write role assigments
      CLEAR ls_output.
      ls_output-identifier = 'R'.
      ls_output-profile  = lv_profile.
      LOOP AT lt_role_id INTO ls_role_id.
        ls_output-values = ls_role_id-role_id.
        APPEND ls_output TO lt_output.
      ENDLOOP.

* Write user assignments
      CLEAR ls_output.
      ls_output-identifier = 'U'.
      ls_output-profile  = lv_profile.
      LOOP AT lt_users_asin INTO ls_users_asin.
        ls_output-values = ls_users_asin-user_id.
        APPEND ls_output TO lt_output.
      ENDLOOP.

* Write team assignments
      CLEAR ls_output.
      ls_output-identifier = 'T'.
      ls_output-profile  = lv_profile.
      LOOP AT lt_teams_asin INTO ls_teams_asin.
        ls_output-values = ls_teams_asin-team_id.
        APPEND ls_output TO lt_output.
      ENDLOOP.

    ENDLOOP.

* Download table
    lcl_application=>download( EXPORTING i_filepath = p_file
                                         it_datatab = lt_output ).

  ENDMETHOD.                    "export_task_profiles_to_file

  METHOD import_task_profiles_from_file.

    TYPES: BEGIN OF t_input,
            identifier TYPE char01, " Row Identifer
            profile TYPE uj_profile_id,
            values TYPE string,
           END OF t_input.

    TYPES: BEGIN OF t_task_profile,
            profile TYPE uje_s_profile,
            roles TYPE uje_t_api_role_id,
            task_info TYPE uje_t_task_info,
            users_asin TYPE uje_t_api_user_id,
            teams_asin TYPE uje_t_api_team_id,
           END OF t_task_profile.

    DATA: lt_task_profile TYPE TABLE OF t_task_profile.
    DATA: ls_task_profile LIKE LINE OF lt_task_profile.

    DATA: ls_alv_messages LIKE LINE OF lt_alv_messages.

    DATA: lt_messages TYPE uj0_t_message.

    DATA: lv_action TYPE uj_action.
    DATA: lv_success TYPE uj_bool.
    DATA: lv_last_profile TYPE uj_profile_id.

    DATA: lt_role_id TYPE uje_t_api_role_id.
    DATA: ls_role_id LIKE LINE OF lt_role_id.

    DATA: lt_task_info TYPE  uje_t_task_info.
    DATA: ls_task_info LIKE LINE OF lt_task_info.

    DATA: lt_users_asin TYPE uje_t_api_user_id.
    DATA: ls_users_asin LIKE LINE OF lt_users_asin.

    DATA: lt_teams_asin TYPE uje_t_api_team_id.
    DATA: ls_teams_asin LIKE LINE OF lt_teams_asin.

    DATA: lt_strtab TYPE stringtab.
    DATA: ls_strtab LIKE LINE OF lt_strtab.

    DATA: lt_input TYPE TABLE OF t_input.
    DATA: ls_input LIKE LINE OF lt_input.

    DATA: lt_obj_asin TYPE uje_t_profile_asin.
    DATA: ls_obj_asin LIKE LINE OF lt_obj_asin.

    DATA: lt_task_asin TYPE uje_t_task_id_act.
    DATA: ls_task_asin LIKE LINE OF lt_task_asin.

* Upload file
    lt_strtab = lcl_application=>upload( p_file ).

* Rip import file into internal table
    LOOP AT lt_strtab INTO ls_strtab.
      CLEAR ls_input.
      SPLIT ls_strtab AT lcl_application=>lv_delimiter INTO ls_input-identifier
                                  ls_input-profile
                                  ls_input-values.
      APPEND ls_input TO lt_input.
    ENDLOOP.

* Build profile table containing all associated data
    SORT lt_input STABLE ASCENDING BY profile identifier values.

    LOOP AT lt_input INTO ls_input.

      IF ls_input-profile <> lv_last_profile
          AND lv_last_profile IS NOT INITIAL.
        APPEND ls_task_profile TO lt_task_profile.
        CLEAR ls_task_profile.
      ENDIF.

* Based on record identifier
      CASE ls_input-identifier.
        WHEN 'H'.  " Header
          ls_task_profile-profile-profile_id  = ls_input-profile.
          ls_task_profile-profile-description = ls_input-values.
        WHEN 'K'.  " Task info
          SPLIT ls_input-values AT lcl_application=>lv_delimiter INTO ls_task_info-task_id
                                            ls_task_info-description.
          IF lcl_application=>task_is_valid( ls_task_info-task_id ) = abap_false.
            CLEAR ls_alv_messages.
            ls_alv_messages-msgid = '00'.
            ls_alv_messages-msgty = 'E'.
            ls_alv_messages-msgno = '001'.
            CONCATENATE 'Task ID' ls_task_info-task_id  'is not valid.'
                        'No task profile updates done.'
                                INTO ls_alv_messages-message SEPARATED BY space.
            APPEND ls_alv_messages TO lt_alv_messages.
            lcl_application=>render_alv( ).
            RETURN.
          ENDIF.
          APPEND ls_task_info TO ls_task_profile-task_info.
        WHEN 'R'.  " Roles
          ls_role_id = ls_input-values.
          IF lcl_application=>role_is_valid( ls_role_id ) = abap_false.
            CLEAR ls_alv_messages.
            ls_alv_messages-msgid = '00'.
            ls_alv_messages-msgty = 'E'.
            ls_alv_messages-msgno = '001'.
            CONCATENATE 'Role ID' ls_role_id   'is not valid.'
                        'No task profile updates done.'
                                INTO ls_alv_messages-message SEPARATED BY space.
            APPEND ls_alv_messages TO lt_alv_messages.
            lcl_application=>render_alv( ).
            RETURN.
          ENDIF.
          APPEND ls_role_id TO ls_task_profile-roles.
        WHEN 'U'.  " Users Assignments
          ls_users_asin  = ls_input-values.
          IF lcl_application=>user_is_valid( ls_users_asin ) = abap_false.
            CLEAR ls_alv_messages.
            ls_alv_messages-msgid = '00'.
            ls_alv_messages-msgty = 'E'.
            ls_alv_messages-msgno = '001'.
            CONCATENATE 'User' ls_users_asin  'does not exist.'
                        'No task profile updates done.'
                                INTO ls_alv_messages-message SEPARATED BY space.
            APPEND ls_alv_messages TO lt_alv_messages.
            lcl_application=>render_alv( ).
            RETURN.
          ENDIF.
          APPEND ls_users_asin  TO ls_task_profile-users_asin.
        WHEN 'T'.  " Team Assignments
          ls_teams_asin  = ls_input-values.
          IF lcl_application=>team_is_valid( ls_teams_asin ) = abap_false.
            CLEAR ls_alv_messages.
            ls_alv_messages-msgid = '00'.
            ls_alv_messages-msgty = 'E'.
            ls_alv_messages-msgno = '001'.
            CONCATENATE 'Team' ls_teams_asin 'does not exist.'
                        'No task profile updates done.'
                                INTO ls_alv_messages-message SEPARATED BY space.
            APPEND ls_alv_messages TO lt_alv_messages.
            lcl_application=>render_alv( ).
            RETURN.
          ENDIF.
          APPEND ls_teams_asin  TO ls_task_profile-teams_asin.
      ENDCASE.

      lv_last_profile = ls_input-profile.

      AT LAST.
        APPEND ls_task_profile TO lt_task_profile.
      ENDAT.

    ENDLOOP.

* Now for each profile, call API to create/update
    LOOP AT lt_task_profile INTO ls_task_profile.

* Determine if the task profile is new, set action accordingly.
      IF lcl_application=>tprofile_is_valid( ls_task_profile-profile ) = abap_false.
        lv_action = 'I'.
      ELSE.
        lv_action = 'M'.
      ENDIF.

* Move data to API tables
      REFRESH lt_obj_asin.
      LOOP AT ls_task_profile-roles INTO ls_role_id.
        ls_obj_asin-object_id = ls_role_id.
        ls_obj_asin-profile_id = ls_task_profile-profile.
        ls_obj_asin-object_type = 'R'.
        APPEND ls_obj_asin TO lt_obj_asin.
      ENDLOOP.
      LOOP AT ls_task_profile-users_asin INTO ls_users_asin.
        ls_obj_asin-object_id = ls_users_asin.
        ls_obj_asin-profile_id = ls_task_profile-profile.
        ls_obj_asin-object_type = 'U'.
        APPEND ls_obj_asin TO lt_obj_asin.
      ENDLOOP.
      LOOP AT ls_task_profile-teams_asin INTO ls_teams_asin.
        ls_obj_asin-object_id = ls_teams_asin.
        ls_obj_asin-profile_id = ls_task_profile-profile.
        ls_obj_asin-object_type = 'T'.
        APPEND ls_obj_asin TO lt_obj_asin.
      ENDLOOP.

      REFRESH lt_task_asin.
      LOOP AT ls_task_profile-task_info INTO ls_task_info.
        ls_task_asin-task_id = ls_task_info-task_id.
        APPEND ls_task_asin TO lt_task_asin.
      ENDLOOP.

* Call API
      CALL FUNCTION 'UJE_API_MANAGE_TPROFILE2'
        EXPORTING
          i_appset_id      = lcl_application=>lv_appset_id
          is_user          = lcl_application=>lo_context->ds_user
          i_action         = lv_action
          is_profile       = ls_task_profile-profile
          it_obj_asin      = lt_obj_asin
          it_task_asin     = lt_task_asin
        IMPORTING
          e_success        = lv_success
          et_message_lines = lt_messages.
      IF lv_success = 'Y'.
        CLEAR ls_alv_messages.
        ls_alv_messages-msgid = '00'.
        ls_alv_messages-msgty = 'S'.
        ls_alv_messages-msgno = '001'.
        CONCATENATE 'Task Profile' ls_task_profile-profile-profile_id
                    'has been created/updated successfully'
                         INTO ls_alv_messages-message SEPARATED BY space.
        APPEND ls_alv_messages TO lt_alv_messages.
      ELSE.
        APPEND LINES OF lt_messages TO lt_alv_messages.
        CLEAR ls_alv_messages.
        ls_alv_messages-msgid = '00'.
        ls_alv_messages-msgty = 'E'.
        ls_alv_messages-msgno = '001'.
        CONCATENATE 'Task Profile' ls_task_profile-profile-profile_id
                    'not created/updated due to error'
                         INTO ls_alv_messages-message SEPARATED BY space.
        APPEND ls_alv_messages TO lt_alv_messages.
      ENDIF.

    ENDLOOP.

* Display ALV
    lcl_application=>render_alv( ).

  ENDMETHOD.                    "import_task_profiles_from_file
METHOD Delete_task_profiles_from_file.

    TYPES: BEGIN OF t_input,
            identifier TYPE char01, " Row Identifer
            profile TYPE uj_profile_id,
            values TYPE string,
           END OF t_input.

    TYPES: BEGIN OF t_task_profile,
            profile TYPE uje_s_profile,
            roles TYPE uje_t_api_role_id,
            task_info TYPE uje_t_task_info,
            users_asin TYPE uje_t_api_user_id,
            teams_asin TYPE uje_t_api_team_id,
           END OF t_task_profile.

    DATA: lt_task_profile TYPE TABLE OF t_task_profile.
    DATA: ls_task_profile LIKE LINE OF lt_task_profile.

    DATA: ls_alv_messages LIKE LINE OF lt_alv_messages.

    DATA: lt_messages TYPE uj0_t_message.

    DATA: lv_action TYPE uj_action.
    DATA: lv_success TYPE uj_bool.
    DATA: lv_last_profile TYPE uj_profile_id.

    DATA: lt_role_id TYPE uje_t_api_role_id.
    DATA: ls_role_id LIKE LINE OF lt_role_id.

    DATA: lt_task_info TYPE  uje_t_task_info.
    DATA: ls_task_info LIKE LINE OF lt_task_info.

    DATA: lt_users_asin TYPE uje_t_api_user_id.
    DATA: ls_users_asin LIKE LINE OF lt_users_asin.

    DATA: lt_teams_asin TYPE uje_t_api_team_id.
    DATA: ls_teams_asin LIKE LINE OF lt_teams_asin.

    DATA: lt_strtab TYPE stringtab.
    DATA: ls_strtab LIKE LINE OF lt_strtab.

    DATA: lt_input TYPE TABLE OF t_input.
    DATA: ls_input LIKE LINE OF lt_input.

    DATA: lt_obj_asin TYPE uje_t_profile_asin.
    DATA: ls_obj_asin LIKE LINE OF lt_obj_asin.

    DATA: lt_task_asin TYPE uje_t_task_id_act.
    DATA: ls_task_asin LIKE LINE OF lt_task_asin.

* Upload file
    lt_strtab = lcl_application=>upload( p_file ).

* Rip import file into internal table
    LOOP AT lt_strtab INTO ls_strtab.
      CLEAR ls_input.
      SPLIT ls_strtab AT lcl_application=>lv_delimiter INTO ls_input-identifier
                                  ls_input-profile
                                  ls_input-values.
      APPEND ls_input TO lt_input.
    ENDLOOP.

* Build profile table containing all associated data
    SORT lt_input STABLE ASCENDING BY profile identifier values.

    LOOP AT lt_input INTO ls_input.

      IF ls_input-profile <> lv_last_profile
          AND lv_last_profile IS NOT INITIAL.
        APPEND ls_task_profile TO lt_task_profile.
        CLEAR ls_task_profile.
      ENDIF.

* Based on record identifier
      CASE ls_input-identifier.
        WHEN 'H'.  " Header
          ls_task_profile-profile-profile_id  = ls_input-profile.
          ls_task_profile-profile-description = ls_input-values.
      ENDCASE.

      lv_last_profile = ls_input-profile.

      AT LAST.
        APPEND ls_task_profile TO lt_task_profile.
      ENDAT.

    ENDLOOP.

* Now for each profile, call API to create/update
    LOOP AT lt_task_profile INTO ls_task_profile.

      CALL FUNCTION 'UJE_API_DELETE_PROFILE'
        EXPORTING
          i_appset_id      = lcl_application=>lv_appset_id
          is_user          = lcl_application=>lo_context->ds_user
          i_profile_id     = ls_task_profile-profile-profile_id
          i_profile_class  = 'TSK'
        IMPORTING
          e_success        = lv_success
          et_message_lines = lt_messages.


      IF lv_success = 'Y'.
        CLEAR ls_alv_messages.
        ls_alv_messages-msgid = '00'.
        ls_alv_messages-msgty = 'S'.
        ls_alv_messages-msgno = '001'.
        CONCATENATE 'Task Profile' ls_task_profile-profile-profile_id
                    'has been deleted successfully'
                         INTO ls_alv_messages-message SEPARATED BY space.
        APPEND ls_alv_messages TO lt_alv_messages.
      ELSE.
        APPEND LINES OF lt_messages TO lt_alv_messages.
        CLEAR ls_alv_messages.
        ls_alv_messages-msgid = '00'.
        ls_alv_messages-msgty = 'E'.
        ls_alv_messages-msgno = '001'.
        CONCATENATE 'Task Profile' ls_task_profile-profile-profile_id
                    'could not be deleted due to error'
                         INTO ls_alv_messages-message SEPARATED BY space.
        APPEND ls_alv_messages TO lt_alv_messages.
      ENDIF.

    ENDLOOP.

* Display ALV
    lcl_application=>render_alv( ).

  ENDMETHOD.                    "import_task_profiles_from_file

  METHOD export_mem_profiles_to_file.

    TYPES: BEGIN OF t_output,
            identifier TYPE char01, " Row Identifer
            profile TYPE uj_profile_id,
            values TYPE string,
           END OF t_output.

    DATA: ls_profile TYPE uje_s_profile.

    DATA: lv_profile TYPE uj_profile_id.

    DATA: lt_memaccess TYPE uje_t_memaccess.
    DATA: ls_memaccess LIKE LINE OF lt_memaccess.

    DATA: lt_users_asin TYPE uje_t_api_user_id.
    DATA: ls_users_asin LIKE LINE OF lt_users_asin.

    DATA: lt_teams_asin TYPE uje_t_api_team_id.
    DATA: ls_teams_asin LIKE LINE OF lt_teams_asin.

    DATA: ls_mprofs LIKE LINE OF lt_mprofs.

    DATA: lt_output TYPE TABLE OF t_output.
    DATA: ls_output LIKE LINE OF lt_output.

    LOOP AT lcl_application=>lt_mprofs INTO ls_mprofs.

      lv_profile = ls_mprofs-profile_id.

* Get relevant data for task profile
      CLEAR ls_profile.
      REFRESH: lt_memaccess, lt_users_asin, lt_teams_asin.

      CALL FUNCTION 'UJE_API_GET_MPROFILEDATA'
        EXPORTING
          i_appset_id  = lcl_application=>lv_appset_id
          is_user      = lcl_application=>lo_context->ds_user
          i_profile_id = lv_profile
        IMPORTING
          es_profile   = ls_profile
          et_memaccess = lt_memaccess
          et_user_id   = lt_users_asin
          et_team_id   = lt_teams_asin.

* Write Header row
      CLEAR ls_output.
      ls_output-identifier = 'H'.
      ls_output-profile  = lv_profile.
      ls_output-values  = ls_profile-description.
      APPEND ls_output TO lt_output.

* Write member access
      CLEAR ls_output.
      ls_output-identifier = 'M'.
      ls_output-profile  = lv_profile.
      LOOP AT lt_memaccess INTO ls_memaccess.
        ls_memaccess-profile_id = lv_profile.
        CONCATENATE ls_memaccess-dimension
                    ls_memaccess-application_id
                    ls_memaccess-member
                    ls_memaccess-rwd
                       INTO ls_output-values SEPARATED BY lcl_application=>lv_delimiter.
        APPEND ls_output TO lt_output.
      ENDLOOP.

* Write user assignments
      CLEAR ls_output.
      ls_output-identifier = 'U'.
      ls_output-profile  = lv_profile.
      LOOP AT lt_users_asin INTO ls_users_asin.
        ls_output-values = ls_users_asin-user_id.
        APPEND ls_output TO lt_output.
      ENDLOOP.

* Write team assignments
      CLEAR ls_output.
      ls_output-identifier = 'T'.
      ls_output-profile  = lv_profile.
      LOOP AT lt_teams_asin INTO ls_teams_asin.
        ls_output-values = ls_teams_asin-team_id.
        APPEND ls_output TO lt_output.
      ENDLOOP.

    ENDLOOP.

* Download table
    lcl_application=>download( EXPORTING i_filepath = p_file
                                         it_datatab = lt_output ).

  ENDMETHOD.                    "export_mem_profiles_to_file

  METHOD import_mem_profiles_from_file.

    TYPES: BEGIN OF t_input,
            identifier TYPE char01, " Row Identifer
            profile TYPE uj_profile_id,
            values TYPE string,
           END OF t_input.

    TYPES: BEGIN OF t_memacc_profile,
            profile TYPE uje_s_profile,
            memacc TYPE uje_t_memaccess,
            users_asin TYPE uje_t_api_user_id,
            teams_asin TYPE uje_t_api_team_id,
           END OF t_memacc_profile.

    DATA: lt_memacc_profile TYPE TABLE OF t_memacc_profile.
    DATA: ls_memacc_profile LIKE LINE OF lt_memacc_profile.

    DATA: ls_alv_messages LIKE LINE OF lt_alv_messages.

    DATA: lt_messages TYPE uj0_t_message.

    DATA: lv_action TYPE uj_action.
    DATA: lv_success TYPE uj_bool.
    DATA: lv_last_profile TYPE uj_profile_id.

    DATA: lt_memaccess TYPE uje_t_memaccess.
    DATA: ls_memaccess LIKE LINE OF lt_memaccess.

    DATA: lt_users_asin TYPE uje_t_api_user_id.
    DATA: ls_users_asin LIKE LINE OF lt_users_asin.

    DATA: lt_teams_asin TYPE uje_t_api_team_id.
    DATA: ls_teams_asin LIKE LINE OF lt_teams_asin.

    DATA: lt_strtab TYPE stringtab.
    DATA: ls_strtab LIKE LINE OF lt_strtab.

    DATA: lt_input TYPE TABLE OF t_input.
    DATA: ls_input LIKE LINE OF lt_input.

    DATA: lt_obj_asin TYPE uje_t_profile_asin.
    DATA: ls_obj_asin LIKE LINE OF lt_obj_asin.

* Upload file
    lt_strtab = lcl_application=>upload( p_file ).

* Rip import file into internal table
    LOOP AT lt_strtab INTO ls_strtab.
      CLEAR ls_input.
      SPLIT ls_strtab AT lcl_application=>lv_delimiter INTO ls_input-identifier
                                  ls_input-profile
                                  ls_input-values.
      APPEND ls_input TO lt_input.
    ENDLOOP.

* Build profile table containing all associated data
    SORT lt_input STABLE ASCENDING BY profile identifier values.

    LOOP AT lt_input INTO ls_input.

      IF ls_input-profile <> lv_last_profile
          AND lv_last_profile IS NOT INITIAL.
        APPEND ls_memacc_profile TO lt_memacc_profile.
        CLEAR ls_memacc_profile.
      ENDIF.

* Based on record identifier
      CASE ls_input-identifier.
        WHEN 'H'.  " Header
          ls_memacc_profile-profile-profile_id = ls_input-profile.
          ls_memacc_profile-profile-description = ls_input-values.
        WHEN 'M'.  " Member Access info
          ls_memaccess-profile_id = ls_input-profile.
          SPLIT ls_input-values AT lcl_application=>lv_delimiter INTO ls_memaccess-dimension
                                            ls_memaccess-application_id
                                            ls_memaccess-member
                                            ls_memaccess-rwd.

* Check APPLICATION_ID
          READ TABLE lcl_application=>lt_appl_info
                 TRANSPORTING NO FIELDS
                      WITH KEY application_id = ls_memaccess-application_id.
          IF sy-subrc <> 0.
            CLEAR ls_alv_messages.
            ls_alv_messages-msgid = '00'.
            ls_alv_messages-msgty = 'E'.
            ls_alv_messages-msgno = '001'.
            CONCATENATE 'Application ID' ls_memaccess-application_id
                       'not valid for this Application Set'
                           INTO ls_alv_messages-message SEPARATED BY space.
            APPEND ls_alv_messages TO lt_alv_messages.
            CONCATENATE 'Member Access Profile' ls_memacc_profile-profile-profile_id
                       'not created/updated due to error'
                           INTO ls_alv_messages-message SEPARATED BY space.
            APPEND ls_alv_messages TO lt_alv_messages.
            lcl_application=>render_alv( ).
            RETURN.
          ENDIF.

* Check DIMENSION
          READ TABLE lcl_application=>lt_appl_dim
               TRANSPORTING NO FIELDS
                       WITH KEY appl_id  = ls_memaccess-application_id
                               dimension = ls_memaccess-dimension.
          IF sy-subrc <> 0.
            CLEAR ls_alv_messages.
            ls_alv_messages-msgid = '00'.
            ls_alv_messages-msgty = 'E'.
            ls_alv_messages-msgno = '001'.
            CONCATENATE 'Dimension' ls_memaccess-dimension
                        'not valid for Application'
                         ls_memaccess-application_id
                            INTO ls_alv_messages-message SEPARATED BY space.
            APPEND ls_alv_messages TO lt_alv_messages.
            CONCATENATE 'Member Access Profile'
                        ls_memacc_profile-profile-profile_id
                        'not created/updated due to error'
                            INTO ls_alv_messages-message SEPARATED BY space.
            APPEND ls_alv_messages TO lt_alv_messages.
            lcl_application=>render_alv( ).
            RETURN.
          ENDIF.

* Check MEMBER
          READ TABLE lcl_application=>lt_members
               TRANSPORTING NO FIELDS
                      WITH KEY appl_id   = ls_memaccess-application_id
                               dimension = ls_memaccess-dimension
                               member    = ls_memaccess-member.
          IF sy-subrc <> 0 AND ls_memaccess-member <> '[ALL]'.
            CLEAR ls_alv_messages.
            ls_alv_messages-msgid = '00'.
            ls_alv_messages-msgty = 'E'.
            ls_alv_messages-msgno = '001'.
            CONCATENATE 'Member' ls_memaccess-member
                       'not valid for Dimension' ls_memaccess-dimension
                           INTO ls_alv_messages-message SEPARATED BY space.
            APPEND ls_alv_messages TO lt_alv_messages.
            CONCATENATE 'Member Access Profile' ls_memacc_profile-profile-profile_id
                       'not created/updated due to error'
                           INTO ls_alv_messages-message SEPARATED BY space.
            APPEND ls_alv_messages TO lt_alv_messages.
            lcl_application=>render_alv( ).
            RETURN.
          ENDIF.
          APPEND ls_memaccess TO ls_memacc_profile-memacc.
        WHEN 'U'.  " Users Assignments
          ls_users_asin  = ls_input-values.
          IF lcl_application=>user_is_valid( ls_users_asin ) = abap_false.
            CLEAR ls_alv_messages.
            ls_alv_messages-msgid = '00'.
            ls_alv_messages-msgty = 'E'.
            ls_alv_messages-msgno = '001'.
            CONCATENATE 'User' ls_users_asin  'does not exist.'
                        'No member access profile updates done.'
                            INTO ls_alv_messages-message SEPARATED BY space.
            APPEND ls_alv_messages TO lt_alv_messages.
            lcl_application=>render_alv( ).
            RETURN.
          ENDIF.
          APPEND ls_users_asin  TO ls_memacc_profile-users_asin.
        WHEN 'T'.  " Team Assignments
          ls_teams_asin  = ls_input-values.
          IF lcl_application=>team_is_valid( ls_teams_asin ) = abap_false.
            CLEAR ls_alv_messages.
            ls_alv_messages-msgid = '00'.
            ls_alv_messages-msgty = 'E'.
            ls_alv_messages-msgno = '001'.
            CONCATENATE 'Team' ls_teams_asin 'does not exist.'
                        'No member access profile updates done.'
                            INTO ls_alv_messages-message SEPARATED BY space.
            APPEND ls_alv_messages TO lt_alv_messages.
            lcl_application=>render_alv( ).
            RETURN.
          ENDIF.
          APPEND ls_teams_asin  TO ls_memacc_profile-teams_asin.
      ENDCASE.

      lv_last_profile = ls_input-profile.

      AT LAST.
        APPEND ls_memacc_profile TO lt_memacc_profile.
      ENDAT.

    ENDLOOP.

* Now for each profile, call API to create/update
    LOOP AT lt_memacc_profile INTO ls_memacc_profile.

* Determine if the task profile is new, set action accordingly.
      IF lcl_application=>mprofile_is_valid( ls_memacc_profile-profile ) = abap_false.
        lv_action = 'I'.
      ELSE.
        lv_action = 'M'.
      ENDIF.

* Move data to API tables
      REFRESH lt_obj_asin.
      LOOP AT ls_memacc_profile-users_asin INTO ls_users_asin.
        ls_obj_asin-object_id = ls_users_asin.
        ls_obj_asin-profile_id = ls_memacc_profile-profile.
        ls_obj_asin-object_type = 'U'.
        APPEND ls_obj_asin TO lt_obj_asin.
      ENDLOOP.
      LOOP AT ls_memacc_profile-teams_asin INTO ls_teams_asin.
        ls_obj_asin-object_id = ls_teams_asin.
        ls_obj_asin-profile_id = ls_memacc_profile-profile.
        ls_obj_asin-object_type = 'T'.
        APPEND ls_obj_asin TO lt_obj_asin.
      ENDLOOP.

* Move member access data to table.
      REFRESH lt_memaccess.
      LOOP AT ls_memacc_profile-memacc INTO ls_memaccess.
        APPEND ls_memaccess TO lt_memaccess.
      ENDLOOP.

* Call API
      CALL FUNCTION 'UJE_API_MANAGE_MPROFILE2'
        EXPORTING
          i_appset_id      = lcl_application=>lv_appset_id
          is_user          = lcl_application=>lo_context->ds_user
          i_action         = lv_action
          is_profile       = ls_memacc_profile-profile
          it_memaccess     = lt_memaccess
          it_obj_asin      = lt_obj_asin
        IMPORTING
          e_success        = lv_success
          et_message_lines = lt_messages.
      IF lv_success = 'Y'.
        CLEAR ls_alv_messages.
        ls_alv_messages-msgid = '00'.
        ls_alv_messages-msgty = 'S'.
        ls_alv_messages-msgno = '001'.
        CONCATENATE 'Member Access Profile' ls_memacc_profile-profile-profile_id
                    'has been created/updated successfully'
                        INTO ls_alv_messages-message SEPARATED BY space.
        APPEND ls_alv_messages TO lt_alv_messages.
      ELSE.
        APPEND LINES OF lt_messages TO lt_alv_messages.
        CLEAR ls_alv_messages.
        ls_alv_messages-msgid = '00'.
        ls_alv_messages-msgty = 'E'.
        ls_alv_messages-msgno = '001'.
        CONCATENATE 'Member Access Profile' ls_memacc_profile-profile-profile_id
                    'not created/updated due to error'
                        INTO ls_alv_messages-message SEPARATED BY space.
        APPEND ls_alv_messages TO lt_alv_messages.
      ENDIF.

    ENDLOOP.

* Display ALV
    lcl_application=>render_alv( ).

  ENDMETHOD.                    "import_mem_profiles_from_file
  METHOD delete_mem_profiles_from_file.

    TYPES: BEGIN OF t_input,
            identifier TYPE char01, " Row Identifer
            profile TYPE uj_profile_id,
            values TYPE string,
           END OF t_input.

    TYPES: BEGIN OF t_memacc_profile,
            profile TYPE uje_s_profile,
            memacc TYPE uje_t_memaccess,
            users_asin TYPE uje_t_api_user_id,
            teams_asin TYPE uje_t_api_team_id,
           END OF t_memacc_profile.

    DATA: lt_memacc_profile TYPE TABLE OF t_memacc_profile.
    DATA: ls_memacc_profile LIKE LINE OF lt_memacc_profile.

    DATA: ls_alv_messages LIKE LINE OF lt_alv_messages.

    DATA: lt_messages TYPE uj0_t_message.

    DATA: lv_action TYPE uj_action.
    DATA: lv_success TYPE uj_bool.
    DATA: lv_last_profile TYPE uj_profile_id.

    DATA: lt_memaccess TYPE uje_t_memaccess.
    DATA: ls_memaccess LIKE LINE OF lt_memaccess.

    DATA: lt_users_asin TYPE uje_t_api_user_id.
    DATA: ls_users_asin LIKE LINE OF lt_users_asin.

    DATA: lt_teams_asin TYPE uje_t_api_team_id.
    DATA: ls_teams_asin LIKE LINE OF lt_teams_asin.

    DATA: lt_strtab TYPE stringtab.
    DATA: ls_strtab LIKE LINE OF lt_strtab.

    DATA: lt_input TYPE TABLE OF t_input.
    DATA: ls_input LIKE LINE OF lt_input.

    DATA: lt_obj_asin TYPE uje_t_profile_asin.
    DATA: ls_obj_asin LIKE LINE OF lt_obj_asin.

* Upload file
    lt_strtab = lcl_application=>upload( p_file ).

* Rip import file into internal table
    LOOP AT lt_strtab INTO ls_strtab.
      CLEAR ls_input.
      SPLIT ls_strtab AT lcl_application=>lv_delimiter INTO ls_input-identifier
                                  ls_input-profile
                                  ls_input-values.
      APPEND ls_input TO lt_input.
    ENDLOOP.

* Build profile table containing all associated data
    SORT lt_input STABLE ASCENDING BY profile identifier values.

    LOOP AT lt_input INTO ls_input.

      IF ls_input-profile <> lv_last_profile
          AND lv_last_profile IS NOT INITIAL.
        APPEND ls_memacc_profile TO lt_memacc_profile.
        CLEAR ls_memacc_profile.
      ENDIF.

* Based on record identifier
      CASE ls_input-identifier.
        WHEN 'H'.  " Header
          ls_memacc_profile-profile-profile_id = ls_input-profile.
          ls_memacc_profile-profile-description = ls_input-values.
      ENDCASE.

      lv_last_profile = ls_input-profile.

      AT LAST.
        APPEND ls_memacc_profile TO lt_memacc_profile.
      ENDAT.

    ENDLOOP.

* Now for each profile, call API to create/update
    LOOP AT lt_memacc_profile INTO ls_memacc_profile.

*"*"Local Interface:
*"  IMPORTING
*"     VALUE(I_APPSET_ID) TYPE  UJ_APPSET_ID
*"     VALUE(IS_USER) TYPE  UJ0_S_USER
*"     VALUE(I_PROFILE_ID) TYPE  UJ_PROFILE_ID
*"     VALUE(I_PROFILE_CLASS) TYPE  UJ_PROFILE_CLASS
*"  EXPORTING
*"     VALUE(E_SUCCESS) TYPE  UJ_BOOL
*"     VALUE(ET_MESSAGE_LINES) TYPE  UJ0_T_MESSAGE

* Call API

      CALL FUNCTION 'UJE_API_DELETE_PROFILE'
        EXPORTING
          i_appset_id      = lcl_application=>lv_appset_id
          is_user          = lcl_application=>lo_context->ds_user
          i_profile_id     = ls_memacc_profile-profile-profile_id
          i_profile_class  = 'MBR'

        IMPORTING
          e_success        = lv_success
          et_message_lines = lt_messages.
      IF lv_success = 'Y'.
        CLEAR ls_alv_messages.
        ls_alv_messages-msgid = '00'.
        ls_alv_messages-msgty = 'S'.
        ls_alv_messages-msgno = '001'.
        CONCATENATE 'Member Access Profile' ls_memacc_profile-profile-profile_id
                    'has been deleted successfully'
                        INTO ls_alv_messages-message SEPARATED BY space.
        APPEND ls_alv_messages TO lt_alv_messages.
      ELSE.
        APPEND LINES OF lt_messages TO lt_alv_messages.
        CLEAR ls_alv_messages.
        ls_alv_messages-msgid = '00'.
        ls_alv_messages-msgty = 'E'.
        ls_alv_messages-msgno = '001'.
        CONCATENATE 'Member Access Profile' ls_memacc_profile-profile-profile_id
                    'could not be deleted due to error'
                        INTO ls_alv_messages-message SEPARATED BY space.
        APPEND ls_alv_messages TO lt_alv_messages.
      ENDIF.

    ENDLOOP.

* Display ALV
    lcl_application=>render_alv( ).

  ENDMETHOD.                    "delete_mem_profiles_from_file

  METHOD export_tap_assign_to_file.

    TYPES: BEGIN OF t_output,
            identifier TYPE char01, "Identifer, U or T
            profile TYPE uj_profile_id,
            id TYPE uj_user_id,  "User ID or Team ID
           END OF t_output.

    DATA: ls_tprofs LIKE LINE OF lt_tprofs.
    DATA: lv_profile TYPE uj_profile_id.

    DATA: lt_user_assign TYPE uje_t_api_user_id.
    DATA: ls_user_assign LIKE LINE OF lt_user_assign.

    DATA: lt_team_assign TYPE uje_t_api_team_id.
    DATA: ls_team_assign LIKE LINE OF lt_team_assign.

    DATA: lt_output TYPE TABLE OF t_output.
    DATA: ls_output LIKE LINE OF lt_output.

    LOOP AT lcl_application=>lt_tprofs INTO ls_tprofs.

      lv_profile = ls_tprofs-profile_id.
      CALL FUNCTION 'UJE_API_GET_TPROFILEDATA2'
        EXPORTING
          i_appset_id  = lcl_application=>lv_appset_id
          is_user      = lcl_application=>lo_context->ds_user
          i_profile_id = lv_profile
        IMPORTING
          et_user_id   = lt_user_assign
          et_team_id   = lt_team_assign.

      LOOP AT lt_user_assign INTO ls_user_assign.
        CLEAR ls_output.
        ls_output-identifier = 'U'.
        ls_output-profile = lv_profile.
        ls_output-id = ls_user_assign-user_id.
        APPEND ls_output TO lt_output.
      ENDLOOP.

      LOOP AT lt_team_assign INTO ls_team_assign.
        CLEAR ls_output.
        ls_output-identifier = 'T'.
        ls_output-profile = lv_profile.
        ls_output-id = ls_team_assign-team_id.
        APPEND ls_output TO lt_output.
      ENDLOOP.

    ENDLOOP.

* Download table
    lcl_application=>download( EXPORTING i_filepath = p_file
                                         it_datatab = lt_output ).

  ENDMETHOD.                    "export_tap_assign_to_file

  METHOD import_tap_assign_from_file.

    TYPES: BEGIN OF t_input,
            identifier TYPE char01, "Identifer, U or T
            profile TYPE uj_profile_id,
            id TYPE uj_user_id,  "User ID or Team ID
           END OF t_input.

    DATA: lv_success TYPE uj_bool.

    DATA: lt_user_team TYPE uje_t_user_team.

    DATA: lt_messages TYPE uj0_t_message.
    DATA: ls_alv_messages LIKE LINE OF lt_alv_messages.

    DATA: lt_tprofiles TYPE uje_t_profile_id_act.
    DATA: ls_tprofiles LIKE LINE OF lt_tprofiles.

    DATA: lt_mprofiles TYPE uje_t_profile_id_act.
    DATA: ls_mprofiles LIKE LINE OF lt_mprofiles.

    DATA: lt_tprofile_ids TYPE uje_t_api_profile_id.

    DATA: lt_mprofile_ids TYPE uje_t_api_profile_id.
    DATA: ls_mprofile_ids LIKE LINE OF lt_mprofile_ids.

    DATA: lt_strtab TYPE stringtab.
    DATA: ls_strtab LIKE LINE OF lt_strtab.

    DATA: ls_teams_list LIKE LINE OF lt_teams_list.
    DATA: ls_users_list LIKE LINE OF lt_users_list.

    DATA: lt_input TYPE TABLE OF t_input.
    DATA: ls_input LIKE LINE OF lt_input.

    DATA: lt_user_data TYPE uje_t_user_detail.
    DATA: ls_user_data LIKE LINE OF lt_user_data.

    lt_strtab = lcl_application=>upload( p_file ).

    LOOP AT lt_strtab INTO ls_strtab.

      SPLIT ls_strtab AT lcl_application=>lv_delimiter INTO ls_input-identifier
                                  ls_input-profile
                                  ls_input-id.

      IF lcl_application=>tprofile_is_valid( ls_input-profile ) = abap_false.
        CLEAR ls_alv_messages.
        ls_alv_messages-msgid = '00'.
        ls_alv_messages-msgty = 'E'.
        ls_alv_messages-msgno = '001'.
        CONCATENATE 'Profile' ls_input-profile 'does not yet exist.'
                    'No task profile assigments done.'
                       INTO ls_alv_messages-message SEPARATED BY space.
        APPEND ls_alv_messages TO lt_alv_messages.
        lcl_application=>render_alv( ).
        RETURN.
      ENDIF.

      CASE ls_input-identifier.

        WHEN 'T'.
          IF lcl_application=>team_is_valid( ls_input-id ) = abap_false.
            CLEAR ls_alv_messages.
            ls_alv_messages-msgid = '00'.
            ls_alv_messages-msgty = 'E'.
            ls_alv_messages-msgno = '001'.
            CONCATENATE 'Team' ls_input-id 'does not yet exist.'
                        'No task profile assigments done.'
                          INTO ls_alv_messages-message SEPARATED BY space.
            APPEND ls_alv_messages TO lt_alv_messages.
            lcl_application=>render_alv( ).
            RETURN.
          ENDIF.

        WHEN 'U'.
          IF lcl_application=>user_is_valid( ls_input-id ) = abap_false.
            CLEAR ls_alv_messages.
            ls_alv_messages-msgid = '00'.
            ls_alv_messages-msgty = 'E'.
            ls_alv_messages-msgno = '001'.
            CONCATENATE 'User' ls_input-id 'does not yet exist.'
                        'No task profile assigments done.'
                           INTO ls_alv_messages-message SEPARATED BY space.
            APPEND ls_alv_messages TO lt_alv_messages.
            lcl_application=>render_alv( ).
            RETURN.
          ENDIF.

      ENDCASE.

      APPEND ls_input TO lt_input.

    ENDLOOP.

    LOOP AT lcl_application=>lt_users_list INTO ls_users_list.

      CALL FUNCTION 'UJE_API_GET_USERDATA'
        EXPORTING
          i_appset_id = lcl_application=>lv_appset_id
          is_user     = lcl_application=>lo_context->ds_user
          i_user_id   = ls_users_list-user_id
        IMPORTING
          et_user     = lt_user_data.

      CLEAR ls_user_data.
      READ TABLE  lt_user_data INTO ls_user_data
             WITH KEY user_info-user_id = ls_users_list-user_id.
      IF sy-subrc =  0.
        lt_user_team = ls_user_data-t_team_id.
        lt_tprofiles = ls_user_data-t_tprofile_id.
        lt_mprofiles = ls_user_data-t_mprofile_id.
      ENDIF.

      REFRESH lt_tprofiles.
      LOOP AT lt_input INTO ls_input
                            WHERE identifier = 'U'
                              AND id = ls_users_list-user_id.
        ls_tprofiles-profile_id = ls_input-profile.
        APPEND ls_tprofiles TO lt_tprofiles.
      ENDLOOP.

      IF lt_tprofiles IS INITIAL.
        CONTINUE.
      ENDIF.

      CALL FUNCTION 'UJE_API_MANAGE_USER2'
        EXPORTING
          i_appset_id      = lcl_application=>lv_appset_id
          is_user          = lcl_application=>lo_context->ds_user
          is_user_info     = ls_users_list
          i_action         = 'M'
          it_team_asin     = lt_user_team
          it_tprofile_id   = lt_tprofiles
          it_mprofile_id   = lt_mprofiles
        IMPORTING
          e_success        = lv_success
          et_message_lines = lt_messages.

      IF lv_success = 'Y'.
        CLEAR ls_alv_messages.
        ls_alv_messages-msgid = '00'.
        ls_alv_messages-msgty = 'S'.
        ls_alv_messages-msgno = '001'.
        CONCATENATE 'User' ls_users_list-user_id 'task profile assignments'
                    'have been updated successfully'
                       INTO ls_alv_messages-message SEPARATED BY space.
        APPEND ls_alv_messages TO lt_alv_messages.
      ELSE.
        APPEND LINES OF lt_messages TO lt_alv_messages.
        CLEAR ls_alv_messages.
        ls_alv_messages-msgid = '00'.
        ls_alv_messages-msgty = 'E'.
        ls_alv_messages-msgno = '001'.
        CONCATENATE 'User' ls_users_list-user_id 'task profile assignments'
                    'not updated due to error'
                       INTO ls_alv_messages-message SEPARATED BY space.
        APPEND ls_alv_messages TO lt_alv_messages.
      ENDIF.

    ENDLOOP.

    LOOP AT lcl_application=>lt_teams_list INTO ls_teams_list.

      REFRESH lt_tprofile_ids.
      REFRESH lt_mprofile_ids.

* Get existing team data for this team.
      CALL FUNCTION 'UJE_API_GET_TEAMDATA'
        EXPORTING
          i_appset_id    = lcl_application=>lv_appset_id
          is_user        = lcl_application=>lo_context->ds_user
          i_team_id      = ls_teams_list-team_id
        IMPORTING
          et_user_team   = lt_user_team
          et_tprofile_id = lt_tprofile_ids
          et_mprofile_id = lt_mprofile_ids.

      REFRESH lt_tprofiles.
      LOOP AT lt_input INTO ls_input
                            WHERE identifier = 'T'
                              AND id = ls_teams_list-team_id.
        ls_tprofiles-profile_id = ls_input-profile.
        APPEND ls_tprofiles TO lt_tprofiles.
      ENDLOOP.

      IF lt_tprofiles IS INITIAL.
        CONTINUE.
      ENDIF.

* Keep existing member access profiles.
      REFRESH lt_mprofiles.
      LOOP AT lt_mprofile_ids INTO ls_mprofile_ids.
        ls_mprofiles-profile_id = ls_mprofile_ids-profile_id.
        APPEND ls_mprofiles TO lt_mprofiles.
      ENDLOOP.

      CALL FUNCTION 'UJE_API_MANAGE_TEAM2'
        EXPORTING
          i_appset_id      = lcl_application=>lv_appset_id
          is_user          = lcl_application=>lo_context->ds_user
          is_team          = ls_teams_list
          i_action         = 'M'
          it_users         = lt_user_team
          it_tprofile_id   = lt_tprofiles
          it_mprofile_id   = lt_mprofiles
        IMPORTING
          e_success        = lv_success
          et_message_lines = lt_messages.

      IF lv_success = 'Y'.
        CLEAR ls_alv_messages.
        ls_alv_messages-msgid = '00'.
        ls_alv_messages-msgty = 'S'.
        ls_alv_messages-msgno = '001'.
        CONCATENATE 'Team' ls_teams_list-team_id 'task profile assignments'
                    'have been updated successfully'
                       INTO ls_alv_messages-message SEPARATED BY space.
        APPEND ls_alv_messages TO lt_alv_messages.
      ELSE.
        APPEND LINES OF lt_messages TO lt_alv_messages.
        CLEAR ls_alv_messages.
        ls_alv_messages-msgid = '00'.
        ls_alv_messages-msgty = 'E'.
        ls_alv_messages-msgno = '001'.
        CONCATENATE 'Team' ls_teams_list-team_id 'task profile assignments'
                    'not updated due to error'
                       INTO ls_alv_messages-message SEPARATED BY space.
        APPEND ls_alv_messages TO lt_alv_messages.
      ENDIF.

    ENDLOOP.

    lcl_application=>render_alv( ).

  ENDMETHOD.                    "import_tap_assign_from_file

  METHOD export_map_assign_to_file.

    TYPES: BEGIN OF t_output,
            identifier TYPE char01, "Identifer, U or T
            profile TYPE uj_profile_id,
            id TYPE uj_user_id,  "User ID or Team ID
           END OF t_output.

    DATA: ls_mprofs LIKE LINE OF lt_mprofs.
    DATA: lv_profile TYPE uj_profile_id.

    DATA: lt_user_assign TYPE uje_t_api_user_id.
    DATA: ls_user_assign LIKE LINE OF lt_user_assign.

    DATA: lt_team_assign TYPE uje_t_api_team_id.
    DATA: ls_team_assign LIKE LINE OF lt_team_assign.

    DATA: lt_output TYPE TABLE OF t_output.
    DATA: ls_output LIKE LINE OF lt_output.

    LOOP AT lcl_application=>lt_mprofs INTO ls_mprofs.

      lv_profile = ls_mprofs-profile_id.
      CALL FUNCTION 'UJE_API_GET_MPROFILEDATA'
        EXPORTING
          i_appset_id  = lcl_application=>lv_appset_id
          is_user      = lcl_application=>lo_context->ds_user
          i_profile_id = lv_profile
        IMPORTING
          et_user_id   = lt_user_assign
          et_team_id   = lt_team_assign.

      LOOP AT lt_user_assign INTO ls_user_assign.
        CLEAR ls_output.
        ls_output-identifier = 'U'.
        ls_output-profile = lv_profile.
        ls_output-id = ls_user_assign-user_id.
        APPEND ls_output TO lt_output.
      ENDLOOP.

      LOOP AT lt_team_assign INTO ls_team_assign.
        CLEAR ls_output.
        ls_output-identifier = 'T'.
        ls_output-profile = lv_profile.
        ls_output-id = ls_team_assign-team_id.
        APPEND ls_output TO lt_output.
      ENDLOOP.

    ENDLOOP.

* Download table
    lcl_application=>download( EXPORTING i_filepath = p_file
                                         it_datatab = lt_output ).

  ENDMETHOD.                    "export_map_assign_to_file

  METHOD import_map_assign_from_file.

    TYPES: BEGIN OF t_input,
            identifier TYPE char01, "Identifer, U or T
            profile TYPE uj_profile_id,
            id TYPE uj_user_id,  "User ID or Team ID
           END OF t_input.

    DATA: lv_success TYPE uj_bool.

    DATA: lt_user_team TYPE uje_t_user_team.

    DATA: lt_messages TYPE uj0_t_message.
    DATA: ls_alv_messages LIKE LINE OF lt_alv_messages.

    DATA: lt_tprofiles TYPE uje_t_profile_id_act.
    DATA: ls_tprofiles LIKE LINE OF lt_tprofiles.

    DATA: lt_mprofiles TYPE uje_t_profile_id_act.
    DATA: ls_mprofiles LIKE LINE OF lt_mprofiles.

    DATA: lt_tprofile_ids TYPE uje_t_api_profile_id.
    DATA: ls_tprofile_ids LIKE LINE OF lt_tprofile_ids.

    DATA: lt_mprofile_ids TYPE uje_t_api_profile_id.

    DATA: lt_strtab TYPE stringtab.
    DATA: ls_strtab LIKE LINE OF lt_strtab.

    DATA: ls_teams_list LIKE LINE OF lt_teams_list.
    DATA: ls_users_list LIKE LINE OF lt_users_list.

    DATA: lt_input TYPE TABLE OF t_input.
    DATA: ls_input LIKE LINE OF lt_input.

    DATA: lt_user_data TYPE uje_t_user_detail.
    DATA: ls_user_data LIKE LINE OF lt_user_data.

    lt_strtab = lcl_application=>upload( p_file ).

    LOOP AT lt_strtab INTO ls_strtab.

      SPLIT ls_strtab AT lcl_application=>lv_delimiter INTO ls_input-identifier
                                  ls_input-profile
                                  ls_input-id.

      IF lcl_application=>mprofile_is_valid( ls_input-profile ) = abap_false.
        CLEAR ls_alv_messages.
        ls_alv_messages-msgid = '00'.
        ls_alv_messages-msgty = 'E'.
        ls_alv_messages-msgno = '001'.
        CONCATENATE 'Profile' ls_input-profile 'does not yet exist.'
                    'No member profile assigments done.'
                       INTO ls_alv_messages-message SEPARATED BY space.
        APPEND ls_alv_messages TO lt_alv_messages.
        lcl_application=>render_alv( ).
        RETURN.
      ENDIF.

      CASE ls_input-identifier.
        WHEN 'T'.
          IF lcl_application=>team_is_valid( ls_input-id ) = abap_false.
            CLEAR ls_alv_messages.
            ls_alv_messages-msgid = '00'.
            ls_alv_messages-msgty = 'E'.
            ls_alv_messages-msgno = '001'.
            CONCATENATE 'Team' ls_input-id 'does not yet exist.'
                        'No member profile assigments done.'
                           INTO ls_alv_messages-message SEPARATED BY space.
            APPEND ls_alv_messages TO lt_alv_messages.
            lcl_application=>render_alv( ).
            RETURN.
          ENDIF.

        WHEN 'U'.
          IF lcl_application=>user_is_valid( ls_input-id ) = abap_false.
            CLEAR ls_alv_messages.
            ls_alv_messages-msgid = '00'.
            ls_alv_messages-msgty = 'E'.
            ls_alv_messages-msgno = '001'.
            CONCATENATE 'User' ls_input-id 'does not yet exist.'
                        'No member profile assigments done.'
                           INTO ls_alv_messages-message SEPARATED BY space.
            APPEND ls_alv_messages TO lt_alv_messages.
            lcl_application=>render_alv( ).
            RETURN.
          ENDIF.

      ENDCASE.

      APPEND ls_input TO lt_input.

    ENDLOOP.

    LOOP AT lcl_application=>lt_users_list INTO ls_users_list.

* Get Existing data
      CALL FUNCTION 'UJE_API_GET_USERDATA'
        EXPORTING
          i_appset_id = lcl_application=>lv_appset_id
          is_user     = lcl_application=>lo_context->ds_user
          i_user_id   = ls_users_list-user_id
        IMPORTING
          et_user     = lt_user_data.

      CLEAR ls_user_data.
      READ TABLE  lt_user_data INTO ls_user_data
             WITH KEY user_info-user_id = ls_users_list-user_id.
      IF sy-subrc =  0.
        lt_user_team = ls_user_data-t_team_id.
        lt_tprofiles = ls_user_data-t_tprofile_id.
        lt_mprofiles = ls_user_data-t_mprofile_id.
      ENDIF.

* Overwrite the member access profile data
      REFRESH lt_mprofiles.
      LOOP AT lt_input INTO ls_input
                            WHERE identifier = 'U'
                              AND id = ls_users_list-user_id.
        ls_mprofiles-profile_id = ls_input-profile.
        APPEND ls_mprofiles TO lt_mprofiles.
      ENDLOOP.

      IF lt_mprofiles IS INITIAL.
        CONTINUE.
      ENDIF.

* Update user
      CALL FUNCTION 'UJE_API_MANAGE_USER2'
        EXPORTING
          i_appset_id      = lcl_application=>lv_appset_id
          is_user          = lcl_application=>lo_context->ds_user
          is_user_info     = ls_users_list
          i_action         = 'M'
          it_team_asin     = lt_user_team
          it_tprofile_id   = lt_tprofiles
          it_mprofile_id   = lt_mprofiles
        IMPORTING
          e_success        = lv_success
          et_message_lines = lt_messages.

      IF lv_success = 'Y'.
        CLEAR ls_alv_messages.
        ls_alv_messages-msgid = '00'.
        ls_alv_messages-msgty = 'S'.
        ls_alv_messages-msgno = '001'.
        CONCATENATE 'User' ls_users_list-user_id 'member profile assignments'
                    'have been updated successfully'
                       INTO ls_alv_messages-message SEPARATED BY space.
        APPEND ls_alv_messages TO lt_alv_messages.
      ELSE.
        APPEND LINES OF lt_messages TO lt_alv_messages.
        CLEAR ls_alv_messages.
        ls_alv_messages-msgid = '00'.
        ls_alv_messages-msgty = 'E'.
        ls_alv_messages-msgno = '001'.
        CONCATENATE 'User' ls_users_list-user_id 'member profile assignments'
                    'not updated due to error'
                       INTO ls_alv_messages-message SEPARATED BY space.
        APPEND ls_alv_messages TO lt_alv_messages.
      ENDIF.

    ENDLOOP.

    LOOP AT lcl_application=>lt_teams_list INTO ls_teams_list.

      REFRESH lt_tprofile_ids.
      REFRESH lt_mprofile_ids.

* Get existing team data for this team.
      CALL FUNCTION 'UJE_API_GET_TEAMDATA'
        EXPORTING
          i_appset_id    = lcl_application=>lv_appset_id
          is_user        = lcl_application=>lo_context->ds_user
          i_team_id      = ls_teams_list-team_id
        IMPORTING
          et_user_team   = lt_user_team
          et_tprofile_id = lt_tprofile_ids
          et_mprofile_id = lt_mprofile_ids.

* Overwrite member access profile data
      REFRESH lt_mprofiles.
      LOOP AT lt_input INTO ls_input
                            WHERE identifier = 'T'
                              AND id = ls_teams_list-team_id.
        ls_mprofiles-profile_id = ls_input-profile.
        APPEND ls_mprofiles TO lt_mprofiles.
      ENDLOOP.

      IF lt_mprofiles IS INITIAL.
        CONTINUE.
      ENDIF.

* Keep assigned task profiles
      REFRESH lt_tprofiles.
      LOOP AT lt_tprofile_ids INTO ls_tprofile_ids.
        ls_tprofiles-profile_id = ls_tprofile_ids-profile_id.
        APPEND ls_tprofiles TO lt_tprofiles.
      ENDLOOP.

* UPdate Team
      CALL FUNCTION 'UJE_API_MANAGE_TEAM2'
        EXPORTING
          i_appset_id      = lcl_application=>lv_appset_id
          is_user          = lcl_application=>lo_context->ds_user
          is_team          = ls_teams_list
          i_action         = 'M'
          it_users         = lt_user_team
          it_tprofile_id   = lt_tprofiles
          it_mprofile_id   = lt_mprofiles
        IMPORTING
          e_success        = lv_success
          et_message_lines = lt_messages.

      IF lv_success = 'Y'.
        CLEAR ls_alv_messages.
        ls_alv_messages-msgid = '00'.
        ls_alv_messages-msgty = 'S'.
        ls_alv_messages-msgno = '001'.
        CONCATENATE 'Team' ls_teams_list-team_id 'member profile assignments'
                    'have been updated successfully'
                       INTO ls_alv_messages-message SEPARATED BY space.
        APPEND ls_alv_messages TO lt_alv_messages.
      ELSE.
        APPEND LINES OF lt_messages TO lt_alv_messages.
        CLEAR ls_alv_messages.
        ls_alv_messages-msgid = '00'.
        ls_alv_messages-msgty = 'E'.
        ls_alv_messages-msgno = '001'.
        CONCATENATE 'Team' ls_teams_list-team_id 'member profile assignments'
                    'not updated due to error'
                       INTO ls_alv_messages-message SEPARATED BY space.
        APPEND ls_alv_messages TO lt_alv_messages.
      ENDIF.

    ENDLOOP.

    lcl_application=>render_alv( ).

  ENDMETHOD.                    "import_map_assign_from_file

  METHOD set_global_context.

    DATA: ls_user  TYPE uj0_s_user.
    DATA: lv_value TYPE uj_value.

    DATA: lo_srv_mgr_dao TYPE REF TO cl_uja3_svrmgr_dao.

* GEt the system admin user id
    CREATE OBJECT lo_srv_mgr_dao.
    lo_srv_mgr_dao->read_sysadmin_id( IMPORTING e_sysadmin_id = lv_value ).
    ls_user-user_id = lv_value.

* Set the context
    TRY.
        cl_uj_context=>set_cur_context(
                        EXPORTING  i_appset_id = lcl_application=>lv_appset_id
                                   is_user     = ls_user ).
      CATCH cx_uj_obj_not_found .
    ENDTRY.

* Get it
    lo_context = cl_uj_context=>get_cur_context( ).
* Set user to system admin
    lo_context->switch_to_srvadmin( ).

  ENDMETHOD.                    "set_global_context

  METHOD set_delimiter_listbox.

* set delimiter listbox.
    DATA: lt_vrm_values TYPE vrm_values.
    DATA: ls_vrm_values LIKE LINE OF lt_vrm_values.
    DATA: lv_name TYPE vrm_id  VALUE 'P_DELMT'.

    REFRESH lt_vrm_values.

    ls_vrm_values-key = lcl_application=>lc_comma.
    ls_vrm_values-text = 'Comma'.
    APPEND ls_vrm_values TO lt_vrm_values.

    ls_vrm_values-key = lcl_application=>lc_tab.
    ls_vrm_values-text = 'Tab'.
    APPEND ls_vrm_values TO lt_vrm_values.

    ls_vrm_values-key = lcl_application=>lc_pipe.
    ls_vrm_values-text = 'Pipe'.
    APPEND ls_vrm_values TO lt_vrm_values.

    CALL FUNCTION 'VRM_SET_VALUES'
      EXPORTING
        id     = lv_name
        values = lt_vrm_values.

  ENDMETHOD.                    "set_delimiter_listbox

  METHOD set_delimiter.

    IF p_delmt = lcl_application=>lc_tab.
      lcl_application=>lv_delimiter = cl_abap_char_utilities=>horizontal_tab.
    ELSE.
      lcl_application=>lv_delimiter = p_delmt.
    ENDIF.

  ENDMETHOD.                    "set_delimiter

  METHOD render_alv.

    TYPE-POOLS: icon.

    TYPES: BEGIN OF t_alv,
            icon    TYPE icon-id,
            msgid   TYPE uj0_s_message-msgid,
            msgty   TYPE uj0_s_message-msgty,
            msgno   TYPE uj0_s_message-msgno,
            message TYPE uj0_s_message-message,
           END OF t_alv.

    DATA: lt_alv TYPE TABLE OF t_alv.
    DATA: lo_table     TYPE REF TO cl_salv_table.
    DATA: lo_columns   TYPE REF TO cl_salv_columns_table.
    DATA: lo_column    TYPE REF TO cl_salv_column_table.
    DATA: lo_functions TYPE REF TO cl_salv_functions.

    FIELD-SYMBOLS: <ls_alv> LIKE LINE OF lt_alv,
                   <ls_alv_messages> LIKE LINE OF lt_alv_messages.

* Convert messages from API to ALV output
    LOOP AT lt_alv_messages ASSIGNING <ls_alv_messages>.
      APPEND INITIAL LINE TO lt_alv ASSIGNING <ls_alv>.
      MOVE-CORRESPONDING <ls_alv_messages> TO <ls_alv>.
      CASE <ls_alv>-msgty.
        WHEN 'E'. WRITE icon_message_error_small AS ICON TO <ls_alv>-icon.
        WHEN 'W'. WRITE icon_message_warning_small AS ICON TO <ls_alv>-icon.
        WHEN 'I'. WRITE icon_message_information_small  AS ICON TO <ls_alv>-icon.
        WHEN 'S'. WRITE icon_checked AS ICON TO <ls_alv>-icon.
      ENDCASE.
    ENDLOOP.

* Show messages
    TRY.
        cl_salv_table=>factory( IMPORTING r_salv_table  = lo_table
                                 CHANGING t_table       = lt_alv ).
      CATCH cx_salv_msg.
    ENDTRY.

    lo_functions = lo_table->get_functions( ).
    lo_functions->set_all( abap_true ).

    TRY.
        lo_columns = lo_table->get_columns( ).
        lo_column ?= lo_columns->get_column( 'ICON' ).
        lo_column->set_icon( abap_true ).
        lo_column ?= lo_columns->get_column( 'MSGNO' ).
        lo_column->set_leading_zero( abap_true ).
      CATCH cx_salv_not_found.
    ENDTRY.

    lo_table->display( ).

  ENDMETHOD.                    "render_alv

  METHOD get_appset_data.

    DATA: ls_uja_appl_info TYPE uja_s_appl_info.
    DATA: lt_uja_appl_dim TYPE uja_t_appl_dim.
    DATA: ls_uja_appl_dim LIKE LINE OF lt_uja_appl_dim.

    DATA: ls_members LIKE LINE OF lt_members.
    DATA: ls_appl_dim  LIKE LINE OF lt_appl_dim.

    DATA: lt_appl_list TYPE uja_t_appl_id.
    DATA: ls_appl_list LIKE LINE OF lt_appl_list.

    DATA: lo_appset_dao TYPE REF TO cl_uja_appset_dao.
    DATA: lo_application_dao TYPE REF TO cl_uja_application_dao.
    DATA: lo_dim TYPE REF TO cl_uja_dim.

    DATA: lt_member_field TYPE uja_t_mbr_field.
    DATA: ls_member_field LIKE LINE OF lt_member_field.

    DATA: ls_alv_messages LIKE LINE OF lt_alv_messages.

    lcl_application=>lv_appset_id  =  i_appset_id.

    TRY.

* Get the appset info, need the prefix
        CREATE OBJECT lo_appset_dao
          EXPORTING
            i_appset_id = lcl_application=>lv_appset_id.

        lo_appset_dao->get_appset_info(
              EXPORTING
                  i_appset_id    = lcl_application=>lv_appset_id
              IMPORTING
                  es_appset_info = lcl_application=>ls_appset_info ).

* Get the list of applications for this appset, need the application prefixes
        lo_appset_dao->get_appl_list(
              IMPORTING
                  et_appl_list = lt_appl_list ).

      CATCH cx_uj_db_error.
* Do not raise exception here
    ENDTRY.

* Check Appset to make sure it is valid
    IF lcl_application=>ls_appset_info IS INITIAL.
      CLEAR ls_alv_messages.
      ls_alv_messages-msgid = '00'.
      ls_alv_messages-msgty = 'E'.
      ls_alv_messages-msgno = '001'.
      CONCATENATE 'AppSet' lcl_application=>lv_appset_id 'does not exist.'
                  INTO ls_alv_messages-message SEPARATED BY space.
      APPEND ls_alv_messages TO lt_alv_messages.
      lcl_application=>render_alv( ).
      RAISE appset_not_found .
    ENDIF.

    lcl_application=>set_global_context( ).

* Loop applications, get application info, add to internal table
    LOOP AT lt_appl_list INTO ls_appl_list.

      TRY.

          CREATE OBJECT lo_application_dao
            EXPORTING
              i_appset_id = lcl_application=>lv_appset_id.

          lo_application_dao->get_application_info(
                EXPORTING
                  i_application_id = ls_appl_list
                IMPORTING
                  es_appl_info = ls_uja_appl_info ).

          APPEND ls_uja_appl_info TO lcl_application=>lt_appl_info.

* Get dimension list for each application
          lo_application_dao->get_dim_list(
                 EXPORTING
                   i_application_id = ls_appl_list
                 IMPORTING
                   et_appl_dim = lt_uja_appl_dim ).
          LOOP AT lt_uja_appl_dim INTO ls_uja_appl_dim.
            ls_appl_dim-appl_id = ls_appl_list.
            ls_appl_dim-dimension = ls_uja_appl_dim-dimension.
            COLLECT ls_appl_dim INTO lcl_application=>lt_appl_dim.
          ENDLOOP.

* Get members for each dimension
          LOOP AT lt_uja_appl_dim INTO ls_uja_appl_dim.
            CREATE OBJECT lo_dim
              EXPORTING
                i_appset_id = lcl_application=>lv_appset_id
                i_dimension = ls_uja_appl_dim-dimension.

            REFRESH lt_member_field.
            lo_dim->read_dim_mbr_field(
                 EXPORTING
                   i_attr_name = 'ID'
                   f_uppercase = abap_false  "<-- Get in correct case
                 IMPORTING
                   et_member   = lt_member_field ).
            LOOP AT lt_member_field INTO ls_member_field.
              ls_members-appl_id = ls_appl_list.
              ls_members-dimension = ls_uja_appl_dim-dimension.
              ls_members-member = ls_member_field-member.
              COLLECT ls_members INTO lcl_application=>lt_members.
            ENDLOOP.

          ENDLOOP.

        CATCH: cx_uj_db_error, cx_uja_admin_error, cx_uj_static_check.
* Do not raise exception here
      ENDTRY.

    ENDLOOP.

    CALL FUNCTION 'UJE_API_GET_USERS'
      EXPORTING
        i_appset_id = lcl_application=>lv_appset_id
        is_user     = lcl_application=>lo_context->ds_user
      IMPORTING
        et_user     = lcl_application=>lt_users_list.

    CALL FUNCTION 'UJE_API_GET_TEAMS'
      EXPORTING
        i_appset_id = lcl_application=>lv_appset_id
        is_user     = lcl_application=>lo_context->ds_user
      IMPORTING
        et_team     = lcl_application=>lt_teams_list.

    CALL FUNCTION 'UJE_API_GET_TPROFILES'
      EXPORTING
        i_appset_id   = lcl_application=>lv_appset_id
        is_user       = lcl_application=>lo_context->ds_user
      IMPORTING
        et_profile_id = lcl_application=>lt_tprofs.

* The interface for this FM has changed in 7.5 SP5 so we need to
* handle for both the old function interface as well as the new.
* Also, handle for 7.5 releases on newer NW stacks(NW 7.3 and higher).
    IF ( lv_release = '750' AND lv_splevel >= '0005' )
       or ( lv_release >= '753' ).

      DATA: ls_mprofs LIKE LINE OF lcl_application=>lt_mprofs.
      DATA: ls_mprofs_tmp LIKE LINE OF lcl_application=>lt_mprofs_tmp.
      CALL FUNCTION 'UJE_API_GET_MPROFILES'
        EXPORTING
          i_appset_id = lcl_application=>lv_appset_id
          is_user     = lcl_application=>lo_context->ds_user
        IMPORTING
          et_profile  = lcl_application=>lt_mprofs_tmp.
      REFRESH lcl_application=>lt_mprofs.
      LOOP AT lt_mprofs_tmp INTO ls_mprofs_tmp.
        ls_mprofs-profile_id = ls_mprofs_tmp-profile_id.
        APPEND ls_mprofs TO lt_mprofs.
      ENDLOOP.

    ELSE. " Release 7.0 and release 7.5 <= SP4

      CALL FUNCTION 'UJE_API_GET_MPROFILES'
        EXPORTING
          i_appset_id   = lcl_application=>lv_appset_id
          is_user       = lcl_application=>lo_context->ds_user
        IMPORTING
          et_profile_id = lcl_application=>lt_mprofs.

    ENDIF.

    CALL FUNCTION 'UJE_API_GET_ROLE_TSKASG'
      IMPORTING
        et_taskasgn = lcl_application=>lt_tasks.

    CALL FUNCTION 'UJE_API_GET_ROLES'
      IMPORTING
        et_role = lcl_application=>lt_roles.

  ENDMETHOD.                    "get_supporting_Data

  METHOD user_is_valid.

    READ TABLE lcl_application=>lt_users_list
              TRANSPORTING NO FIELDS
                         WITH KEY user_id = i_user_id.
    IF sy-subrc = 0.
      r_boolean = abap_true.
    ELSE.
      r_boolean = abap_false.
    ENDIF.

  ENDMETHOD.                    "user_id_valid


  METHOD team_is_valid.

    READ TABLE lcl_application=>lt_teams_list
               TRANSPORTING NO FIELDS
                          WITH KEY team_id = i_team_id.
    IF sy-subrc = 0.
      r_boolean = abap_true.
    ELSE.
      r_boolean = abap_false.
    ENDIF.

  ENDMETHOD.                    "team_id_valid

  METHOD tprofile_is_valid.

    READ TABLE lcl_application=>lt_tprofs
               TRANSPORTING NO FIELDS
                        WITH KEY profile_id = i_profile_id.
    IF sy-subrc = 0.
      r_boolean = abap_true.
    ELSE.
      r_boolean = abap_false.
    ENDIF.

  ENDMETHOD.                    "tprofile_is_valid

  METHOD mprofile_is_valid.

    READ TABLE lcl_application=>lt_mprofs
               TRANSPORTING NO FIELDS
                      WITH KEY profile_id = i_profile_id.
    IF sy-subrc = 0.
      r_boolean = abap_true.
    ELSE.
      r_boolean = abap_false.
    ENDIF.

  ENDMETHOD.                    "mprofile_is_valid

  METHOD role_is_valid.

    READ TABLE lcl_application=>lt_roles
               TRANSPORTING NO FIELDS
                        WITH KEY role_id = i_role_id.
    IF sy-subrc = 0.
      r_boolean = abap_true.
    ELSE.
      r_boolean = abap_false.
    ENDIF.

  ENDMETHOD.                    "role_is_valid
  METHOD task_is_valid.

    READ TABLE lcl_application=>lt_tasks
               TRANSPORTING NO FIELDS
                        WITH KEY task_id = i_task_id.
    IF sy-subrc = 0.
      r_boolean = abap_true.
    ELSE.
      r_boolean = abap_false.
    ENDIF.

  ENDMETHOD.                    "task_is_valid

  METHOD get_bpc_component_version.

    DATA: ls_cvers TYPE cvers.

    CALL FUNCTION 'UPG_GET_SINGLE_COMPREL'
      EXPORTING
        iv_component = `CPMBPC`
      IMPORTING
        ev_version   = ls_cvers
      EXCEPTIONS
        OTHERS       = 4.
    IF sy-subrc = 0.
      lv_release = ls_cvers-release.
      lv_splevel = ls_cvers-extrelease.
    ENDIF.

  ENDMETHOD.                    "get_bpc_component_version

ENDCLASS.                    "lcl_application IMPLEMENTATION

 

 

Note: This ABAP program needs to add text element as below

 

 

 

 

 

 

Assigned tags

      7 Comments
      You must be Logged on to comment or reply to a post.
      Author's profile photo Former Member
      Former Member

      Interesting, please post more details

      Author's profile photo Former Member
      Former Member

      Please post more information on this, sounds like a interesting tool

      Author's profile photo Naidu G
      Naidu G

      Please post the document.

      Author's profile photo Former Member
      Former Member

      Please post the document.

      Author's profile photo Former Member
      Former Member

      Please post more details.

      Author's profile photo Matteo Vannini
      Matteo Vannini

      Please post the document.

      Author's profile photo wangyuewu CCC
      wangyuewu CCC

      PLEASE post.