Вот как я делаю справочники может кому понадобится!!!
Code:
*&---------------------------------------------------------------------*
*& Program ZFI_BEZPRAVA_BP Soglaev V/A 14.08.2008 *
*&---------------------------------------------------------------------*
PROGRAM Z_FI_BEZPRAVA_BP.
TABLES : ZFI_BEZPRAVA_BP. " Основная таблица данных
TYPE-POOLS VRM. " Подключение заполнения listbox
*-CLASS_BEGIN-##########################################################
CLASS lcl_event_receiver DEFINITION.
PUBLIC SECTION.
METHODS handle_data_changed
FOR EVENT data_changed OF cl_gui_alv_grid
IMPORTING er_data_changed.
METHODS handle_f4
FOR EVENT onf4 OF cl_gui_alv_grid
IMPORTING e_fieldname
es_row_no
er_event_data
et_bad_cells.
METHODS handle_data_changed_finished
FOR EVENT data_changed_finished OF cl_gui_alv_grid
IMPORTING e_modified
et_good_cells.
ENDCLASS. "lcl_event_receiver DEFINITION
CLASS lcl_event_receiver IMPLEMENTATION.
METHOD handle_data_changed.
PERFORM data_changed USING er_data_changed.
ENDMETHOD. "handle_data_changed
METHOD handle_f4.
PERFORM f4 USING e_fieldname
es_row_no
er_event_data
et_bad_cells.
ENDMETHOD. "handle_f4
METHOD handle_data_changed_finished.
PERFORM data_changed_finished USING
e_modified
et_good_cells.
ENDMETHOD. "handle_data_changed_finished
*---------------------------------------------------------
ENDCLASS. "lcl_event_receiver IMPLEMENTATION
*-CLASS_END-############################################################
*-Грид для строк документа-#############################################
DATA: g_container TYPE scrfname VALUE 'GRID',
g_container_error TYPE scrfname VALUE 'CONTAINER_ERROR',
Grid TYPE REF TO cl_gui_alv_grid,
g_custom_container TYPE REF TO cl_gui_custom_container,
g_custom_container_error TYPE REF TO cl_gui_custom_container.
*- ListBox ---------------
DATA : NAME TYPE VRM_ID,
LIST TYPE VRM_VALUES,
VALUE LIKE LINE OF LIST.
DATA : BUKRS LIKE ZFI_BEZPRAVA_BP-BUKRS.
DATA : IDUSL LIKE ZFI_BEZPRAVA_BP-VIDUS.
*Строки документа (ДАННЫЕ)
data: BEGIN OF i_doc_lines OCCURS 0.
include structure ZFI_BEZPRAVA_BP.
data: END OF i_doc_lines.
*Собственный банк
data: ST012 LIKE TABLE OF T012 WITH HEADER LINE.
DATA : deleted_rows TYPE STANDARD TABLE OF ZFI_BEZPRAVA_BP WITH HEADER LINE. " Удалённые
DATA : modify_rows TYPE STANDARD TABLE OF ZFI_BEZPRAVA_BP WITH HEADER LINE. " Изменённые
DATA : insert_rows TYPE STANDARD TABLE OF ZFI_BEZPRAVA_BP WITH HEADER LINE. " Новые
DATA : event_receiver TYPE REF TO lcl_event_receiver. " Приёмник событий
DATA : lt_exclude TYPE ui_functions.
DATA : change_flag TYPE c VALUE space.
DATA : gs_variant TYPE disvariant.
DATA : gs_layout TYPE lvc_s_layo." LAYOUT для строк документа
DATA : gt_fieldcat TYPE lvc_t_fcat." Каталог полей для строк документа (GRID)
DATA : gt_sort TYPE lvc_t_sort.
DATA : gt_f4 TYPE lvc_t_f4.
INITIALIZATION.
Call screen 1000. " Первый экран
START-OF-SELECTION.
" BEGIN ###################################################################################
MODULE init_screen_0100 OUTPUT.
SET PF-STATUS '100'.
SET TITLEBAR '100'.
" Заполнение listbox
CLEAR LIST. REFRESH LIST.
VALUE-KEY = '1'.
VALUE-TEXT = 'ГСМ'.
APPEND VALUE TO LIST.
VALUE-KEY = '2'.
VALUE-TEXT = 'Услуга без права включ. ВР'.
APPEND VALUE TO LIST.
CALL FUNCTION 'VRM_SET_VALUES'
EXPORTING
ID = 'IDUSL'
VALUES = LIST.
ENDMODULE.
MODULE CANCEL INPUT.
LEAVE PROGRAM.
ENDMODULE.
MODULE DO_ INPUT.
CASE sy-ucomm.
WHEN 'CANCEL'.
LEAVE PROGRAM.
WHEN 'OKAY'.
PERFORM AUTHORITY_CHECK. " Проверка прав полномочия
PERFORM SEL_DATA.
Call screen 1001.
ENDCASE.
ENDMODULE.
"## Обработка таблицы #####################################################################
MODULE pai_input INPUT. " Модуль после вывода на экран
DATA: answer TYPE c VALUE space.
DATA: err_code(1) TYPE c VALUE space.
DATA: l_valid(1) TYPE c.
CASE sy-ucomm." Обработка событий кнопок
WHEN 'CANCEL'."-----------------------------------------
IF change_flag <> space.
CALL FUNCTION 'POPUP_TO_CONFIRM_STEP'
EXPORTING
defaultoption = 'Y'
textline1 = 'Все несохранённые данные будут утеряны.'
textline2 = 'Продолжить?'
titel = 'Предупреждение'
start_column = 30
start_row = 6
cancel_display = space
IMPORTING
answer = answer.
ELSE.
answer = 'J'.
ENDIF.
IF answer = 'J'.
SET SCREEN 0.
LEAVE SCREEN.
ENDIF.
WHEN 'EDIT'."-------------------------------------------
if GRID->is_ready_for_input( ) = 0.
call method GRID->set_ready_for_input EXPORTING
i_ready_for_input = 1.
else.
CALL METHOD GRID->check_changed_data
IMPORTING
e_valid = l_valid.
IF l_valid = 'X'.
call method GRID->set_ready_for_input EXPORTING
i_ready_for_input = 0.
ENDIF.
endif.
WHEN 'SAVE'."-------------------------------------------
PERFORM initial_check USING err_code.
CALL METHOD grid->check_changed_data
IMPORTING
e_valid = l_valid.
IF l_valid = 'X' AND err_code NE 'X'.
PERFORM save_database.
ELSE.
MESSAGE text-002 TYPE 'S' DISPLAY LIKE 'E'.
ENDIF.
WHEN 'BTDEL'."-------------------------------------------
DATA : BT_DEL TYPE C VALUE ''.
IF change_flag <> space.
CALL FUNCTION 'POPUP_TO_CONFIRM_STEP'
EXPORTING
defaultoption = 'Y'
textline1 = 'Все несохранённые данные будут утеряны.'
textline2 = 'Продолжить?'
titel = 'Предупреждение'
start_column = 30
start_row = 6
cancel_display = space
IMPORTING
answer = answer.
ELSE.
answer = 'J'.
ENDIF.
IF answer = 'J'.
IF BT_DEL = space. " Показывать не показывать удалённые
BT_DEL = 'X'.
FREE i_doc_lines.
Select * from ZFI_BEZPRAVA_BP into corresponding fields of table i_doc_lines
WHERE BUKRS = BUKRS and IDUSL = IDUSL.
ELSE.
CLEAR BT_DEL.
FREE i_doc_lines.
Select * from ZFI_BEZPRAVA_BP into corresponding fields of table i_doc_lines
WHERE BUKRS = BUKRS and IDUSL = IDUSL AND ISDEL = BT_DEL .
ENDIF.
ENDIF.
ENDCASE.
ENDMODULE.
MODULE grid_creat OUTPUT. " Модуль перед выводом
SET PF-STATUS '100'. " устанавливаем пользовательские кнопки
SET TITLEBAR '100'.
LOOP AT SCREEN.
IF screen-NAME eq 'BTDEL'. " Скрытие кнопки
IF sy-uname <> 'V.A.SOGLAEV'. " Если я кнопка активна
screen-input = '0'.
ENDIF.
ENDIF.
MODIFY SCREEN.
ENDLOOP.
IF g_custom_container IS INITIAL. " если контейнер не создан
IF sy-batch IS INITIAL. " если не запущен фоновый режим
CREATE OBJECT g_custom_container " создаем контейнер
EXPORTING container_name = g_container.
CREATE OBJECT g_custom_container_error " создаем контейнер
EXPORTING container_name = g_container_error.
ENDIF.
CREATE OBJECT grid " создаем грид
EXPORTING i_parent = g_custom_container
i_applogparent = g_custom_container_error.
CREATE OBJECT event_receiver. " создаем приемник событий
* и привязываем его к гриду
SET HANDLER event_receiver->handle_data_changed FOR grid.
SET HANDLER event_receiver->handle_data_changed_finished FOR grid.
* F4 для грида
SET HANDLER event_receiver->handle_f4 FOR grid.
CALL METHOD grid->register_f4_for_fields
EXPORTING
it_f4 = gt_f4.
IF sy-batch IS INITIAL.
* метод обработки изменений при смене ячеек
CALL METHOD grid->register_edit_event
EXPORTING
i_event_id = cl_gui_alv_grid=>mc_evt_modified.
ENDIF.
PERFORM exclude_tb_functions CHANGING lt_exclude.
* если таблица пустая - режим редактирования,
* если есть записи - режим просмотра
IF i_doc_lines[] IS INITIAL.
CALL METHOD grid->set_ready_for_input
EXPORTING
i_ready_for_input = 1.
ELSE.
CALL METHOD grid->set_ready_for_input
EXPORTING
i_ready_for_input = 0.
ENDIF.
ENDIF.
PERFORM BUILD_FIELDCAT TABLES gt_fieldcat[].
CALL METHOD grid->set_table_for_first_display
EXPORTING
it_toolbar_excluding = lt_exclude
i_save = 'A'
is_variant = gs_variant
is_layout = gs_layout
CHANGING
it_outtab = i_doc_lines[]
it_sort = gt_sort
it_fieldcatalog = gt_fieldcat[].
CALL METHOD grid->refresh_table_display.
ENDMODULE.
FORM BUILD_FIELDCAT TABLES fcat.
DATA: wa TYPE lvc_s_fcat.
CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
EXPORTING
i_structure_name = 'ZFI_BEZPRAVA_BP'
CHANGING
ct_fieldcat = fcat[]
EXCEPTIONS
inconsistent_interface = 1
program_error = 2
OTHERS = 3.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
LOOP AT fcat INTO wa.
"Скрываем лишние поля
search 'ID/BUKRS/ISUSL/CPUDT/CPUTM/USNAME/ISDEL' for wa-fieldname.
if sy-subrc eq 0.
wa-no_out = 'X'.
MODIFY fcat FROM wa.
endif.
CASE wa-fieldname. " Укорачиваем видимую длину наименования
WHEN 'BUDAT'.
wa-coltext = 'Дата'.
wa-outputlen = 10.
MODIFY fcat FROM wa.
WHEN 'NUMDOC'.
wa-coltext = 'Номер документа'.
wa-outputlen = 20.
MODIFY fcat FROM wa.
WHEN 'NAMOR'.
wa-coltext = 'Наименование организации'.
wa-outputlen = 25.
MODIFY fcat FROM wa.
WHEN 'VIDUS'.
wa-coltext = 'Вид услуги'.
wa-outputlen = 25.
MODIFY fcat FROM wa.
WHEN 'SUMDOC'.
wa-coltext = 'Сумма'.
wa-outputlen = 15.
MODIFY fcat FROM wa.
"##################################################
WHEN 'BUKRS'.
wa-coltext = 'БЕ'.
wa-style = cl_gui_alv_grid=>mc_style_enabled. " Запрет на редактирование
MODIFY fcat FROM wa.
WHEN 'ID'.
wa-coltext = 'ID'.
wa-style = cl_gui_alv_grid=>mc_style_enabled. " Запрет на редактирование
MODIFY fcat FROM wa.
WHEN 'IDUSL'.
wa-coltext = 'ГСМ/Услуга'.
wa-no_out = 'X'.
wa-style = cl_gui_alv_grid=>mc_style_enabled. " Запрет на редактирование
MODIFY fcat FROM wa.
WHEN 'CPUDT'.
wa-coltext = 'Дата'.
wa-style = cl_gui_alv_grid=>mc_style_enabled. " Запрет на редактирование
MODIFY fcat FROM wa.
WHEN 'CPUTM'.
wa-coltext = 'Время'.
wa-style = cl_gui_alv_grid=>mc_style_enabled. " Запрет на редактирование
MODIFY fcat FROM wa.
WHEN 'USNAME'.
wa-coltext = 'Пользователь'.
wa-style = cl_gui_alv_grid=>mc_style_enabled. " Запрет на редактирование
MODIFY fcat FROM wa.
WHEN 'ISDEL'.
wa-coltext = 'Удален'.
wa-style = cl_gui_alv_grid=>mc_style_enabled. " Запрет на редактирование
MODIFY fcat FROM wa.
ENDCASE.
ENDLOOP.
gs_layout-edit = 'X'.
gs_layout-no_toolbar = ''.
ENDFORM. " BUILD_TREEFIELDCAT
FORM SEL_DATA. "" Загрузка в таблицу
FREE i_doc_lines.
Select * from ZFI_BEZPRAVA_BP into corresponding fields of table i_doc_lines
WHERE BUKRS = BUKRS and IDUSL = IDUSL AND ISDEL = '' .
ENDFORM.
FORM data_changed USING rr_data_changed TYPE REF TO cl_alv_changed_data_protocol.
FIELD-SYMBOLS <fld> TYPE ANY.
DATA: i_doc_lines_wa LIKE LINE OF i_doc_lines.
DATA: field_text(50) TYPE c.
DATA: ls_fieldcatalog TYPE lvc_s_fcat.
DATA: ls_mod_cells TYPE lvc_s_modi.
DATA: ls_del_cells TYPE lvc_s_moce.
DATA: ls_ins_cells TYPE lvc_s_moce.
DATA: ls_modi_cells TYPE lvc_s_modi.
DATA: ls_cells TYPE lvc_s_modi.
DATA: l_BUDAT LIKE ZFI_BEZPRAVA_BP-BUDAT.
DATA: l_NUMDOC LIKE ZFI_BEZPRAVA_BP-NUMDOC.
DATA: l_NAMOR LIKE ZFI_BEZPRAVA_BP-NAMOR.
DATA: l_VIDUS LIKE ZFI_BEZPRAVA_BP-VIDUS.
DATA: l_SUMDOC LIKE ZFI_BEZPRAVA_BP-SUMDOC.
DATA: area TYPE REF TO data.
FIELD-SYMBOLS <table> TYPE STANDARD TABLE.
FIELD-SYMBOLS <line> LIKE LINE OF i_doc_lines.
change_flag = 'X'.
** регистрация удаленных строк
LOOP AT rr_data_changed->mt_deleted_rows INTO ls_del_cells.
READ TABLE i_doc_lines INTO i_doc_lines_wa INDEX ls_del_cells-row_id.
MOVE-CORRESPONDING i_doc_lines_wa TO deleted_rows.
COLLECT deleted_rows.
ENDLOOP.
*** регистрация редактируемых и новых
LOOP AT rr_data_changed->mt_mod_cells INTO ls_mod_cells.
READ TABLE i_doc_lines INDEX ls_mod_cells-row_id." Читаем текущую строку!
if i_doc_lines-ISDEL = 'X'." Проверяем удалена или нет!
MESSAGE 'Ошибка: Нельзя редактировать удалённую запись!' TYPE 'S' DISPLAY LIKE 'E'.
ELSE.
CASE ls_mod_cells-fieldname.
WHEN 'BUDAT'.
CALL METHOD rr_data_changed->get_cell_value
EXPORTING
i_row_id = ls_mod_cells-row_id
i_fieldname = ls_mod_cells-fieldname
IMPORTING
e_value = l_BUDAT.
CALL METHOD rr_data_changed->modify_cell
EXPORTING
i_row_id = ls_mod_cells-row_id
i_fieldname = ls_mod_cells-fieldname
i_value = l_BUDAT.
WHEN 'NUMDOC'.
CALL METHOD rr_data_changed->get_cell_value
EXPORTING
i_row_id = ls_mod_cells-row_id
i_fieldname = ls_mod_cells-fieldname
IMPORTING
e_value = l_NUMDOC.
CALL METHOD rr_data_changed->modify_cell
EXPORTING
i_row_id = ls_mod_cells-row_id
i_fieldname = ls_mod_cells-fieldname
i_value = l_NUMDOC.
WHEN 'NAMOR'.
CALL METHOD rr_data_changed->get_cell_value
EXPORTING
i_row_id = ls_mod_cells-row_id
i_fieldname = ls_mod_cells-fieldname
IMPORTING
e_value = l_NAMOR.
CALL METHOD rr_data_changed->modify_cell
EXPORTING
i_row_id = ls_mod_cells-row_id
i_fieldname = ls_mod_cells-fieldname
i_value = l_NAMOR.
WHEN 'VIDUS'.
CALL METHOD rr_data_changed->get_cell_value
EXPORTING
i_row_id = ls_mod_cells-row_id
i_fieldname = ls_mod_cells-fieldname
IMPORTING
e_value = l_VIDUS.
CALL METHOD rr_data_changed->modify_cell
EXPORTING
i_row_id = ls_mod_cells-row_id
i_fieldname = ls_mod_cells-fieldname
i_value = l_VIDUS.
WHEN 'SUMDOC'.
CALL METHOD rr_data_changed->get_cell_value
EXPORTING
i_row_id = ls_mod_cells-row_id
i_fieldname = ls_mod_cells-fieldname
IMPORTING
e_value = l_SUMDOC.
CALL METHOD rr_data_changed->modify_cell
EXPORTING
i_row_id = ls_mod_cells-row_id
i_fieldname = ls_mod_cells-fieldname
i_value = l_SUMDOC.
ENDCASE.
CALL METHOD rr_data_changed->modify_cell
EXPORTING
i_row_id = ls_mod_cells-row_id
i_fieldname = 'BUKRS'
i_value = BUKRS.
CALL METHOD rr_data_changed->modify_cell
EXPORTING
i_row_id = ls_mod_cells-row_id
i_fieldname = 'IDUSL'
i_value = IDUSL.
CALL METHOD rr_data_changed->modify_cell
EXPORTING
i_row_id = ls_mod_cells-row_id
i_fieldname = 'CPUDT'
i_value = sy-datum.
CALL METHOD rr_data_changed->modify_cell
EXPORTING
i_row_id = ls_mod_cells-row_id
i_fieldname = 'CPUTM'
i_value = sy-uzeit.
CALL METHOD rr_data_changed->modify_cell
EXPORTING
i_row_id = ls_mod_cells-row_id
i_fieldname = 'USNAME'
i_value = sy-uname.
ENDIF.
ENDLOOP.
ENDFORM. "data_changed
FORM save_database.
* !!! удаление из таблицы !!!
LOOP AT deleted_rows.
UPDATE ZFI_BEZPRAVA_BP SET CPUDT = sy-datum
CPUTM = sy-uzeit
USNAME = sy-uname
ISDEL = 'X'
WHERE id = deleted_rows-id.
ENDLOOP.
* --- Проверка уникальности -------------------------------------------------
DATA : tmp_tab_save LIKE i_doc_lines OCCURS 10 WITH HEADER LINE,
npp TYPE I.
tmp_tab_save[] = i_doc_lines[].
LOOP AT i_doc_lines .
LOOP AT tmp_tab_save WHERE IDUSL = i_doc_lines-IDUSL and BUDAT = i_doc_lines-BUDAT and numdoc = i_doc_lines-NUMDOC.
npp = npp + 1.
IF npp >= 2.
MESSAGE 'Запись уже существует!!!' TYPE 'W' display like 'E'.
RETURN.
ENDIF.
ENDLOOP.
CLEAR npp.
ENDLOOP.
* !!! модификация или добавление записей в таблицу !!!
data : gen_id type int4.
LOOP AT i_doc_lines WHERE ISDEL <> 'X'.
i_doc_lines-MANDT = sy-MANDT.
i_doc_lines-BUKRS = BUKRS.
i_doc_lines-IDUSL = IDUSL.
"===Получение уникального ключа "gen_id" к справочнику=========
if sy-tabix eq 1.
clear gen_id.
Select single max( id ) from ZFI_BEZPRAVA_BP into gen_id .
endif.
if i_doc_lines-id eq 0 .
gen_id = gen_id + 1.
i_doc_lines-id = gen_id.
endif.
"===============================================================
modify : i_doc_lines.
clear : i_doc_lines , ZFI_BEZPRAVA_BP.
ENDLOOP.
MODIFY ZFI_BEZPRAVA_BP FROM TABLE i_doc_lines. COMMIT WORK. " Finish
IF sy-subrc = 0.
MESSAGE text-008 TYPE 'S'.
CLEAR change_flag.
ELSE.
MESSAGE text-010 TYPE 'S' DISPLAY LIKE 'E'.
ENDIF.
ENDFORM. "update_database.
FORM data_changed_finished USING r_modified TYPE char01 rt_good_cells TYPE lvc_t_modi.
" здесь в сформированную строку заполняю дополнительные поля в таблицу
DATA rt_good_cells_wa LIKE LINE OF rt_good_cells.
ENDFORM.
FORM exclude_tb_functions CHANGING pt_exclude TYPE ui_functions.
DATA ls_exclude TYPE ui_func.
ls_exclude = cl_gui_alv_grid=>mc_fc_loc_insert_row.
APPEND ls_exclude TO pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_loc_undo.
APPEND ls_exclude TO pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_loc_copy_row.
APPEND ls_exclude TO pt_exclude.
ENDFORM.
FORM f4 USING r_fieldname TYPE lvc_fname
rs_row_no TYPE lvc_s_roid
rr_event_data TYPE REF TO cl_alv_event_data
rt_bad_cells TYPE lvc_t_modi. "#EC *
FIELD-SYMBOLS: <lt_f4> TYPE lvc_t_modi.
DATA: ls_f4 TYPE lvc_s_modi.
ASSIGN rr_event_data->m_data->* TO <lt_f4>.
ls_f4-fieldname = r_fieldname.
ls_f4-row_id = rs_row_no-row_id.
ls_f4-value = 'BLUBBER'.
APPEND ls_f4 TO <lt_f4>.
rr_event_data->m_event_handled = 'X'.
ENDFORM. " F4
FORM initial_check USING err_code TYPE c. " Проверка на правильность ввода данных
CLEAR : err_code.
LOOP AT i_doc_lines.
* IF i_doc_lines-SUMDOC IS INITIAL.
* err_code = 'X'. EXIT.
* ENDIF.
ENDLOOP.
ENDFORM.
FORM AUTHORITY_CHECK.
AUTHORITY-CHECK OBJECT 'F_BKPF_BUK'
ID 'BUKRS' FIELD BUKRS
ID 'ACTVT' FIELD '03'.
if sy-subrc ne 0.
MESSAGE 'Нет прав на получение информации!!!' TYPE 'I'.
SUBMIT Z_FI_BEZPRAVA_BP .
endif.
ENDFORM.