Текущее время: Пт, авг 01 2025, 14:02

Часовой пояс: 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 часа


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

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


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

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