Posted: Mon Feb 16, 2009 3:42 pm Post subject: Lock object with mode=X, _scope=3
Программа последовательно выполняет проводку СчФ, создание ДМ, авт. выравнивание ПМ/ПСч, на последнем шаге авт.выравнивание СчФ и документов платежных поручений. Для того чтобы программа смогла успешно выполнить все шаги, перед выполнением первого шага делаю блокирование основных используемых объектов блокировки. В частности, пытаюсь заблокировать объект EFLFB1A:
call function 'ENQUEUE_EFLFB1A'
exporting
MODE_LFB1 = 'X'
LIFNR = P_LIFNR
BUKRS = P_BUKRS
_SCOPE = '3'
exceptions
FOREIGN_LOCK = 1
SYSTEM_FAILURE = 2
others = 3.
Далее в программе делаю вызов собственного ФМ, в котором делается вызов программы авт. выравнивания:
call transaction 'FB1K' using BDC_TAB mode I_MODE update 'S' messages into IT_MESSTAB.
Транзакция FB1K при попытке заблокировать этот же объект выдает сообщение: «Счет <такой-то> обрабатывается пользователем <мною же>. № сообщения F5287».
Подскажите, пожалуйста, с какими параметрами нужно устанавливать блокировку, чтобы отрабатывали все последующие блокировки. Возможно, не учтены какие-нибудь особенности блокировки?
Age: 48 Joined: 25 Jan 2008 Posts: 580 Location: Москва
Posted: Mon Feb 16, 2009 7:03 pm Post subject:
Перед вызовом стандартных транзакций блокировки нужно снимать.
Ну и соответственно восстанавливать после сохранения данных
Подробно механизм блокировок рассмотрен на help.sap.com _________________ С уважением,
Удав.
Спасибо за ответ.
Еще раз перечитала механизм блокировок - похоже, промахнулась с выбранным режимом (нужен «E»).
Хотелось бы убедиться, в утверждении, что перед вызовом стандартных транзакций блокировки нужно снимать. Тем более что представленный код какое-то время работал. Сейчас пытаюсь найти хоть какое-то объяснение либо тому, почему это работало, либо тому, почему не работает сейчас.
Age: 48 Joined: 25 Jan 2008 Posts: 580 Location: Москва
Posted: Wed Feb 18, 2009 2:15 am Post subject:
Ну тут все зависит от задержек - иногда вызов стандартной транзакции, который ставит и снимает блокировки в стандартных транзакциях выполняется быстро по сравнению с шагом в режиме отладки
А посмотреть блокировки очень просто: вручную запустите FB1K, задайте кредитора.
После этого запустите в параллельном режиме транзакцию SM12 - просмотр блокировок.
Или используйте ST01 для трассировки блокировок. _________________ С уважением,
Удав.
Действительно, бывали случаи, когда попадалась на задержки в режиме отладки , но я не об этом.
Когда я писала, что код «какое-то время работал», имела в виду, что два месяца назад, программа была разработана, оттестирована полностью вся цепочка, в т.ч. и выравнивание – проблем с блокировками не возникало. А через два месяца перестают работать блокировки (или наоборот начали работать? ). Ведь так не бывает?
Спасибо за ответы.
Программу переделала, теперь перед вызовом call transaction блокировки снимаю, все работает.
Из ваших рекомендаций я поняла, что совет «Перед вызовом стандартных транзакций блокировки нужно снимать» нужно воспринять как аксиому.
Режим блокировки «E» (Exclusive (write lock): simultaneous read or write locks for this object are rejected; only the same owner (see The Owner Concept) can request the lock again. This is referred to as cumulation.( see Cumulation of Locks)) не распространяет свое действие при вызове стандартной транзакции из своей программы, даже если при этом задать _SCOPE = 3 , т.е. owner не наследуется, кумулятивный счетчик не увеличивается и, следовательно, когда стандартная транзакция устанавливает блокировку происходит Owner Collision
An owner collision exists if one of the following conditions applies to an elementary lock collision:
• At least one owner is different
• The owners are identical but at least one lock has mode X
Age: 48 Joined: 25 Jan 2008 Posts: 580 Location: Москва
Posted: Wed Feb 18, 2009 4:04 pm Post subject:
Снятие блокировки перед call transaction - не догма и не аксиома
Вы неправильно поняли перевод: "только в случае, когда блокировки вызываются от одного владельца..".
Владельцем(owner) по концепции блокировок SAP служит не программа, а LUW - логический шаг. Вызов стандартной транзакции в рамках своей программы - это уже другой LUW, поэтому и происходит ошибка. _________________ С уважением,
Удав.
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum You cannot attach files in this forum You can download files in this forum
All product names are trademarks of their respective companies. SAPNET.RU websites are in no way affiliated with SAP AG. SAP, SAP R/3, R/3 software, mySAP, ABAP, BAPI, xApps, SAP NetWeaver and any other are registered trademarks of SAP AG. Every effort is made to ensure content integrity. Use information on this site at your own risk.