我正在使用来自外部优化工具的优化数据更改路线作业 (ProdRouteJob)。更改的数据使用简单的 ax 类和 prodRouteJob.update() 编写。现在的问题是,容量预留 (WrkCtrCapRes) 不会得到更新。是一种重新计算容量预留的方法吗?还是创建新的容量预留?
问问题
838 次
2 回答
2
唯一更新的地方WrkCtrCapRes
是WrkCtrJobData.updateCapacityReservations()
方法中。课程WrkCtrJobData
要求WrkCtrScheduleJobs
和其他深层复杂性。
没有更新容量预留的ProdRouteJob
全部知识,它必须考虑日历。
我做了以下方法来做类似的更新。它不支持“基本日历”,但做了我需要的。
Hours updateWrkCtrCapRes(ProdRouteJob prodRouteJob, WrkCtrTable wrkCtrTable = WrkCtrTable::find(prodRouteJob.WrkCtrId))
{
WrkCtrCapRes wrkCtrCapRes;
WorkCalendarDateLine workCalendarDateLine;
Seconds sec;
delete_from wrkCtrCapRes
where wrkCtrCapRes.RefType == WrkCtrCapRefType::Production &&
wrkCtrCapRes.RefId == prodRouteJob.ProdId &&
wrkCtrCapRes.OprNum == prodRouteJob.OprNum &&
wrkCtrCapRes.OprPriority == prodRouteJob.OprPriority &&
wrkCtrCapRes.JobId == prodRouteJob.JobId;
wrkCtrCapRes.ReqPlanId = ReqPlanSched::defaultDynamicId();
wrkCtrCapRes.LoadType = WrkCtrCapacityType::JobSched;
wrkCtrCapRes.RefType = WrkCtrCapRefType::Production;
wrkCtrCapRes.RefId = prodRouteJob.ProdId;
wrkCtrCapRes.OprNum = prodRouteJob.OprNum;
wrkCtrCapRes.OprPriority = prodRouteJob.OprPriority;
wrkCtrCapRes.JobType = prodRouteJob.JobType;
wrkCtrCapRes.JobId = prodRouteJob.JobId;
wrkCtrCapRes.Locked = prodRouteJob.Locked;
wrkCtrCapRes.WrkCtrGroupId = wrkCtrTable.WrkCtrGroupId;
wrkCtrCapRes.WrkCtrId = wrkCtrTable.WrkCtrId;
wrkCtrCapRes.WrkCtrLoadPct = 100.0;
while select workCalendarDateLine
where workCalendarDateLine.CalendarId == wrkCtrTable.CalendarId &&
workCalendarDateLine.TransDate >= prodRouteJob.FromDate &&
workCalendarDateLine.TransDate <= prodRouteJob.ToDate
{
if (workCalendarDateLine.TransDate == prodRouteJob.FromDate)
workCalendarDateLine.FromTime = max(workCalendarDateLine.FromTime, prodRouteJob.FromTime);
if (workCalendarDateLine.TransDate == prodRouteJob.ToDate)
workCalendarDateLine.ToTime = min(workCalendarDateLine.ToTime, prodRouteJob.ToTime);
if (workCalendarDateLine.FromTime < workCalendarDateLine.ToTime)
{
wrkCtrCapRes.TransDate = workCalendarDateLine.TransDate;
wrkCtrCapRes.StartTime = workCalendarDateLine.FromTime;
wrkCtrCapRes.EndTime = workCalendarDateLine.ToTime;
wrkCtrCapRes.WrkCtrSec = wrkCtrCapRes.EndTime - wrkCtrCapRes.StartTime;
wrkCtrCapRes.insert();
sec += wrkCtrCapRes.WrkCtrSec;
}
}
return decRound(sec / 3600.0, 5);
}
于 2011-11-28T10:14:52.970 回答
1
我只是添加了这个方法:
static void ProdSchedule(ProdId _ProdId)
{
ProdTableType ProdTableType;
ProdTable ProdTable=ProdTable::find(_ProdId);
ProdParmScheduling ProdParmScheduling;
;
ProdTableType=new ProdTableType(ProdTable);
ProdParmScheduling = ProdParmScheduling::findLast(_ProdId,ProdSchedMethod::JobScheduling); ProdTableType.runJobScheduling(ProdParmScheduling);
}
于 2014-05-08T09:11:31.650 回答