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 *
* Email : mpioud@yahoo.fr HomePage : http://www.geocities.com/mpioud *
***********************************************************************
* Macro definition
DEFINE m_ligne.
selection-screen :
begin of line, comment 10(20) v_&1 for field &2.
select-options &2 for &3.
selection-screen end of line.
END-OF-DEFINITION.
TABLES : ust04, " User masters
usr05. " User Master Parameter ID
TYPE-POOLS: icon. " Icons
SELECTION-SCREEN :
SKIP, BEGIN OF LINE, COMMENT 10(20) v_1 FOR FIELD s_bname."#EC NEEDED
SELECT-OPTIONS s_bname FOR ust04-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 usr05-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.
TYPES :
BEGIN OF ty_s_user,
bname LIKE usr04-bname, " User name
name_last LIKE addr3_val-name_last," Last name
parid LIKE usr05-parid, " Set/Get parameter ID
partext LIKE tparat-partext, " Memory ID Text
parva LIKE usr05-parva, " Parameter value
END OF ty_s_user.
CONSTANTS gc_save TYPE syucomm VALUE '&DATASAVE'.
CLASS lcl_event_alv DEFINITION DEFERRED.
DATA :
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,
gt_user TYPE STANDARD TABLE OF ty_s_user WITH HEADER LINE,
gt_user_old TYPE SORTED TABLE OF ty_s_user
WITH UNIQUE KEY bname parid.
FIELD-SYMBOLS <user> LIKE LINE OF gt_user.
*---------------------------------------------------------------------*
* 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 ASSIGNING <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 = '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 gc_save.
WHEN 'EXIT'.
LEAVE PROGRAM.
ENDCASE.
ENDMODULE. " USER_COMMAND_0100 INPUT
*---------------------------------------------------------------------*
* Form f_read_data
*---------------------------------------------------------------------*
FORM f_read_data.
DATA :
l_mandt TYPE mandt, "#EC NEEDED
l_adresse LIKE addr3_val.
* Read data
SELECT bname parid parva
INTO CORRESPONDING FIELDS OF TABLE gt_user
FROM usr05
WHERE bname IN s_bname
AND parid IN s_parid.
* Sorting to improve performance with FM 'SUSR_USER_ADDRESS_READ'
SORT gt_user BY bname.
LOOP AT gt_user ASSIGNING <user>.
* User exists ?
SELECT SINGLE mandt INTO l_mandt
FROM usr01
WHERE bname = <user>-bname.
IF sy-subrc NE 0.
DELETE gt_user. " Delete
CONTINUE. " Next loop.
ENDIF.
* Get the parameter-id texts.
SELECT SINGLE partext INTO <user>-partext
FROM tparat
WHERE paramid = <user>-parid
AND sprache = sy-langu.
IF sy-subrc NE 0 AND sy-langu <> 'E'.
* Not found, try in English
SELECT SINGLE partext INTO <user>-partext
FROM tparat
WHERE paramid = <user>-parid
AND sprache = 'E'.
ENDIF.
IF sy-subrc NE 0 AND sy-langu <> 'D'.
* Not found, try in German
SELECT SINGLE partext INTO <user>-partext
FROM tparat
WHERE paramid = <user>-parid
AND sprache = 'D'.
ENDIF.
* Get user address data
CALL FUNCTION 'SUSR_USER_ADDRESS_READ'
EXPORTING
user_name = <user>-bname
* READ_DB_DIRECTLY = ' '
IMPORTING
user_address = l_adresse
* USER_USR03 =
EXCEPTIONS
user_address_not_found = 1
OTHERS = 2.
IF sy-subrc = 0.
CONCATENATE l_adresse-name_last l_adresse-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 = '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' '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 = 'X'.
ls_alv_lay-cwidth_opt = '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 LIKE sy-ucomm.
* Macro definition
DEFINE m_bdc_dynpro.
clear lt_bdcdata.
lt_bdcdata-program = &1.
lt_bdcdata-dynpro = &2.
lt_bdcdata-dynbegin = 'X'.
lt_bdcdata-fnam = 'BDC_OKCODE'.
lt_bdcdata-fval = &3.
append lt_bdcdata.
END-OF-DEFINITION.
DEFINE m_bdc_field.
clear lt_bdcdata.
lt_bdcdata-fnam = &1.
lt_bdcdata-fval = &2.
append lt_bdcdata.
END-OF-DEFINITION.
DATA :
l_valid TYPE flag,
lt_message TYPE STANDARD TABLE OF bdcmsgcoll WITH HEADER LINE,
lt_bdcdata TYPE STANDARD TABLE OF bdcdata WITH HEADER LINE.
CASE u_ucomm.
WHEN '&IC1'.
m_bdc_dynpro 'SAPLSUU5' '0050' '=SHOW'.
m_bdc_field 'USR02-BNAME' <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'.
CHECK sy-subrc EQ 0.
* You are not authorized to display users
MESSAGE i495(01).
WHEN gc_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.
READ TABLE gt_user_old ASSIGNING <user>
WITH KEY bname = gt_user-bname
parid = gt_user-parid.
CHECK gt_user-parva <> <user>-parva.
m_bdc_dynpro 'SAPLSUU5' '0050' '=CHAN'.
m_bdc_field 'USR02-BNAME' gt_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)' gt_user-parid.
m_bdc_field 'USPARAM-PARVA(10)' gt_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'.
IF sy-subrc EQ 0.
* You are not authorized to change users in group &
MESSAGE i492(01) WITH lt_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 ***********************
유용하게 사용하겠습니다. 감사합니다^^