воскресенье, 29 декабря 2019 г.

Сравнение изменённых записей, внесённых через ракурс ведения таблицы, с записями в БД

Ок, с тем, как отловить момент сохранения записей в таблице разобрались.

Теперь парни хотят каким-то образом отловить к те записи, которые были добавлены\изменены пользователем до момента сохранения в БД (и такой кейс имеет место быть).

Берём гугл (ох, есть у меня знакомый коллега, который ужасно любит сарказмы про поиск в гугле), вытаскиваем из него немного абапа для нашего кода обработки события (см. верхнюю ссылку), и получаем что-то вроде этого:

  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.

  SORTlt_tab_modlt_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.

пятница, 13 декабря 2019 г.

7.5 Когда вам нужно передать значения выборочных столбцов из одной таблицы в другую

Да, если вам повезло работать с 7.5 и выше. Есть мега-шаманский класс, который облегчит задачу. 
Вообще, он умеет разными способами столбцы передавать, почитайте справку о нём.


    cl_abap_corresponding=>create(
       source      result_package
       destination lt_value_tab
       mapping     VALUE cl_abap_corresponding=>mapping_table(
         level   0
           kind    1
           srcname lv_name
           dstname 'FIELD' )
           )
        )->executeEXPORTING source      result_package
                    CHANGING  destination lt_value_tab ).