Codeunit 9089 Top Vendors By Purchases Job, source in 29
Source29
src/Layers/W1/BaseApp/Purchases/Vendor/TopVendorsByPurchasesJob.Codeunit.al112 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.Purchases.Vendor;
using Microsoft.Finance.RoleCenters;
using Microsoft.Purchases.Payables;
using System.Threading;
codeunit 9089 "Top Vendors By Purchases Job"
{
TableNo = "Job Queue Entry";
InherentEntitlements = X;
InherentPermissions = X;
var
AllOtherVendorsTxt: Label 'All Other Vendors';
trigger OnRun()
begin
UpdateVendorTop10List();
end;
[EventSubscriber(ObjectType::Table, Database::"Job Queue Entry", 'OnFindingIfJobNeedsToBeRun', '', false, false)]
local procedure OnFindingIfJobNeedsToBeRun(var Sender: Record "Job Queue Entry"; var Result: Boolean)
var
TopVendorsByPurchases: Record "Top Vendors By Purchase";
LastVendLedgerEntry: Record "Vendor Ledger Entry";
begin
if Sender."Object Type to Run" <> Sender."Object Type to Run"::Codeunit then
exit;
if Sender."Object ID to Run" <> Codeunit::"Top Vendors By Purchases Job" then
exit;
if not LastVendLedgerEntry.FindLast() then
exit;
if TopVendorsByPurchases.FindFirst() then
if TopVendorsByPurchases.LastVendLedgerEntryNo = LastVendLedgerEntry."Entry No." then
exit;
Result := true;
end;
/// <summary>
/// Updates the vendors by purchases buffer with top 10 vendors.
/// </summary>
procedure UpdateVendorTop10List()
var
LastVendLedgerEntry: Record "Vendor Ledger Entry";
VendLedgerEntry: Record "Vendor Ledger Entry";
TopVendorsByPurchases: Record "Top Vendors By Purchase";
TempTopVendorsByPurchases: Record "Top Vendors By Purchase" temporary;
Vendor: Record Vendor;
PayablePerformance: Codeunit "Acc. Payable Performance";
Top10VendorPurchasesQry: Query "Top 10 Vendor Purchases";
VendorCounter: Integer;
OtherVendorsPurchasesLCY: Decimal;
DTUpdated: DateTime;
LastVendorLedgerEntryNo: Integer;
begin
if PayablePerformance.TopVendorListUpdatedRecently(LastVendorLedgerEntryNo) then
exit;
if not LastVendLedgerEntry.FindLast() then
exit;
if LastVendLedgerEntry."Entry No." = LastVendorLedgerEntryNo then
exit;
DTUpdated := CurrentDateTime;
if Top10VendorPurchasesQry.Open() then
while Top10VendorPurchasesQry.Read() do
if Vendor.Get(Top10VendorPurchasesQry.Vendor_No) then begin
VendorCounter += 1;
InsertRow(TempTopVendorsByPurchases, VendorCounter, Vendor."No.", Vendor.Name, Top10VendorPurchasesQry.Sum_Purchases_LCY, LastVendLedgerEntry."Entry No.", DTUpdated);
OtherVendorsPurchasesLCY -= Top10VendorPurchasesQry.Sum_Purchases_LCY;
end;
if Vendor.Count > 10 then begin
VendLedgerEntry.CalcSums("Purchase (LCY)");
OtherVendorsPurchasesLCY += VendLedgerEntry."Purchase (LCY)";
VendorCounter += 1;
InsertRow(TempTopVendorsByPurchases,
VendorCounter, '', AllOtherVendorsTxt, OtherVendorsPurchasesLCY, LastVendLedgerEntry."Entry No.", DTUpdated);
end;
if TempTopVendorsByPurchases.FindSet() then begin
TopVendorsByPurchases.LockTable();
TopVendorsByPurchases.DeleteAll(false);
repeat
TopVendorsByPurchases.TransferFields(TempTopVendorsByPurchases);
TopVendorsByPurchases.Insert(false);
until TempTopVendorsByPurchases.Next() = 0
end;
end;
local procedure InsertRow(var TempTopVendorsByPurchases: Record "Top Vendors By Purchase" temporary; Ranking: Integer; VendorNo: Code[20]; VendorName: Text[100]; PurchasesLCY: Decimal; LastVendLedgEntryNo: Integer; DTUpdated: DateTime)
begin
TempTopVendorsByPurchases.Ranking := Ranking;
TempTopVendorsByPurchases.VendorNo := VendorNo;
TempTopVendorsByPurchases.VendorName := VendorName;
TempTopVendorsByPurchases.PurchasesLCY := PurchasesLCY;
TempTopVendorsByPurchases.LastVendLedgerEntryNo := LastVendLedgEntryNo;
TempTopVendorsByPurchases.DateTimeUpdated := DTUpdated;
TempTopVendorsByPurchases.Insert(false);
end;
}