Коротко про трассировку и резервирование

Резервировать товар под будущую продажу - любимое занятие менеджеров по продажам. Автоматическое снятие резервирования - любимое занятие программистов. А нейтрализация конфликтов возникших на почве резервирования - любимое занятие руководства компании.

В Navision процедура резервирования товара реализована, и ею можно пользоваться (такое сочетание является редкостью). Однако если возникнет необходимость процедуру резервирования изменить, то перед тем как лезть в код настоятельно рекомендуется разобраться, как она работает.

Первым делом нужно ознакомиться со специальной литературой:

  1. Резервирование, трассировка и интерактивные указания. Техническая Белая книга.
  2. Трассировка товаров. Белая книга.

Ознакомились? Отлично, перейдем к делу.

Как Вы уже знаете функциональные возможности, такие как «Трассировка товара по серийным номерам», «Резервирование» и «Трассировка заказов», реализованы практически на одной таблице 337 Reservation Entry.

В таблице присутствуют следующие поля:
Операция Но. (Integer) и Положительна (Boolean) - это ключевые поля.
Товар, Код Склада, Код Варианта - это измерения позволяющие указать, что именно мы резервируем и где.
Источник * - поля указывающие из какого объекта было произведено резервирование. Указывается номер таблицы (например 37 для Строки продажи), указывается Тип документа (Заказ продажи, Счет) или Статус для Производственного заказа, также указываются номер документа, наименование шаблона и раздела для журнала, номер строки.
Серийный номер и Лот номер - если требуется учитывать товар в разрезе партий и серийных номеров.
Важную роль в данной таблице играет поле Статус резервирования. Это поле типа Option, принимает одно из следующих значений:

  • Резервирование (Reservation).
  • Трассировка (Tracking).
  • Излишек (Surplus).
  • Проспект (Prospect).

Именно благодаря этому полю в одну табличку удалось поместить все функциональные возможности перечисленные в начале статьи. Начнем с конца.

Если товар требуется учитывать в разрезе партий и серийных номеров (в карточке товара заполнено поле Код трассировки на закладке Товар Трассировка), то данные об остатках и оборотах товара на складах с указанной детализацией, можно получить на основании таблицы 32 Item Ledger Entry. Для этого в указанной таблице есть соответствующие поля: Серийный номер и Лот номер.

С учтенными операциями понятно, повторно хранить эти данные в таблице 337 необходимости нет. Зато в ней хранится информация о серийных номерах указанных в окне Товар Трассировка Строки еще не учтенного документа (журнала). Вот для таких строк устанавливается значение в поле Статус резервирования = Проспект.

Значения Излишек и Трассировка используются, в паре для реализации функциональности «Трассировка заказов». Излишек указывает, что данная строка является несбалансированным спросом (предложением), а Трассировка, указывает, что данный спрос связан с конкретным предложением. Здесь стоит немного отвлечься и сообщить, что для указания связи спроса и предложения используется любопытный механизм. У сбалансированных операций один и тот же номер операции. А чтобы не было конфликта, в первичный ключ включено еще поле Положительна, типа Boolean. Для операций спроса оно принимает значение False, а для операций поставки значение True, дублируя, таким образом, информацию о знаке в поле Кол-во и Кол-во (Баз.).

Значение Резервирование соответственно указывается для операций резервирования. Номер зарезервированной операции и номер операции, для которой осуществлялось резервирование, совпадают. Грубо говоря, операция резервирования, это операция трассировки для которой запрещено изменять источник пополнения. Как известно при работе механизма планирования (report ) система оптимизирует трассировки, согласно идеологии Just in Time, при этом для операций спроса могут быть привязаны иные операции пополнения, отличные от первоначальных.

Что же происходит когда нужно указать серийный номер товара, по которому включена Трассировка заказов? Или что происходит, когда товар с включенной Трассировкой заказов требуется зарезервировать?

Чтобы понять я описал поведение системы при создании заказа покупки, на товар по которому система отслеживает трассировку заказов (в карточке товара на закладке Планирование в поле Трассировка и указание установлено значение Только Трассировка или Трассировка и Указания). Нотация моя, в комментариях указаны функции и кодеюниты, которые использует система.

//Все действия вызываются из функции VerifyQuantity из 99000834 Purch. Line-Reserve      
 
//Система создает операцию в таблице резервирования, ссылающуюся на строку заказа покупки. 
//Функция SetPurchLine из 99000845 Reservation Management      
 
Рез1.Положительна := Да;  //SignFactor из 99000830 Create Reserv. Entry 
Рез1.СтатусРезервирования :=Излишек; 
Рез1.Склад,Товар,Вариант ... := Строка заказа покупки.Склад,Товар,Вариант; 
Рез1.Источник := Строка заказа покупки; 
Рез1.СерийныйНомер = ``;      
 
//Дальнейшие операции система проводит из функции AutoTrack в 99000845 Reservation Management 
Количество := Строка заказа покупки.Количество;  
 
