Принятие функциональности строки отслеживания товаров с другой таблицей

Сначала я никогда не думал, что реализация функциональности строки отслеживания товаров за пределами стандартной страницы строки отслеживания товаров будет довольно сложной и запутанной.

Идея проста: представьте себе сценарий, в котором нам нужно ввести номер одного лота. для каждой отдельной строки журнала предметов. Это означает: одна строка журнала товаров всегда будет состоять из одной строки отслеживания товаров. Это сильно отличается от того, что предлагает Dynamics NAV. Процесс выбора/ввода номера партии с использованием страницы «Строки отслеживания товаров» будет длительным, поскольку существуют сотни строк журнала товаров, каждая из которых имеет только один номер партии.

Microsoft-динамика-nav-client_2018-12-08_13-00-04.png
Представьте, когда вам нужно ввести номер лота. один за другим в каждой строке, используя стандартную страницу строки отслеживания товаров, и их сотни строк. У каждой линии разные номера лотов.. О боже…

Дизайн стола

Если для этого вам нужна другая таблица, вам может потребоваться изменить эту статью в зависимости от того, что вы хотите. Вам повезло, если вы просто изменяете стандартную строку журнала предметов.

В этой статье я буду использовать две таблицы: одну, NewSelectTable, для отслеживания выбора товара для продажи/отрицательной корректировки, а другую, NewInsertTable, для вставки отслеживания товара для покупки/положительной корректировки.

Вставка отслеживания товара для покупки/положительной корректировки

Вставить отслеживание товара довольно сложно, нам нужно только проверить, было ли вставлено отслеживание товара (номер партии/серийный номер), и, таким образом, пусть все остальное обрабатывается внутренним кодом системы.

Код как-то так:

CreateReservEntry@1000000002 : Codeunit 99000830;
ProcessSpecification@1000000003 : Record 336; CreateReservEntry.SetDates(0D, 0D);
CreateReservEntry.CreateReservEntryFor(
DATABASE::"New Insert Table", 0,
NewInsertTable."Document No.", '', 0, NewInsertTable."Line No.", NewInsertTable."Qty. Per Unit of Measure",
NewInsertTable.Quantity, NewInsertTable."Quantity (Base)", '', NewInsertTable."Lot No.");
CreateReservEntry.CreateEntry(NewInsertTable."Item No.", '', NewInsertTable."Location Code",
NewInsertTable.Description, 0D, 0D, 0, 3); // prospect

Остальное — нам нужно создать строку журнала товаров по умолчанию для публикации покупки/положительной корректировки и опубликовать эту строку с помощью codeunit Item Jnl.-Post Line (22).

Выбор отслеживания товара для продажи/отрицательной корректировки

Однако выбор отслеживания элементов является более сложным, поскольку по умолчанию любое исключение, возникающее при выборе отслеживания элементов, обрабатывается строками отслеживания элементов страницы (6510). Если нам нужно использовать отдельную таблицу для выбора, нам нужно перенести процесс проверки отслеживания элемента в наш код.

Рассмотрим этот сценарий:

  1. Товар A, лот № 123 зарегистрирован как 1000 PCS в записи книги товаров.
  2. Мы решили взять 500 PCS и поместить их в нашу новую таблицу выбора — без резервирования этой записи. Резервирование записи — лучший выбор, но это налагает еще одну ответственность: сохранение резервирования на случай удаления строки.
  3. Затем другой процесс использует эту запись для 700 PCS (либо для производства, либо для внезапной продажи), таким образом, 500 PCS недостаточно.

Это правда, такого сценария не произошло бы, если бы мы использовали стандартную функциональность Dynamics NAV Item Tracking. Здесь мы можем принять меры предосторожности только перед публикацией продажи / отрицательной корректировки, мы можем продолжить процесс, только если количество достаточно.

Во-первых, нам нужно создать запись о бронировании, прежде чем выполнять корректировку продажи/отрицательной цены:

_ReservationEntry@1011 : Record 337;
_ReservationEntryNo@1012 : Integer;
_ReservationEntryNo := 1;
_ReservationEntry.RESET;
_ReservationEntry.SETRANGE(Positive,FALSE);
IF _ReservationEntry.FINDLAST THEN
_ReservationEntryNo := _ReservationEntry."Entry No." + 1;

_ReservationEntry.INIT;
_ReservationEntry."Entry No." := _ReservationEntryNo;
_ReservationEntry."Item No." := NewSelectTable."Item No.";
_ReservationEntry."Location Code" := NewSelectTable."Location Code";
_ReservationEntry."Quantity (Base)" := -1 * NewSelectTable."Qty. to be Processed" * NewSelectTable."Qty. per Unit of Measure";
_ReservationEntry."Quantity Invoiced (Base)" := -1 * NewSelectTable."Qty. to be Processed" * NewSelectTable."Qty. per Unit of Measure";
_ReservationEntry."Reservation Status" := _ReservationEntry."Reservation Status"::Prospect;
_ReservationEntry."Creation Date" := NewSelectTable."Posting Date";
_ReservationEntry."Source Type" := DATABASE::"Item Journal Line";
_ReservationEntry."Source Subtype" := _ItemJnlLine."Entry Type"::"Negative Adjmt.";
_ReservationEntry."Source ID" := NewSelectTable."No.";
_ReservationEntry."Source Batch Name" := ''; // NEED BLANK TO DIFFERENTIATE POSTING FROM CODE
_ReservationEntry."Source Ref. No." := NewSelectTable."Line No.";
_ReservationEntry."Shipment Date" := NewSelectTable."Posting Date";
_ReservationEntry."Serial No." := NewSelectTable."Serial No.";
_ReservationEntry."Created By" := USERID;
_ReservationEntry.Positive := FALSE;
_ReservationEntry."Qty. per Unit of Measure" := NewSelectTable."Qty. per Unit of Measure";
_ReservationEntry.Quantity := -1 * NewSelectTable."Qty. to be Processed";
_ReservationEntry."Appl.-to Item Entry" := NewSelectTable."ILE Entry No.";
_ReservationEntry."Qty. to Handle (Base)" := -1 * NewSelectTable."Qty. to be Processed" * NewSelectTable."Qty. per Unit of Measure";
_ReservationEntry."Qty. to Invoice (Base)" := -1 * NewSelectTable."Qty. to be Processed" * NewSelectTable."Qty. per Unit of Measure";
_ReservationEntry."Lot No." := NewSelectTable."Lot No.";
_ReservationEntry.INSERT();

