SAPфорум.RU
https://sapboard.ru/forum/

BAPI_OBJCL_CHANGE и ожидание завершения обновления
https://sapboard.ru/forum/viewtopic.php?f=13&t=96149
Страница 1 из 1

Автор:  Валерка [ Пн, мар 05 2018, 09:47 ]
Заголовок сообщения:  BAPI_OBJCL_CHANGE и ожидание завершения обновления

Есть программа, которая меняет признаки. Работает просто - для каждого ЕО вызывается BAPI_OBJCL_CHANGE. Если ошибок нет, то
Code:
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'.

Попросили добавить добавить вывод значения признака ДО внесения изменений и ПОСЛЕ. Проблема в том, что без параметра WAIT нет ожидания, когда данные внесутся в таблицы. Поэтому иногда при чтении новых значений читается старое значение, так как новое не успевает лечь в таблицу.
Прикрутил эвристику в виде "если успешно изменилось, а значения не равны, то давайте попробуем подождать 10 секунд и опять считать значения". Но какое-то кривое решение, на мой взгляд. К тому же не дающее 100% гарантии верности значений.

Может, есть более прямые решения, которые я не вижу?

p.s. Само собой, добавление параметра WAIT = 'X' поможет, но тогда скорость уменьшится.

Автор:  troy [ Пн, мар 05 2018, 10:00 ]
Заголовок сообщения:  Re: BAPI_OBJCL_CHANGE и ожадние завершения обновления

А если попробовать ставить WAIT после последнего вызова BAPI?
Один COMMIT после вызова всех BAPI, как я понимаю, не получится сделать (записей много?), также как и брать значения из параметров с которыми запускаются BAPI в качестве выводимых в отчет значений "ПОСЛЕ" (могут отработать экзиты и процедуры в классификации?).

Автор:  Валерка [ Пн, мар 05 2018, 10:32 ]
Заголовок сообщения:  Re: BAPI_OBJCL_CHANGE и ожадние завершения обновления

troy написал(а):
А если попробовать ставить WAIT после последнего вызова BAPI?

Честно говоря не пробовал потмоу что как-то сомнительно что дополнительный вызов
Code:
      CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
        EXPORTING
          wait = 'X'.
Будет ждать все предыдыщие вызовы.
Получается что если вызвать "COMMIT WORK AND WAIT." то он будет ожидать все предыдыушие "COMMIT WORK."?

Автор:  Kuranov.Dmitry [ Пн, мар 05 2018, 10:50 ]
Заголовок сообщения:  Re: BAPI_OBJCL_CHANGE и ожадние завершения обновления

Валерка написал(а):
troy написал(а):
А если попробовать ставить WAIT после последнего вызова BAPI?

Честно говоря не пробовал потмоу что как-то сомнительно что дополнительный вызов
Code:
      CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
        EXPORTING
          wait = 'X'.
Будет ждать все предыдыщие вызовы.
Получается что если вызвать "COMMIT WORK AND WAIT." то он будет ожидать все предыдыушие "COMMIT WORK."?



вот код 'BAPI_TRANSACTION_COMMIT'

Code:
FUNCTION BAPI_TRANSACTION_COMMIT.
*"----------------------------------------------------------------------
*"*"Lokale Schnittstelle:
*"       IMPORTING
*"             VALUE(WAIT) LIKE  BAPITA-WAIT OPTIONAL
*"       EXPORTING
*"             VALUE(RETURN) LIKE  BAPIRET2 STRUCTURE  BAPIRET2
*"----------------------------------------------------------------------

IF WAIT EQ SPACE.
  COMMIT WORK.
ELSE.
  COMMIT WORK AND WAIT.
  IF SY-SUBRC NE 0.
    CALL FUNCTION 'BALW_BAPIRETURN_GET2'
         EXPORTING
              TYPE       = 'E'
              CL         = 'S&'
              NUMBER     = '150'
         IMPORTING
              RETURN     = RETURN.
  ENDIF.
ENDIF.
CALL FUNCTION 'BUFFER_REFRESH_ALL'.


т.е этот фм делает коммит и чистит буффер и все.

Автор:  Валерка [ Пн, мар 05 2018, 11:01 ]
Заголовок сообщения:  Re: BAPI_OBJCL_CHANGE и ожадние завершения обновления

