MTO企业可能会有的需求
问题描述
按单生产的企业,销售订单是一切的源头,在后续的生产和采购过程中都需要看到是为哪张销售订单,哪个客户生产或者采购的。
客户采购的是A产品,A产品又由B和C组成,而B,C又需要生产,在生产B和C的时候工厂也需要知道为哪张销售订单生产的以及其关联的销售订单上对B和C的具体要求。AX目前的数据结构只能看到最顶级的BOM上看到关联的销售订单,如果B,C想看到就要一级级往上查这很不方便。
解决方案
给计划生产订单和计划采购订单添加一个SalesLineRecId字段,让其记录SalesLine的RecId.写一个类MTOSolution,通过递归得到每一张计划生产订单和计划采购订单关联的SalesLine的RecId,并更新到SalesLineRecId中。
在接下来的生产订单和采购订单中也要看到相应的记录,可以在ProdTable和PurchLine中也添加SalesLineRecId字段,并在各自表的initFromReqPO方法中添加如下代码:
按单生产的企业,销售订单是一切的源头,在后续的生产和采购过程中都需要看到是为哪张销售订单,哪个客户生产或者采购的。
客户采购的是A产品,A产品又由B和C组成,而B,C又需要生产,在生产B和C的时候工厂也需要知道为哪张销售订单生产的以及其关联的销售订单上对B和C的具体要求。AX目前的数据结构只能看到最顶级的BOM上看到关联的销售订单,如果B,C想看到就要一级级往上查这很不方便。
解决方案
给计划生产订单和计划采购订单添加一个SalesLineRecId字段,让其记录SalesLine的RecId.写一个类MTOSolution,通过递归得到每一张计划生产订单和计划采购订单关联的SalesLine的RecId,并更新到SalesLineRecId中。
public static void UpdateReqTransPoS()
{
/*
在将每张计划生产工单都加上销售订单行的RecId
*/
ReqPo reqPo;
ReqTrans reqTrans;
ReqTransCov reqTransCov;
;
ttsbegin;
while select forupdate SalesLineRecId from reqPo
where reqPo.ReqPlanId == 'MPS'
join Qty,RefType,InventTransId,RefId from reqTrans
where ReqPO.RefType == reqTrans.RefType &&
ReqPO.RefId == reqTrans.RefId &&
ReqPO.ReqPlanId == reqTrans.ReqPlanId &&
reqTrans.IsDerivedDirectly == NoYes::No
{
if(!reqPo.SalesLineRecId)
{
reqPo.SalesLineRecId = MTOSolution::GetSalesLineRecId(reqTrans);
reqPo.doUpdate();
}
}
ttscommit;
}
该方法调用GetSalesLineRecId方法得到SalesLine的RecId{
/*
在将每张计划生产工单都加上销售订单行的RecId
*/
ReqPo reqPo;
ReqTrans reqTrans;
ReqTransCov reqTransCov;
;
ttsbegin;
while select forupdate SalesLineRecId from reqPo
where reqPo.ReqPlanId == 'MPS'
join Qty,RefType,InventTransId,RefId from reqTrans
where ReqPO.RefType == reqTrans.RefType &&
ReqPO.RefId == reqTrans.RefId &&
ReqPO.ReqPlanId == reqTrans.ReqPlanId &&
reqTrans.IsDerivedDirectly == NoYes::No
{
if(!reqPo.SalesLineRecId)
{
reqPo.SalesLineRecId = MTOSolution::GetSalesLineRecId(reqTrans);
reqPo.doUpdate();
}
}
ttscommit;
}
static RecId GetSalesLineRecId(ReqTrans _reqTrans)
{
SalesLine salesLine;
ReqTrans reqTrans;
ReqTransCov reqTransCov;
;
if(!_reqTrans)
return 0;
//寻找到销售订单,返回销售订单行的RecId
if(_reqTrans.RefType == ReqRefType::Sales)
return (select recId from SalesLine where SalesLine.InventTransId == _reqTrans.InventTransId).recId;
//如果是计划生产订单(计划采购订单),则找到其上级
if(_reqTrans.RefType == ReqRefType::BOMPlannedOrder ||
_reqTrans.RefType == ReqRefType::ItemPlannedOrder)
{
if(_reqTrans.Qty>=0)
{
select Qty,RefType,InventTransId,RefId from reqTrans
join * from reqTransCov
where reqTrans.RecId == reqTransCov.IssueRecId && reqTransCov.ReceiptRecId == _reqTrans.RecId;
}
else
{
select Qty,RefType,InventTransId,RefId from reqTrans
join * from reqTransCov
where reqTrans.RecId == reqTransCov.ReceiptRecId && reqTransCov.IssueRecId == _reqTrans.RecId;
}
}
else //同上
if(_reqTrans.RefType == ReqRefType::BOMLine)
{
select Qty,RefType,InventTransId,RefId from reqTrans
where reqTrans.RefType == ReqRefType::BOMPlannedOrder &&
reqTrans.RefId == _ReqTrans.RefId;
}
return MTOSolution::GetSalesLineRecId(reqTrans);
}
在类ReqCalcScheduleItemTable的Main方法的最后调用MTOSolution的UpdateReqTransPoS静态方法。{
SalesLine salesLine;
ReqTrans reqTrans;
ReqTransCov reqTransCov;
;
if(!_reqTrans)
return 0;
//寻找到销售订单,返回销售订单行的RecId
if(_reqTrans.RefType == ReqRefType::Sales)
return (select recId from SalesLine where SalesLine.InventTransId == _reqTrans.InventTransId).recId;
//如果是计划生产订单(计划采购订单),则找到其上级
if(_reqTrans.RefType == ReqRefType::BOMPlannedOrder ||
_reqTrans.RefType == ReqRefType::ItemPlannedOrder)
{
if(_reqTrans.Qty>=0)
{
select Qty,RefType,InventTransId,RefId from reqTrans
join * from reqTransCov
where reqTrans.RecId == reqTransCov.IssueRecId && reqTransCov.ReceiptRecId == _reqTrans.RecId;
}
else
{
select Qty,RefType,InventTransId,RefId from reqTrans
join * from reqTransCov
where reqTrans.RecId == reqTransCov.ReceiptRecId && reqTransCov.IssueRecId == _reqTrans.RecId;
}
}
else //同上
if(_reqTrans.RefType == ReqRefType::BOMLine)
{
select Qty,RefType,InventTransId,RefId from reqTrans
where reqTrans.RefType == ReqRefType::BOMPlannedOrder &&
reqTrans.RefId == _ReqTrans.RefId;
}
return MTOSolution::GetSalesLineRecId(reqTrans);
}
在接下来的生产订单和采购订单中也要看到相应的记录,可以在ProdTable和PurchLine中也添加SalesLineRecId字段,并在各自表的initFromReqPO方法中添加如下代码:
this.SalesLineRecId = _reqPo.SalesLineRecId;
这样就传递到下一层了。