SAPфорум.RU https://www.sapboard.ru/forum/ |
|
BAPI_OBJCL_CHANGE и ожидание завершения обновления https://www.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, и что в итоге пишется в БД, в общем случае не одно и то же. В данном случае это как раз одно и то же. "Зависшими" обновлениями занимаются базисники |
Автор: | troy [ Пн, апр 02 2018, 16:32 ] |
Заголовок сообщения: | Re: BAPI_OBJCL_CHANGE и ожидание завершения обновления |
Удав написал(а): В данном случае это как раз одно и то же. "Зависшими" обновлениями занимаются базисники Может в конкретном случае и так, мы не знаем. Но в общем случае нет. Речь не про зависшие обновления, а про то, что внутри BAPI могут производиться "махинации" с входными данными (userexit и прочий Z). И на выходе (в БД) может быть вообще всё что угодно. Я только в этом случае вижу необходимость проверять значения ДО/ПОСЛЕ. |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |