sap abap seçim parametreleri ve alv grid bir arada dinamik ekran tasarımı

istersek seçim ekranından “AT SELECTION-SCREEN OUTPUT” yardımıyla “EXECUTE” butonunu kaldırabiliriz ve raporumuzun “AT SELECTION-SCREEN” yardımıyla “ENTER” tuşuna basıldığında oluşmasını sağlayabiliriz.
daha sonra rapor alv gridimizin büyüklüğünü belirleyip bir “DOCKING CONTAINER” oluşturabiliriz. istersek bu container’ı “SPLITTER CONTAINER” ile parçalara ayırabiliriz. ama ben aşağıdaki örnekte bu “DOCKING CONTAINER” içerisine tek parça halinde bir alv grid ekledim. alv gridime “TOOLBAR” ekleyip buradan basılacak herhangi bir butonu handle etmek için ise “EVENT LISTENER” oluşturdum. bazı hücrelerin bir takım koşullarda kullanıcı girişine açık olmasını sağlayabilmek için de “CELL STYLE” oluşturdum. aşağıdaki örnekte teslimattan mal girişi yani 501 mal hareketi yapan programımı görebilirsiniz.

*&---------------------------------------------------------------------*
*& Report  ZSD_TESLIMAT_MAL_GIRISI
*&
*&---------------------------------------------------------------------*
*& Serkan Özcan
*&
*&---------------------------------------------------------------------*
 
REPORT  zsd_teslimat_mal_girisi.
 
CLASS lcl_events_d0001 DEFINITION DEFERRED.
 
DATA: gt_exclude        TYPE TABLE OF syucomm,
      oref_dock         TYPE REF TO cl_gui_docking_container,
      oref_alv1         TYPE REF TO cl_gui_alv_grid,
      gs_toolbar1       TYPE stb_button,
      event_receiver1   TYPE REF TO lcl_events_d0001,
      gs_layout1        TYPE lvc_s_layo,
      gt_cellstyle      TYPE lvc_t_styl,
      gs_cellstyle      TYPE lvc_s_styl.
 
DATA: gt_teslimat TYPE STANDARD TABLE OF zsd_s_teslimat INITIAL SIZE 0,
      gs_teslimat LIKE LINE OF gt_teslimat.
 
TABLES: likp.
 
SELECT-OPTIONS: s_vbeln FOR likp-vbeln NO-EXTENSION NO INTERVALS OBLIGATORY.
 
AT SELECTION-SCREEN OUTPUT.
 
  PERFORM initialize_output.
 
 
AT SELECTION-SCREEN.
 
  PERFORM get_data.
 
*----------------------------------------------------------------------*
*       CLASS lcl_events_d0001 DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_events_d0001 DEFINITION.
  PUBLIC SECTION.
*---code addition for ALV pushbuttons
*--for placing buttons
    METHODS handle_toolbar_set
        FOR EVENT toolbar OF cl_gui_alv_grid
        IMPORTING
              e_object
              e_interactive.
*---user command on clicking a button
    METHODS handle_user_command
        FOR EVENT user_command OF cl_gui_alv_grid
        IMPORTING
             e_ucomm.
ENDCLASS.                    "lcl_events_d0001 DEFINITION
*----------------------------------------------------------------------*
*       CLASS lcl_events_d0001 IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_events_d0001 IMPLEMENTATION.
*---method for handling toolbar
  METHOD handle_toolbar_set.
    CLEAR gs_toolbar1.
    gs_toolbar1-function = 'MGRS'. "name of btn to  catch click
    gs_toolbar1-butn_type = 0.
    gs_toolbar1-text = 'Seçilenlerin Mal Girişini Yap'.
    APPEND gs_toolbar1    TO e_object->mt_toolbar.
  ENDMETHOD.                    "handle_toolbar_set
  METHOD handle_user_command.
    DATA: wr_data_changed TYPE REF TO cl_alv_changed_data_protocol.
    DATA: lt_rows TYPE lvc_t_row,
          lt_index TYPE  lvc_s_row-index.
    CASE e_ucomm.
      WHEN 'MGRS'.
        PERFORM goodsmvt_create.
    ENDCASE.
  ENDMETHOD.                    "handle_user_command
ENDCLASS.                    "lcl_events_d0001 IMPLEMENTATION
 
