메뉴 건너뛰기

SAP 한국 커뮤니티



REPORT z_alv_modify_pid

노름마치 2007.11.05 12:49 조회 수 : 4034

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 ***********************