Текущее время: Вт, июл 22 2025, 16:21

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


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


ВНИМАНИЕ!

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



Начать новую тему Ответить на тему  [ Сообщений: 23 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: А как грамотнее всего организовать счетчик числа запусков?
СообщениеДобавлено: Ср, янв 12 2005, 14:37 
Гость
Возникла вот задача - ограничить количество одновременно запущенных (разными юзерами, или одним юзеров в нескольких параллельных режимах) "экземпляров" одной транзакции (транзакция и программа к ней - пользовательские, т.е. править могу без ограничений).

Первое что пришло в голову - завести табличку-диспетчер, куда добавлять запись при каждом запуске транзакции, и соотв. удалять при выходе из нее (например - проставлять туда SY-UNAME в качестве первичного ключа, т.е. обеспечить тем самым уникальность запускающих ее юзеров). А как организовать "учет" паралельно открытых режимов?
И самое главное - при выходе из транзакции запись нужно удалить. А если вдруг программа свалилась с дампом (т.е. не дошла до конца) ... или принудительно снята через SM50. Т.е. как грамотно обработать, чтобы не зависли лишние записи при возможных дампах и этот "счетчик" не самозаблокировался?

Может более простое решение есть?


Принять этот ответ
Вернуться к началу
  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, янв 12 2005, 16:23 
Старший специалист
Старший специалист

Зарегистрирован:
Ср, авг 18 2004, 09:17
Сообщения: 477
Откуда: Москва
Пол: Мужской
Способ 1.
Можно создать объект блокировки с одним параметром.
Сначала пытаешься заблокировать объект со значением параметра = 1.
В случае успеха проолжаешь выполнение.
В случае неудачи паытаешься блокировать со значением 2, 3 и т.д. до максимально допустимого количества. Это гарантирует от всевозможных проблем с дампами, внезапным завершением сессий и пр.

Способ 2.
Анализируешь количество запущенных сессий с этой транзакцией как это сделано в sm04.


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

Зарегистрирован:
Вт, авг 17 2004, 14:35
Сообщения: 1519
Откуда: В ВЕЧНОМ БАНЕ
Дмитрий написал:
Способ 1.
Можно создать объект блокировки с одним параметром.
Сначала пытаешься заблокировать объект со значением параметра = 1.
В случае успеха проолжаешь выполнение.

Ага только параметров сразу лучше рисовать два имя пользователя и ключик номера запуска и сразу предусмотреть секретное слово запуска программы которое плюет на эту блокировку :P


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: *
СообщениеДобавлено: Чт, янв 13 2005, 06:55 
Гость
попробовал способ номер два (тама буков меньше :-) )

вот как интересно работает SM04 - там реально кода всего одна строка:
какойто странный вызов
include: TSKHINCL,RSUSRCOM.
...
refresh USR_TABL.
CALL 'ThUsrInfo' ID 'OPCODE' field opcODE_LIST
ID 'TAB' FIELD USR_TABL-*SYS*.

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

Дык вот оно в эту таблицу вписывает днные для SM04, НО сообщается код ПОСЛЕДНЕЙ запущенной юзером транзакции :(. Т.е. если юзер в томже режиме запустил /nSM04 то она соообщит код транзакции SM04 к примеру, а если сначала новый режим создал - то нифига не сообщит. Т.е. работает такой "учет" не всегда.

А что это за вызов такой? И есть ли хелп по нему нормальный?


Принять этот ответ
Вернуться к началу
  
 
 Заголовок сообщения: Re: *
СообщениеДобавлено: Чт, янв 13 2005, 07:56 
Гость
PavelBerezin написал(а):
попробовал способ номер два (тама буков меньше :-) )

вот как интересно работает SM04 - там реально кода всего одна строка:
какойто странный вызов


Какой-то странный вызов - это вызов системной функции.


Принять этот ответ
Вернуться к началу
  
 
 Заголовок сообщения: *
СообщениеДобавлено: Чт, янв 13 2005, 08:49 
Гость
понятно что системной - вот как из нее извлечь полный список всех режимов конкретного пользователя (чтобы определить список всех запущенных им транзакций/программ)?

