Пример работы с классификацией, когда нужно выполнить классификацию объекта в своей программе. Стандартно SAP когда выполняет такие операции, то вы всегда переходите на стандартные экраны классификации, где выбираете класс и затем заполняете свойства признаков. Следовательно можно организовать вызов стандартных экранов для классификации объектов из своей программы. Данная программа небольшой пример классификации ОЗМ для вида класса 001. В принципе можно использовать любые допустимые в системы виды классов. Комментарии, по использованию вызываемых функциональных модулей в данном примере, в коде программы.
Внимание: Из особенностей работы, нужно понимать, что объект классификации и создаваемый объект системы, в данном случае ОЗМ, это разные вещи. Поэтому например кода материала '000000000500003609' в системе может и не существовать,но это не помешает сделать объект классификации с таким кодом объекта.
REPORT z_test_clas_mara.
DATA: l_updateflag LIKE rmclk-updat,
l_ok_code LIKE sy-ucomm,
l_object LIKE rmclf-objek,
l_objtxt LIKE rmclf-obtxt.
* Вызвать классификацию объекта
l_object = '000000000500003609'. "Код объекта, для 001 типа класса = полный номер ОЗМ
l_objtxt = 'Термометр 200'. "Крактий текст наименования, обычно текст ОЗМ
CALL FUNCTION 'CLFM_OBJECT_CLASSIFICATION'
EXPORTING
table = 'MARA' "Объект/таблица классификации
object = l_object
objtxt = l_objtxt
classtype = '001' "Вид класса
status = '1' "1 - создание, 2 - изменение, 3 - просмотр
initflag = 'X'
ref_datuv = sy-datum
IMPORTING
updateflag = l_updateflag "Требуется обновление, были изменения в классе
ok_code = l_ok_code "Команда выбранная пользователм на экране классификация
EXCEPTIONS
classification_not_found = 1
class_not_valid = 2.
* Получить параметры класса и значения признаков, заданные на экране классификации
DATA: lt_exp_ausp_tab TYPE rmclausp OCCURS 1 WITH HEADER LINE,
lt_exp_kssk_tab TYPE rmclkssk OCCURS 1 WITH HEADER LINE.
CALL FUNCTION 'CLFM_GET_INTERNAL_TABLES'
EXPORTING
i_allausp = 'X'
i_allkssk = 'X'
TABLES
exp_ausp_tab = lt_exp_ausp_tab "Данные признаков для классов, указанные на экране
exp_kssk_tab = lt_exp_kssk_tab. "Данные классов указаннные на экране классификации
* Если пользователь выбрал сохранить или стрелка далее на экране классификации и были изменения
* тогда вызвать сохранение объекта классификации.
IF ( l_ok_code = 'SAVE' OR l_ok_code = 'WEI1' ) AND l_updateflag = 'X'.
* Сохранить изменения классификации
CALL FUNCTION 'CUOB_COMMIT_WORK'
EXPORTING
on_commit = 'X'. "X - Сохранение в общем процессе обновления иначе немедленное сохранение
COMMIT WORK AND WAIT.
ENDIF.
* После выполнения COMMIT WORK данные вунтри функций рабоыт с классами очищаются, это занчит что функция
* CLFM_GET_INTERNAL_TABLES больше не будет возвращать значений параметров класса и признаков, поэтому
* необходимо по новму считать во внутренние структуры значения классификации объекта и признаков объекта
DATA: l_object_read LIKE rmclf-objek,
lt_allocations LIKE api_kssk OCCURS 1 WITH HEADER LINE.
* Прочитать имена классов которым классифицирован объект. В общем виде это может быть
* несколько классов для типа класса, в данном случае тип класса = 001 - ОЗМ
l_object_read = '000000000500003609'. "Код объекта, для 001 типа класса = полный номер ОЗМ
CALL FUNCTION 'CLAP_DDB_GET_CLASSIFICATION'
EXPORTING
object = l_object_read
obtab = 'MARA'
date_of_change = sy-datum
classtype = '001'
sort_posnr = 'X'
TABLES
allocations = lt_allocations
EXCEPTIONS
no_allocation = 1
foreign_lock = 2
system_failure = 3
set_aennr = 4
change_nr_not_exist = 5
date_in_past = 6
error_class = 7
error_date_restriction = 8
error_status = 9
OTHERS = 10.
* Прочитать параметры классификации объекта для кажадого класса
LOOP AT lt_allocations.
CALL FUNCTION 'CLAP_DDB_SHOW_CLASSIFICATION'
EXPORTING
class = lt_allocations-class
object = l_object
classtype = lt_allocations-klart
EXCEPTIONS
allocation_not_available = 1
class_not_found = 2
OTHERS = 3.
ENDLOOP.
* Теперь функция CLFM_GET_INTERNAL_TABLES будет возвращать данные классификации, значения признаков и т.д.