Обновить itab с другого itab?

Моя программа просто блокирует пользователей, если установлен флажок «LOCK».

Все работает и записи пользователей обновляются в USR02. Когда происходит это изменение, я хочу, чтобы оно также отражалось в IT_USR02, т.е. таблица БД USR02 и itab it_usr02 должны быть идентичными.

SELECT-OPTIONS: USER_ID FOR USR02-BNAME.
  START-OF-SELECTION.
  SELECT BNAME
         USTYP
         UFLAG
  FROM USR02
  INTO TABLE IT_USR02
  WHERE BNAME IN USER_ID.

  LOOP AT IT_USR02 INTO ST_USR02.
      IF LOCK = 'X'.
        CALL FUNCTION 'BAPI_USER_LOCK'
          EXPORTING
            USERNAME = ST_USR02-BNAME
          TABLES
            RETURN   = I_BAPI_RETURN.

        MOVE-CORRESPONDING IT_USR02[] TO IT_ZATO_LOCK_UNLOCK[].
        MODIFY ZATO_LOCK_UNLOCK FROM TABLE IT_ZATO_LOCK_UNLOCK.

      ENDIF.
  ENDLOOP.

По сути, после вызова функции BAPI_USER_LOCK я хочу, чтобы это изменение было внесено и в таблицу IT_USR02. Оттуда я копирую содержимое IT_USR02 в свою настраиваемую таблицу ZATO_LOCK_UNLOCK.

Кажется, здесь все работает нормально, я просто не могу понять, как обновить внутреннюю таблицу. Любая помощь будет оценена.


person oceanlab1    schedule 31.07.2017    source источник
comment
Код неполный - откуда берется LOCK и какое изменение вы хотите записать обратно в таблицу? Вы ничего не меняете в цикле.   -  person vwegert    schedule 31.07.2017
comment
«LOCK» относится к флажку, и я хотел сохранить значения BNAME, USTYP и UFLAG в моей настраиваемой таблице (ZATO_LOCK_UNLOCK). После запуска программа не обновляет значение в IT_USR02, что, в свою очередь, не обновляет настраиваемую таблицу. Он вносит изменения, как бы я не понимал, как скопировать это изменение с USR02 на мой IT_USR02.   -  person oceanlab1    schedule 31.07.2017
comment
Вы не меняете ни BNAME, ни USTYP, поэтому не нужно его обновлять, верно? И вы не определяете новое значение UFLAG для себя, поэтому вам нужно прочитать его либо из базы данных, либо через BAPI_USER_GETDETAIL.   -  person vwegert    schedule 31.07.2017
comment
Ага, извините :) Отменил мой комментарий.   -  person Suncatcher    schedule 31.07.2017


Ответы (1)


Если я правильно понимаю вашу проблему, то вам нужно что-то вроде этого:

LOOP AT IT_USR02 ASSIGNING FIELD-SYMBOL(<USR02>).
  " Using field symbol for performance and so the entry can be changed

  IF LOCK = 'X'.
    CALL FUNCTION 'BAPI_USER_LOCK'
      EXPORTING
        USERNAME = ST_USR02-BNAME
      TABLES
        RETURN   = I_BAPI_RETURN.
    IF "All is OK in I_BAPI_RETURN
      " Change the table entry
      <USR02>-UFLAG = 32. " Not sure if this is the right value
    ENDIF.
  ENDIF.
ENDLOOP.
" This needs to be outside the loop since you are handling the complete table
MOVE-CORRESPONDING IT_USR02[] TO IT_ZATO_LOCK_UNLOCK[].
MODIFY ZATO_LOCK_UNLOCK FROM TABLE IT_ZATO_LOCK_UNLOCK.
" A commit work might be needed here

Обратите внимание, что вам все равно нужно закодировать условие, чтобы проверить, все ли в порядке с вызовом BAPI. Я не знаком с BAPI, поэтому не знаю, является ли отсутствие записей хорошей новостью или вам нужно проверить, есть ли какие-либо ошибки в возвращаемой таблице.

person Gert Beukema    schedule 31.07.2017