Решил для себя сделать такую весщь.
Сделать класс для работы с ALV гридом.
Чтобы на каждом экране не писать много кода, не создавать кучу переменных а обьявить класс присвоить имя и и все будет работать.
Вообщем сделал. Работает даже.
но только работает 1й вызов. после отработки PAI я теряю грид на экране из класса. Вернее он есть но с ним уже работать не могу.
Подумав, логично получается. получается что в PBO я при каждом вызове экрана крейчу класс и он уже как бы новый. А алв на экране остается от старого класса. и не должно работать!!!
Привожу пример класса.
Code:
CLASS ALV_DISPLAY DEFINITION.
PUBLIC SECTION.
" переменные класса.
DATA gr_alvgrid TYPE REF TO cl_gui_alv_grid.
DATA alvname TYPE scrfname. " Тут обязательно указать название ALV на экране.
DATA gr_container TYPE REF TO cl_gui_custom_container.
DATA gt_fieldcat TYPE lvc_t_fcat.
DATA gs_layout TYPE lvc_s_layo.
DATA wa_catalog TYPE lvc_s_fcat.
DATA StructureName TYPE DD02L-TABNAME .
DATA Title type STRING VALUE 'ALV TITLE'.
DATA CONTEXT_MENU_CODE TYPE STRING.
* методы.
METHODS: INITIALIZE_ALV. "выполнить 1 раз для инициализации ALV на экране.
METHODS: REFRESH EXPORTING tblName TYPE TABLE. " вывод данных на экран.
METHODS: SET_CONTEXT_MENU.
.......... тут еще много методов есть но они не важны сейчас.
PRIVATE SECTION.
ENDCLASS.
CLASS ALV_DISPLAY IMPLEMENTATION.
METHOD INITIALIZE_ALV.
CREATE OBJECT gr_container
EXPORTING
container_name = alvname
EXCEPTIONS
cntl_error = 1
cntl_system_error = 2
create_error = 3
lifetime_error = 4
lifetime_dynpro_dynpro_link = 5
others = 6 .
CREATE OBJECT gr_alvgrid
EXPORTING
i_parent = gr_container
EXCEPTIONS
error_cntl_create = 1
error_cntl_init = 2
error_cntl_link = 3
error_dp_create = 4
others = 5 .
CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
EXPORTING
i_structure_name = StructureName
CHANGING
ct_fieldcat = gt_fieldcat[] .
* данные лайяута по умолчанию. если надо меняйте. лайаут в паблик секции.
gs_layout-zebra = 'X'.
gs_layout-CWIDTH_OPT = 'X'.
gs_layout-SEL_MODE = 'A'.
gs_layout-grid_title = Title.
gs_layout-smalltitle = 'X'.
ENDMETHOD.
******************************************************************************
METHOD REFRESH.
" Запустили на экран грид.
CALL METHOD gr_alvgrid->set_table_for_first_display
EXPORTING
is_layout = gs_layout
i_save = 'A'
CHANGING
it_fieldcatalog = gt_fieldcat
it_outtab = tblName[].
ENDMETHOD.
ENDCLASS.
пример вызова на экране.
Code:
CREATE OBJECT ALV_01.
ALV_01->alvname = 'ALV0001'.
ALV_01->StructureName = 'MyStructure'.
CALL METHOD ALV_01->INITIALIZE_ALV.
CALL METHOD ALV_01->REFRESH IMPORTING tblName = mytable[].
..... [различные действия]
и главное что все работает.
но до первого рефреша.
Логически я четко понимаю почему не работает.
Хотелось бы придумать как его заставить работать.
Не хотелось бы при каждом экране методом копирования переносить пачку кода. Хочется сделать код минимальным и читстым.
Ваши советы?