В SM02 в явном виде выбор пользователей не осуществляется. Поэтому мне кажется, что ZSM02 профита не даст.
Но обратите внимание на логику в ФМ SM02_GET_UNREAD_MESSAGE (и до него по стеку, если отладите). Все сводится в итоге к таблицам TEMSG (системные сообщения) и TEMSGU (последнее считанное сообщение пользователя). Дальше логика такая: при отправке нового системного сообщения предварительно чистятся все старые сообщения из TEMSG (просрочка), а также из TEMSGU удаляются все сообщения, которые пользователь уже прочитал ранее (до текущего дня sy-datum). Из TEMSG выбираются все актуальные сообщения и сравниваются с тем, что пользователь прочитал последним (TEMSGU-BID). Все непрочитанные сообщения образуют таблицу сообщений и далее пошел popup. Но фишка в том, что из TEMSG выбираются только сообщения с номером ID > LAST_USR_EMSG. К примеру, последнее прочитанное сообщение (роботом) = 102. Запущено системное сообщение 103. 103 > 102. Поэтому робот получит 103, таблица TEMSGU обновится, а робот сломается.
Можно было бы внутри SM02_GET_UNREAD_MESSAGE расширить в самом начале и дать последний номер прочитанного роботом сообщения = 999.999. Но проблема в том, что ФМ не расширяется.
И поэтому на момент создания нового системного сообщения достаточно обеспечить для робота наличие записи в TEMSGU с текущей датой и номером сообщения = 999.999. Но кто этот герой, который будет апдейтить TEMSGU перед отправкой нового системного? ПРАВИЛЬНО. Это ночной джоб в 3 ночи, который просто будет для робота инсертить в таблицу TEMSGU строки с прочитанным сообщением 999.999 на неделю вперед. Они будут постепенно устаревать и удаляться самостоятельно по мере отправки новых сообщений. Почему желательно заложить некоторый диапазон времени наперед: потому что если робот активности в день N не проявлял, то как только начнет проявлять в день N+1, его строка из TEMSGU с днем N удалится и он получит сообщение, то есть сломается. Поэтому ночная проходка в 3 часа ночи с горизонтом на день N + 1 день.
Попробуйте. Мне кажется, что это выход из ситуации с минимальными потерями. Вы остаетесь на стандартном SM02, а abap для ночного джоба составляет 4 строки.
updated. Проверил еще раз. Сообщение не придет, но в TEMSGU последнее полученное сообщение перетрется новым значением. Это означает, что следующее сообщение (отправленное в этот же день) роботу будет доставлено. Досадно. Надо думать дальше. Если обойти стандартные мозги не получится (уперся пока, не могу проверить), то ZSM02 в целом уже и не выглядит плохо. В самом начале ZSM02 создавать такую строку для робота в TEMSGU, апдейтить таблицу и потом надеяться, что в этот самый момент робот не ходил по диалогам. Потому что если он попадет на момент >= апдейта таблицы и <= обновления таблиц в ZSM02, то он затрет свое последнее сообщение и в итоге его получит. Других способов исключить робота в ZSM02 я не вижу: там нельзя управлять списком адресатов. Отправка сообщения инициализируется в любой момент, например, достаточно щелкнуть правой кнопкой мыши, запустить транзакцию etc.
_________________ Алё, это Пакистан? Нам нужен один килограмм
|