Текущее время: Пн, июл 21 2025, 15:19

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


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

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


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

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