您的位置:首页 > 其它

【项目实施随笔】生产领料

2009-07-06 22:39 316 查看
好久没涂鸦了,最近一段时间一个人做项目,有些忙乱。
写一篇关于生产领料的帖子,这篇帖子只是描述了我实施这个项目的做法,只适合这个项目的实际情况,没有普遍意义,每个项目都有自己的需求,抛砖引玉,希望得到大家的指点,得到最佳实践。
公司的规模比较小,按单生产,每个产品的生产周期都比较长,一般在三四个月左右,只使用了最基本的生产功能,做领料的管理,没有使用主计划模块,工序相对简单,都是手工作业,工时定额也不好算出,成本方面人工费占得比重很小,所以暂时也没有使用工艺路线做管理,生产模块使用的也就是领料了。
公司的物料领用一共有如下三种情况:
1.正冲(Forward Flushing)倒冲(Backward Flushing)
有一些物料的单件价值不大,不需要每次领料都让库房管理员去登记,财务要求在生产工单开工或者完工的时候就把这部分物料的领用在财务上体现。
2.正常领用
这部分物料是需要正常领用的,生产工人根据生产情况需要去库房领用,库房管理员发货并登记在系统。
3.采购入库的时候领用
有一部分物料是根据生产订单采购的,这部分物料在采购入库后就直接到了放到生产车间,由于这部分物料是针对特z项目的,在库房里特定的区域,工人根据需要去拿就行了,库房管理员不希望每次工人去领用都到他那边登记,太过麻烦,希望系统在采购入库的时候自动产生领料单并过账,他就不必为这部分物料忙活了。
第1和第2种情况,AX的现有功能都可以应对,第三种情况可以用供应商类型的BOM行来实现,但是需做一些修改。下面以一个虚拟的实例描述一下这个项目的做法:
设置产成品,物料号为000001,该物料有几个子物料组成,这里只举四个物料为例,分别代表上面的几种情况:
000001_001 正冲
000001_002 倒冲
000001_003 正常领用
000001_004 采购入库时领用
1.基础设置
关于正冲和倒冲,AX在物料,物料清单行以及生产BOM行处各有一个选项设置,实际上这三个选项都是都是依次覆盖的,也就是生产BOM行的设置会覆盖物料清单行的设置,物料清单行的设置会覆盖物料的设置。另外在生产订单做开始和完工入库动作的时候还有个选项做控制。下面一一介绍这些参数:
物料上的选项:
库存管理->物料->参考(选项卡)->刷新原则

void postVendorProdBOM(TransDate _postDate, InventQty _qtyUpdateNow, PurchLine _purchLine)
{
ProdJournalCheckPostBOM prodJournalCheckPostBOM;
ProdJournalCreateBOM prodJournalCreateBOM;
ProdJournalTable prodJournalTable;
ProdParameters prodParameters;
InventQty prodQty;
NoYes endUpdatePickList;
boolean reversed;
boolean ok = true;
boolean isJournalCreated = false;
;

if(
//Farseer Begin 2009/07/06 clear the OprNum
//this.OprNum &&
//Farseer End 2009/07/06
this.ProdLineType == BOMType::Vendor)
{
//Farseer Begin 2009/07/06 clear the service restriction
//if(this.itemType() == ItemType::Service)
//{
//Farseer End 2009/07/06
prodParameters = ProdParameters::find();

// create journal
if (prodParameters && prodParameters.BOMAutoConsumpPurchReceive != BOMAutoConsump::Never)
{
endUpdatePickList = _purchLine.RemainPurchPhysical ? NoYes::No : NoYes::Yes;
reversed = _qtyUpdateNow < 0 ? true : false;
prodQty = _qtyUpdateNow / (this.BOMQty() ? this.BOMQty() : 1);

setprefix(strfmt("@SYS90210", this.ProdId));
setprefix("@SYS60017");

prodJournalCreateBOM = ProdJournalCreateBOM::construct();
prodJournalCreateBOM.parmTransDate(systemdateget());
prodJournalCreateBOM.parmProdId(this.ProdId);
prodJournalCreateBOM.parmEndUpdate(endUpdatePickList);

prodJournalCreateBOM.parmOprNumFrom(this.OprNum);
prodJournalCreateBOM.parmOprNumTo(this.OprNum);
prodJournalCreateBOM.parmQtyCalc(prodQty);
prodJournalCreateBOM.parmConsumpAsProposal(NoYes::Yes);
prodJournalCreateBOM.parmProposalAsConsump(NoYes::No);
prodJournalCreateBOM.parmConsumpProposal(ProdBOMConsumpProposal::Qty);
prodJournalCreateBOM.parmBOMAutoConsump(prodParameters.BOMAutoConsumpPurchReceive);
prodJournalCreateBOM.parmShipAccError(NoYes::No);
prodJournalCreateBOM.parmJournalNameId(prodParameters.BOMJournalNameId);

//Farseer Begin 2009/07/07 add the inventTransId
prodJournalCreateBOM.parmInventTransId(this.InventTransId);
//Farseer End 2009/07/07

if(prodParameters.BOMJournalNameId)
{
prodJournalCreateBOM.init();
prodJournalCreateBOM.initProdJournalTableData(ProdJournalType::Picklist);
}
else
{
ok = checkFailed("@SYS26138");
}

ok = ok && prodJournalCreateBOM.validate();

if(ok)
{
prodJournalCreateBOM.runSpecial();
prodJournalTable = prodJournalCreateBOM.usedProdJournalTable();
}

// post journal
if (ok && prodJournalTable.RecId && prodJournalTable.JournalId)
{
isJournalCreated = true;
prodJournalCheckPostBOM = ProdJournalCheckPostBOM::newPostJournal(prodJournalTable.JournalId,
prodParameters.PurchReceiveShowInfo);
prodJournalCheckPostBOM.parmThrowCheckFailed(false);

ok = ok && prodJournalCheckPostBOM.validateJournalTable(prodJournalTable);

if(ok)
{
prodJournalCheckPostBOM.run();
}
} // end post journal

} // end create journal

//} // end if service item

} // end if Vendor line

if(!ok)
{
if(isJournalCreated)
info(strfmt("@SYS98241", prodJournalTable.JournalId));

warning("@SYS23002");
}
}
我取消了物料类型和工序号的限制,并给ProdJournalCreateBOM增加了一个runSpecial,createLineSpecial的方法,因为AX原有的做法都是工序去筛选prodBOM的记录从而创建ProdJournalTrans的记录的,这不合我意,我想通过InventTransId去过滤ProdBOM的记录从而生成prodJournalTrans的记录,于是,改之。

while select forupdate prodBOM
index hint NumIdx
where prodBOM.ProdId == prodId &&
prodBOM.InventTransId == this.parmInventTransId()
CreateLine方法的其他地方不变,只是把过滤条件从工序号变成了InventTransId.这样应该差不多了。

OK,就这些了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: