Текущее время: Вс, авг 03 2025, 23:24

Часовой пояс: UTC + 3 часа


Правила форума


ВНИМАНИЕ!

Вопросы по SAP Query и Quick View - сюда



Начать новую тему Ответить на тему  [ Сообщений: 21 ]  На страницу Пред.  1, 2
Автор Сообщение
 Заголовок сообщения:
СообщениеДобавлено: Вт, сен 23 2008, 09:53 
Специалист
Специалист

Зарегистрирован:
Пт, мар 25 2005, 13:58
Сообщения: 216
Попробовал: если "плодить" объёкты интерф. IF_OS_TRANSACTION и внутри вызывать

Т->Start( ).
Т1->Start( ).
* Здесь сделать откат
T1->END( ).
T->END( ).

то действительно, сделается UNDO последней версии.
Сейчас буду разбираться как зрегистрировать этот "Persistent Objects"


Code:
REPORT DEMO_TRANSACTION_SERVICE.

CLASS CL_OS_SYSTEM DEFINITION LOAD.

DATA TM TYPE REF TO IF_OS_TRANSACTION_MANAGER.
DATA: T  TYPE REF TO IF_OS_TRANSACTION,
     T1 TYPE REF TO IF_OS_TRANSACTION.

DATA WA_SPFLI TYPE SPFLI.

DATA: CONNECTION TYPE REF TO CL_SPFLI_PERSISTENT,
      AGENT      TYPE REF TO CA_SPFLI_PERSISTENT.

DATA: EXC TYPE REF TO CX_ROOT,
      TEXT TYPE STRING.

LOAD-OF-PROGRAM.

CL_OS_SYSTEM=>INIT_AND_SET_MODES( I_EXTERNAL_COMMIT = OSCON_FALSE
I_UPDATE_MODE = OSCON_DMODE_DEFAULT ).

start-OF-selection.

TM = CL_OS_SYSTEM=>GET_TRANSACTION_MANAGER( ).
T  = TM->CREATE_TRANSACTION( ).
T1 = TM->CREATE_TRANSACTION( ).


WA_SPFLI-CARRID     = 'LH'.
WA_SPFLI-CONNID     = '0401'.

AGENT = CA_SPFLI_PERSISTENT=>AGENT.

TRY.

  T->START( ).

  CONNECTION = AGENT->GET_PERSISTENT( I_CARRID = WA_SPFLI-CARRID
  I_CONNID = WA_SPFLI-CONNID ).
  WA_SPFLI-DEPTIME = CONNECTION->GET_DEPTIME( ).
  WA_SPFLI-ARRTIME = CONNECTION->GET_ARRTIME( ).
  WA_SPFLI-DEPTIME = WA_SPFLI-DEPTIME + 3600.
  WA_SPFLI-ARRTIME = WA_SPFLI-ARRTIME + 3600.

  CONNECTION->SET_DEPTIME( WA_SPFLI-DEPTIME ).
  CONNECTION->SET_ARRTIME( WA_SPFLI-ARRTIME ).

WA_SPFLI-CARRID     = 'LH'.
WA_SPFLI-CONNID     = '0400'.

  T1->START( ).
    CONNECTION = AGENT->GET_PERSISTENT( I_CARRID = WA_SPFLI-CARRID
      I_CONNID = WA_SPFLI-CONNID ).

    WA_SPFLI-DEPTIME = CONNECTION->GET_DEPTIME( ).
    WA_SPFLI-ARRTIME = CONNECTION->GET_ARRTIME( ).
    WA_SPFLI-DEPTIME = WA_SPFLI-DEPTIME + 3600.
    WA_SPFLI-ARRTIME = WA_SPFLI-ARRTIME + 3600.

    CONNECTION->SET_DEPTIME( WA_SPFLI-DEPTIME ).
    CONNECTION->SET_ARRTIME( WA_SPFLI-ARRTIME ).
    T1 = T1->UNDO_AND_CHAIN( ).
  T1->END( ).

  T->END( ).

CATCH CX_ROOT INTO EXC.

  TEXT = EXC->GET_TEXT( ).
  MESSAGE TEXT TYPE 'I'.

ENDTRY.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт, сен 23 2008, 10:23 
Председатель
Председатель
Аватара пользователя

