web
You’re offline. This is a read only version of the page.
close
Skip to main content

Announcements

No record found.

News and Announcements icon
Community site session details

Community site session details

Session Id :
Small and medium business | Business Central, N...
Suggested Answer

Item Reservation

(2) ShareShare
ReportReport
Posted on by 312
Hi Team,

For reservations

  1. Current standard functionality will be set to Reserve = Optional
  2. Because on Auto, the items are getting reserved from Purchase order, but we only need to reserve them from Item Ledger Entry
  3. The process should flow in such a way that as soon as the item quantity has been entered on sales line then it should trigger a codeunit which will contain the logic of manual reservation but automated.
  4. The logic should firstly check the available quantity and only reserve the quantities which are present on item ledger entries, It should not reserve any qty from purchase order. It should only reserve from Item Ledger Entries.
  5. We do not want auto-reservation because it is reserving from purchase order which is not required. we need it to reserve from ILE.
  6. for now, the logic of reservation should not work for assembly items
Also, I have written this code to run the logic but still it's not working -
 

codeunit 50138 "SalesLineReservation"

{

    [EventSubscriber(ObjectType::Table, Database::"Sales Line", 'OnAfterValidateEvent', 'Quantity', false, false)]

    local procedure OnAfterQuantityValidate(var Rec: Record "Sales Line")

    var

        Item: Record Item;

        ReservationEntry: Record "Reservation Entry";

        TempReservEntry: Record "Reservation Entry" temporary;

        CreateReservEntry: Codeunit "Create Reserv. Entry";

        ItemLedgerEntry: Record "Item Ledger Entry";

        QtyToReserve: Decimal;

        QtyReserved: Decimal;

        TotalReservedQty: Decimal;

        ReservStatus: Enum "Reservation Status";

    begin

       

        if Rec.Type <> Rec.Type::Item then

            exit;

 

       

        if not Item.Get(Rec."No.") then

            exit;

        if Item."Assembly BOM" then

            exit;

 

       

        ClearExistingReservations(Rec);

 

       

        ItemLedgerEntry.SetRange("Item No.", Rec."No.");

        ItemLedgerEntry.SetRange("Variant Code", Rec."Variant Code");

        ItemLedgerEntry.SetRange("Location Code", Rec."Location Code");

        ItemLedgerEntry.SetFilter("Remaining Quantity", '>0');

        if ItemLedgerEntry.FindSet() then begin

            QtyToReserve := Rec.Quantity;

            repeat

                if QtyToReserve<ItemLedgerEntry."Remaining Quantity" then

                    QtyReserved :=QtyToReserve

                else

                    QtyReserved := ItemLedgerEntry."Remaining Quantity";

                if QtyReserved > 0 then begin

                    CreateTempReservationEntry(

                        TempReservEntry,

                        QtyReserved,

                        Rec,

                        ItemLedgerEntry."Entry No."

                    );

                    QtyToReserve -= QtyReserved;

                    TotalReservedQty += QtyReserved;

                end;

            until (ItemLedgerEntry.Next() = 0) or (QtyToReserve <= 0);

        end;

 

   

        if not TempReservEntry.IsEmpty() then begin

            CreateReservationEntries(TempReservEntry, Rec, CreateReservEntry, ReservStatus::Reservation);

            Message('Successfully reserved %1 units from Item Ledger Entries.', TotalReservedQty);

        end;

    end;

 

    local procedure ClearExistingReservations(SalesLine: Record "Sales Line")

    var

        ReservationEntry: Record "Reservation Entry";

    begin

        ReservationEntry.SetRange("Source Type", Database::"Sales Line");

        ReservationEntry.SetRange("Source Subtype", SalesLine."Document Type".AsInteger());

        ReservationEntry.SetRange("Source ID", SalesLine."Document No.");

        ReservationEntry.SetRange("Source Ref. No.", SalesLine."Line No.");

        ReservationEntry.DeleteAll(true);

    end;

 

    local procedure CreateTempReservationEntry(

        var TempReservEntry: Record "Reservation Entry" temporary;

        QtyToReserve: Decimal;

        SalesLine: Record "Sales Line";

        ItemLedgerEntryNo: Integer

    )

    begin

        TempReservEntry.Init();

        TempReservEntry."Entry No." := TempReservEntry."Entry No." + 1;

        TempReservEntry."Item No." := SalesLine."No.";

        TempReservEntry."Variant Code" := SalesLine."Variant Code";

        TempReservEntry."Location Code" := SalesLine."Location Code";

        TempReservEntry.Quantity := QtyToReserve;

        TempReservEntry."Reservation Status" := TempReservEntry."Reservation Status"::Reservation;

        TempReservEntry."Source Type" := Database::"Sales Line";

        TempReservEntry."Source Subtype" := SalesLine."Document Type".AsInteger();

        TempReservEntry."Source ID" := SalesLine."Document No.";

        TempReservEntry."Source Ref. No." := SalesLine."Line No.";

        TempReservEntry."Item Ledger Entry No." := ItemLedgerEntryNo;

        TempReservEntry.Insert();

    end;

 

    local procedure CreateReservationEntries(

        var TempReservEntry: Record "Reservation Entry" temporary;

        SalesLine: Record "Sales Line";

        var CreateReservEntry: Codeunit "Create Reserv. Entry";

        ReservStatus: Enum "Reservation Status"

    )

    var

        QtyPerUOM: Decimal;

    begin

        QtyPerUOM := SalesLine."Qty. per Unit of Measure";

    if QtyPerUOM = 0 then

        QtyPerUOM := 1;

        if TempReservEntry.FindSet() then

            repeat

                CreateReservEntry.SetDates(0D, TempReservEntry."Expiration Date");

                CreateReservEntry.CreateReservEntryFor(

                    Database::"Sales Line",

                    SalesLine."Document Type".AsInteger(),

                    SalesLine."Document No.",

                    '',

                    0,

                    SalesLine."Line No.",

                    QtyPerUOM,

                    TempReservEntry.Quantity,

                    TempReservEntry.Quantity * SalesLine."Qty. per Unit of Measure",

                    TempReservEntry

                );

                CreateReservEntry.CreateEntry(

                    SalesLine."No.",

                    SalesLine."Variant Code",

                    SalesLine."Location Code",

                    '',

                    0D,

                    0D,

                    0,

                    ReservStatus

                );

            until TempReservEntry.Next() = 0;

    end;

}

 
 
I have the same question (0)
  • Suggested answer
    Ramesh Kumar Profile Picture
    7,547 Super User 2026 Season 1 on at
    Replace manual Entry No. with a call to ReservationEntry.InitRecord() or ensure you use a reliable entry number sequence.
     
    CreateReservEntry.CreateReservEntryFor(
        Database::"Sales Line",
        SalesLine."Document Type".AsInteger(),
        SalesLine."Document No.",
        '',
        0,
        SalesLine."Line No.",
        QtyPerUOM,
        TempReservEntry.Quantity,
        TempReservEntry.Quantity * QtyPerUOM,
        TempReservEntry
    );
     
    Thanks
    Ramesh
     
    If this was helpful, please check the "Does this answer your question?" box and mark it as verified.
  • Suggested answer
    YUN ZHU Profile Picture
    99,049 Super User 2026 Season 1 on at
    I suggest you debug it segment by segment to see where the correct value is not passed in.
     
    Thanks.
    ZHU

Under review

Thank you for your reply! To ensure a great experience for everyone, your content is awaiting approval by our Community Managers. Please check back later.

Helpful resources

Quick Links

Introducing the 2026 Season 1 community Super Users

Congratulations to our 2026 Super Stars!

Congratulations to our 2025 Community Spotlights

Thanks to all of our 2025 Community Spotlight stars!

Leaderboard > Small and medium business | Business Central, NAV, RMS

#1
OussamaSabbouh Profile Picture

OussamaSabbouh 1,804 Super User 2026 Season 1

#2
YUN ZHU Profile Picture

YUN ZHU 1,103 Super User 2026 Season 1

#3
Kamal Khakhkhar Profile Picture

Kamal Khakhkhar 695

Last 30 days Overall leaderboard

Featured topics

Product updates

Dynamics 365 release plans