//Затем система проверяет, существует ли несбалансированный спрос на данный товар, 
//на том же складе (MatchSurlpus из 99000845 Reservation Management). 
//И производит связывание спроса и предложения (MakeConnection из 99000845 Reservation Management). 
Рез2.Фильтр(Положительна = Нет);      
Рез2.Фильтр(Склад,Товар,Вариант... = Рез1.Склад,Товар,Вариант); //SetPointerFilter из 99000845 Reservation Management 
Рез2.Фильтр(СтатусРезервирования = Излишек);      
 
//Если существует несбалансированный спрос, система связывает с ним поставку 
//MatchSurplus из 99000845 Reservation Management 
WHILE (Рез2.Найти)AND(Количество>0) BEGIN 
  Рез3 := Рез1; 
  Рез3.СтатусРезервирования := Трассировка; 
  Рез3.ОперацияНо=Рез2.ОперацияНо; 
  IF Рез2.Количество <= Количество THEN BEGIN 
    //если спрос меньше предложения, то предложение делится на несколько операций. 
    Рез3.Количество := Рез2.Количество; 
    Рез3.INSERT; 
    Количество := Количество - Рез2.Количество; 
    Рез2.СтатусРезервирования := Трассировка; 
    Рез2.MODIFY;      
 
  END ELSE BEGIN 
    Рез3.Количество := Количество; 
    Рез3.Вставить;      
 
    IF Рез2.Количество>Количество THEN 
      //Если спрос больше предложения, то на несколько операций делится именно спрос. 
      Рез4 := Рез2; 
      Рез4.ОперацияНо := +1; 
      Рез4.СтатусРезервирования :=Излишек; 
      Рез4.Количество := Рез2.Количество - Количество; 
      Рез4.INSERT;      
 
      Рез2.СтатусРезервирования:=Трассировка; 
      Рез2.Количество:=Количество; 
      Рез2.MODIFY; 
    END; 
    Количество = 0; 
  END; 
END;      
 
IF Количество = 0 THEN 
  Рез1.DELETE; 
ELSE BEGIN 
  //В базу данных производится вставка операции на несбалансированное предложение 
  //MakeConnection из 99000845 Reservation Management 
  //Все верно, это та функция, которой производилась привязка спроса к предложению. 
  //Она умеет вставлять и одиночные записи. 
  Рез1.ОперацияНо := +1; 
  Рез1.СтатусРезервирования :=Излишек; 
  Рез1.Количество :=Количество; 
  Рез1.INSERT; 
END; 
//Для непосредственной вставки записей в таблицу 339 из функции MakeConnection 
//происходит обращение к фукнциям кодеюнита 99000830 Create Reserv. Entry 
//Количество вставляемых записей зависит от значения параметра ReservationStatus 
//[Reservation,Tracking,Surplus].

Теперь мы хотим указать закупаемому товару серийные номера, для этого требуется открыть окно «Товар Трассировка Строки» (форма 6510 Item Tracking Lines) и указать в нем серийные номера. Так как для каждого серийного номера требуется отдельная строка, то уже созданные операции трассировки (см.выше) с количеством больше единицы будут разбиты на множество операций с количеством равным единице, при этом новым операциям будут присвоены серийные номера.
Похожая логика и при резервировании, только открывается не «Товар Трассировка Строки», а «Резервирование» (форма 498 Reservation). В этом случаем операции трассировки изменяются на операции резервирования, ведь, по сути, операция резервирование это операция трассировки для которой запрещено изменять источник пополнения. Понятно, что источник, назначенный системой автоматически для трассировки, может не совпадать с назначенным источником.

Например,
Таблица 337, до ручного резервирования.

Операция 1 Положительна = Да Трассировка 2 шт Источник = Заказ покупки 
Операция 1 Положительна = Нет Трассировка 2 шт Источник = Заказ продажи 
Операция 2 Положительна = Да Излишек 5 шт Источник = Производственный заказ

Пояснение к операциям в таблице:
Система трассировки заказов, при создании заказа продажи автоматически создала трассировку с заказом покупки. Предположим, что мы решили вручную зарезервировать товар из производственного заказа. Тогда таблица 337 примет следующий вид.

Таблица 337, после ручного резервирования.

Операция 1 Положительна = Да Излишек 2 шт. Источник = Заказ покупки 
Операция 2 Положительна = Да Резервирование 2 шт. Источник = Производственный заказ 
Операция 2 Положительна = Нет Резервирование 2 шт. Источник = Заказ продажи 
Операция 3 Положительна = Да Излишек 3 шт. Источник = Производственный заказ

Пояснение к изменениям:
Операция 1 Положительна = Нет, преобразуется в Операция 2 Положительна = Нет, а Статус резервирования = Резервирование.
В Операции 2 Положительна = Да, будет уменьшено количество, и также измениться Статус Резервирования.
Будет создана Операция 3 Положительна =Да, полностью похожая на Операцию 2 Положительна = Да в предыдущей таблице, однако количество в ней будет меньше (исходное количество - зарезервированное количество).

На этом знакомство с функционалом «Резервирования» считаю завершенным.

Метки:



Оставьте свой отзыв!