Код ФМ-а я смотрел. Т.е. если сделать 10 раз "COMMIT WORK.", а потом один раз "COMMIT WORK AND WAIT.", то этот последний коммит будет ждать пока все 11 коммитов не внесут данные в таблицу?

Автор:  nicky555 [ Пн, мар 05 2018, 13:21 ]
Заголовок сообщения:  Re: BAPI_OBJCL_CHANGE и ожадние завершения обновления

Посмотрите в сторону SET UPDATE TASK LOCAL ...

Автор:  UKY [ Пн, мар 05 2018, 16:34 ]
Заголовок сообщения:  Re: BAPI_OBJCL_CHANGE и ожидание завершения обновления

Валерка написал(а):
p.s. Само собой, добавление параметра WAIT = 'X' поможет, но тогда скорость уменьшится.

Если скорость важна и признаки меняет Ваша программа, то почему тогда нельзя новые значения признаков брать сразу из параметров BAPI_OBJCL_CHANGE?

Автор:  troy [ Пн, мар 05 2018, 19:45 ]
Заголовок сообщения:  Re: BAPI_OBJCL_CHANGE и ожидание завершения обновления

UKY написал(а):
Если скорость важна и признаки меняет Ваша программа, то почему тогда нельзя новые значения признаков брать сразу из параметров BAPI_OBJCL_CHANGE?

Потому что то, что подается в BAPI, и что в итоге пишется в БД, в общем случае не одно и то же.

Автор:  Besa [ Вт, мар 13 2018, 11:33 ]
Заголовок сообщения:  Re: BAPI_OBJCL_CHANGE и ожидание завершения обновления

Валерка написал(а):
p.s. Само собой, добавление параметра WAIT = 'X' поможет, но тогда скорость уменьшится.


А ждать 10 сек или селектиться в цикле это лучше? :)
Почитайте что такое синхронное и асинхронное обновление и сразу станет понятно.
В чем проблема в wait? что у Вас там за объемы такие?
Ну и как посоветовал nicky про локальное обновление (это синхрон тоже)

По существу задачи, зачем городить это, ДО/ПОСЛЕ, если стандартные механизмы - журнал изменений (change docs), там все видно, кто изменил, когда, какое старое значение, какое новое...

Автор:  Удав [ Ср, мар 14 2018, 21:23 ]
Заголовок сообщения:  Re: BAPI_OBJCL_CHANGE и ожидание завершения обновления

Валерка написал(а):
Прикрутил эвристику в виде "если успешно изменилось, а значения не равны, то давайте попробуем подождать 10 секунд и опять считать значения". Но какое-то кривое решение, на мой взгляд. К тому же не дающее 100% гарантии верности значений.

Может, есть более прямые решения, которые я не вижу?

p.s. Само собой, добавление параметра WAIT = 'X' поможет, но тогда скорость уменьшится.

1. Модули обновления используют блокировки. Поэтому перед чтением смотрите, есть ли блокировки на классификацию
2. Скорость уменьшится, если использовать шаг 10 с.
3. Прислушайтесь к Besa по поводу журнала изменений. И кстати, старое значение вам известно, новое тоже. Если ФМ BAPI_OBJCL_CHANGE отработал успешно, зачем ждать, когда изменения отразятся в БД? :?

Автор:  Удав [ Ср, мар 14 2018, 21:26 ]
Заголовок сообщения:  Re: BAPI_OBJCL_CHANGE и ожидание завершения обновления

troy написал(а):
UKY написал(а):
Если скорость важна и признаки меняет Ваша программа, то почему тогда нельзя новые значения признаков брать сразу из параметров BAPI_OBJCL_CHANGE?

Потому что то, что подается в BAPI, и что в итоге пишется в БД, в общем случае не одно и то же.

В данном случае это как раз одно и то же. "Зависшими" обновлениями занимаются базисники :roll:

Автор:  troy [ Пн, апр 02 2018, 16:32 ]
Заголовок сообщения:  Re: BAPI_OBJCL_CHANGE и ожидание завершения обновления

Удав написал(а):
В данном случае это как раз одно и то же. "Зависшими" обновлениями занимаются базисники :roll:

Может в конкретном случае и так, мы не знаем. Но в общем случае нет.
Речь не про зависшие обновления, а про то, что внутри BAPI могут производиться "махинации" с входными данными (userexit и прочий Z). И на выходе (в БД) может быть вообще всё что угодно. Я только в этом случае вижу необходимость проверять значения ДО/ПОСЛЕ.

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/