Ок, с тем, как отловить момент сохранения записей в таблице разобрались.
Теперь парни хотят каким-то образом отловить к те записи, которые были добавлены\изменены пользователем до момента сохранения в БД (и такой кейс имеет место быть).
Берём гугл (ох, есть у меня знакомый коллега, который ужасно любит сарказмы про поиск в гугле), вытаскиваем из него немного абапа для нашего кода обработки события (см. верхнюю ссылку), и получаем что-то вроде этого:
DATA:
wa_lines TYPE zpsb_bwa_obj,
lt_tab TYPE STANDARD TABLE OF zpsb_bwa_obj,
lt_tab_mod LIKE lt_tab,
lv_string_db TYPE string,
lv_string_it TYPE string.
FIELD-SYMBOLS:
<fs_tab> LIKE LINE OF lt_tab.
BREAK-POINT.
SELECT
*
FROM zpsb_bwa_obj
INTO CORRESPONDING FIELDS OF TABLE lt_tab.
LOOP AT total.
CLEAR wa_lines.
IF <vim_total_struc> IS ASSIGNED.
MOVE-CORRESPONDING <vim_total_struc> TO wa_lines.
APPEND wa_lines TO lt_tab_mod.
ENDIF.
** IF <action> IS NOT INITIAL AND add CHECKS here .
**
** IF wa_lines-<field 1> ne '<VALUE>'.
** MESSAGE 'XX' TYPE 'S' DISPLAY LIKE 'E'.
** vim_abort_saving = 'X'.
** EXIT.
**
** ELSEIF wa_lines-<field 2> ne '<VALUE>'
**
** message 'XX' type 'S' display like 'E'.
**
** vim_abort_saving = 'X'.
**
** EXIT.
**
** ENDIF.
** ENDIF.
ENDLOOP.
SORT: lt_tab_mod, lt_tab.
LOOP AT lt_tab ASSIGNING <fs_tab>.
READ TABLE lt_tab_mod INTO wa_lines
WITH KEY dso_name = <fs_tab>-dso_name.
IF sy-subrc NE 0.
CONTINUE.
ENDIF.
lv_string_db = <fs_tab>.
lv_string_it = wa_lines.
IF lv_string_db NE lv_string_it.
CONCATENATE `Строка различается: ` lv_string_it INTO lv_string_it.
MESSAGE lv_string_it TYPE 'I'.
ENDIF.
ENDLOOP.
п.с.: Не забыть бы переписать код, чтобы в динамике определять имя и структуру таблиц.
п.п.с: Для обновления полей - 01 и 05. Тут гайд.
FORM _new.
GET TIME STAMP FIELD zdbtab-timestamp.
zdbtab-chng_user = sy-uname.
ENDFORM.
FORM _update.
FIELD-SYMBOLS: <fs_field> TYPE any.
LOOP AT total.
CHECK <action> EQ aendern.
ASSIGN COMPONENT 'TIMESTAMP' OF STRUCTURE <vim_total_struc> TO <fs_field>.
IF sy-subrc EQ 0.
GET TIME STAMP FIELD <fs_field>.
ENDIF.
ASSIGN COMPONENT 'CHNG_USER' OF STRUCTURE <vim_total_struc> TO <fs_field>.
IF sy-subrc EQ 0.
<fs_field> = sy-uname.
ENDIF.
READ TABLE extract WITH KEY <vim_xtotal_key>.
IF sy-subrc EQ 0.
extract = total.
MODIFY extract INDEX sy-tabix.
ENDIF.
IF total IS NOT INITIAL.
MODIFY total.
ENDIF.
ENDLOOP.
ENDFORM.
Теперь парни хотят каким-то образом отловить к те записи, которые были добавлены\изменены пользователем до момента сохранения в БД (и такой кейс имеет место быть).
Берём гугл (ох, есть у меня знакомый коллега, который ужасно любит сарказмы про поиск в гугле), вытаскиваем из него немного абапа для нашего кода обработки события (см. верхнюю ссылку), и получаем что-то вроде этого:
DATA:
wa_lines TYPE zpsb_bwa_obj,
lt_tab TYPE STANDARD TABLE OF zpsb_bwa_obj,
lt_tab_mod LIKE lt_tab,
lv_string_db TYPE string,
lv_string_it TYPE string.
FIELD-SYMBOLS:
<fs_tab> LIKE LINE OF lt_tab.
BREAK-POINT.
SELECT
*
FROM zpsb_bwa_obj
INTO CORRESPONDING FIELDS OF TABLE lt_tab.
LOOP AT total.
CLEAR wa_lines.
IF <vim_total_struc> IS ASSIGNED.
MOVE-CORRESPONDING <vim_total_struc> TO wa_lines.
APPEND wa_lines TO lt_tab_mod.
ENDIF.
** IF <action> IS NOT INITIAL AND add CHECKS here .
**
** IF wa_lines-<field 1> ne '<VALUE>'.
** MESSAGE 'XX' TYPE 'S' DISPLAY LIKE 'E'.
** vim_abort_saving = 'X'.
** EXIT.
**
** ELSEIF wa_lines-<field 2> ne '<VALUE>'
**
** message 'XX' type 'S' display like 'E'.
**
** vim_abort_saving = 'X'.
**
** EXIT.
**
** ENDIF.
** ENDIF.
ENDLOOP.
SORT: lt_tab_mod, lt_tab.
LOOP AT lt_tab ASSIGNING <fs_tab>.
READ TABLE lt_tab_mod INTO wa_lines
WITH KEY dso_name = <fs_tab>-dso_name.
IF sy-subrc NE 0.
CONTINUE.
ENDIF.
lv_string_db = <fs_tab>.
lv_string_it = wa_lines.
IF lv_string_db NE lv_string_it.
CONCATENATE `Строка различается: ` lv_string_it INTO lv_string_it.
MESSAGE lv_string_it TYPE 'I'.
ENDIF.
ENDLOOP.
п.с.: Не забыть бы переписать код, чтобы в динамике определять имя и структуру таблиц.
п.п.с: Для обновления полей - 01 и 05. Тут гайд.
FORM _new.
GET TIME STAMP FIELD zdbtab-timestamp.
zdbtab-chng_user = sy-uname.
ENDFORM.
FORM _update.
FIELD-SYMBOLS: <fs_field> TYPE any.
LOOP AT total.
CHECK <action> EQ aendern.
ASSIGN COMPONENT 'TIMESTAMP' OF STRUCTURE <vim_total_struc> TO <fs_field>.
IF sy-subrc EQ 0.
GET TIME STAMP FIELD <fs_field>.
ENDIF.
ASSIGN COMPONENT 'CHNG_USER' OF STRUCTURE <vim_total_struc> TO <fs_field>.
IF sy-subrc EQ 0.
<fs_field> = sy-uname.
ENDIF.
READ TABLE extract WITH KEY <vim_xtotal_key>.
IF sy-subrc EQ 0.
extract = total.
MODIFY extract INDEX sy-tabix.
ENDIF.
IF total IS NOT INITIAL.
MODIFY total.
ENDIF.
ENDLOOP.
ENDFORM.
Комментариев нет:
Отправить комментарий