25 Kasım 2017 Cumartesi

Dynamic Dropdown List Values in ALV

I created an OO ALV which has a dropdown list column, for new custom screen. But the dropdown lists should be filled dynamically not statically. So I did a little research on the internet and no result :) Some people even says, it does not seem possible. I made and want to share :)

I used demo tables SFLIGHT and SBOOK. The program lists flights and customers for the each flight but in dropdown list. Look at the screenshots you will get it what i try to explain.

Dinamik Dropdown List 1

Dinamik Dropdown List 2

Dinamik Dropdown List 3


It is easier to unterstand code by runnig than by reading. Because of that reason, I wrote the sample code as copy, past and run code. Dont forget to create Screen 0100 and Container CONT0100.


  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
REPORT z_xxxx.
"Extended version of sflight table. results for the dropdown values and keyc for the differention of the values 
DATA: BEGIN OF gt_flights_extended OCCURS 0.
            INCLUDE STRUCTURE sflight.
            DATA:  result(15).
            DATA:   keyc TYPE int4,
      END OF gt_flights_extended.
*Container definitions
DATA: r_container100 TYPE REF TO cl_gui_custom_container,
      r_grid100      TYPE REF TO cl_gui_alv_grid.
*table for the dropdown data
DATA: gt_dropdown  TYPE lvc_t_drop,
      gs_dropdown  TYPE lvc_s_drop.
*variable as a counter. it helps to differentiate
DATA: gv_counter TYPE int4 VALUE 0.
*Catalog/layout 
DATA: gt_fieldcat  TYPE lvc_t_fcat WITH HEADER LINE,
      gs_layout    TYPE lvc_s_layo.

INITIALIZATION.

  PERFORM retrieve_data.
  PERFORM create_catalog.
  PERFORM show_alv_and_screen.

*&---------------------------------------------------------------------*
*&      Form  retrieve_data
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM retrieve_data.

  SELECT * FROM sflight INTO CORRESPONDING FIELDS OF gt_flights_extended UP TO 50 ROWS.
*use counter for each row
    gv_counter = gv_counter + 1.
    gt_flights_extended-keyc = gv_counter.
    APPEND gt_flights_extended.
*retrieve customer id for each row
    SELECT customid FROM sbook INTO (gs_dropdown-value) UP TO 10 ROWS
      WHERE carrid = gt_flights_extended-carrid AND connid = gt_flights_extended-connid AND  fldate = gt_flights_extended-fldate.
*use counter while saving customerid for coupling
      gs_dropdown-handle = gv_counter.
      APPEND gs_dropdown TO gt_dropdown.

    ENDSELECT.

  ENDSELECT.

ENDFORM.                    "retrieve_data

*&---------------------------------------------------------------------*
*&      Form  create_catalog
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM create_catalog.

  gt_fieldcat-fieldname  = 'CARRID'.
  gt_fieldcat-coltext = 'CARRID'.
  APPEND gt_fieldcat .

  gt_fieldcat-fieldname  = 'CONNID'.
  gt_fieldcat-coltext = 'CONNID'.
  APPEND gt_fieldcat .

  gt_fieldcat-fieldname  = 'FLDATE'.
  gt_fieldcat-coltext = 'DATE'.
  APPEND gt_fieldcat .
*Dropdown list tanımı böyle yapılmalı
  gt_fieldcat-fieldname  = 'RESULT'.
  gt_fieldcat-coltext = 'Results'.
  gt_fieldcat-checktable = '!'.
  gt_fieldcat-edit  = 'X'.
  gt_fieldcat-drdn_hndl = 1.
  gt_fieldcat-drdn_field = 'KEYC'.
  APPEND gt_fieldcat .

  gs_layout-zebra = 'X'.
  gs_layout-no_toolbar = 'X'.

ENDFORM.                    "create_catalog

FORM show_alv_and_screen.

 CREATE OBJECT r_container100
    EXPORTING
      container_name = 'CONT100'.

  CREATE OBJECT r_grid100
    EXPORTING
      i_parent = r_container100.
*we let it know we will use this table for dropdown list
  CALL METHOD r_grid100->set_drop_down_table
    EXPORTING
      it_drop_down = gt_dropdown.

  CALL METHOD r_grid100->set_ready_for_input
    EXPORTING
      i_ready_for_input = 1.

  CALL METHOD r_grid100->set_table_for_first_display
    EXPORTING
      i_structure_name = 'GT_FLIGHTS_EXTENDED'
      is_layout        = gs_layout
    CHANGING
      it_outtab        = gt_flights_extended[]
      it_fieldcatalog  = gt_fieldcat[].

  CALL SCREEN '0100'.

ENDFORM.

ALV'de Dinamik Dropdown List Doldurmak

Merhabalar,

Yeni oluşturulacak bir ekran için Dropdown List sütunu olan bir ALV oluşturdum. Ancak bu listelerin değerlerinin sabit değil dinamik olarak doldurulması gerekiyordu. Birkaç saatlik araştırma sonunda kayda değer bir sonuca rastlamadım ve hatta bazıları mümkün değil yazmıştı. Kendim yaptım ve paylaşmak istedim :)

SAP'nin demo tabloları  SFLIGHT ve SBOOK'u kullandım. ALV'de uçuşları listelerken, her bir uçuş için kayıtlı olan yolcu listesini de Dropdown ile getirdim. Aşağıda ne demek istediğimi daha rahat görebilirsiniz. :)

Dinamik Dropdown List Görsel 1

Dinamik Dropdown List Görsel 2

Dinamik Dropdown List Görsel 3

Kodu okuyarak anlamak zaman alır, çalıştırmak bu süreyi oldukça kısaltır. En azından bu süreç benim için böyle işliyor. Bu yüzden kodu kolayca ve değiştirmeden çalışabilir olması için düzenledim. Kullandığınız herhangi bir Report'da Screen '0100' ve içinde de Custom Container 'CONT100' oluşturarak kodu çalıştırabilirsiniz.


  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
REPORT z_xxxx.
"Flight tablosu genişletimiş versiyonu. Result sonuçlar için, Keyc ise satır ayrımı için
DATA: BEGIN OF gt_flights_extended OCCURS 0.
            INCLUDE STRUCTURE sflight.
            DATA:  result(15).
            DATA:   keyc TYPE int4,
      END OF gt_flights_extended.
*Container tanımlamaları
DATA: r_container100 TYPE REF TO cl_gui_custom_container,
      r_grid100      TYPE REF TO cl_gui_alv_grid.
*Dropdown list datasının tutulacağı yapı
DATA: gt_dropdown  TYPE lvc_t_drop,
      gs_dropdown  TYPE lvc_s_drop.
*Her bir satırı saydırmak için int
DATA: gv_counter TYPE int4 VALUE 0.
*Catalog/layout için
DATA: gt_fieldcat  TYPE lvc_t_fcat WITH HEADER LINE,
      gs_layout    TYPE lvc_s_layo.

INITIALIZATION.

  PERFORM retrieve_data.
  PERFORM create_catalog.
  PERFORM show_alv_and_screen.

*&---------------------------------------------------------------------*
*&      Form  retrieve_data
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM retrieve_data.

  SELECT * FROM sflight INTO CORRESPONDING FIELDS OF gt_flights_extended UP TO 50 ROWS.
*Her bir satır için counter'ı koy
    gv_counter = gv_counter + 1.
    gt_flights_extended-keyc = gv_counter.
    APPEND gt_flights_extended.
*Ve her bir satır için müşteri çek
    SELECT customid FROM sbook INTO (gs_dropdown-value) UP TO 10 ROWS
      WHERE carrid = gt_flights_extended-carrid AND connid = gt_flights_extended-connid AND  fldate = gt_flights_extended-fldate.
*Her bir satır için yine counter'ı işaretle
      gs_dropdown-handle = gv_counter.
      APPEND gs_dropdown TO gt_dropdown.

    ENDSELECT.

  ENDSELECT.

ENDFORM.                    "retrieve_data

*&---------------------------------------------------------------------*
*&      Form  create_catalog
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM create_catalog.

  gt_fieldcat-fieldname  = 'CARRID'.
  gt_fieldcat-coltext = 'CARRID'.
  APPEND gt_fieldcat .

  gt_fieldcat-fieldname  = 'CONNID'.
  gt_fieldcat-coltext = 'CONNID'.
  APPEND gt_fieldcat .

  gt_fieldcat-fieldname  = 'FLDATE'.
  gt_fieldcat-coltext = 'DATE'.
  APPEND gt_fieldcat .
*Dropdown list tanımı böyle yapılmalı
  gt_fieldcat-fieldname  = 'RESULT'.
  gt_fieldcat-coltext = 'Results'.
  gt_fieldcat-checktable = '!'.
  gt_fieldcat-edit  = 'X'.
  gt_fieldcat-drdn_hndl = 1.
  gt_fieldcat-drdn_field = 'KEYC'.
  APPEND gt_fieldcat .

  gs_layout-zebra = 'X'.
  gs_layout-no_toolbar = 'X'.

ENDFORM.                    "create_catalog

FORM show_alv_and_screen.

 CREATE OBJECT r_container100
    EXPORTING
      container_name = 'CONT100'.

  CREATE OBJECT r_grid100
    EXPORTING
      i_parent = r_container100.
*Dropdown list olacağını set ediyoruz ve table ı söylüyoruz
  CALL METHOD r_grid100->set_drop_down_table
    EXPORTING
      it_drop_down = gt_dropdown.

  CALL METHOD r_grid100->set_ready_for_input
    EXPORTING
      i_ready_for_input = 1.

  CALL METHOD r_grid100->set_table_for_first_display
    EXPORTING
      i_structure_name = 'GT_FLIGHTS_EXTENDED'
      is_layout        = gs_layout
    CHANGING
      it_outtab        = gt_flights_extended[]
      it_fieldcatalog  = gt_fieldcat[].

  CALL SCREEN '0100'.

ENDFORM.