Report 698 Get Sales Orders
- App
- Base Application
- Namespace
- Microsoft.Sales.Document
- Versions
- 17-28
Versions171819202122232425262728
Source29
Source in 29
src/Layers/W1/BaseApp/Sales/Document/GetSalesOrders.Report.al352 lines, Copyright (c) Microsoft Corporation. MIT
// ------------------------------------------------------------------------------------------------
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License. See License.txt in the project root for license information.
// ------------------------------------------------------------------------------------------------
namespace Microsoft.Sales.Document;
using Microsoft.Foundation.UOM;
using Microsoft.Inventory;
using Microsoft.Inventory.Item.Catalog;
using Microsoft.Inventory.Requisition;
using Microsoft.Inventory.Tracking;
/// <summary>
/// Retrieves sales order lines for planning worksheets to create purchase or production orders.
/// </summary>
report 698 "Get Sales Orders"
{
Caption = 'Get Sales Orders';
ProcessingOnly = true;
dataset
{
dataitem("Sales Line"; "Sales Line")
{
DataItemTableView = where("Document Type" = const(Order), Type = const(Item), "Purch. Order Line No." = const(0), "Outstanding Quantity" = filter(<> 0));
RequestFilterFields = "Document No.", "Sell-to Customer No.", "No.";
RequestFilterHeading = 'Sales Order Line';
trigger OnAfterGetRecord()
var
IsHandled: Boolean;
begin
IsHandled := false;
OnBeforeOnAfterGetRecord("Sales Line", IsHandled);
if IsHandled then
CurrReport.Skip();
if ("Purchasing Code" = '') and (SpecOrder <> 1) then
if "Drop Shipment" then begin
LineCount := LineCount + 1;
if not HideDialog then
Window.Update(1, LineCount);
InsertReqWkshLine("Sales Line", ReqLine);
end;
if "Purchasing Code" <> '' then
if PurchasingCode.Get("Purchasing Code") then
if PurchasingCode."Drop Shipment" and (SpecOrder <> 1) then begin
LineCount := LineCount + 1;
if not HideDialog then
Window.Update(1, LineCount);
InsertReqWkshLine("Sales Line", ReqLine);
end else
if PurchasingCode."Special Order" and
("Special Order Purchase No." = '') and
(SpecOrder <> 0)
then begin
LineCount := LineCount + 1;
if not HideDialog then
Window.Update(1, LineCount);
InsertReqWkshLine("Sales Line", ReqLine);
end;
end;
trigger OnPostDataItem()
var
IsHandled: Boolean;
begin
IsHandled := false;
OnPostDataItemOnBeforeCheckLineCount(LineCount, IsHandled);
if (not HideDialog) and (not IsHandled) then
if LineCount = 0 then
Error(Text001);
end;
}
}
requestpage
{
SaveValues = true;
layout
{
area(content)
{
group(Options)
{
Caption = 'Options';
field(GetDim; GetDim)
{
ApplicationArea = Dimensions;
Caption = 'Retrieve dimensions from';
OptionCaption = 'Item,Sales Line';
ToolTip = 'Specifies the source of dimensions that will be copied in the batch job. Dimensions can be copied exactly as they were used on a sales line or can be copied from the items used on a sales line.';
}
}
}
}
actions
{
}
}
labels
{
}
trigger OnPreReport()
begin
OnBeforeOnPreReport(HideDialog, ReqLine);
ReqWkshTmpl.Get(ReqLine."Worksheet Template Name");
ReqWkshName.Get(ReqLine."Worksheet Template Name", ReqLine."Journal Batch Name");
ReqLine.SetRange("Worksheet Template Name", ReqLine."Worksheet Template Name");
ReqLine.SetRange("Journal Batch Name", ReqLine."Journal Batch Name");
ReqLine.LockTable();
if ReqLine.FindLast() then begin
ReqLine.Init();
LineNo := ReqLine."Line No.";
end;
if not HideDialog then
Window.Open(Text000);
end;
var
ReqWkshTmpl: Record "Req. Wksh. Template";
SalesHeader: Record "Sales Header";
PurchasingCode: Record Purchasing;
ItemTrackingMgt: Codeunit "Item Tracking Management";
LeadTimeMgt: Codeunit "Lead-Time Management";
UOMMgt: Codeunit "Unit of Measure Management";
Window: Dialog;
LineCount: Integer;
GetDim: Option Item,"Sales Line";
HideDialog: Boolean;
#pragma warning disable AA0074
#pragma warning disable AA0470
Text000: Label 'Processing sales lines #1######';
#pragma warning restore AA0470
Text001: Label 'There are no sales lines to retrieve.';
#pragma warning restore AA0074
protected var
ReqWkshName: Record "Requisition Wksh. Name";
ReqLine: Record "Requisition Line";
LineNo: Integer;
SpecOrder: Integer;
/// <summary>
/// Sets the requisition worksheet line and special order indicator.
/// </summary>
/// <param name="NewReqLine">The requisition line to use as template.</param>
/// <param name="SpecialOrder">The special order type indicator.</param>
procedure SetReqWkshLine(NewReqLine: Record "Requisition Line"; SpecialOrder: Integer)
begin
ReqLine := NewReqLine;
SpecOrder := SpecialOrder;
end;
/// <summary>
/// Inserts a requisition worksheet line for the specified sales line.
/// </summary>
/// <param name="SalesLine">The sales line to create a requisition from.</param>
/// <param name="ReqLine">Returns the created requisition line.</param>
procedure InsertReqWkshLine(SalesLine: Record "Sales Line"; var ReqLine: Record "Requisition Line")
var
IsHandled: Boolean;
begin
IsHandled := false;
OnInsertReqWkshLineOnBeforeCode(ReqLine, SalesLine, SpecOrder, LineNo, ReqWkshName, GetDim, IsHandled);
if IsHandled then
exit;
ReqLine.Reset();
ReqLine.SetCurrentKey(Type, "No.");
ReqLine.SetRange(Type, SalesLine.Type);
ReqLine.SetRange("No.", SalesLine."No.");
ReqLine.SetRange("Sales Order No.", SalesLine."Document No.");
ReqLine.SetRange("Sales Order Line No.", SalesLine."Line No.");
if ReqLine.FindFirst() then
exit;
LineNo := LineNo + 10000;
Clear(ReqLine);
ReqLine.Init();
ReqLine."Worksheet Template Name" := ReqWkshName."Worksheet Template Name";
ReqLine."Journal Batch Name" := ReqWkshName.Name;
ReqLine."Line No." := LineNo;
ReqLine.Validate(Type, SalesLine.Type);
OnInsertReqWkshLineOnAfterValidateType(ReqLine, SalesLine, SpecOrder);
ReqLine."Location Code" := SalesLine."Location Code";
ReqLine."Drop Shipment" := SalesLine."Drop Shipment";
ReqLine.Validate("No.", SalesLine."No.");
ReqLine."Variant Code" := SalesLine."Variant Code";
ReqLine.Validate("Location Code");
ReqLine."Bin Code" := SalesLine."Bin Code";
OnInsertReqWkshLineOnAfterSetBinCode(ReqLine, SalesLine, PurchasingCode);
// Drop Shipment means replenishment by purchase only
if (ReqLine."Replenishment System" <> ReqLine."Replenishment System"::Purchase) and
ReqLine."Drop Shipment"
then
ReqLine.Validate("Replenishment System", ReqLine."Replenishment System"::Purchase);
IsHandled := false;
OnInsertReqWkshLineOnBeforeValidateUoM(ReqLine, SalesLine, SpecOrder, IsHandled);
if not IsHandled then
ReqLine.Validate("Unit of Measure Code", SalesLine."Unit of Measure Code");
ValidateRequisitionLineQuantity(ReqLine, SalesLine);
IsHandled := false;
OnInsertReqWkshLineOnBeforeSetInsertRequisitionLineBatch(ReqLine, SalesLine, IsHandled);
if not IsHandled then begin
ReqLine."Sales Order No." := SalesLine."Document No.";
ReqLine."Sales Order Line No." := SalesLine."Line No.";
IsHandled := false;
OnInsertReqWkshLineOnBeforeSetSellToCustomerNo(ReqLine, SalesLine, SpecOrder, IsHandled);
if not IsHandled then
ReqLine."Sell-to Customer No." := SalesLine."Sell-to Customer No.";
SalesHeader.Get(1, SalesLine."Document No.");
if SpecOrder <> 1 then
ReqLine."Ship-to Code" := SalesHeader."Ship-to Code";
ReqLine."Item Category Code" := SalesLine."Item Category Code";
ReqLine.Nonstock := SalesLine.Nonstock;
ReqLine."Action Message" := "Action Message Type"::New;
ReqLine."Purchasing Code" := SalesLine."Purchasing Code";
// Backward Scheduling
ReqLine."Due Date" := SalesLine."Shipment Date";
OnInsertReqWkshLineOnBeforeCalcEndingDate(ReqLine, SalesLine);
ReqLine."Ending Date" :=
LeadTimeMgt.GetPlannedEndingDate(
ReqLine."No.", ReqLine."Location Code", ReqLine."Variant Code", ReqLine."Due Date",
ReqLine."Vendor No.", ReqLine."Ref. Order Type");
ReqLine.CalcStartingDate('');
ReqLine.UpdateDescription();
ReqLine.UpdateDatetime();
OnBeforeInsertReqWkshLine(ReqLine, SalesLine, SpecOrder);
ReqLine.Insert();
ItemTrackingMgt.CopyItemTracking(SalesLine.RowID1(), ReqLine.RowID1(), true);
if GetDim = GetDim::"Sales Line" then begin
ReqLine."Shortcut Dimension 1 Code" := SalesLine."Shortcut Dimension 1 Code";
ReqLine."Shortcut Dimension 2 Code" := SalesLine."Shortcut Dimension 2 Code";
ReqLine."Dimension Set ID" := SalesLine."Dimension Set ID";
ReqLine.Modify();
end;
end;
OnAfterInsertReqWkshLine(ReqLine, SalesLine);
end;
local procedure ValidateRequisitionLineQuantity(var RequisitionLine: Record "Requisition Line"; SalesLine: Record "Sales Line")
var
IsHandled: Boolean;
begin
IsHandled := false;
OnBeforeValidateRequisitionLineQuantity(RequisitionLine, SalesLine, SpecOrder, IsHandled);
if IsHandled then
exit;
RequisitionLine.Validate(
Quantity,
Round(
SalesLine."Outstanding Quantity" * SalesLine."Qty. per Unit of Measure" / RequisitionLine."Qty. per Unit of Measure",
UOMMgt.QtyRndPrecision()));
end;
/// <summary>
/// Initializes the request specifying where to retrieve dimensions from.
/// </summary>
/// <param name="NewRetrieveDimensionsFrom">The option specifying dimension source (Item or Sales Line).</param>
procedure InitializeRequest(NewRetrieveDimensionsFrom: Option)
begin
GetDim := NewRetrieveDimensionsFrom;
end;
/// <summary>
/// Sets whether to hide dialog messages during processing.
/// </summary>
/// <param name="NewHideDialog">Whether to hide dialog messages.</param>
procedure SetHideDialog(NewHideDialog: Boolean)
begin
HideDialog := NewHideDialog;
end;
[IntegrationEvent(false, false)]
local procedure OnAfterInsertReqWkshLine(var ReqLine: Record "Requisition Line"; SalesLine: Record "Sales Line")
begin
end;
[IntegrationEvent(false, false)]
local procedure OnBeforeInsertReqWkshLine(var ReqLine: Record "Requisition Line"; SalesLine: Record "Sales Line"; SpecOrder: Integer)
begin
end;
[IntegrationEvent(false, false)]
local procedure OnBeforeOnAfterGetRecord(SalesLine: Record "Sales Line"; var IsHandled: Boolean)
begin
end;
[IntegrationEvent(false, false)]
local procedure OnBeforeOnPreReport(var HideDialog: Boolean; var RequisitionLine: Record "Requisition Line")
begin
end;
[IntegrationEvent(false, false)]
local procedure OnBeforeValidateRequisitionLineQuantity(var ReqLine: Record "Requisition Line"; SalesLine: Record "Sales Line"; SpecOrder: Integer; var IsHandled: Boolean)
begin
end;
[IntegrationEvent(false, false)]
local procedure OnInsertReqWkshLineOnBeforeValidateUoM(var ReqLine: Record "Requisition Line"; SalesLine: Record "Sales Line"; SpecOrder: Integer; var IsHandled: Boolean)
begin
end;
[IntegrationEvent(false, false)]
local procedure OnInsertReqWkshLineOnBeforeSetSellToCustomerNo(var ReqLine: Record "Requisition Line"; SalesLine: Record "Sales Line"; SpecOrder: Integer; var IsHandled: Boolean)
begin
end;
[IntegrationEvent(true, false)]
local procedure OnInsertReqWkshLineOnBeforeCode(var ReqLine: Record "Requisition Line"; SalesLine: Record "Sales Line"; SpecOrder: Integer; var LineNo: Integer; ReqWkshName: Record "Requisition Wksh. Name"; GetDim: Option Item,"Sales Line"; var IsHandled: Boolean)
begin
end;
[IntegrationEvent(false, false)]
local procedure OnPostDataItemOnBeforeCheckLineCount(LineCount: Integer; var IsHandled: Boolean)
begin
end;
[IntegrationEvent(false, false)]
local procedure OnInsertReqWkshLineOnAfterValidateType(var RequisitionLine: Record "Requisition Line"; SalesLine: Record "Sales Line"; SpecOrder: Integer)
begin
end;
[IntegrationEvent(false, false)]
local procedure OnInsertReqWkshLineOnAfterSetBinCode(var RequisitionLine: Record "Requisition Line"; SalesLine: Record "Sales Line"; var PurchasingCode: Record Purchasing)
begin
end;
[IntegrationEvent(false, false)]
local procedure OnInsertReqWkshLineOnBeforeCalcEndingDate(var RequisitionLine: Record "Requisition Line"; SalesLine: Record "Sales Line")
begin
end;
[IntegrationEvent(true, false)]
local procedure OnInsertReqWkshLineOnBeforeSetInsertRequisitionLineBatch(var RequisitionLine: Record "Requisition Line"; SalesLine: Record "Sales Line"; var IsHandled: Boolean)
begin
end;
}