Текущее время: Чт, июл 31 2025, 17:09

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


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


ВНИМАНИЕ!

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



Начать новую тему Ответить на тему  [ Сообщений: 11 ] 
Автор Сообщение
 Заголовок сообщения: Частичный COMMIT
СообщениеДобавлено: Чт, авг 06 2009, 13:31 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Вт, апр 24 2007, 15:56
Сообщения: 1402
Всем здрасте.

Есть проблема в следующем блоке:
Code:
  ...
  UPDATE db_table1 FROM TABLE lt_table1[].
  ...
  CALL FUNCTION 'UPDATE_DB_TABLE2'.
  ...
  IF flag = 'X'.
    COMMIT WORK AND WAIT.
  ELSE.
    ROLLBACK WORK.
  ENDIF.


причем в ФМ 'UPDATE_DB_TABLE2' есть "свой" COMMIT, а переменная FLAG не всегда имеет значение 'X'.
Как бы сделать так, чтобы таблица db_table1 апдейтилась только тогда, когда нужно?..
Изменять последовательность строк нельзя :wink:


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Частичный COMMIT
СообщениеДобавлено: Чт, авг 06 2009, 13:35 
Гуру-эксперт
Гуру-эксперт
Аватара пользователя

Зарегистрирован:
Чт, ноя 11 2004, 16:25
Сообщения: 3109
Пол: Мужской
что за переменная flag? где она заполняется? что делает ФМ UPDATE_DB_TABLE2? опишите проблему в целом.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Частичный COMMIT
СообщениеДобавлено: Чт, авг 06 2009, 13:58 
Специалист
Специалист

Зарегистрирован:
Пт, сен 05 2008, 08:08
Сообщения: 134
Пол: Женский
Вместо
Code:
UPDATE db_table1 FROM TABLE lt_table1[].

можно написать
Code:
PERFORM F1 ON COMMIT

Code:
UPDATE db_table1 FROM TABLE lt_table1[].
перенести в F1,
и COMMIT WORK не нужен, достаточно его в UPDATE_DB_TABLE2.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Частичный COMMIT
СообщениеДобавлено: Чт, авг 06 2009, 14:10 
Гуру-модератор
Гуру-модератор
Аватара пользователя

Зарегистрирован:
Пн, окт 11 2004, 20:32
Сообщения: 2470
Пол: Мужской
troy написал(а):
причем в ФМ 'UPDATE_DB_TABLE2' есть "свой" COMMIT, а переменная FLAG не всегда имеет значение 'X'.
Как бы сделать так, чтобы таблица db_table1 апдейтилась только тогда, когда нужно?..

что то непонятно что вам нужно...

_________________
- Может ли настоящий мастер кунг-фу получить по морде?
- Настоящий мастер может все!


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Частичный COMMIT
СообщениеДобавлено: Чт, авг 06 2009, 14:22 
Модератор
Модератор
Аватара пользователя

Зарегистрирован:
Пт, июн 16 2006, 00:43
Сообщения: 1686
Откуда: Москва <-> Красноярск
Пол: Мужской
troy, вам не нужен блок
Цитата:
IF flag = 'X'.
COMMIT WORK AND WAIT.
ELSE.
ROLLBACK WORK.
ENDIF.

