Создание динамической таблицы для ALV в зависимости от структуры.
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 |
create_dyn_struc IMPORTING iv_infty TYPE infty EXPORTING es_infty_str TYPE REF TO data. METHOD create_dyn_struc. DATA: ref_table_descr TYPE REF TO cl_abap_structdescr. DATA(lv_name) = |P{ iv_infty }|. ref_table_descr ?= cl_abap_typedescr=>describe_by_name( lv_name ). DATA(lt_lvc_fieldcatalog) = VALUE lvc_t_fcat( FOR ls_tab_struct IN ref_table_descr->components[] ( fieldname = ls_tab_struct-name ref_table = lv_name ) ). DATA: dyn_table TYPE REF TO data, dyn_line TYPE REF TO data. " Создаем динамически таблицу" CALL METHOD cl_alv_table_create=>create_dynamic_table EXPORTING it_fieldcatalog = lt_lvc_fieldcatalog IMPORTING ep_table = dyn_table. FIELD-SYMBOLS: <fs_data> TYPE STANDARD TABLE, <fs_wa_data> TYPE any. ASSIGN dyn_table->* TO <fs_data>. CREATE DATA dyn_line LIKE LINE OF <fs_data>. ASSIGN dyn_line->* TO <fs_wa_data>. CREATE DATA es_infty_str LIKE <fs_wa_data>. ENDMETHOD. |
Более частный случай. К структуре докидываются доп поля.
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 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 |
TYPES: BEGIN OF lty_struc_data. INCLUDE TYPE abap_compdescr. TYPES: scrtext_s TYPE scrtext_s, scrtext_m TYPE scrtext_m, scrtext_l TYPE scrtext_l, END OF lty_struc_data. TYPES lty_t_struc_data TYPE TABLE OF lty_struc_data. DATA : lt_idetails TYPE lty_t_struc_data, "abap_compdescr_tab, ls_xdetails TYPE lty_struc_data. "abap_compdescr. DATA : ref_table_des TYPE REF TO cl_abap_structdescr. DATA lo_type_desc TYPE REF TO cl_abap_typedescr. DATA: lt_comp TYPE abap_compdescr_tab, ls_comp LIKE LINE OF lt_comp. DATA ls_zqm_s_zpp49_alv TYPE zqm_s_zpp49_alv. DATA l_rollname TYPE dd04t-rollname. DATA: ls_fcat TYPE lvc_s_fcat, lt_fcat TYPE lvc_t_fcat. FIELD-SYMBOLS: <gt_dyn_table> TYPE STANDARD TABLE, <gs_dyn_wa> TYPE any. * Получим структуру внутренней таблицы ref_table_des ?= cl_abap_typedescr=>describe_by_name( 'ZQM_S_ZPP49_ALV' ). * lt_idetails[] = ref_table_des->components[]. LOOP AT ref_table_des->components[] INTO ls_comp. ASSIGN COMPONENT sy-tabix OF STRUCTURE ls_zqm_s_zpp49_alv TO FIELD-SYMBOL(<fs1>). CHECK sy-subrc = 0. APPEND INITIAL LINE TO lt_idetails ASSIGNING FIELD-SYMBOL(<ls_idetails>). MOVE-CORRESPONDING ls_comp TO <ls_idetails>. CLEAR lo_type_desc. lo_type_desc ?= cl_abap_typedescr=>describe_by_data( <fs1> ). l_rollname = lo_type_desc->absolute_name. SHIFT l_rollname BY 6 PLACES. SELECT SINGLE scrtext_s scrtext_m scrtext_l INTO (<ls_idetails>-scrtext_s, <ls_idetails>-scrtext_m, <ls_idetails>-scrtext_l) FROM dd04t WHERE rollname = l_rollname AND ddlanguage = sy-langu. ENDLOOP. LOOP AT lt_idetails INTO ls_xdetails. CLEAR ls_fcat. ls_fcat-fieldname = ls_xdetails-name . CASE ls_xdetails-type_kind. WHEN 'C'. ls_fcat-datatype = 'CHAR'. ls_fcat-inttype = ls_xdetails-type_kind. ls_fcat-intlen = ls_xdetails-length. ls_fcat-decimals = ls_xdetails-decimals. WHEN 'N'. ls_fcat-datatype = 'NUMC'. ls_fcat-inttype = ls_xdetails-type_kind. ls_fcat-intlen = ls_xdetails-length. ls_fcat-decimals = ls_xdetails-decimals. WHEN 'D'. ls_fcat-datatype = 'DATE'. * ls_fcat-datatype = 'DATS'. ls_fcat-domname = 'DATUM'. ls_fcat-inttype = 'D'. ls_fcat-intlen = '000010'. ls_fcat-dd_outlen = '000010'. ls_fcat-edit_mask = '__.__.____'. WHEN 'P'. ls_fcat-datatype = 'PACK'. ls_fcat-inttype = ls_xdetails-type_kind. ls_fcat-intlen = ls_xdetails-length. ls_fcat-decimals = ls_xdetails-decimals. WHEN OTHERS. ls_fcat-datatype = ls_xdetails-type_kind. ls_fcat-inttype = ls_xdetails-type_kind. ls_fcat-intlen = ls_xdetails-length. ls_fcat-decimals = ls_xdetails-decimals. ENDCASE. ls_fcat-scrtext_l = ls_xdetails-scrtext_l . ls_fcat-scrtext_s = ls_xdetails-scrtext_s . ls_fcat-scrtext_m = ls_xdetails-scrtext_m . ls_fcat-col_opt = abap_true. APPEND ls_fcat TO lt_fcat. ENDLOOP. LOOP AT it_char ASSIGNING FIELD-SYMBOL(<ls_char>) WHERE atinn <> '0000000000'. CLEAR ls_fcat. IF <ls_char>-dec <> abap_true. ls_fcat-fieldname = <ls_char>-atinn. ls_fcat-inttype = 'C'. ls_fcat-intlen = 40. ls_fcat-decimals = 0. ls_fcat-scrtext_l = <ls_char>-char_descr . ls_fcat-scrtext_s = <ls_char>-char_descr . ls_fcat-scrtext_m = <ls_char>-char_descr . ls_fcat-col_opt = abap_true. ELSE. ls_fcat-fieldname = <ls_char>-atinn. ls_fcat-inttype = 'P'. ls_fcat-intlen = 16. ls_fcat-decimals = 2. ls_fcat-scrtext_l = <ls_char>-char_descr . ls_fcat-scrtext_s = <ls_char>-char_descr . ls_fcat-scrtext_m = <ls_char>-char_descr . ls_fcat-col_opt = abap_true. ENDIF. APPEND ls_fcat TO lt_fcat. ENDLOOP. * Создадим динамическую внутреннюю таблицу CALL METHOD cl_alv_table_create=>create_dynamic_table EXPORTING it_fieldcatalog = lt_fcat i_length_in_byte = 'X' IMPORTING ep_table = gt_dy_table. " Работать с динамической таблицей надо через ссылки ASSIGN gt_dy_table->* TO <gt_dyn_table>. CREATE DATA gs_dy_line LIKE LINE OF <gt_dyn_table>. ASSIGN gs_dy_line->* TO <gs_dyn_wa>. |
Добрый день.
Спасибо за интересный пример.
Можно вот такой вопрос – тема-то известная.
Все дескрайб методы в этих классах возвращают же в системах с юникодом не совсем корректную длину в components-length – они возвращают внутреннюю длину в байтах.
То есть символьные поля будут иметь удвоенную длину – БЕ вместо 4 будет иметь длину 8.
Многие дополнительно преобразуют в зависимости от внутреннего типа.
Мне поэтому стало интересно, Вы это пофиксили как-то нотой (ходила молва, что будет такая, но я не проверял). Или в Вашем конкретном примере этот баг/фича просто ускользнули? 🙂
Может быть, стоит перепроверить и на всякий случай добавить в сноску.
Отличная статья! Спасибо!!!!
Если честно, проблемы такой не заметил. Возможно она и была, но в моих задачах ошибки из-за этого не возникало. Надо будет проверить этот момент.