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

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


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


ВНИМАНИЕ!

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



Начать новую тему Ответить на тему  [ Сообщений: 48 ]  На страницу 1, 2, 3, 4  След.
Автор Сообщение
 Заголовок сообщения: Вызов ф.м. starting new task из perform on commit
СообщениеДобавлено: Ср, окт 17 2007, 21:05 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Ср, ноя 23 2005, 13:37
Сообщения: 1805
Откуда: ECC 6.0
Пол: Мужской
Перед сохранением документа материала в badi регистрируем свою подпрограмму: PERFORM z_form1 ON COMMIT (без аргументов).
В этой подпрограмме стартуем параллельный процесс:
Code:
CALL FUNCTION 'Z_FUNCTION'
   STARTING NEW TASK 'ZTASK'
   PERFORMING z_form2 ON END OF TASK
ну и ждём пока он завершится (по факту от 1 до 10 секунд).

В 99% случаев всё работает, как и задумано.
Но примерно 1 раз из 100 процесс обновления не запускается: ни дампов, ни ошибок в sm13. Соответственно, никаких документов в системе не формируется. При этом ход выполнения программы не меняется (расставлено много контрольных точек) и параллельный процесс выполняется не дольше, чем обычно.

Найдены вторичные признаки этого глюка: если прочитать vbkey до и после цикла ожидания
Code:
do 100 times.
  if zg_job_finished. exit. endif.
  wait up to 1 seconds.
enddo.
окончания асинхронного вызова, то два значения не совпадают тогда и только тогда, когда происходит глюк. Ну, понятное дело, всё, что зарегистрировано in update уходит в небытие. (Вообще говоря, vbkey вещь туманная и может в определённых случаях менять свои значения, например, когда ещё не зарегистрировано ни одного update модуля.) Значения vbkey читаются с помощью ф.м. TH_GET_VBKEY.

Вопрос: не использовал ли кто-нибудь aRFC в perfrom on commit и не наблюдались ли подобные глюки?


Последний раз редактировалось sibrin Ср, окт 17 2007, 21:51, всего редактировалось 2 раз(а).

Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, окт 17 2007, 21:16 
Гуру-эксперт
Гуру-эксперт
Аватара пользователя

Зарегистрирован:
Ср, ноя 03 2004, 14:51
Сообщения: 1912
Откуда: КраснАдар
Пол: Мужской
Извиняюсь, но ответа я не знаю. Вопрос: мог ли 99 вызов модуля закончится как-то криво и не почистить за собой? (задаю потому что абсолютно не знаю как выполняется асинхронный RFC).


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

Зарегистрирован:
Ср, ноя 23 2005, 13:37
Сообщения: 1805
Откуда: ECC 6.0
Пол: Мужской
John Doe написал:
Вопрос: мог ли 99 вызов модуля закончится как-то криво и не почистить за собой? (задаю потому что абсолютно не знаю как выполняется асинхронный RFC).

Вызовы происходят от разных пользователей в разное время.
По завершению сохранения документа специально добавлен выход из программы, чтобы исключить возможность повторного вызова одним и тем же пользователем. Действительно, мало ли что может сохраниться в глобальной памяти каких-нибудь групп функций.

Количество позиций в документе тоже роли не играет. Бывает и на одной позиции, и на десятках.


Последний раз редактировалось sibrin Чт, окт 18 2007, 22:33, всего редактировалось 2 раз(а).

Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вызов ф.м. starting new task из perform on commit
СообщениеДобавлено: Ср, окт 17 2007, 21:41 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, окт 06 2005, 16:44
Сообщения: 3080
Откуда: Москва
sibrin написал:
Перед сохранением документа материала в badi регистрируем свою подпрограмму: PERFORM z_form1 ON COMMIT (без аргументов).

А почему не подходит вызов из BAdI CALL FUNCTION ... IN BACKGROUND TASK?
Это как раз решение проблемы обновления данных только после COMMIT.
Кстати, неплохо бы в application log писать контрольную информацию.