*&---------------------------------------------------------------------*
*&      Form  INITIALIZE_OUTPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM initialize_output .
 
  APPEND 'ONLI' TO gt_exclude.
  APPEND 'SJOB' TO gt_exclude.
  APPEND 'PRIN' TO gt_exclude.
 
  CALL FUNCTION 'RS_SET_SELSCREEN_STATUS'
    EXPORTING
      p_status  = sy-pfkey
      p_program = sy-repid
    TABLES
      p_exclude = gt_exclude.
 
  IF oref_dock IS NOT BOUND.
 
    CREATE OBJECT oref_dock
      EXPORTING
        repid                       = sy-repid
        dynnr                       = '1000'
        side                        = cl_gui_docking_container=>dock_at_bottom
        ratio                       = 90
      EXCEPTIONS
        cntl_error                  = 1
        cntl_system_error           = 2
        create_error                = 3
        lifetime_error              = 4
        lifetime_dynpro_dynpro_link = 5
        OTHERS                      = 6.
    IF sy-subrc <> 0.
      MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
                 WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    ENDIF.
  ENDIF.
  IF oref_alv1 IS NOT BOUND.
 
    CHECK oref_dock IS BOUND.
    CREATE OBJECT oref_alv1
      EXPORTING
        i_parent          = oref_dock
      EXCEPTIONS
        error_cntl_create = 1
        error_cntl_init   = 2
        error_cntl_link   = 3
        error_dp_create   = 4
        OTHERS            = 5.
    IF sy-subrc <> 0.
      MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
                 WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    ENDIF.
 
    CHECK oref_alv1 IS BOUND.
 
    CALL METHOD oref_alv1->set_ready_for_input
      EXPORTING
        i_ready_for_input = 1.
 
    CREATE OBJECT event_receiver1.
    SET HANDLER event_receiver1->handle_toolbar_set   FOR oref_alv1.
    SET HANDLER event_receiver1->handle_user_command  FOR oref_alv1.
 
    gs_layout1-sel_mode   = 'A'. "A,C,D multiple select B single select
    gs_layout1-stylefname = 'CELLSTYLE'.
 
    CALL METHOD oref_alv1->set_table_for_first_display
      EXPORTING
        i_structure_name              = 'ZSD_S_TESLIMAT'
        i_save                        = 'A'
        is_layout                     = gs_layout1
      CHANGING
        it_outtab                     = gt_teslimat
      EXCEPTIONS
        invalid_parameter_combination = 1
        program_error                 = 2
        too_many_lines                = 3
        OTHERS                        = 4.
    IF sy-subrc <> 0.
      MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
                 WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    ENDIF.
 
  ENDIF.
ENDFORM.                    " INITIALIZE_OUTPUT
 
*&---------------------------------------------------------------------*
*&      Form  GET_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM get_data .
 
  CHECK sy-ucomm = space.
  REFRESH gt_teslimat.
  SELECT * FROM lips INTO CORRESPONDING FIELDS OF TABLE gt_teslimat
    WHERE vbeln IN s_vbeln.
 
  REFRESH gt_cellstyle.
  gs_cellstyle-fieldname = 'LFIMG'.
  gs_cellstyle-style = cl_gui_alv_grid=>mc_style_enabled.
  INSERT gs_cellstyle INTO TABLE gt_cellstyle.
 
  LOOP AT gt_teslimat INTO gs_teslimat.
    INSERT LINES OF gt_cellstyle INTO TABLE gs_teslimat-cellstyle.
    MODIFY gt_teslimat FROM gs_teslimat.
  ENDLOOP.
 
  CALL METHOD oref_alv1->refresh_table_display
    EXCEPTIONS
      finished = 1
      OTHERS   = 2.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
               WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.
 
  IF gt_teslimat[] IS INITIAL.
    MESSAGE w000(zpp) WITH 'Kayıt bulunamadı'.
  ENDIF.
 
 
 
ENDFORM.                    " GET_DATA
 
*&---------------------------------------------------------------------*
*&      Form  GOODSMVT_CREATE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM goodsmvt_create .
 
  DATA: lt_selected_rows  TYPE lvc_t_roid,
        ls_selected_row   TYPE lvc_s_roid.
 
  DATA: lt_mal_giris      TYPE STANDARD TABLE OF zsd_s_teslimat INITIAL SIZE 0,
        ls_mal_giris      LIKE LINE OF lt_mal_giris.
 
  DATA: lt_return         LIKE bapiret2 OCCURS 0 WITH HEADER LINE,
        lt_messtab        TYPE TABLE OF symsg WITH HEADER LINE,
        ls_header         TYPE bapi2017_gm_head_01,
        lt_item           TYPE TABLE OF bapi2017_gm_item_create WITH HEADER LINE,
        lv_code           TYPE bapi2017_gm_code,
        lv_mblnr          TYPE mblnr,
        lv_mjahr          TYPE mjahr,
        lv_oran           TYPE f,
        lv_kwmeng         TYPE vbap-kwmeng,
        lv_vbeln          TYPE vbeln,
        lv_posnr          TYPE posnr.
 
