Variantenschnellauswahl
Mit diesem kleinen Gimmick stellen Sie dem Anwender eine Schnellauswahl der Varianten zur Verfügung. Ausserdem wird hier demonstriert, wie die Werte einer Variante übernommen werden können.
Die vorhandenen Varianten werden links am Rand angezeigt und können per Doppelklick übernommen werden. Auf Wunsch kann auch die Variante sofort ausgeführt werden.
Man könnte auch definieren, dass Varianten, die mit X beginnen, sofort ausgeführt werden, alle anderen werden nur geladen…
Desweiteren kann nachvollzogen werden, auf welch einfache Weise in Splitter mit ALV an ein Dynpro angebunden werden kann.
Ich habe den Report etwas auf Vordermann gebracht. Die alte Version hat mit dem Funktionsbaustein RS_VARIANT_CONTENTS und der manuellen Zuweisung der gespeicherten Variantenwerte über Feldsymbole gearbeitet. Die neue Version habe ich einerseits auf Methoden umgestellt und zudem verwende ich den Funktionsbaustein RS_SUPPORT_SELECTIONS, der die Übernahme der Feldwerte in das Dynpro automatisch macht.
Coding – Aktuelle Variante
REPORT. PARAMETERS p_eins TYPE char10. PARAMETERS p_zwei TYPE char10. CLASS main DEFINITION. PUBLIC SECTION. METHODS handle_double_click FOR EVENT double_click OF cl_gui_alv_grid IMPORTING e_row e_column. METHODS load_variants. METHODS reload_variants. METHODS get_variant IMPORTING variant_name TYPE raldb_vari. METHODS refresh. PROTECTED SECTION. DATA docker TYPE REF TO cl_gui_docking_container. DATA alv TYPE REF TO cl_gui_alv_grid. DATA fcat TYPE lvc_t_fcat. DATA layout TYPE lvc_s_layo. DATA varit TYPE STANDARD TABLE OF varit. ENDCLASS. "lcl_event_receiver DEFINITION CLASS main IMPLEMENTATION. METHOD handle_double_click. FIELD-SYMBOLS <varit> TYPE varit. READ TABLE varit ASSIGNING <varit> INDEX e_row. IF sy-subrc = 0. "Read Variant and assign values get_variant( <varit>-variant ). "Set variant name sy-slset = <varit>-variant. *** execute program (activate to your own needs) * CALL FUNCTION 'SAPGUI_SET_FUNCTIONCODE' * EXPORTING * functioncode = '=ONLI'. ENDIF. ENDMETHOD. "handle_double_click METHOD load_variants. " get all variants and texts SELECT * FROM varit INTO TABLE varit WHERE langu = sy-langu AND report = sy-repid. CHECK sy-subrc = 0. " Create docking container on left side docker = NEW #( side = cl_gui_docking_container=>dock_at_left extension = 350 ). " Create ALV-Grid alv = NEW #( i_parent = docker i_appl_events = 'X' ). " Create event receiver for double click in grid SET HANDLER handle_double_click FOR alv. " Define ALV-Grid-Layout layout-no_toolbar = 'X'. layout-grid_title = 'Auswahl mit Doppelklick…'(001). layout-smalltitle = 'X'. " Display ALV Grid alv->set_table_for_first_display( EXPORTING i_structure_name = 'VARIT' i_save = space i_default = 'X' is_layout = layout CHANGING it_outtab = varit EXCEPTIONS OTHERS = 4 ). " Get frontend catalog to modify alv->get_frontend_fieldcatalog( IMPORTING et_fieldcatalog = fcat ). " modify fields LOOP AT fcat ASSIGNING FIELD-SYMBOL(<fcat>). CASE <fcat>-fieldname. WHEN 'MANDT' OR 'REPORT' OR 'LANGU'. <fcat>-tech = 'X'. WHEN 'VARIANT'. <fcat>-outputlen = '10'. ENDCASE. ENDLOOP. " set modified field catalog alv->set_frontend_fieldcatalog( fcat ). " Refresh display to activate catalog refresh( ). ENDMETHOD. METHOD refresh. IF alv IS BOUND. alv->refresh_table_display( ). ENDIF. ENDMETHOD. METHOD get_variant. "Activate selected variant CALL FUNCTION 'RS_SUPPORT_SELECTIONS' EXPORTING report = sy-cprog variant = variant_name EXCEPTIONS OTHERS = 3. ENDMETHOD. METHOD reload_variants. " set variant CONCATENATE 'Gewählte Variante:' sy-slset INTO DATA(vartx) SEPARATED BY space. IF sy-msgid = 'DB'. IF sy-msgno = '617'. " variant has been saved READ TABLE varit TRANSPORTING NO FIELDS WITH KEY variant = sy-slset. IF sy-subrc > 0. SELECT * FROM varit APPENDING TABLE varit WHERE langu = sy-langu AND report = sy-repid AND variant = sy-slset. SORT varit BY variant. " Refresh display to activate catalog refresh( ). ENDIF. ENDIF. IF sy-msgno = '618'. " Variant deleted DELETE varit WHERE variant = sy-msgv1. " Refresh display to activate catalog refresh( ). ENDIF. ENDIF. ENDMETHOD. ENDCLASS. INITIALIZATION. DATA(go_main) = NEW main( ). go_main->load_variants( ). AT SELECTION-SCREEN OUTPUT. go_main->reload_variants( ). " Start of program START-OF-SELECTION. WRITE: / 'P_EINS:', p_eins. WRITE: / 'P_ZWEI:', p_zwei.
Coding – Alte Variante
REPORT zz_var_grid. *** Docking container and ALV Grid to display variants DATA gr_docking TYPE REF TO cl_gui_docking_container. DATA gr_alv TYPE REF TO cl_gui_alv_grid. DATA gt_fcat TYPE lvc_t_fcat. FIELD-SYMBOLS TYPE lvc_s_fcat. DATA gs_layo TYPE lvc_s_layo. DATA gt_varit TYPE STANDARD TABLE OF varit. CLASS lcl_event_receiver DEFINITION DEFERRED. DATA gr_event_receiver TYPE REF TO lcl_event_receiver. SELECTION-SCREEN BEGIN OF BLOCK var WITH FRAME TITLE gv_vartx. PARAMETERS p_1. SELECTION-SCREEN END OF BLOCK var. *----------------------------------------------------------------------* * CLASS lcl_event_receiver DEFINITION *----------------------------------------------------------------------* CLASS lcl_event_receiver DEFINITION. PUBLIC SECTION. METHODS: handle_double_click FOR EVENT double_click OF cl_gui_alv_grid IMPORTING e_row e_column. ENDCLASS. "lcl_event_receiver DEFINITION *----------------------------------------------------------------------* * CLASS lcl_event_receiver IMPLEMENTATION *----------------------------------------------------------------------* CLASS lcl_event_receiver IMPLEMENTATION. METHOD handle_double_click. FIELD-SYMBOLS TYPE varit. READ TABLE gt_varit ASSIGNING INDEX e_row. IF sy-subrc = 0. *** Read Variant and assign values PERFORM get_variant USING -variant. *** Set variant name sy-slset = -variant. *** execute program (activate to your own needs) * CALL FUNCTION 'SAPGUI_SET_FUNCTIONCODE' * EXPORTING * functioncode = '=ONLI'. ENDIF. ENDMETHOD. "handle_double_click ENDCLASS. "lcl_event_receiver IMPLEMENTATION AT SELECTION-SCREEN OUTPUT. *** set variant CONCATENATE 'Gewählte Variante:' sy-slset INTO gv_vartx SEPARATED BY space. IF sy-msgid = 'DB'. IF sy-msgno = '617'. *** variant has been saved READ TABLE gt_varit TRANSPORTING NO FIELDS WITH KEY variant = sy-slset. IF sy-subrc > 0. SELECT * FROM varit APPENDING TABLE gt_varit WHERE langu = sy-langu AND report = sy-repid AND variant = sy-slset. SORT gt_varit BY variant. *** Refresh display to activate catalog CALL METHOD gr_alv->refresh_table_display. ENDIF. ENDIF. IF sy-msgno = '618'. *** Variant deleted DELETE gt_varit WHERE variant = sy-msgv1. *** Refresh display to activate catalog CALL METHOD gr_alv->refresh_table_display. ENDIF. ENDIF. INITIALIZATION. *** get all variants SELECT * FROM varit INTO TABLE gt_varit WHERE langu = sy-langu AND report = sy-repid. CHECK sy-subrc = 0. *** Create docking container on left side CREATE OBJECT gr_docking EXPORTING side = cl_gui_docking_container=>dock_at_left extension = 350. *** Create ALV-Grid CREATE OBJECT gr_alv EXPORTING i_parent = gr_docking i_appl_events = 'X'. *** Create event receiver for double click in grid CREATE OBJECT gr_event_receiver. SET HANDLER gr_event_receiver->handle_double_click FOR gr_alv. *** Define ALV-Grid-Layout gs_layo-no_toolbar = 'X'. gs_layo-grid_title = 'Auswahl mit Doppelklick...'(001). gs_layo-smalltitle = 'X'. *** Display ALV Grid CALL METHOD gr_alv->set_table_for_first_display EXPORTING i_structure_name = 'VARIT' i_save = space i_default = 'X' is_layout = gs_layo CHANGING it_outtab = gt_varit EXCEPTIONS OTHERS = 4. *** Get frontend catalog to modify CALL METHOD gr_alv->get_frontend_fieldcatalog IMPORTING et_fieldcatalog = gt_fcat. *** modify fields LOOP AT gt_fcat ASSIGNING . CASE -fieldname. WHEN 'MANDT' OR 'REPORT' OR 'LANGU'. -tech = 'X'. WHEN 'VARIANT'. -outputlen = '10'. ENDCASE. ENDLOOP. *** set modified field catalog CALL METHOD gr_alv->set_frontend_fieldcatalog EXPORTING it_fieldcatalog = gt_fcat. *** Refresh display to activate catalog IF gr_alv IS BOUND. CALL METHOD gr_alv->refresh_table_display. ENDIF. *** Start of program START-OF-SELECTION. WRITE: / 'Variante', gv_vartx. WRITE: / 'P1:', p_1. *&---------------------------------------------------------------------* *& Form get_variant *&---------------------------------------------------------------------* FORM get_variant USING iv_varid TYPE variant. DATA lt_valutab LIKE rsparams OCCURS 0 WITH HEADER LINE. DATA lt_objects LIKE vanz OCCURS 0 WITH HEADER LINE. DATA lv_seltab(20). FIELD-SYMBOLS TYPE STANDARD TABLE. FIELD-SYMBOLS TYPE ANY. FIELD-SYMBOLS TYPE ANY. *** get contents of variant CALL FUNCTION 'RS_VARIANT_CONTENTS' EXPORTING report = sy-cprog variant = iv_varid no_import = ' ' execute_direct = ' ' TABLES valutab = lt_valutab OBJECTS = lt_objects EXCEPTIONS variant_non_existent = 01 variant_obsolete = 02. IF sy-subrc > 0. *** Error MESSAGE e000(oo) WITH 'Variante nicht vorhanden:' iv_varid. ELSE. *** Clear old values LOOP AT lt_objects. *** -> workarea ASSIGN (lt_objects-name) TO . IF sy-subrc = 0. CLEAR . ENDIF. IF lt_objects-kind = 'S'. *** -> table CONCATENATE lt_objects-name '[]' INTO lv_seltab. ASSIGN (lv_seltab) TO . IF sy-subrc = 0. CLEAR . ENDIF. ENDIF. *** Assign values of variant LOOP AT lt_valutab WHERE selname = lt_objects-name. *** -> Workarea ASSIGN (lt_valutab-selname) TO . CHECK sy-subrc = 0. CASE lt_objects-kind. WHEN 'S'. *** *** SELECT-OPTIONS *** *** -> table CONCATENATE lt_valutab-selname '[]' INTO lv_seltab. ASSIGN (lv_seltab) TO . CHECK sy-subrc = 0. *** -> SIGN ASSIGN COMPONENT 'SIGN' OF STRUCTURE TO . IF sy-subrc = 0. = lt_valutab-sign. ENDIF. *** -> OPTION ASSIGN COMPONENT 'OPTION' OF STRUCTURE TO . IF sy-subrc = 0. = lt_valutab-option. ENDIF. *** -> LOW ASSIGN COMPONENT 'LOW' OF STRUCTURE TO . IF sy-subrc = 0. = lt_valutab-low. ENDIF. *** -> HIGH ASSIGN COMPONENT 'HIGH' OF STRUCTURE TO . IF sy-subrc = 0. = lt_valutab-high. ENDIF. APPEND TO . WHEN 'P'. *** *** PARAMETER *** = lt_valutab-low. ENDCASE. ENDLOOP. ENDLOOP. ENDIF. ENDFORM. "get_variant
- Interview mit Björn Schulz (Software-Heroes.com) - 3. September 2024
- Daten aus ALV ermitteln - 3. September 2024
- So lange es den SAPGUI noch gibt… - 27. Juni 2024