_________________
С уважением,
Удав.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вызов ф.м. starting new task из perform on commit
СообщениеДобавлено: Ср, окт 17 2007, 21:48 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Ср, ноя 23 2005, 13:37
Сообщения: 1805
Откуда: ECC 6.0
Пол: Мужской
Удав написал(а):
А почему не подходит вызов из BAdI CALL FUNCTION ... IN BACKGROUND TASK?

Потому что идёт обращение на сервер презентаций. В этом как раз вся суть.

Удав написал(а):
Кстати, неплохо бы в application log писать контрольную информацию.
Контрольных точек очень много. Логи пишутся параллельно и в БД (прямые insert'ы в z-log-таблицы, и in update task, и application log), и в файлы.

Кстати, application log — самое неудобное место для таких вещей. Потому что записей очень много и найти там что-то нереально. Всё равно туда пишется, конечно, кое-что, чтобы пользователь по окончании транзакции увидел номера созданных документов или причины ошибок. Вот z-таблица, где вся нужная информация по полочкам разложена и можно хитрые select'ы делать, чтобы проанализировать результаты, — то, что надо. Но, чтобы иметь независимую от многочисленных неявных DB commit'ов и rollback'ов информацию, полезно писать кое-что в файл.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вызов ф.м. starting new task из perform on commit
СообщениеДобавлено: Ср, окт 17 2007, 21:58 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, окт 06 2005, 16:44
Сообщения: 3080
Откуда: Москва
sibrin написал:
Потому что идёт обращение на сервер презентаций. В этом как раз вся суть.

мда..
Тогда информации маловато. Что же в этом ФМ делается такое?

ЗЫ: кстати, ...in background task запускается в диалоговом режиме.

_________________
С уважением,
Удав.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вызов ф.м. starting new task из perform on commit
СообщениеДобавлено: Ср, окт 17 2007, 22:04 
Гуру-эксперт
Гуру-эксперт
Аватара пользователя

Зарегистрирован:
Ср, ноя 03 2004, 14:51
Сообщения: 1912
Откуда: КраснАдар
Пол: Мужской
sibrin написал:
Потому что идёт обращение на сервер презентаций. В этом как раз вся суть.

А не мог ли файл на клиенте не закрыться? (Уууу бредовое предположение)...


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вызов ф.м. starting new task из perform on commit
СообщениеДобавлено: Чт, окт 18 2007, 08:27 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Ср, ноя 23 2005, 13:37
Сообщения: 1805
Откуда: ECC 6.0
Пол: Мужской
Удав написал(а):
Что же в этом ФМ делается такое?

Опять в десятку. В асинхронном ФМ создаётся OLE-объект на фронтенде, который качает информацию в БД локальной сети юзера.

Вариантов сделать по-другому много — это не вопрос. Вопрос в том, неужели тёмные дела, творящиеся в асинхронном диалоговом процессе, могут повлиять на SAP LUW в родительском процессе? Не может же WAIT сам по себе порушить SAP LUW.

Ещё немного приоткрою карты. Сначала асинхронный ФМ вызывался не on commit, а в середине SAP LUW между 7-м и 8-м update-модулем, то первые семь тоже корова языком слизывала. Специально делали в V2-модуле дамп, чтобы в sm13 увидеть следующую картину:
Code:
8  Z_COOL_DUMP                     V2  Error
9  CKML_F_POST_INDEX               V1 (no retry)   Processed
10  POST_DOCUMENT                   V1  Processed
11  G_GLDB_POSTING_A                V1  Processed
12  FAGL_SPLINFO_UPDATE             V1  Processed
13  G_PCA_0_POSTING                 V1  Processed
14  AC_DOCUMENT_MM_UPDATE           V2  Initial
15  RV_MESSAGE_UPDATE               V1  Processed
16  MCV_STATISTICS_UPD_V1_DELIVER   V1  Processed
17  MCV_STATISTICS_UPD_V2_DELIVER   V2  Initial
18  LIEFERUNG_WRITE_DOCUMENT        V2  Initial

Можно предположить, что VBKEY поменялся, а счётчик позиций VBMODCNT не сбросился. Подробные z-логи тогда ещё не велись, поэтому достоверно поведение vbkey не зафиксировано.

Удав написал(а):
ЗЫ: кстати, ...in background task запускается в диалоговом режиме.

В диалоговом процессе, но в отвязанном от GUI режиме.[/img]


Последний раз редактировалось sibrin Чт, окт 18 2007, 08:56, всего редактировалось 5 раз(а).

Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, окт 18 2007, 08:39 
Председатель
Председатель
Аватара пользователя

Зарегистрирован:
Чт, апр 13 2006, 12:32
Сообщения: 1503
Откуда: Питер
Нет ли статистики, что не срабатывает у определенного пользователя, на определенном сервере презентаций?


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, окт 18 2007, 08:49 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Ср, ноя 23 2005, 13:37
Сообщения: 1805
Откуда: ECC 6.0
Пол: Мужской
vga написал(а):
Нет ли статистики, что не срабатывает у определенного пользователя, на определенном сервере презентаций?

Пользователи в разных городах, в разных подсетях.
Никакой корреляции ни по местопложению, ни по времени суток нет.
Научных методов статистики для анализа ещё не применяли, но на первый взгляд процесс стохастический.

Но, есть ощущение, что если у пользователя ЭТО произошло, то ОНО может длиться некоторое время. Т.е. если юзер успевает быстро сбацать ещё один документ, то глюк может повториться. Впрочем, это документально не подтверждено.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, окт 18 2007, 09:04 
Председатель
Председатель
Аватара пользователя

Зарегистрирован:
Чт, апр 13 2006, 12:32
Сообщения: 1503
Откуда: Питер
Как смог понять из описания, успешность выполнения задачи зависит от настроек доступа к локальной базе данных на рабочей станции пользователя (ODBC, OleDB, ...). И поскольку сеть очень разветвленная, есть вероятность, что у какого-то пользователя неправильныяе настройки доступа к DB (или прав недостаточно). Видимо это можно отловить логированием успешности создания OLE объекта.
Так же может и саповскими правами конкретного пользователся где-то ошибки. Нет ли в в коде авторизационных объектов?


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, окт 18 2007, 09:08 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Ср, ноя 23 2005, 13:37
Сообщения: 1805
Откуда: ECC 6.0
Пол: Мужской
vga написал(а):
Как смог понять из описания, успешность выполнения задачи зависит от настроек доступа к локальной базе данных на рабочей станции пользователя (ODBC, OleDB, ...).

Если так, то было бы здорово. Тогда бы была консистентность: документа нет ни там, ни здесь.

А в реалии OLE отрабатывает без ошибок, что документально установлено кодом возврата каждого OLE-метода и фактом попадания данных в локальную БД. Повтрюсь: контрольные точки с записью в z-логи маньячно расставлены повсюду. Прямые insert'ы в z-логи попадают, т.е. DB rollback'ов нет. А большой ROLLBACK в perfrom on commit запрещён по определению.

PS. Локальная БД не на рабочей станции, а в локальной сети юзера, что в общем-то сути не меняет.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, окт 18 2007, 09:24 
Почетный гуру
Почетный гуру

Зарегистрирован:
Вт, авг 17 2004, 10:45
Сообщения: 550
Откуда: SAP_BASIS 640
Вообще есть такое ощущение, что проявление ошибки привязано к времени выполнения параллельной задачи. Также есть ощущение, что запуск UPDATE модулей с помощью COMMIT WORK и выполнение параллельной задачи тоже имеют связь. Т.е. если выполнение параллельной задачи уложилось в какой-то срок, то запуск происходит, если нет - то нет. Глубже копать сейчас времени нет, однако проблема очень интересная.


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

Зарегистрирован:
Чт, апр 13 2006, 12:32
Сообщения: 1503
Откуда: Питер
Мда, а факт выставления zg_job_finished всегда успешно фиксируется в родителе?


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, окт 18 2007, 09:31 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Ср, ноя 23 2005, 13:37
Сообщения: 1805
Откуда: ECC 6.0
Пол: Мужской
EGF написал(а):
Вообще есть такое ощущение, что проявление ошибки привязано к времени выполнения параллельной задачи.

Нет, глюк может быть при задержке в 2 сек., а нормальное обновление при задержке в 8 сек. Ну и, соответственно, наоборот.


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

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


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

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


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

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