Потому-как с первым способом подсчета не всё гладко :(
Наращивание счетчика запусков программы я к примеру могу повесить в событие INITIALIZATION. А вот обратную операцию (которая уберет отметку) куда вешать? Какое событие гарантированно отработает, если юзер зашел на первый селекционный экран и тутже вышел из транзакции?

И еще - поясните плиз по объектам полномочий: их удалять ручками (т.е. принудительно) нужно, или они автоматом удаляются при завершении создавшей их транзакции?


Принять этот ответ
Вернуться к началу
  
 
 Заголовок сообщения: *
СообщениеДобавлено: Чт, янв 13 2005, 08:51 
Гость
обшибся - имелись в виду объекты блокировки конечно-же


Принять этот ответ
Вернуться к началу
  
 
 Заголовок сообщения: Re: *
СообщениеДобавлено: Чт, янв 13 2005, 10:31 
Председатель
Председатель
Аватара пользователя

Зарегистрирован:
Вт, авг 17 2004, 14:35
Сообщения: 1519
Откуда: В ВЕЧНОМ БАНЕ
PavelBerezin написал(а):
обшибся - имелись в виду объекты блокировки конечно-же

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


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: *
СообщениеДобавлено: Чт, янв 13 2005, 11:43 
Гость
тогда вопрос - гдебы найти примерчик кода , как создавать объекты блокировки (ну совсем не представляю даже, что это такое ... подозреваю некий аналог "семафоров" в win32)


Принять этот ответ
Вернуться к началу
  
 
 Заголовок сообщения: Re: *
СообщениеДобавлено: Чт, янв 13 2005, 12:15 
Старший специалист
Старший специалист

Зарегистрирован:
Ср, авг 18 2004, 09:17
Сообщения: 477
Откуда: Москва
Пол: Мужской
PavelBerezin написал(а):
тогда вопрос - гдебы найти примерчик кода , как создавать объекты блокировки (ну совсем не представляю даже, что это такое ... подозреваю некий аналог "семафоров" в win32)

транзакция se11


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, янв 13 2005, 12:30 
Специалист
Специалист

Зарегистрирован:
Чт, авг 19 2004, 07:31
Сообщения: 234
Откуда: Нижнекамск
можно через SE80 создать...
при генерации объекта блокировок создаётся пара функциональных модулей 'ENQUEUE_имя_ объекта_блокировки' и 'DEQUEUE_имя_ объекта_блокировки' с параметрами заданными при создании объекта + режим блокировки и еще несколько стандартных параметров...


первый блокирует, второй разблокирует, их и надо использовать в коде...при завершении транзакции или её откате блокировки поставленные этой транзакцией снимаются автоматом по моему


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

Зарегистрирован:
Вт, авг 17 2004, 14:35
Сообщения: 1519
Откуда: В ВЕЧНОМ БАНЕ
Ну где-то так, а смотреть как оно ставится или нет SM12


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: *
СообщениеДобавлено: Чт, янв 13 2005, 15:24 
Гость
спасибо всем - заработало :-)

действительно оказалось просто очень:
создал табличку с ключом MANDT+TCODE+COUNTER (числовой счетчик) и объект блокировки к нему.
При запуске программы в событии INITIALIZATION циклически пытаюсь создать объекты блокировки с нарастающим COUNTER=1,2,3 и т.п. до требуемого максимума.
Если хоть один создался - заношу в таблицу его запись (там сохраняю SY-TCODE и неключевое SY-UNAME для статистики, ну плюс дату-время ессно).
Если лимит объектов исчерпан, то опрашиваю табличку и вываливаю список UNAME в сообщение типа "Сейчас c транзакцией уже работают такието юзеры ... все в очередь" :-)

Получается очень даже компактно и удобно.


Принять этот ответ
Вернуться к началу
  
 
 Заголовок сообщения: Re: *
СообщениеДобавлено: Ср, мар 23 2005, 15:24 
Ассистент
Ассистент
Аватара пользователя

Зарегистрирован:
Ср, мар 16 2005, 09:37
Сообщения: 42
Откуда: Москва
PavelBerezin написал(а):
Дык вот оно в эту таблицу вписывает днные для SM04, НО сообщается код ПОСЛЕДНЕЙ запущенной юзером транзакции :(. Т.е. если юзер в томже режиме запустил /nSM04 то она соообщит код транзакции SM04 к примеру, а если сначала новый режим создал - то нифига не сообщит. Т.е. работает такой "учет" не всегда.

Понимаю, что задача уже решена и давно не актуальна, но вот другое решение.
Функция TH_USER_LIST выдаст список работающих в данный момент (примерно как в SM04). А функция TH_LONG_USR_INFO уже выдаст ВСЕ транзакции для конкретного пользователя (опять же, как при двойном клике на строчку в SM04).


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: *
СообщениеДобавлено: Ср, мар 23 2005, 15:46 
Гость
только одна беда - показывается "первичная" транзакция, которую юзер ручками запустил ... а если он провалился из одной транзакции в другую, то ту другую не видно, и ессно она останется неучтённой


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

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


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

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


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

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