*--getting the selected row indexes
  CALL METHOD oref_alv1->get_selected_rows
    IMPORTING
      et_row_no = lt_selected_rows.
 
  LOOP AT lt_selected_rows INTO ls_selected_row.
    READ TABLE gt_teslimat INTO gs_teslimat INDEX ls_selected_row-row_id.
    IF sy-subrc EQ 0.
      APPEND gs_teslimat TO lt_mal_giris.
    ENDIF.
  ENDLOOP.
 
  CLEAR:lt_item[],lt_item,ls_header.
  ls_header-pstng_date   = sy-datum.
  ls_header-doc_date     = sy-datum.
 
  PERFORM determine_bapi_code USING '501'  CHANGING lv_code.
 
  LOOP AT lt_mal_giris INTO ls_mal_giris.
    lt_item-material       = ls_mal_giris-matnr.
    lt_item-entry_qnt      = ls_mal_giris-lfimg.
    lt_item-entry_uom      = ls_mal_giris-meins.
    lt_item-stck_type      = 'F'.
    lt_item-val_s_ord_item = ls_mal_giris-vgpos.
    lt_item-val_sales_ord  = ls_mal_giris-vgbel.
    lt_item-move_type      = '501'.
    lt_item-spec_stock     = 'E'.
    lt_item-plant          = ls_mal_giris-werks.
    lt_item-stge_loc       = ls_mal_giris-lgort.
    COLLECT lt_item.
  ENDLOOP.
  CLEAR lt_return[].
  CALL FUNCTION 'BAPI_GOODSMVT_CREATE'
    EXPORTING
      goodsmvt_header  = ls_header
      goodsmvt_code    = lv_code
    IMPORTING
      materialdocument = lv_mblnr
      matdocumentyear  = lv_mjahr
    TABLES
      goodsmvt_item    = lt_item
      return           = lt_return.
  IF lt_return[] IS NOT INITIAL.
    LOOP AT lt_return.
      CLEAR lt_messtab.
      lt_messtab-msgty = lt_return-type.
      lt_messtab-msgid = lt_return-id.
      lt_messtab-msgno = lt_return-number.
      lt_messtab-msgv1 = lt_return-message_v1.
      lt_messtab-msgv2 = lt_return-message_v2.
      lt_messtab-msgv3 = lt_return-message_v3.
      lt_messtab-msgv4 = lt_return-message_v4.
      APPEND lt_messtab.
    ENDLOOP.
  ELSE.
    CLEAR lt_messtab.
    lt_messtab-msgno = 'ZRF'.
    lt_messtab-msgid = '000'.
    lt_messtab-msgty = 'E'.
    lt_messtab-msgv1 = lv_mblnr.
    lt_messtab-msgv2 = lv_mjahr.
    lt_messtab-msgv3 = '413'.
    lt_messtab-msgv4 = 'Malzeme hareketi gerçekleşti'.
    APPEND lt_messtab.
    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
      EXPORTING
        wait = 'X'.
    COMMIT WORK AND WAIT .
  ENDIF.
 
  CALL FUNCTION 'RHVM_SHOW_MESSAGE'
    EXPORTING
      mess_header = 'Mesajlar'
    TABLES
      tem_message = lt_messtab
    EXCEPTIONS
      canceled    = 1
      OTHERS      = 2.
 
 
ENDFORM.                    " GOODSMVT_CREATE
 
*&---------------------------------------------------------------------*
*&      Form  determine_bapi_code
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_BWART    text
*      -->P_CODE     text
*----------------------------------------------------------------------*
FORM determine_bapi_code USING p_bwart TYPE bwart
      CHANGING p_code TYPE bapi2017_gm_code.
  DATA lt_t158b TYPE TABLE OF t158b WITH HEADER LINE.
  CLEAR : p_code, lt_t158b.
  REFRESH : lt_t158b .
  SELECT tcode FROM t158b INTO CORRESPONDING FIELDS OF TABLE lt_t158b
  WHERE bwart EQ p_bwart.
  LOOP AT lt_t158b.
    SELECT SINGLE gmcode FROM t158g INTO p_code
    WHERE tcode EQ lt_t158b-tcode.
    IF sy-subrc IS INITIAL.
      EXIT.
    ENDIF.
  ENDLOOP.
ENDFORM.                    "determine_bapi_code

seçim parametreleri ve alv grid aynı ekranda