Вот что в итоге получилось.
В ПБО экрана в зависимости от выбранных параметров присваиваются соответствующие параметры конструктора Представления.
Code:
IF ( p_add = abap_true OR p_dir = abap_true ) AND go_pay_viewer IS NOT BOUND.
IF p_add = abap_true.
gv_ddstruct = 'ZHR_T_PLANN_PAY'.
gv_way = 'GO_PAY_WORKER->MT_OUTTAB'.
lo_tdestr ?= cl_abap_tabledescr=>describe_by_data( go_pay_worker->mt_outtab ).
CREATE DATA gv_tab TYPE HANDLE lo_tdestr.
IF gv_tab IS BOUND.
ASSIGN gv_tab->* TO <gt_outtab>.
IF <gt_outtab> IS ASSIGNED.
<gt_outtab> = go_pay_worker->mt_outtab.
ENDIF.
ENDIF.
ELSEIF p_dir = abap_true.
go_pay_worker->fill_dir( ).
gv_ddstruct = 'ZHR_T_BANK_DIR'.
gv_way = 'GO_PAY_WORKER->MT_BANK_DIR'.
lo_tdestr ?= cl_abap_tabledescr=>describe_by_data( go_pay_worker->mt_bank_dir ).
CREATE DATA gv_tab TYPE HANDLE lo_tdestr.
IF gv_tab IS BOUND.
ASSIGN gv_tab->* TO <gt_outtab>.
IF <gt_outtab> IS ASSIGNED.
<gt_outtab> = go_pay_worker->mt_bank_dir.
ENDIF.
ENDIF.
ENDIF.
CREATE OBJECT go_pay_viewer
EXPORTING
iv_dynpro = '0100'
iv_cont = 'CONT1'.
ENDIF.
go_pay_viewer->setup_alv( i_has_top = abap_false ).
go_pay_viewer->disp( ).
Так выглядит конструктор:
Code:
CLASS lcl_payment_viewer IMPLEMENTATION.
METHOD constructor.
* В конструкторе мы используем динамические параметры для реализации возможности выводы разных гридов
super->constructor( sy-repid ).
me->md_repid = sy-repid.
me->md_dynnr = iv_dynpro.
me->md_container_name = iv_cont.
me->md_ddstruct = gv_ddstruct.
me->md_data_table = gv_way.
ENDMETHOD.
Выдержка из настроек альва
Code:
METHOD setup_alv.
super->setup_alv( i_has_top = abap_false ).
....
CREATE OBJECT go_pay_controller .
SET HANDLER go_pay_controller->on_toolbar FOR me->mr_grid.
SET HANDLER go_pay_controller->on_user_command FOR me->mr_grid.
SET HANDLER go_pay_controller->on_data_changed FOR me->mr_grid.
.....
.................t_fieldcatalog( ).
me->set_handlers( ).
me->set_layout( ).
me->set_sort( ).
ENDMETHOD.
разные гриды выводятся нормально, но не работают кнопки на тулбаре. В отладке всё корректно вроде, и до рефреша доходит, но на экране изменений я не вижу.
Вот тулбар:
Code:
METHOD on_toolbar.
DATA:
ls_toolbar TYPE stb_button
.
FIELD-SYMBOLS: <fs_alv_buttons> TYPE stb_button.
READ TABLE e_object->mt_toolbar
ASSIGNING <fs_alv_buttons>
WITH KEY function = '&LOCAL&INSERT_ROW'.
CHECK sy-subrc EQ 0.
<fs_alv_buttons>-icon = icon_insert_row.
<fs_alv_buttons>-function = 'INS'.
<fs_alv_buttons>-quickinfo = 'Добавить строку'(010).
CLEAR ls_toolbar.
ENDMETHOD.
Вот обработка этой кнопки:
Code:
METHOD on_user_command.
DATA:
lt_rows TYPE lvc_t_row
, ls_rows TYPE lvc_s_row
, ls_outtab TYPE zhr_t_plann_pay
, lv_pa_basis TYPE zhr_e_pay_basis
, lv_txt TYPE char_60
, ls_bank_dir TYPE zhr_t_bank_dir
.
FIELD-SYMBOLS:
<ls_outtab> TYPE zhr_t_plann_pay
.
CASE e_ucomm.
WHEN 'INS'.
IF p_add = abap_true.
ls_outtab-pay_basis = '1'.
lv_pa_basis = ls_outtab-pay_basis.
CALL FUNCTION 'ADS2KIPBRO_GET_DOMAIN_TEXT'
EXPORTING
e_table = 'ZHR_T_PLANN_PAY'
e_field = 'PAY_BASIS'
e_value = lv_pa_basis
IMPORTING
i_text = lv_txt
EXCEPTIONS
illegal_input = 1
domain_not_found = 2
OTHERS = 3.
IF sy-subrc <> 0.
MESSAGE text-007 TYPE 'I' DISPLAY LIKE 'E'.
ENDIF.
ls_outtab-pay_basis_text = lv_txt.
ls_outtab-obj_mr_type = '0001'.
CALL FUNCTION 'ADS2KIPBRO_GET_DOMAIN_TEXT'
EXPORTING
e_table = 'ZHR_T_PLANN_PAY'
e_field = 'OBJ_MR_TYPE'
e_value = ls_outtab-obj_mr_type
IMPORTING
i_text = lv_txt
EXCEPTIONS
illegal_input = 1
domain_not_found = 2
OTHERS = 3.
IF sy-subrc <> 0.
MESSAGE text-007 TYPE 'I' DISPLAY LIKE 'E'.
ENDIF.
ls_outtab-obj_mr_type_txt = lv_txt.
* ls_outtab-initiatir_pay = sy-uname.
ls_outtab-pay_mark = 'ОПЛАЧЕНО'.
CALL FUNCTION 'ADS2KIPBRO_GET_DOMAIN_TEXT'
EXPORTING
e_table = 'ZHR_T_PLANN_PAY'
e_field = 'PAY_MARK'
e_value = ls_outtab-pay_mark
IMPORTING
i_text = lv_txt
EXCEPTIONS
illegal_input = 1
domain_not_found = 2
OTHERS = 3.
IF sy-subrc <> 0.
MESSAGE text-007 TYPE 'I' DISPLAY LIKE 'E'.
ENDIF.
ls_outtab-pay_mark = lv_txt.
APPEND ls_outtab TO go_pay_worker->mt_outtab.
go_pay_viewer->refresh( ).
ELSEIF p_dir = abap_true.
ls_bank_dir-currency = 'UE'.
APPEND ls_bank_dir TO go_pay_worker->mt_bank_dir.
go_pay_viewer->refresh( ).
ENDIF.
ENDCASE.
ENDMETHOD. "on_user_command
Буду признателен, если поделитесь соображениям на тему: где я накосячил?