REPORT z_alv_modify_pid.
***********************************************************************
* ALV Grid Control *
* This program lists the user's Parameter-IDs, These Parameter-IDs *
* can be modified and saved via Batch-Input *
*---------------------------------------------------------------------*
* Steps : *
* - Create the report Z_ALV_MODIFY_PID *
* - Create the Dynpro 0100 (size 27x120) *
* - Add OKCODE (type OK) in the element list *
* - Modify the flow logic of dynpro 0100 : *
* * PROCESS BEFORE OUTPUT. *
* MODULE pbo_0100. *
* * PROCESS AFTER INPUT. *
* MODULE user_command_0100. *
* - Create a status named 'MAIN' *
* with the buttons : SAVE BACK and EXIT *
*---------------------------------------------------------------------*
* The Dynpro 0100 can be uploaded *
* (SE51/Change/utilities/More utilities/Upload-Download/Upload) *
* at this URL : Z_ALV_MODIFY_PID_DYN_0100.html *
*---------------------------------------------------------------------*
* Author : Michel PIOUD - Updated 23-Nov-07 *
* HomePage : http://www.oocities.org/mpioud *
***********************************************************************
CONSTANTS :
c_x(1) VALUE 'X',
c_save TYPE syucomm VALUE '&DATASAVE'.
*---------------------------------------------------------------------*
TYPES :
BEGIN OF ty_s_user,
bname TYPE usr04-bname, " User name
parid TYPE usr05-parid, " Set/Get parameter ID
parva TYPE usr05-parva, " Parameter value
partext TYPE tparat-partext, " Memory ID Text
name_last TYPE addr3_val-name_last," Last name
END OF ty_s_user.
*---------------------------------------------------------------------*
CLASS lcl_event_alv DEFINITION DEFERRED.
*---------------------------------------------------------------------*
DATA :
g_bname TYPE usr05-bname,
g_parid TYPE usr05-parid,
go_container TYPE REF TO cl_gui_docking_container,
go_alv_grid TYPE REF TO cl_gui_alv_grid,
go_event_alv TYPE REF TO lcl_event_alv,
okcode TYPE syucomm,
gv_okcode TYPE syucomm,
gs_user TYPE ty_s_user,
gt_user TYPE TABLE OF ty_s_user,
gt_user_old TYPE SORTED TABLE OF ty_s_user
WITH UNIQUE KEY bname parid.
*---------------------------------------------------------------------*
SELECTION-SCREEN :
SKIP, BEGIN OF LINE, COMMENT 10(20) v_1 FOR FIELD s_bname."#EC NEEDED
SELECT-OPTIONS s_bname FOR g_bname.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN :
BEGIN OF LINE, COMMENT 10(20) v_2 FOR FIELD s_parid. "#EC NEEDED
SELECT-OPTIONS s_parid FOR g_parid.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN :
SKIP, BEGIN OF LINE,COMMENT 10(20) v_3 FOR FIELD p_dsplay."#EC NEEDED
PARAMETERS p_dsplay AS CHECKBOX.
SELECTION-SCREEN END OF LINE.
*---------------------------------------------------------------------*
* CLASS lcl_event_alv DEFINITION
*---------------------------------------------------------------------*
CLASS lcl_event_alv DEFINITION.
PUBLIC SECTION.
METHODS:
h_double_click FOR EVENT double_click OF cl_gui_alv_grid
IMPORTING e_row
e_column.
ENDCLASS. " LCL_EVENT_ALV DEFINITION
*---------------------------------------------------------------------*
* Class (Implementation) lcl_event_alv
*---------------------------------------------------------------------*
CLASS lcl_event_alv IMPLEMENTATION.
METHOD h_double_click.
READ TABLE gt_user INDEX e_row-index INTO gs_user.
IF sy-subrc EQ 0.
PERFORM f_user_command USING '&IC1'.
ENDIF.
ENDMETHOD. " H_double_click
ENDCLASS. " LCL_EVENT_ALV
*---------------------------------------------------------------------*
INITIALIZATION.
v_1 = 'User'.
v_2 = 'Parameter Id'.
v_3 = 'Display only'.
*---------------------------------------------------------------------*
START-OF-SELECTION.
PERFORM f_read_data.
CALL SCREEN 100.
*---------------------------------------------------------------------*
* Module pbo_0100 OUTPUT
*---------------------------------------------------------------------*
MODULE pbo_0100 OUTPUT.
IF p_dsplay = c_x.
SET PF-STATUS 'MAIN' EXCLUDING 'SAVE'.
ELSE.
SET PF-STATUS 'MAIN'.
ENDIF.
IF go_container IS INITIAL.
PERFORM create_and_init_alv.
ENDIF.
ENDMODULE. " PBO_0100 OUTPUT
*---------------------------------------------------------------------*
* Module user_command_0100 INPUT
*---------------------------------------------------------------------*
MODULE user_command_0100 INPUT.
gv_okcode = okcode.
CLEAR okcode.
CASE gv_okcode.
WHEN 'BACK'.
SET SCREEN 0.
WHEN 'SAVE'.
PERFORM f_user_command USING c_save.
WHEN 'EXIT'.
LEAVE PROGRAM.
ENDCASE.
ENDMODULE. " USER_COMMAND_0100 INPUT
*---------------------------------------------------------------------*
* Form f_read_data
*---------------------------------------------------------------------*
FORM f_read_data.
TYPES :
BEGIN OF ty_name,
bname TYPE usr21-bname,
name_first TYPE adrp-name_first,
name_last TYPE adrp-name_last,
END OF ty_name,
BEGIN OF ty_tparat,
paramid TYPE tparat-paramid,
partext TYPE tparat-partext,
END OF ty_tparat.
DATA :
ls_name TYPE ty_name,
lt_name TYPE HASHED TABLE OF ty_name
WITH UNIQUE KEY bname,
ls_tparat TYPE ty_tparat,
lt_tparat TYPE SORTED TABLE OF ty_tparat
WITH UNIQUE KEY paramid,
lt_user TYPE TABLE OF ty_s_user.
FIELD-SYMBOLS <user> TYPE ty_s_user.
* Read data
SELECT u~bname parid parva
INTO TABLE gt_user
FROM usr05 AS u
JOIN usr01 AS s
ON u~bname = s~bname
WHERE u~bname IN s_bname
AND parid IN s_parid.
IF gt_user[] IS NOT INITIAL.
lt_user[] = gt_user[].
SORT lt_user BY bname.
DELETE ADJACENT DUPLICATES FROM lt_user COMPARING bname.
* Read user name
SELECT bname name_first name_last
INTO TABLE lt_name
FROM usr21 AS u
JOIN adrp AS a
ON u~persnumber = a~persnumber
FOR ALL ENTRIES IN lt_user
WHERE bname = lt_user-bname.
lt_user[] = gt_user[].
SORT lt_user BY parid.
DELETE ADJACENT DUPLICATES FROM lt_user COMPARING parid.
* Memory ID Texts
SELECT paramid partext
INTO TABLE lt_tparat
FROM tparat
FOR ALL ENTRIES IN lt_user
WHERE paramid = lt_user-parid
AND sprache = sy-langu.
ENDIF.
LOOP AT gt_user ASSIGNING <user>.
* Get the parameter-id texts.
READ TABLE lt_tparat WITH KEY paramid = <user>-parid
INTO ls_tparat.
IF sy-subrc IS INITIAL.
<user>-partext = ls_tparat-partext.
ELSEIF sy-langu <> 'E'.
* Not found, try in English
SELECT SINGLE partext INTO <user>-partext
FROM tparat
WHERE paramid = <user>-parid
AND sprache = 'E'.
IF sy-subrc IS INITIAL.
CLEAR ls_tparat.
ls_tparat-paramid = <user>-parid.
ls_tparat-partext = <user>-partext.
INSERT ls_tparat INTO TABLE lt_tparat.
ELSEIF sy-langu <> 'D'.
* Not found, try in German
SELECT SINGLE partext INTO <user>-partext
FROM tparat
WHERE paramid = <user>-parid
AND sprache = 'D'.
IF sy-subrc IS INITIAL.
CLEAR ls_tparat.
ls_tparat-paramid = <user>-parid.
ls_tparat-partext = <user>-partext.
INSERT ls_tparat INTO TABLE lt_tparat.
ENDIF.
ENDIF.
ENDIF.
* Get user name
READ TABLE lt_name WITH KEY bname = <user>-bname
INTO ls_name.
IF sy-subrc IS INITIAL.
CONCATENATE ls_name-name_last ls_name-name_first
INTO <user>-name_last SEPARATED BY space.
ELSE.
<user>-name_last = <user>-bname.
ENDIF.
ENDLOOP.
* Save data
gt_user_old[] = gt_user[].
ENDFORM. " F_READ_DATA
*---------------------------------------------------------------------*
* Form create_and_init_alv
*---------------------------------------------------------------------*
FORM create_and_init_alv.
* Macro definition
DEFINE m_fieldcat.
add 1 to ls_alv_cat-col_pos.
ls_alv_cat-fieldname = &1.
ls_alv_cat-ref_table = &2.
ls_alv_cat-edit = &3.
append ls_alv_cat to lt_alv_cat.
END-OF-DEFINITION.
DEFINE m_sort.
add 1 to ls_sort-spos.
ls_sort-fieldname = &1.
ls_sort-up = c_x.
ls_sort-group = &2.
append ls_sort to lt_sort.
END-OF-DEFINITION.
DATA:
ls_variant TYPE disvariant,
lt_sort TYPE lvc_t_sort,
ls_sort TYPE lvc_s_sort,
lt_alv_cat TYPE lvc_t_fcat,
ls_alv_cat TYPE lvc_s_fcat,
ls_alv_lay TYPE lvc_s_layo,
ls_print TYPE lvc_s_prnt,
l_offline TYPE char1,
lt_toolbar_excl TYPE ui_functions.
CALL METHOD cl_gui_alv_grid=>offline
RECEIVING
e_offline = l_offline.
IF l_offline EQ 0.
CREATE OBJECT go_container
EXPORTING
extension = 2000
EXCEPTIONS
cntl_error = 1
cntl_system_error = 2
create_error = 3
lifetime_error = 4
lifetime_dynpro_dynpro_link = 5
OTHERS = 6.
IF sy-subrc NE 0.
MESSAGE e208(00) WITH 'The control could not be created'.
ENDIF.
ENDIF.
* Create an instance of alv control
CREATE OBJECT go_alv_grid
EXPORTING
i_parent = go_container.
* Build field catalog and sort table
m_fieldcat 'BNAME' 'USR05' ''.
m_fieldcat 'NAME_LAST' 'ADDR3_VAL' ''.
m_fieldcat 'PARID' 'USR05' ''.
m_fieldcat 'PARTEXT' 'TPARAT' ''.
IF p_dsplay IS INITIAL.
m_fieldcat 'PARVA' 'USR05' c_x. " Column alterable
ELSE.
m_fieldcat 'PARVA' 'USR05' ''.
ENDIF.
m_sort 'BNAME' 'UL'. " Line break
m_sort 'NAME_LAST' ''.
m_sort 'PARID' ''.
* Layout
CLEAR ls_alv_lay.
ls_alv_lay-zebra = c_x.
ls_alv_lay-cwidth_opt = c_x.
IF l_offline EQ 0.
* Exclude toolbar functions
APPEND cl_gui_alv_grid=>mc_fc_detail TO lt_toolbar_excl.
APPEND cl_gui_alv_grid=>mc_fc_info TO lt_toolbar_excl.
APPEND cl_gui_alv_grid=>mc_fc_graph TO lt_toolbar_excl.
APPEND cl_gui_alv_grid=>mc_fc_view_crystal TO lt_toolbar_excl.
APPEND cl_gui_alv_grid=>mc_fc_loc_delete_row TO lt_toolbar_excl.
APPEND cl_gui_alv_grid=>mc_fc_loc_append_row TO lt_toolbar_excl.
APPEND cl_gui_alv_grid=>mc_fc_loc_insert_row TO lt_toolbar_excl.
APPEND cl_gui_alv_grid=>mc_fc_loc_copy_row TO lt_toolbar_excl.
APPEND cl_gui_alv_grid=>mc_fc_loc_undo TO lt_toolbar_excl.
APPEND cl_gui_alv_grid=>mc_fc_check TO lt_toolbar_excl.
APPEND cl_gui_alv_grid=>mc_fc_refresh TO lt_toolbar_excl.
CREATE OBJECT go_event_alv.
SET HANDLER go_event_alv->h_double_click
FOR go_alv_grid.
ENDIF.
ls_variant-report = sy-cprog.
* Display
CALL METHOD go_alv_grid->set_table_for_first_display
EXPORTING
is_variant = ls_variant
is_layout = ls_alv_lay
is_print = ls_print
i_save = 'A'
it_toolbar_excluding = lt_toolbar_excl
CHANGING
it_sort = lt_sort
it_outtab = gt_user[]
it_fieldcatalog = lt_alv_cat.
ENDFORM. " CREATE_AND_INIT_ALV
*---------------------------------------------------------------------*
* FORM F_USER_COMMAND *
*---------------------------------------------------------------------*
FORM f_user_command USING u_ucomm TYPE sy-ucomm.
* Macro definition
DEFINE m_bdc_dynpro.
clear ls_bdcdata.
ls_bdcdata-program = &1.
ls_bdcdata-dynpro = &2.
ls_bdcdata-dynbegin = c_x.
ls_bdcdata-fnam = 'BDC_OKCODE'.
ls_bdcdata-fval = &3.
append ls_bdcdata to lt_bdcdata.
END-OF-DEFINITION.
DEFINE m_bdc_field.
clear ls_bdcdata.
ls_bdcdata-fnam = &1.
ls_bdcdata-fval = &2.
append ls_bdcdata to lt_bdcdata.
END-OF-DEFINITION.
DATA :
l_valid TYPE flag,
ls_userold TYPE ty_s_user,
ls_message TYPE bdcmsgcoll,
lt_message TYPE TABLE OF bdcmsgcoll,
ls_bdcdata TYPE bdcdata,
lt_bdcdata TYPE TABLE OF bdcdata.
CASE u_ucomm.
WHEN '&IC1'.
m_bdc_dynpro 'SAPLSUU5' '0050' '=SHOW'.
m_bdc_field 'USR02-BNAME' gs_user-bname.
* Tabstrip Parameter-Id
m_bdc_dynpro 'SAPLSUU5' '0100' '=PARAM'.
* Show user
CALL TRANSACTION 'SU01' USING lt_bdcdata MODE 'E'
MESSAGES INTO lt_message.
READ TABLE lt_message WITH KEY msgid = '01'
msgnr = '495'
TRANSPORTING NO FIELDS.
CHECK sy-subrc EQ 0.
* You are not authorized to display users
MESSAGE i495(01).
WHEN c_save.
* Verification of Changes
CALL METHOD go_alv_grid->check_changed_data
IMPORTING
e_valid = l_valid.
CHECK NOT l_valid IS INITIAL.
* Update User's Parameter-IDs
LOOP AT gt_user INTO gs_user.
READ TABLE gt_user_old INTO ls_userold
WITH KEY bname = gs_user-bname
parid = gs_user-parid.
CHECK gs_user-parva <> ls_userold-parva.
m_bdc_dynpro 'SAPLSUU5' '0050' '=CHAN'.
m_bdc_field 'USR02-BNAME' gs_user-bname.
* Tabstrip Parameter-Id
m_bdc_dynpro 'SAPLSUU5' '0100' '=PARAM'.
* Last page
m_bdc_dynpro 'SAPLSUU5' '0100' '=P++'.
* Previous page
m_bdc_dynpro 'SAPLSUU5' '0100' '=P+'.
m_bdc_dynpro 'SAPLSUU5' '0100' '=CHECK'.
m_bdc_field 'USPARAM-PARID(10)' gs_user-parid.
m_bdc_field 'USPARAM-PARVA(10)' gs_user-parva.
* Save
m_bdc_dynpro 'SAPLSUU5' '0100' '=UPD'.
CALL TRANSACTION 'SU01' USING lt_bdcdata MODE 'E'
MESSAGES INTO lt_message.
READ TABLE lt_message WITH KEY msgid = '01'
msgnr = '492'
INTO ls_message.
IF sy-subrc EQ 0.
* You are not authorized to change users in group &
MESSAGE i492(01) WITH ls_message-msgv1.
EXIT.
ENDIF.
REFRESH lt_bdcdata.
ENDLOOP.
gt_user_old[] = gt_user[].
ENDCASE.
ENDFORM. " F_USER_COMMAND
************* END OF PROGRAM Z_ALV_MODIFY_PID ***********************