При создании экрана ведения для таблицы ширина блока вывода по умолчанию составляет 80 колонок. Что составляет примерно половину экрана. Это далеко не всегда удобно.
При необходимости увеличить область вывода первое, что делает разработчик, заходит в редактор экрана и меняет ширину в ручную. Такой подход часто достаточен, но при перегенерации ракурса ведения, все ручные изменения исчезают, экран приобретает свой стандартный размер. Мелочь, а неприятно.
Недавно наткнулся на способ, позволяющий каждый раз не восстанавливать размер экрана руками, а единожды прописать ФМ, который будет сравнивать текущий размер области с необходимым и в случае несовпадения перегенерировать его с заданным размером на лету.
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 |
FUNCTION zzz_resize_table_ctrl. *"---------------------------------------------------------------------- *"*"Local Interface: *" IMPORTING *" REFERENCE(IV_TABLE) TYPE STRING *" REFERENCE(IV_MAINT_FG) TYPE STRING *" REFERENCE(IV_DYNPRO_NO) TYPE CHAR4 *" REFERENCE(IV_WIDTH) TYPE I *"---------------------------------------------------------------------- CHECK iv_width <= 255. DATA: BEGIN OF gs_dynpro_descr, prog TYPE progname, dynpro TYPE char4, END OF gs_dynpro_descr. DATA: lv_fnam TYPE d021s-fnam, h TYPE d020s, ls_f TYPE d021s, f TYPE TABLE OF d021s WITH EMPTY KEY, e TYPE TABLE OF d022s WITH EMPTY KEY, m TYPE TABLE OF d023s WITH EMPTY KEY. DATA: m1 TYPE string, l1 TYPE string, w1 TYPE string. CONCATENATE 'SAPL' iv_maint_fg INTO gs_dynpro_descr-prog. gs_dynpro_descr-dynpro = iv_dynpro_no. CONCATENATE 'TCTRL_' iv_table INTO lv_fnam. IMPORT DYNPRO h f e m ID gs_dynpro_descr. READ TABLE f INTO ls_f WITH KEY fnam = lv_fnam. CHECK sy-subrc = 0. CHECK h-noco < iv_width. h-noco = iv_width. * convert to hexa DATA: lv_crmt_ei_kb_id TYPE crmt_ei_kb_id. lv_crmt_ei_kb_id = iv_width - 2. CALL FUNCTION 'CRM_EI_KB_CONV_DEC_TO_HEX' EXPORTING iv_decimal = lv_crmt_ei_kb_id IMPORTING ev_hex = lv_crmt_ei_kb_id. CHECK NOT lv_crmt_ei_kb_id+30(2) IS INITIAL. ls_f-leng = lv_crmt_ei_kb_id+30(2). MODIFY f FROM ls_f INDEX sy-tabix TRANSPORTING leng. CHECK sy-subrc = 0. EXPORT DYNPRO h f e m ID gs_dynpro_descr. GENERATE DYNPRO h f e m ID gs_dynpro_descr MESSAGE m1 LINE l1 WORD w1. ENDFUNCTION. |
Далее надо вызвать ФМ в событии ракурса
Где
iv_table - Имя таблицы
iv_maint_fg - Имя группы функций
iv_dynpro_no - Номер экрана
iv_width - Необходимая ширина
1 2 3 4 5 6 7 8 9 10 11 |
FORM GENERATE_LARGE_SCREEN. CALL FUNCTION 'ZZZ_RESIZE_TABLE_CTRL' EXPORTING iv_table = 'ZZZ_TEST_TAB' iv_maint_fg = 'ZGR_TEST_TAB' iv_dynpro_no = '0100' iv_width = '200' . ENDFORM. |
Заходим в SM30 и проверяем результат