We need two events in FinitelyLoadCapBack procedure in order to be able to calculate AvailTime in a different way before it used in subsequent procedures.
At the moment there are no other alternative events inside the procedure to do it.
In procedure FinitelyLoadCapBack of codeunit 99000774 "Calculate Routing Line" we need two events:
local procedure FinitelyLoadCapBack(TimeType: Enum "Routing Time Type"; ConstrainedCapacity: Record "Capacity Constrained Resource"; ResourceIsConstrained: Boolean; ParentWorkCenter: Record "Capacity Constrained Resource"; ParentIsConstrained: Boolean)
var
LastProdOrderCapNeed: Record "Prod. Order Capacity Need";
AvailTime: Decimal;
ProdEndingDateTime: DateTime;
ProdEndingDateTimeAddOneDay: DateTime;
SetupTime: Decimal;
TimetoProgram: Decimal;
AvailCap: Decimal;
DampTime: Decimal;
xConCurrCap: Decimal;
EndTime: Time;
StartTime: Time;
ShouldProcessLastProdOrderCapNeed: Boolean;
begin
if (RemainNeedQty = 0) and WaitTimeOnly then
exit;
EndTime := ProdEndingTime;
ProdEndingDateTime := CreateDateTime(ProdEndingDate, ProdEndingTime);
ProdEndingDateTimeAddOneDay := CreateDateTime(ProdEndingDate + 1, ProdEndingTime);
ConCurrCap := ProdOrderRoutingLine."Concurrent Capacities";
xConCurrCap := 1;
LastProdOrderCapNeed.SetCapacityFilters(ProdOrderRoutingLine.Type, ProdOrderRoutingLine."No.");
CalendarEntry.SetCapacityFilters(ProdOrderRoutingLine.Type, ProdOrderRoutingLine."No.");
CalendarEntry.SetFilter("Starting Date-Time", '<= %1', ProdEndingDateTime);
CalendarEntry.SetFilter("Ending Date-Time", '<= %1', ProdEndingDateTimeAddOneDay);
OnFinitelyLoadCapBackOnAfterSetCalendarEntryFilters(CalendarEntry);
if CalendarEntry.Find('+') then
repeat
if (EndTime > CalendarEntry."Ending Time") or (EndTime < CalendarEntry."Starting Time") or
(ProdEndingDate <> CalendarEntry.Date)
then
EndTime := CalendarEntry."Ending Time";
StartTime := EndTime;
if (ConCurrCap = 0) or (CalendarEntry.Capacity < ConCurrCap) then
ConCurrCap := CalendarEntry.Capacity;
if TimeType <> TimeType::"Run Time" then
RemainNeedQty := RemainNeedQty * ConCurrCap / xConCurrCap;
xConCurrCap := ConCurrCap;
CalculateDailyLoad(AvailCap, DampTime, ConstrainedCapacity, ResourceIsConstrained, ParentWorkCenter, ParentIsConstrained);
SetupTime := 0;
if TimeType = TimeType::"Run Time" then begin
SetupTime :=
Round(
ProdOrderRoutingLine."Setup Time" *
CalendarMgt.TimeFactor(ProdOrderRoutingLine."Setup Time Unit of Meas. Code") /
CalendarMgt.TimeFactor(Workcenter."Unit of Measure Code"),
Workcenter."Calendar Rounding Precision");
SetupTime := SetupTime * ConCurrCap;
OnFinitelyLoadCapBackOnAfterCalcSetupTime(ProdOrderRoutingLine, Workcenter, SetupTime);
end;
if RemainNeedQty + SetupTime <= AvailCap + DampTime then
AvailCap := AvailCap + DampTime;
AvailCap :=
Round(AvailCap *
CalendarMgt.TimeFactor(Workcenter."Unit of Measure Code") *
100 / CalendarEntry.Efficiency / ConCurrCap, 1, '>');
if CalendarEntry.Capacity = CalendarEntry."Absence Capacity" then
AvailCap := 0;
ShouldProcessLastProdOrderCapNeed := AvailCap > 0;
OnFinitelyLoadCapBackOnAfterCalcShouldProcessLastProdOrderCapNeed(
ProdOrderRoutingLine, AvailCap, CalendarEntry, ProdEndingTime, ProdEndingDate, TimeType, FirstInBatch, FirstEntry,
UpdateDates, RemainNeedQty, ProdOrderCapNeed, ProdOrder, NextCapNeedLineNo, Workcenter, LotSize, ShouldProcessLastProdOrderCapNeed);
if ShouldProcessLastProdOrderCapNeed then begin
ProdEndingDateTime := CreateDateTime(CalendarEntry.Date, EndTime);
LastProdOrderCapNeed.SetFilter(
"Ending Date-Time", '>= %1 & < %2', CalendarEntry."Starting Date-Time", ProdEndingDateTimeAddOneDay);
LastProdOrderCapNeed.SetFilter(
"Starting Date-Time", '>= %1 & < %2', CalendarEntry."Starting Date-Time", ProdEndingDateTime);
if LastProdOrderCapNeed.Find('+') then
repeat
if LastProdOrderCapNeed."Ending Time" < EndTime then begin
AvailTime := Min(CalendarMgt.CalcTimeDelta(EndTime, LastProdOrderCapNeed."Ending Time"), AvailCap);
**OnAfterCalcAvailTime1(AvailTime, EndTime, AvailCap, LastProdOrderCapNeed);**
if AvailTime > 0 then begin
UpdateTimesBack(AvailTime, AvailCap, TimetoProgram, StartTime, EndTime);
CreateCapNeed(CalendarEntry.Date, StartTime, EndTime, TimetoProgram, TimeType, 1);
if FirstInBatch and FirstEntry then begin
FirstInBatch := false;
FirstEntry := false
end;
if UpdateDates then begin
ProdOrderRoutingLine."Ending Time" := EndTime;
ProdOrderRoutingLine."Ending Date" := CalendarEntry.Date;
UpdateDates := false
end;
EndTime := StartTime;
end;
end;
if LastProdOrderCapNeed."Starting Time" < EndTime then
EndTime := LastProdOrderCapNeed."Starting Time";
until (LastProdOrderCapNeed.Next(-1) = 0) or (RemainNeedQty = 0) or (AvailCap = 0);
if (AvailCap > 0) and (RemainNeedQty > 0) then begin
OnBeforeCalcAvailTime2(IAvailTime, EndTime, AvailCap, CalendarEntry);
AvailTime := Min(CalendarMgt.CalcTimeDelta(EndTime, CalendarEntry."Starting Time"), AvailCap);
OnAfterCalcAvailTime2(IAvailTime, EndTime, AvailCap, CalendarEntry);
if AvailTime > 0 then begin
UpdateTimesBack(AvailTime, AvailCap, TimetoProgram, StartTime, EndTime);
AdjustStartingTime(CalendarEntry, StartTime);
if TimetoProgram <> 0 then
CreateCapNeed(CalendarEntry.Date, StartTime, EndTime, TimetoProgram, TimeType, 1);
if FirstInBatch and FirstEntry then begin
FirstInBatch := false;
FirstEntry := false
end;
if UpdateDates then begin
ProdOrderRoutingLine."Ending Time" := EndTime;
ProdOrderRoutingLine."Ending Date" := CalendarEntry.Date;
UpdateDates := false
end;
EndTime := StartTime;
end;
end;
end;
if RemainNeedQty > 0 then begin
if CalendarEntry.Next(-1) = 0 then begin
TestForError(Text001, Text002, CalendarEntry.Date);
exit;
end;
EndTime := CalendarEntry."Ending Time";
end else begin
ProdEndingTime := StartTime;
ProdEndingDate := CalendarEntry.Date;
ProdOrderRoutingLine."Starting Time" := StartTime;
ProdOrderRoutingLine."Starting Date" := CalendarEntry.Date;
exit;
end;
until false;
end;
Why do you need this change?
We need two events in FinitelyLoadCapBack procedure in order to be able to calculate AvailTime in a different way before it used in subsequent procedures.
At the moment there are no other alternative events inside the procedure to do it.
Describe the request
In procedure FinitelyLoadCapBack of codeunit 99000774 "Calculate Routing Line" we need two events:
Changes between **: