Коллеги, добрый день!
Сейчас идёт работа над реализацией своей системы статусов (STS не подходит по причине того, что портал не продан заказчику).
Задача стандартна: Существует форма, которую редактирует 1 человек,затем 1 согласует и 1 утверждает. Каждый из них может вводить данные в форму только на своём уровне утверждения.
На данный момент реализация ведётся следующим образом: Текущие права пользователей и статусы записываются в отдельные Z-таблицу. Запись статуса происходит с помощью ФМ, вызываемым через функцию планирования, а проверка полномочий - через Exit-класс сделанный на кубе (Пример кода ниже). В итоге данные блокируются для пользователя на ввод, но при этом возникает проблема - блокировка среза данных для ввода остаётся!
Т.е. если пользователь, ввёл данные и отправил на согласование, а затем не вышел из формы (или просто вошёл в неё, чтобы просмотреть данные), То согласующие не может их редактировать (пишет, что провайдер заблокирован), т.к. формально нижний пользователь остаётся в форме ввода, а не в отчёте (!). Можно ли как-то обойти эту проблему (чтобы согласующий пользователь мог редактировать данные даже если пользователь более низкого уровня завершил ввод данных, но при этом просматривает их через заблокированную форму ввода) или реализовать систему статусов другим образом? Заранее спасибо, Гуру!
пример кода в классе проверки: METHOD IF_RSPLS_DS_METHODS~IS_PROTECTED.
CLEAR e_t_mesg.
FIELD-SYMBOLS: <lv_FORM> TYPE /BIC/OII_FORM, <lv_DEP> TYPE /BIC/OII_DEP, <lv_CALYEAR> TYPE /BI0/OICALYEAR.
ASSIGN COMPONENT '/BIC/I_FORM' OF STRUCTURE I_S_DATA TO <lv_FORM>. ASSIGN COMPONENT '/BIC/I_DEP' OF STRUCTURE I_S_DATA TO <lv_DEP>. ASSIGN COMPONENT 'CALYEAR' OF STRUCTURE I_S_DATA TO <lv_CALYEAR>.
DATA l_stat_form type /BIC/OII_STATUS. DATA l_cat type /BIC/OII_CATEG. Data l_line_user type ZIUSER. Data l_line_status type ZISTATUS.
* из таблицы вытаскиваем текущий статус формы. select single STATUS from ZISTATUS into l_stat_form where FORM = <lv_FORM> and DEPARTMENT = <lv_DEP> and CALYEAR = <lv_CALYEAR>.
* если в таблице ZISTATUS нет записей для этой формы, года и департамента, создаем запись с начальным статусом для текущих знач фильтра. if sy-subrc <> 0. l_line_status-FORM = <lv_FORM>. l_line_status-DEPARTMENT = <lv_DEP>. l_line_status-CALYEAR = <lv_CALYEAR>. * выставляем начальный статус. l_line_status-STATUS = '00'. modify ZISTATUS from l_line_status.
l_stat_form = '00'. endif.
* вытаскиваем категорию по статусу, из полномочий. select single CATEGORY from ZIPOWERS into l_cat where STATUS = l_stat_form. if sy-subrc = 0. select single * from ZIUSER into l_line_user where USERNAME = sy-uname and CATEGORY = l_cat. if sy-subrc <> 0. E_NOINPUT = 'X'. endif. * не найдена категория для статуса else. E_NOINPUT = 'X'. endif. endmethod.
|
|