У вас изменения в БД уже закомитчены из ФМ. Нечему делать СOMMIT или ROLLBACK.
Если только ... между вызовом ФМ и блоком кода не содержит каких-либо операций по изменению содержимого БД.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Частичный COMMIT
СообщениеДобавлено: Чт, авг 06 2009, 15:02 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Вт, апр 24 2007, 15:56
Сообщения: 1402
Вы не так поняли проблему. Извиняйте, не совсем однозначно описал (но если вдаваться в конкретику, то совсем будет непонятно...) Итак.
Code:
  ...
  [апдейтим таблички БД, но COMMIT не вызываем, т.к. при определенных обстоятельствах (которые будут известны только позднее) изменения делать не нужно]
  ...
  [вызываем ФМ (не свой!), внутри которого производятся какие-то действия, завершающиеся COMMIT'ом]
  ...
  [делаем кое-какие проверки, и только(!) если все OK, делаем COMMIT]
  ...


Суть проблемы: "кое-какие проверки" не прошли, а COMMIT-то уже был вызван в ФМ!
Соответственно, были закомитчены и изменения, которые делал ФМ, и мои изменения, которые я делал до вызова ФМ. А мне нужно коммитить их только при определенных условиях.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Частичный COMMIT
СообщениеДобавлено: Чт, авг 06 2009, 15:09 
Модератор
Модератор
Аватара пользователя

Зарегистрирован:
Пт, июн 16 2006, 00:43
Сообщения: 1686
Откуда: Москва <-> Красноярск
Пол: Мужской
Я вашу задачу понял. И могу повторить: т.к. COMMIT уже был - ваши проверки флагов и остальные действия не имеют смысла.
Чтобы решить проблему, можно воспользоваться:
Code:
CALL FUNCTION func STARTING NEW TASK task
              [DESTINATION {dest|{IN GROUP {group|DEFAULT}}}]
              parameter_list
              [{PERFORMING subr}|{CALLING meth} ON END OF TASK].


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Частичный COMMIT
СообщениеДобавлено: Чт, авг 06 2009, 15:11 
Гуру-модератор
Гуру-модератор
Аватара пользователя

Зарегистрирован:
Пн, окт 11 2004, 20:32
Сообщения: 2470
Пол: Мужской
troy написал(а):
Суть проблемы: "кое-какие проверки" не прошли, а COMMIT-то уже был вызван в ФМ!
Соответственно, были закомитчены и изменения, которые делал ФМ, и мои изменения, которые я делал до вызова ФМ. А мне нужно коммитить их только при определенных условиях.

как вариант, вместо
Code:
UPDATE db_table1 FROM TABLE lt_table1[].

собирайте данные во внутреннюю табличку:
Code:
APPEND LINES OF lt_table1 INTO global_lt_table1.

и соответственно при прихождении своих проверок делаете
Code:
UPDATE db_table1 FROM TABLE global_lt_table1[].
COMMIT WORK.

_________________
- Может ли настоящий мастер кунг-фу получить по морде?
- Настоящий мастер может все!


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Частичный COMMIT
СообщениеДобавлено: Чт, авг 06 2009, 15:13 
Гуру-эксперт
Гуру-эксперт

Зарегистрирован:
Вт, сен 07 2004, 17:47
Сообщения: 2988
troy написал(а):
Вы не так поняли проблему. Извиняйте, не совсем однозначно описал (но если вдаваться в конкретику, то совсем будет непонятно...) Итак.
Code:
  ...
  [апдейтим таблички БД, но COMMIT не вызываем, т.к. при определенных обстоятельствах (которые будут известны только позднее) изменения делать не нужно]
  ...
  [вызываем ФМ (не свой!), внутри которого производятся какие-то действия, завершающиеся COMMIT'ом]
  ...
  [делаем кое-какие проверки, и только(!) если все OK, делаем COMMIT]
  ...


Суть проблемы: "кое-какие проверки" не прошли, а COMMIT-то уже был вызван в ФМ!
Соответственно, были закомитчены и изменения, которые делал ФМ, и мои изменения, которые я делал до вызова ФМ. А мне нужно коммитить их только при определенных условиях.

Похоже что Вы просто не понимаете механизм фиксации изменений в SAP. Читайте Transactions and Logical Units of Work
Если Вам необходимо что зафиксировать или откатить что то после COMMIT-а, то изменения в таблицах следует делать уже после коммита. Или вызывать ФМ (не свой!) в отдельном LUW, т.к. COMMIT таких тонкостей (ваш или не ваш ФМ) не различает.

_________________
"После" - не значит "вследствие"


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Частичный COMMIT
СообщениеДобавлено: Чт, авг 06 2009, 19:38 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Вт, апр 24 2007, 15:56
Сообщения: 1402
to sy-uname: да, половину из того, что написано в Library не понял, поэтому и прошу помощи.

to ArmAnn: так бы и сделал, но первые апдейты тоже делаютcя в ФМ с помощью PERFORM ON COMMIT. Пример приводил чисто из соображений наглядности )))))

Пономарев Артем написал:
Чтобы решить проблему, можно воспользоваться CALL FUNCTION func STARTING NEW TASK

Спасибо за подсказку. Все бы ничего, но в этом случае дальнейшее выполнение моей программы будет продолжено вне зависимости от того, завершилось ли целиком выполнение кода в ФМ, да и требование к RFC-функциям "You must specify input parameters and tables with reference fields or reference structures defined in the ABAP Dictionary" убило последнюю надежду :evil:

Мораль сей басни такова: если в функции (не RFC) делается COMMIT, то я всегда должен это учитывать при написании вышестоящего кода, т.к. ничего с этим COMMIT'ом поделать нельзя.

ЗЫ. Отвлеченно... а можно узанть, был ли совершен COMMIT? (в моем случае и ФМ не всегда коммитится)


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Частичный COMMIT
СообщениеДобавлено: Чт, авг 06 2009, 19:46 
Президент
Президент

Зарегистрирован:
Пт, апр 28 2006, 22:39
Сообщения: 2514
Откуда: North Taxolina, USA
Пол: Женский
Можно еще здесь почитать: http://sapboard.ru/forum/viewtopic.php?t=33320

_________________
"One of the symptoms of an approaching nervous breakdown is the belief that one's work is terribly important." Bertrand Russell


Принять этот ответ
Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 11 ] 

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


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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

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