Sapforum.Biz

Логистика => Техническое обслуживание и ремонт оборудования (PM) => Тема начата: Uukrul от Январь 20, 2009, 02:52:12 pm

Название: Изменение серийного номера материала в IQ02
Отправлено: Uukrul от Январь 20, 2009, 02:52:12 pm
В общем виде, если не запрещено, то системе позволяет изменить серийный номер пользователю используя транзакцию IQ02. Такое изменение может привести к следующей проблеме, например, через пару месяцев кто-то находит документ прихода или какого-либо движения материала, показывает серийный номер, который есть в документе, но при этом просмотреть данный серийный номер уже не представляется возможным, так как системе сообщает что такой серийный номер не существует в системе. Ясно дело у пользователя истерика, ваша сапа фигня, вот номер есть, в от она говорит, что его нет и вообще верните мне мой номер. Само собой, никто уже не вспомнит, что менялось и на что менялось и зачем. Поэтому стоит задача найти новое значение серийного номера и как следствие найти автора такого изменения.
Стандартно если вы не отключали для объекта EQUI ведение истории изменений, то система при каждом изменении значения в полях объекта создает документ изменений, который содержит все необходимую информацию, кто менял, что менял и когда. Однако с серийным номером не все так просто.

Данные по изменениям объектов ведутся в так называемых документах изменений системы. Документы находятся в двух таблицах:
CDHDR – Заголовок документа
CDPOS – Позиции документа изменения

Что менялось и какие были значения старое и новое находятся в таблице CDPOS и тут сразу же появляется проблема, задать запрос к этой таблице по имеющейся информации, а это код материала и серийный номер не представляется возможным в принципе, так как таблица большая, да и еще является кластерной, так что построить какие-то индексы для ускорения работы выборки, например по запросу вида, где изменялось значение поля EQUI-SERNR со значения ZZZZZZ, не получится, точнее запрос то задать можно, но вот ответ вряд ли кто дождется. А вся проблема в том что объектом в системе является не серийный номер в связке с кодом материала, а единица оборудования (ЕО), причем она ведется даже если вы задали ведение серийных номеров без ЕО и соответственно запрос на получение изменений надо строить отталкиваясь от номера единицы оборудования, а не серийного номера.

И так есть таблица CDPOS, со следующими ключами:

В общем задача найти номер ЕО. Для этого надо вернуться в документ материала в котором есть старый серийный номер и по коду материала и серийному номеру нужно зайти в таблицу OBJK и в ней по значению полей:
Находим любую первую запись (там есть индексы на эти поля, так что все должно отрабатывать быстро) получаем значение из поля EQUNR, это и будет номер единицы оборудования ЕО, а значит уже известно значение для поля OBJECTID для запроса по таблице CDPOS. При указании только значения в полях
OBJECTCLAS  = EQUI
OBJECTID = Номер ЕО
Система быстро выдаст вам все операции изменения с серийными номерами, а ограничив запрос по полю SERNR получит новое значение серийного номера и кто и когда это сделал.
Как результат, пользователи спокойны, а ваши волосы чистые и ухоженные  ;)

PS: Картинок особо нет, но они вроде как и очень нужны в данной ситуации...