Зарегистрирован:
Чт, сен 23 2004, 18:43
Сообщения: 1556
Откуда: Москва
Salas написал(а):
Сейчас буду разбираться как зрегистрировать этот "Persistent Objects"


SE24->Создать->Постоянный класс.
Только, IMHO, PERSISTENT OBJECT's - это для трудоголиков.

_________________
Hе иди по течению, не иди против течения - иди поперек него, если хочешь достичь берега.
Слова Ванталы. Дела Ванталы


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт, сен 23 2008, 14:52 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Ср, ноя 23 2005, 13:37
Сообщения: 1805
Откуда: ECC 6.0
Пол: Мужской
111 написал(а):
Только, IMHO, PERSISTENT OBJECT's - это для трудоголиков.

Согласен. А ещё для больших проектов и сложных задач, когда много функциональных слоёв. Эти start и end вкладываются друг в друга как скобки в математическом выражении и позволяют создавать сложные транзакции. При этом верхний слой не заканчивается COMMIT'ом, поэтому можно без проблем добавить ещё один и т.д.

2 Salas: вот только есть подозрение, что все эти вкусности работают при условии, что в Persistent Object делаются безошибочные updat'ы таблиц. Прикладные проверки туда не вставишь и ошибки не обработаешь, а значит BAPI не вызовешь.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт, сен 23 2008, 15:20 
Специалист
Специалист

Зарегистрирован:
Пт, мар 25 2005, 13:58
Сообщения: 216
Как раз сейчас пытаюсь переопределить GET_PERSISTENT.
Возможно не получится, но не хочу уж начатое бросать :wink:
Потом детям смогу сказать, что хотя б потытался :lol:

Спасибо за помощь!


Последний раз редактировалось Salas Вт, сен 23 2008, 15:38, всего редактировалось 1 раз.

Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт, сен 23 2008, 15:31 
Председатель
Председатель
Аватара пользователя

Зарегистрирован:
Чт, сен 23 2004, 18:43
Сообщения: 1556
Откуда: Москва
sibrin написал:
111 написал(а):
Только, IMHO, PERSISTENT OBJECT's - это для трудоголиков.

Согласен. А ещё для больших проектов и сложных задач, когда много функциональных слоёв. Эти start и end вкладываются друг в друга как скобки в математическом выражении и позволяют создавать сложные транзакции. При этом верхний слой не заканчивается COMMIT'ом, поэтому можно без проблем добавить ещё один и т.д.


Идея неплохая, но реализация...
Впрочем, как и везде в SAP'е - идеи гениальные, а реализация хромает.
Хотя возможно, просто сыровато еще - доработают.

ЗЫ. Как раз на текущем проекте намучался с этими персистентами, реализованными другими разработчиками.
Не дай Бог, нужно изменить тип какого-нибудь поля... Гемора на полдня. Штатно методы не перегенеряются корректно. Нужно все грохать, вместе с "друзьями", и создавать заново.

_________________
Hе иди по течению, не иди против течения - иди поперек него, если хочешь достичь берега.
Слова Ванталы. Дела Ванталы


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт, сен 23 2008, 15:34 
Модератор
Модератор
Аватара пользователя

Зарегистрирован:
Пт, июн 16 2006, 00:43
Сообщения: 1686
Откуда: Москва <-> Красноярск
Пол: Мужской
Что-то мне не нравятся такие механизмы... Атомарность транзакции еще никто не отменял. А здесь теряется смысл "от одного соглассованого состояния в другое". Получаются промежуточные.

Если говорить формально (т.е. использовать ACID), то:
Если есть одна внешняя транзакция, внутри которой запускается еще одна внутренняя, то ACID durability требует, чтобы изменения, комитнутые внутренним commit'ом, были навсегда. Но тогда неясно, что должен делать случившийся позже внешний rollback: он ни оставить внутренние изменения не может (иначе это не rollback), ни откатить (иначе нарушается внутреннее durability).

Вообщем решая подобную задачу я бы послал лесом все эти PERSISTENT OBJECT's и сделал обертки, использующие глобальную память для накапливания всех изменений. И один общий POST в итоге.
Как пример в SAP стандарте: смотрите пакет HANDLING_UNITS.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 21 ]  На страницу Пред.  1, 2

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot]


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB