Не знаю наверняка, может не до конца поняла, но было похожее.
Тут несколько этапов обработки.
1) data_changed
Code:
METHOD data_changed.
* надо иметь в виду что здесь новой записи ещё нет в нашей внутренней таблице
LOOP AT pr_data_changed->mt_mod_cells INTO ls_good.
* проверим:
CLEAR l_priznak.
PERFORM check USING ls_outtab " тут ваша проверка
CHANGING l_priznak.
IF l_priznak = 'X'.
" нельзя редактировать эти поля
MESSAGE i000(0k) WITH text-m06 text-m07. " сообщение - нельзя менять, возвращаем прежнее значение
PERFORM data_changed_lock_nak USING pr_data_changed.
error_in_data = 'X'.
EXIT. "
ENDIF. " l_priznak = 'X'
ENDMETHOD.
FORM data_changed_lock_nak USING er_data_changed TYPE REF TO
cl_alv_changed_data_protocol.
DATA:
gs_mod_lock_nak LIKE LINE OF gt_mod_lock_nak,
ls_mod_row TYPE lvc_s_modi,
l_row TYPE i.
LOOP AT er_data_changed->mt_good_cells INTO ls_mod_row .
READ TABLE gt_naklad INTO gs_mod_lock_nak INDEX ls_mod_row-row_id.
IF sy-subrc = 0.
MOVE-CORRESPONDING gs_mod_lock_nak TO gt_mod_lock_nak.
READ TABLE gt_mod_lock_nak WITH KEY idn = gs_mod_lock_nak-idn
god = gs_mod_lock_nak-god.
IF sy-subrc <> 0.
APPEND gt_mod_lock_nak.
ENDIF.
ENDIF.
ENDLOOP.
2 часть:
data_changed_finished
Code:
FIELD-SYMBOLS:
<l_fname_otch> TYPE ANY
, <l_field_otch> TYPE ANY
, <l_field_lock> TYPE ANY
.
LOOP AT ret_good_cells INTO ls_modi.
READ TABLE gt_naklad INDEX ls_modi-row_id.
CHECK sy-subrc = 0.
READ TABLE gt_mod_lock_nak INTO ls_sf_lock.
IF sy-subrc <> 0.
......
ELSE.
" возвращаем прежнее значение в ячейку?
ASSIGN ls_modi-fieldname TO <l_fname_otch>.
CHECK sy-subrc EQ 0.
ASSIGN COMPONENT <l_fname_otch>
OF STRUCTURE gt_naklad TO <l_field_otch>. " новые значения..
CHECK sy-subrc EQ 0.
ASSIGN COMPONENT <l_fname_otch>
OF STRUCTURE ls_sf_lock TO <l_field_lock>. " из прежней строки
CHECK sy-subrc EQ 0.
<l_field_otch> = <l_field_lock>.
* l_stable = 'X'.
ENDIF. " READ TABLE gt_mod_lock
ENDLOOP.
REFRESH: gt_mod_lock_nak .
Обратите внимание, что в data_changed используется табличка mt_mod_cells (то есть все изменённые ячейки), а в data_changed_finished используется табличка et_good_cells, то есть те, которые проверены и 'хорошие'.