Затем нам нужно убедиться, что вставленного резервирования достаточно для проводки отрицательной корректировки.

_ProcessSpecification@1015 : Record 336; 
_ProcessSpecification.CheckItemTrackingQuantity(DATABASE::"Item Journal Line",
_ItemJnlLine."Entry Type"::"Negative Adjmt.",
NewSelectTable."No.",
NewSelectTable."Line No.",
NewSelectTable."Qty. to be Processed" * NewSelectTable."Qty. per Unit of Measure",
NewSelectTable."Qty. to be Processed" * NewSelectTable."Qty. per Unit of Measure",
TRUE, TRUE);

Остальное — нам нужно создать строку журнала товаров по умолчанию для публикации продажи/отрицательной корректировки и опубликовать эту строку с помощью codeunit Item Jnl.-Post Line (22).

Изменение постобработки журнала товаров

Следуя нашему сценарию: я использовал разные таблицы для хранения данных о номере партии либо для выбора, либо для вставки, поэтому требуется другая настройка. Вы можете пропустить это, ЕСЛИ вы используете стандартную строку журнала товаров.

Dynamics NAV всегда перенаправляет каждую отдельную транзакцию товара через строку журнала товаров. Если мы решим не использовать строку журнала товаров в качестве основы для отслеживания ввода/выбора товаров, нам потребуется еще одна дополнительная настройка.

Добавление новых функций в Управление отслеживанием товаров (6500)

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

PROCEDURE RetrieveNewInsertTableItemTracking@110(NewInsertTable@1002 : Record 50000;
VAR pTempHandlingSpecification@1007 : TEMPORARY Record 336) : Boolean;
VAR ReservEntry@1001 : Record 337;
BEGIN 
ReservEntry.SETCURRENTKEY( "Source ID","Source Ref. No.","Source Type","Source Subtype", "Source Batch Name","Source Prod. Order Line"); ReservEntry.SETRANGE("Source ID", NewInsertTable."Document No."); ReservEntry.SETRANGE("Source Ref. No.", NewInsertTable."Line No."); ReservEntry.SETRANGE("Source Type", DATABASE::"New Insert Table"); ReservEntry.SETRANGE("Source Batch Name",''); ReservEntry.SETRANGE("Source Prod. Order Line",0); ReservEntry.SETFILTER("Qty. to Handle (Base)",'<>0'); 
IF SumUpItemTracking(ReservEntry,pTempHandlingSpecification,FALSE,TRUE) THEN BEGIN 
ReservEntry.SETRANGE("Reservation Status",ReservEntry."Reservation Status"::Prospect); 
IF NOT ReservEntry.ISEMPTY THEN 
ReservEntry.DELETEALL; 
EXIT(TRUE); 
END; 
EXIT(FALSE);
END;

Изменение элемента Codeunit Jnl.-Post Line (22)

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

Здесь, чтобы упростить поиск строк журнала товаров, созданных из новых таблиц, я внес небольшие изменения в запись книги товаров и строку журнала товаров: новый параметр в поле «Тип документа» для разделения новой таблицы.

Этот код следует разместить внутри функции SetupSplitJnlLine.

_OK@1000000000 : Boolean; 
IF ItemJnlLineOrigin."Document Type" = ItemJnlLineOrigin."Document Type"::"New Document Type" THEN BEGIN 
_OK := NOT ItemJnlLine2.Correction AND (ItemJnlLine2.Quantity <> 0); 
IF _OK THEN BEGIN 
CASE ItemJnlLineOrigin."Entry Type" OF 
ItemJnlLineOrigin."Entry Type"::"Positive Adjmt." : 
_OK := ItemTrackingMgt.RetrieveNewInsertTableItemTracking(NewInsertTable, TempTrackingSpecification); 
ItemJnlLineOrigin."Entry Type"::"Negative Adjmt." : 
_OK := ItemTrackingMgt.RetrieveNewSelectTableItemTracking(NewSelectTable, TempTrackingSpecification); 
END; 
END;
END ELSE
//>> the original Dynamics NAV code goes below
_OK := NOT ItemJnlLine2.Correction AND (ItemJnlLine2."Quantity (Base)" <> 0) AND ItemTrackingMgt.RetrieveItemTracking(ItemJnlLine2,TempTrackingSpecification);

Это все. Теперь у вас должна быть работающая модификация процесса проводки № лота/серийного номера без использования страницы «Строка отслеживания товаров».

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *