From c86a1eadf7febfc5c8f699246fc824f9bc82a22a Mon Sep 17 00:00:00 2001 From: 6Cript Date: Thu, 25 Jun 2026 08:51:14 +0200 Subject: [PATCH 1/5] FindFirst() replaced so now the app does not open the oldest PO but the last one created --- .../SubcProdOrderRtng.PageExt.al | 9 +- .../SubcPurchaseOrderCreator.Codeunit.al | 87 ++++++++++--------- 2 files changed, 48 insertions(+), 48 deletions(-) diff --git a/src/Apps/W1/Subcontracting/App/src/Manufacturing/SubcProdOrderRtng.PageExt.al b/src/Apps/W1/Subcontracting/App/src/Manufacturing/SubcProdOrderRtng.PageExt.al index f16ad942fe..b74bb028dc 100644 --- a/src/Apps/W1/Subcontracting/App/src/Manufacturing/SubcProdOrderRtng.PageExt.al +++ b/src/Apps/W1/Subcontracting/App/src/Manufacturing/SubcProdOrderRtng.PageExt.al @@ -216,14 +216,7 @@ pageextension 99001503 "Subc. Prod. Order Rtng." extends "Prod. Order Routing" PurchaseLine.SetRange("Operation No.", Rec."Operation No."); if PurchaseLine.IsEmpty() then Message(NoPurchOrderCreatedMsg, ProdOrderRoutingLine."Prod. Order No.") - end else begin - if NoOfCreatedPurchOrder = 1 then begin - SubcPurchaseOrderCreator.ClearOperationNoForCreatedPurchaseOrder(); - SubcPurchaseOrderCreator.SetOperationNoForCreatedPurchaseOrder(Rec."Operation No."); - SubcPurchaseOrderCreator.ClearRoutingReferenceNoForCreatedPurchaseOrder(); - SubcPurchaseOrderCreator.SetRoutingReferenceNoForCreatedPurchaseOrder(Rec."Routing Reference No."); - end; + end else SubcPurchaseOrderCreator.ShowCreatedPurchaseOrder(Rec."Prod. Order No.", NoOfCreatedPurchOrder); - end; end; } \ No newline at end of file diff --git a/src/Apps/W1/Subcontracting/App/src/Purchase/SubcPurchaseOrderCreator.Codeunit.al b/src/Apps/W1/Subcontracting/App/src/Purchase/SubcPurchaseOrderCreator.Codeunit.al index 485ebfa05a..3b755dd7ac 100644 --- a/src/Apps/W1/Subcontracting/App/src/Purchase/SubcPurchaseOrderCreator.Codeunit.al +++ b/src/Apps/W1/Subcontracting/App/src/Purchase/SubcPurchaseOrderCreator.Codeunit.al @@ -26,6 +26,7 @@ codeunit 99001557 "Subc. Purchase Order Creator" { var ManufacturingSetup: Record "Manufacturing Setup"; + CreatedPurchaseHeader: Record "Purchase Header"; PageManagement: Codeunit "Page Management"; UnitofMeasureManagement: Codeunit "Unit of Measure Management"; #if not CLEAN29 @@ -34,8 +35,6 @@ codeunit 99001557 "Subc. Purchase Order Creator" #pragma warning restore AL0432 #endif HasManufacturingSetup: Boolean; - OperationNo: Code[10]; - RoutingReferenceNo: Integer; PurchOrderCreatedSingularTxt: Label 'A purchase order was created.\\Do you want to view it?'; PurchOrderCreatedPluralTxt: Label '%1 purchase orders were created.\\Do you want to view them?', Comment = '%1 = number of purchase orders created'; PurchOrderAlreadyCreatedQst: Label 'Purchase orders have already been created.\\Do you want to view them?'; @@ -192,8 +191,6 @@ codeunit 99001557 "Subc. Purchase Order Creator" procedure ShowCreatedPurchaseOrder(ProdOrderNo: Code[20]; NoOfCreatedPurchOrder: Integer) var - PurchaseHeader: Record "Purchase Header"; - PurchaseLine: Record "Purchase Line"; InstructionMgt: Codeunit "Instruction Mgt."; SubcNotificationMgmt: Codeunit "Subc. Notification Mgmt."; IsHandled: Boolean; @@ -214,22 +211,9 @@ codeunit 99001557 "Subc. Purchase Order Creator" if InstructionMgt.ShowConfirm(GetPurchOrderCreatedMessage(NoOfCreatedPurchOrder), SubcNotificationMgmt.GetShowCreatedSubContPurchOrderCode()) and GuiAllowed() then begin - PurchaseLine.SetCurrentKey("Document Type", Type, "Prod. Order No."); - PurchaseLine.SetRange("Document Type", "Purchase Document Type"::Order); - PurchaseLine.SetRange(Type, "Purchase Line Type"::Item); - PurchaseLine.SetRange("Prod. Order No.", ProdOrderNo); - if NoOfCreatedPurchOrder > 1 then - PageManagement.PageRun(PurchaseLine) - else begin - PurchaseLine.SetLoadFields(SystemId); - if (NoOfCreatedPurchOrder = 1) and (OperationNo <> '') then - PurchaseLine.SetRange("Operation No.", OperationNo); - if (NoOfCreatedPurchOrder = 1) and (RoutingReferenceNo <> 0) then - PurchaseLine.SetRange("Routing Reference No.", RoutingReferenceNo); - PurchaseLine.FindFirst(); - PurchaseHeader.Get(PurchaseLine."Document Type", PurchaseLine."Document No."); - PageManagement.PageRun(PurchaseHeader); - end; + CreatedPurchaseHeader.MarkedOnly(true); + if CreatedPurchaseHeader.FindFirst() then + PageManagement.PageRun(CreatedPurchaseHeader); end; end; @@ -240,26 +224,6 @@ codeunit 99001557 "Subc. Purchase Order Creator" exit(PurchOrderCreatedSingularTxt); end; - internal procedure SetOperationNoForCreatedPurchaseOrder(OperationNoToSet: Code[10]) - begin - OperationNo := OperationNoToSet; - end; - - internal procedure ClearOperationNoForCreatedPurchaseOrder() - begin - Clear(OperationNo); - end; - - internal procedure SetRoutingReferenceNoForCreatedPurchaseOrder(RoutingReferenceNoToSet: Integer) - begin - RoutingReferenceNo := RoutingReferenceNoToSet; - end; - - internal procedure ClearRoutingReferenceNoForCreatedPurchaseOrder() - begin - Clear(RoutingReferenceNo); - end; - local procedure CheckProdOrderRtngLine(ProdOrderRoutingLine: Record "Prod. Order Routing Line"; var ProdOrderLine: Record "Prod. Order Line"): Boolean var WorkCenter: Record "Work Center"; @@ -324,6 +288,8 @@ codeunit 99001557 "Subc. Purchase Order Creator" var NoOfCreatedPurchOrder: Integer; begin + CreatedPurchaseHeader.Reset(); + CreatedPurchaseHeader.ClearMarks(); ProdOrderRoutingLine.SetRange(Type, "Capacity Type"::"Work Center"); ShowExistingPurchaseOrdersForRoutingLines(ProdOrderRoutingLine); if ProdOrderRoutingLine.FindSet() then @@ -371,6 +337,7 @@ codeunit 99001557 "Subc. Purchase Order Creator" var RequisitionLine: Record "Requisition Line"; CarryOutActionMsgReq: Report "Carry Out Action Msg. - Req."; + ExistingPurchaseOrderNos: List of [Code[20]]; begin ProdOrderLine.CalcFields("Total Exp. Oper. Output (Qty.)"); @@ -383,15 +350,55 @@ codeunit 99001557 "Subc. Purchase Order Creator" InsertReqWkshLine(ProdOrderRoutingLine, ProdOrderLine, ManufacturingSetup."Subcontracting Template Name", ManufacturingSetup."Subcontracting Batch Name", QtyToPurch); if RequisitionLine.FindFirst() then begin + CollectExistingSubcPurchaseOrderNos(ProdOrderLine, ProdOrderRoutingLine, ExistingPurchaseOrderNos); CarryOutActionMsgReq.UseRequestPage(false); CarryOutActionMsgReq.SetReqWkshLine(RequisitionLine); CarryOutActionMsgReq.SetHideDialog(true); CarryOutActionMsgReq.RunModal(); Clear(CarryOutActionMsgReq); NoOfCreatedPurchOrder += 1; + MarkNewlyCreatedSubcPurchaseOrder(ProdOrderLine, ProdOrderRoutingLine, ExistingPurchaseOrderNos); end; end; + local procedure CollectExistingSubcPurchaseOrderNos(ProdOrderLine: Record "Prod. Order Line"; ProdOrderRoutingLine: Record "Prod. Order Routing Line"; var ExistingPurchaseOrderNos: List of [Code[20]]) + var + PurchaseLine: Record "Purchase Line"; + begin + FilterSubcPurchaseLineForRoutingLine(PurchaseLine, ProdOrderLine, ProdOrderRoutingLine); + if PurchaseLine.FindSet() then + repeat + if not ExistingPurchaseOrderNos.Contains(PurchaseLine."Document No.") then + ExistingPurchaseOrderNos.Add(PurchaseLine."Document No."); + until PurchaseLine.Next() = 0; + end; + + local procedure MarkNewlyCreatedSubcPurchaseOrder(ProdOrderLine: Record "Prod. Order Line"; ProdOrderRoutingLine: Record "Prod. Order Routing Line"; ExistingPurchaseOrderNos: List of [Code[20]]) + var + PurchaseLine: Record "Purchase Line"; + begin + FilterSubcPurchaseLineForRoutingLine(PurchaseLine, ProdOrderLine, ProdOrderRoutingLine); + if PurchaseLine.FindSet() then + repeat + if not ExistingPurchaseOrderNos.Contains(PurchaseLine."Document No.") then + if CreatedPurchaseHeader.Get(CreatedPurchaseHeader."Document Type"::Order, PurchaseLine."Document No.") then + CreatedPurchaseHeader.Mark(true); + until PurchaseLine.Next() = 0; + end; + + local procedure FilterSubcPurchaseLineForRoutingLine(var PurchaseLine: Record "Purchase Line"; ProdOrderLine: Record "Prod. Order Line"; ProdOrderRoutingLine: Record "Prod. Order Routing Line") + begin + PurchaseLine.Reset(); + PurchaseLine.SetCurrentKey("Document Type", Type, "Prod. Order No."); + PurchaseLine.SetRange("Document Type", "Purchase Document Type"::Order); + PurchaseLine.SetRange(Type, "Purchase Line Type"::Item); + PurchaseLine.SetRange("Prod. Order No.", ProdOrderLine."Prod. Order No."); + PurchaseLine.SetRange("Routing No.", ProdOrderRoutingLine."Routing No."); + PurchaseLine.SetRange("Routing Reference No.", ProdOrderRoutingLine."Routing Reference No."); + PurchaseLine.SetRange("Operation No.", ProdOrderRoutingLine."Operation No."); + PurchaseLine.SetLoadFields("Document No."); + end; + local procedure FilterReqLineWithProdOrderAndRtngLine(var RequisitionLine: Record "Requisition Line"; ProdOrderLine: Record "Prod. Order Line"; ProdOrderRoutingLine: Record "Prod. Order Routing Line") begin RequisitionLine.SetRange("Prod. Order No.", ProdOrderLine."Prod. Order No."); From a5e779bbfb453461c6830b7883de4b11c86eb05a Mon Sep 17 00:00:00 2001 From: 6Cript Date: Thu, 25 Jun 2026 09:14:34 +0200 Subject: [PATCH 2/5] Now if we have > 1 orders created, opens a list. --- .../App/src/Purchase/SubcPurchaseOrderCreator.Codeunit.al | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/Apps/W1/Subcontracting/App/src/Purchase/SubcPurchaseOrderCreator.Codeunit.al b/src/Apps/W1/Subcontracting/App/src/Purchase/SubcPurchaseOrderCreator.Codeunit.al index 3b755dd7ac..12031192c0 100644 --- a/src/Apps/W1/Subcontracting/App/src/Purchase/SubcPurchaseOrderCreator.Codeunit.al +++ b/src/Apps/W1/Subcontracting/App/src/Purchase/SubcPurchaseOrderCreator.Codeunit.al @@ -212,8 +212,12 @@ codeunit 99001557 "Subc. Purchase Order Creator" GuiAllowed() then begin CreatedPurchaseHeader.MarkedOnly(true); - if CreatedPurchaseHeader.FindFirst() then - PageManagement.PageRun(CreatedPurchaseHeader); + if CreatedPurchaseHeader.Count() > 1 then + Page.Run(Page::"Purchase Order List", CreatedPurchaseHeader) + else + if CreatedPurchaseHeader.FindFirst() then + PageManagement.PageRun(CreatedPurchaseHeader); + CreatedPurchaseHeader.MarkedOnly(false); end; end; From 01f569ef23c86fd40f460e1c02a5033b9d5e8a7a Mon Sep 17 00:00:00 2001 From: 6Cript Date: Thu, 25 Jun 2026 09:23:55 +0200 Subject: [PATCH 3/5] now manages pre-existing orders --- .../SubcPurchaseOrderCreator.Codeunit.al | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/Apps/W1/Subcontracting/App/src/Purchase/SubcPurchaseOrderCreator.Codeunit.al b/src/Apps/W1/Subcontracting/App/src/Purchase/SubcPurchaseOrderCreator.Codeunit.al index 12031192c0..be8e7d237d 100644 --- a/src/Apps/W1/Subcontracting/App/src/Purchase/SubcPurchaseOrderCreator.Codeunit.al +++ b/src/Apps/W1/Subcontracting/App/src/Purchase/SubcPurchaseOrderCreator.Codeunit.al @@ -380,12 +380,27 @@ codeunit 99001557 "Subc. Purchase Order Creator" local procedure MarkNewlyCreatedSubcPurchaseOrder(ProdOrderLine: Record "Prod. Order Line"; ProdOrderRoutingLine: Record "Prod. Order Routing Line"; ExistingPurchaseOrderNos: List of [Code[20]]) var PurchaseLine: Record "Purchase Line"; + NewPurchaseOrderMarked: Boolean; begin FilterSubcPurchaseLineForRoutingLine(PurchaseLine, ProdOrderLine, ProdOrderRoutingLine); if PurchaseLine.FindSet() then repeat if not ExistingPurchaseOrderNos.Contains(PurchaseLine."Document No.") then - if CreatedPurchaseHeader.Get(CreatedPurchaseHeader."Document Type"::Order, PurchaseLine."Document No.") then + if CreatedPurchaseHeader.Get("Purchase Document Type"::Order, PurchaseLine."Document No.") then begin + CreatedPurchaseHeader.Mark(true); + NewPurchaseOrderMarked := true; + end; + until PurchaseLine.Next() = 0; + + if NewPurchaseOrderMarked then + exit; + + // Carry Out updated an existing open purchase order instead of creating a new one; + // mark it so the confirmation prompt can still open the affected order. + if PurchaseLine.FindSet() then + repeat + if PurchaseLine."Quantity Received" = 0 then + if CreatedPurchaseHeader.Get("Purchase Document Type"::Order, PurchaseLine."Document No.") then CreatedPurchaseHeader.Mark(true); until PurchaseLine.Next() = 0; end; @@ -400,7 +415,7 @@ codeunit 99001557 "Subc. Purchase Order Creator" PurchaseLine.SetRange("Routing No.", ProdOrderRoutingLine."Routing No."); PurchaseLine.SetRange("Routing Reference No.", ProdOrderRoutingLine."Routing Reference No."); PurchaseLine.SetRange("Operation No.", ProdOrderRoutingLine."Operation No."); - PurchaseLine.SetLoadFields("Document No."); + PurchaseLine.SetLoadFields("Document No.", "Quantity Received"); end; local procedure FilterReqLineWithProdOrderAndRtngLine(var RequisitionLine: Record "Requisition Line"; ProdOrderLine: Record "Prod. Order Line"; ProdOrderRoutingLine: Record "Prod. Order Routing Line") From ca99e69b1b5010d1704b0cfe3b3fa04172728fae Mon Sep 17 00:00:00 2001 From: 6Cript Date: Thu, 25 Jun 2026 11:35:56 +0200 Subject: [PATCH 4/5] new filter for routes. --- .../App/src/Purchase/SubcPurchaseOrderCreator.Codeunit.al | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Apps/W1/Subcontracting/App/src/Purchase/SubcPurchaseOrderCreator.Codeunit.al b/src/Apps/W1/Subcontracting/App/src/Purchase/SubcPurchaseOrderCreator.Codeunit.al index be8e7d237d..f1b216b1ce 100644 --- a/src/Apps/W1/Subcontracting/App/src/Purchase/SubcPurchaseOrderCreator.Codeunit.al +++ b/src/Apps/W1/Subcontracting/App/src/Purchase/SubcPurchaseOrderCreator.Codeunit.al @@ -293,6 +293,7 @@ codeunit 99001557 "Subc. Purchase Order Creator" NoOfCreatedPurchOrder: Integer; begin CreatedPurchaseHeader.Reset(); + CreatedPurchaseHeader.MarkedOnly(false); CreatedPurchaseHeader.ClearMarks(); ProdOrderRoutingLine.SetRange(Type, "Capacity Type"::"Work Center"); ShowExistingPurchaseOrdersForRoutingLines(ProdOrderRoutingLine); @@ -408,10 +409,11 @@ codeunit 99001557 "Subc. Purchase Order Creator" local procedure FilterSubcPurchaseLineForRoutingLine(var PurchaseLine: Record "Purchase Line"; ProdOrderLine: Record "Prod. Order Line"; ProdOrderRoutingLine: Record "Prod. Order Routing Line") begin PurchaseLine.Reset(); - PurchaseLine.SetCurrentKey("Document Type", Type, "Prod. Order No."); + PurchaseLine.SetCurrentKey("Prod. Order No.", "Prod. Order Line No.", "Routing No.", "Operation No."); PurchaseLine.SetRange("Document Type", "Purchase Document Type"::Order); PurchaseLine.SetRange(Type, "Purchase Line Type"::Item); PurchaseLine.SetRange("Prod. Order No.", ProdOrderLine."Prod. Order No."); + PurchaseLine.SetRange("Prod. Order Line No.", ProdOrderLine."Line No."); PurchaseLine.SetRange("Routing No.", ProdOrderRoutingLine."Routing No."); PurchaseLine.SetRange("Routing Reference No.", ProdOrderRoutingLine."Routing Reference No."); PurchaseLine.SetRange("Operation No.", ProdOrderRoutingLine."Operation No."); From 2e75fcd1db8b43108537debcaa023788b5bd6f5c Mon Sep 17 00:00:00 2001 From: 6Cript Date: Thu, 25 Jun 2026 12:00:45 +0200 Subject: [PATCH 5/5] quantity received fixed to 0 + ShowCreatedPurchaseOrder is guided only by markers --- .../SubcPurchaseOrderCreator.Codeunit.al | 28 +++++++++++-------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/src/Apps/W1/Subcontracting/App/src/Purchase/SubcPurchaseOrderCreator.Codeunit.al b/src/Apps/W1/Subcontracting/App/src/Purchase/SubcPurchaseOrderCreator.Codeunit.al index f1b216b1ce..6c804475e6 100644 --- a/src/Apps/W1/Subcontracting/App/src/Purchase/SubcPurchaseOrderCreator.Codeunit.al +++ b/src/Apps/W1/Subcontracting/App/src/Purchase/SubcPurchaseOrderCreator.Codeunit.al @@ -194,6 +194,7 @@ codeunit 99001557 "Subc. Purchase Order Creator" InstructionMgt: Codeunit "Instruction Mgt."; SubcNotificationMgmt: Codeunit "Subc. Notification Mgmt."; IsHandled: Boolean; + NoOfMarkedPurchaseOrders: Integer; begin #if not CLEAN29 #pragma warning disable AL0432 @@ -205,20 +206,24 @@ codeunit 99001557 "Subc. Purchase Order Creator" if IsHandled then exit; - if NoOfCreatedPurchOrder = 0 then + CreatedPurchaseHeader.MarkedOnly(true); + NoOfMarkedPurchaseOrders := CreatedPurchaseHeader.Count(); + if NoOfMarkedPurchaseOrders = 0 then begin + CreatedPurchaseHeader.MarkedOnly(false); exit; + end; + if InstructionMgt.IsEnabled(SubcNotificationMgmt.GetShowCreatedSubContPurchOrderCode()) then - if InstructionMgt.ShowConfirm(GetPurchOrderCreatedMessage(NoOfCreatedPurchOrder), SubcNotificationMgmt.GetShowCreatedSubContPurchOrderCode()) and + if InstructionMgt.ShowConfirm(GetPurchOrderCreatedMessage(NoOfMarkedPurchaseOrders), SubcNotificationMgmt.GetShowCreatedSubContPurchOrderCode()) and GuiAllowed() - then begin - CreatedPurchaseHeader.MarkedOnly(true); - if CreatedPurchaseHeader.Count() > 1 then + then + if NoOfMarkedPurchaseOrders > 1 then Page.Run(Page::"Purchase Order List", CreatedPurchaseHeader) else if CreatedPurchaseHeader.FindFirst() then PageManagement.PageRun(CreatedPurchaseHeader); - CreatedPurchaseHeader.MarkedOnly(false); - end; + + CreatedPurchaseHeader.MarkedOnly(false); end; local procedure GetPurchOrderCreatedMessage(NoOfCreatedPurchOrder: Integer): Text @@ -400,9 +405,8 @@ codeunit 99001557 "Subc. Purchase Order Creator" // mark it so the confirmation prompt can still open the affected order. if PurchaseLine.FindSet() then repeat - if PurchaseLine."Quantity Received" = 0 then - if CreatedPurchaseHeader.Get("Purchase Document Type"::Order, PurchaseLine."Document No.") then - CreatedPurchaseHeader.Mark(true); + if CreatedPurchaseHeader.Get("Purchase Document Type"::Order, PurchaseLine."Document No.") then + CreatedPurchaseHeader.Mark(true); until PurchaseLine.Next() = 0; end; @@ -417,7 +421,9 @@ codeunit 99001557 "Subc. Purchase Order Creator" PurchaseLine.SetRange("Routing No.", ProdOrderRoutingLine."Routing No."); PurchaseLine.SetRange("Routing Reference No.", ProdOrderRoutingLine."Routing Reference No."); PurchaseLine.SetRange("Operation No.", ProdOrderRoutingLine."Operation No."); - PurchaseLine.SetLoadFields("Document No.", "Quantity Received"); + PurchaseLine.SetRange("Planning Flexibility", "Reservation Planning Flexibility"::Unlimited); + PurchaseLine.SetRange("Quantity Received", 0); + PurchaseLine.SetLoadFields("Document No."); end; local procedure FilterReqLineWithProdOrderAndRtngLine(var RequisitionLine: Record "Requisition Line"; ProdOrderLine: Record "Prod. Order Line"; ProdOrderRoutingLine: Record "Prod. Order Routing Line")