Sapforum.Biz

Инструменты => ABAP - Инструментальные средства => SE37 - Построитель функций => Тема начата: Uukrul от Сентябрь 04, 2007, 01:10:54 pm

Название: ФМ работы со статусами объектов (статусные схемы)
Отправлено: Uukrul от Сентябрь 04, 2007, 01:10:54 pm
В общем что имеется в виду. Для большинства объектов системы например единицы оборудования, заказы ТОРО существуют так называемые статусные схемы, при этом обычно всегда есть стандартная статусная схема содержащая свой набор статусов и есть пользовательская схема которая позволяет добавить свои статусы к объектам системы. Настройка статусных схем дело отдельное и не эта тема, тут про функции, которыми можно из своей программ управлять статусами объектов для объекта.

На рисунке 1 показана статусная схема для единицы оборудования, она стоит фактически из двух схем, красный квадрат - системная статусная схема, синий - пользовательская схема и зеленый квадрат - кнопка перехода к просмотру и присвоению как пользовательской схемы статусов так и установки/изменения пользовательских статусов, пример на рисунке 2.

Как видно из рисунка 2 пользовательские статусы можно устанавливать в ручном режиме, а вот системные статусы, синий квадрат, контролируются системой и изменяются только автоматически при операциях с единицей оборудования. Все как говорится очень замечательно, но хочется иногда и руками менять как свои так и системные статусы, это бывает по разным причинам и в принципе для этого существует группа функций BSVU и BSVA, так как прямое обновление таблиц не наш метод  ;D.

Ниже пара примеров работы с этими функциями:

1. Прочитать статусы объекта STATUS_READ. Все операции со статусами выполняются с помощью так называемого идентификатора объекта, обычно это поле зовут OBJNR и оно есть в центральной таблице описания объектов. Для единиц оборудования это таблица EQUI, пример на рисунке 3 по номеру единицы оборудования (красное выделение), выбран номер объекта для работы со статусами.

Тут интересует в основном таблица: lt_status которая содержит список статусов объекта. Так как параметр only_active = space, то выданы все статусы объекта, но при этом если рядом со статусом в таблице поле INACT = 'X', то это значит что статус не активен.

Код: You are not allowed to view links. Register or Login
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 - Объект неактивен.

Код: You are not allowed to view links. Register or Login
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 после вызова этого ФМ. и если нужно чтобы следующая обработка обзятельно увидела ваши изменения тогда нужно воспользоваться вызовом функции:

Код: You are not allowed to view links. Register or Login
CALL FUNCTION 'STATUS_BUFFER_REFRESH'
 EXPORTING
   I_FREE        = 'X'.


3. Проверка наличия определенного статуса у объекта.

Код: You are not allowed to view links. Register or Login
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. Удаление статусных схем для объекта или объектов. Пользоваться не рекомендуется, так как после этой операции просмотр объекта для которого удалены статусные схемы невозможен, как и любая другая работа, пока не будет выполнено присвоение статусной схемы. Функции две:

Код: You are not allowed to view links. Register or Login
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, то копирования не произойдет.

Код: You are not allowed to view links. Register or Login
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.