В общем что имеется в виду. Для большинства объектов системы например единицы оборудования, заказы ТОРО существуют так называемые статусные схемы, при этом обычно всегда есть стандартная статусная схема содержащая свой набор статусов и есть пользовательская схема которая позволяет добавить свои статусы к объектам системы. Настройка статусных схем дело отдельное и не эта тема, тут про функции, которыми можно из своей программ управлять статусами объектов для объекта.
На рисунке 1 показана статусная схема для единицы оборудования, она стоит фактически из двух схем, красный квадрат - системная статусная схема, синий - пользовательская схема и зеленый квадрат - кнопка перехода к просмотру и присвоению как пользовательской схемы статусов так и установки/изменения пользовательских статусов, пример на рисунке 2.
Как видно из рисунка 2 пользовательские статусы можно устанавливать в ручном режиме, а вот системные статусы, синий квадрат, контролируются системой и изменяются только автоматически при операциях с единицей оборудования. Все как говорится очень замечательно, но хочется иногда и руками менять как свои так и системные статусы, это бывает по разным причинам и в принципе для этого существует группа функций
BSVU и
BSVA, так как прямое обновление таблиц не наш метод
.
Ниже пара примеров работы с этими функциями:
1. Прочитать статусы объекта
STATUS_READ. Все операции со статусами выполняются с помощью так называемого идентификатора объекта, обычно это поле зовут
OBJNR и оно есть в центральной таблице описания объектов. Для единиц оборудования это таблица
EQUI, пример на рисунке 3 по номеру единицы оборудования (красное выделение), выбран номер объекта для работы со статусами.
Тут интересует в основном таблица:
lt_status которая содержит список статусов объекта. Так как параметр
only_active = space, то выданы все статусы объекта, но при этом если рядом со статусом в таблице поле
INACT = 'X', то это значит что статус не активен.
DATA: l_equnr LIKE equi-equnr,
l_objnr LIKE equi-objnr,
l_obtyp LIKE jsto-obtyp,
l_stsma LIKE jsto-stsma,
l_stonr LIKE tj30-stonr,
lt_status LIKE jstat OCCURS 1 WITH HEADER LINE.
l_equnr = '34762916'.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = l_equnr
IMPORTING
output = l_equnr.
SELECT SINGLE objnr INTO l_objnr FROM equi WHERE equnr = l_equnr.
CALL FUNCTION 'STATUS_READ'
EXPORTING
* CLIENT = SY-MANDT
objnr = l_objnr
only_active = ' '
IMPORTING
obtyp = l_obtyp
stsma = l_stsma
stonr = l_stonr
TABLES
status = lt_status
EXCEPTIONS
object_not_found = 1
OTHERS = 2.
*После вызова пример таблицы статусов:
*
* STAT |INACT
* E0001 |
* E0001 |
* I0099 |
* I0184 |X
Статусы выдаются по кодам, соответствие кода статуса тексту можно посмотреть в табличке для системных статусов
TJ02T, а для пользовательских
TJ30T. Полезное раcширение функции
STATUS_READ_MULTI, фактически тоже. но для группы объектов.
2. Установить/изменить статус объекта. Например присвоить объекту статус
I0320 - Объект неактивен.
REFRESH: lt_status.
lt_status-stat = 'I0320'. "НЕАК
lt_status-inact = ' '. "Установить статус
APPEND lt_status.
CALL FUNCTION 'STATUS_CHANGE_INTERN_VB'
EXPORTING
objnr = l_objnr
TABLES
status = lt_status.
COMMIT WORK.
Не забываем делать
COMMIT WORK после вызова этого ФМ. и если нужно чтобы следующая обработка обзятельно увидела ваши изменения тогда нужно воспользоваться вызовом функции:
CALL FUNCTION 'STATUS_BUFFER_REFRESH'
EXPORTING
I_FREE = 'X'.
3. Проверка наличия определенного статуса у объекта.
CALL FUNCTION 'STATUS_CHECK'
EXPORTING
bypass_buffer = ' '
* CLIENT = SY-MANDT
objnr = l_objnr
status = 'I0320' "Статус НЕАК
EXCEPTIONS
object_not_found = 1
status_not_active = 2
OTHERS = 3.
По умолчанию данные берутся из буфера, если такой объекта буферизирован, но если
bypass_buffer = 'X', то данные читаются из базы.
4. Удаление статусных схем для объекта или объектов. Пользоваться не рекомендуется, так как после этой операции просмотр объекта для которого удалены статусные схемы невозможен, как и любая другая работа, пока не будет выполнено присвоение статусной схемы. Функции две:
CALL FUNCTION 'STATUS_DELETE'
EXPORTING
* CLIENT = SY-MANDT
objnr = l_objnr.
COMMIT WORK.
* И удаление статусных схем для нескольких объектов
DATA: lt_jsto_pre LIKE jsto_pre OCCURS 1 WITH HEADER LINE.
lt_jsto_pre-objnr = l_objnr.
APPEND lt_jsto_pre.
CALL FUNCTION 'STATUS_DELETE_MULTI'
* EXPORTING
* CLIENT = SY-MANDT
TABLES
objnr_table = lt_jsto_pre.
COMMIT WORK.
5. Полезная функция
STATUS_COPY, когда нужно установить одинаковые статусы и схему для группы объектов. Тогда можно установить требуемую комбинация для первого объекта, а для остальных вызвать копирование статусов. Единственная проблема статусные схемы должны быть присвоены, т.е. если вы у объекта уже удалили статусную схему функцийе
STATUS_DELETE, то копирования не произойдет.
l_equnr = '34762916'.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = l_equnr
IMPORTING
output = l_equnr.
SELECT SINGLE objnr INTO l_objnr FROM equi WHERE equnr = l_equnr.
l_equnr = '34762917'.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = l_equnr
IMPORTING
output = l_equnr.
SELECT SINGLE objnr INTO l_objnr_templ FROM equi WHERE equnr = l_equnr.
CALL FUNCTION 'STATUS_COPY'
EXPORTING
* CLIENT = SY-MANDT
objnr_quelle = l_objnr_templ
objnr_ziel = l_objnr
EXCEPTIONS
QUELL_OBJECT_NOT_FOUND = 1
ZIEL_OBJECT_NOT_FOUND = 2
OTHERS = 3.
COMMIT WORK.