2,754
edits
mNo edit summary |
mNo edit summary |
||
(23 intermediate revisions by the same user not shown) | |||
Line 1:
==Technical Specification==
# Quantity of Item must be in '''base UOM'''
# The Quantity Assigned to Item in Detail (raw material) is the quantity that is consumed by Total quantity of Finished Goods.
#:Eg. Finished Goods Qty = 3 Unit
#: Raw Material A Qty = 12kg
#: 12kg of Raw Material A is consumed by 3 Unit Finished Goods
# In Application, Finished Goods must be maintained in '''Item Maintenance''' and '''Item BOM Maintenance'''
==
{{BaseReferenceAC18}}
'''BCE.AutoCount.Stock.dll'''
'''BCE.AutoCount.Manufacturing.dll'''
==Sample with data model==
===Create New Stock Assembly===
<syntaxhighlight lang="csharp">
Line 17 ⟶ 21:
BCE.AutoCount.Manufacturing.StockAssembly.StockAssembly doc = cmd.AddNew();
doc.DocNo = source.DocNo ?? doc.DocNo;
doc.DocDate = source.DocDate;
doc.ItemCode = source.ItemCode;
doc.Qty = source.Quantity;
doc.Location = source.Location ?? doc.Location;
doc.
if (source.Department != null)
doc.DeptNo = source.Department;
doc.RefDocNo = source.ReferenceNo;
doc.AssemblyCost = source.AssemblyCost == null ? doc.AssemblyCost : BCE.Data.Convert.ToDBDecimal(source.AssemblyCost);
//Item's UOM is always Base UOM
//When the Finished Goods is maintained as BOM Item,
//there are raw materials (sub item) maintained & added accordance to the finished goods
//So, when Finished Goods is assigned, AutoCount API will auto insert raw materials (sub items) into the detail.
//A quick & simple solution is to clear all items in detail, before adding items from source into detail
doc.ClearDetails();
//There are two types of Cost update;
//1) UpdateItemCostWithUpToDateCost : Get the latest cost from stock card
//2) UpdateItemCostWithStandardCost : Get the cost from Item Maintenance, Standard Cost of base UOM
source.Detail.ForEach(s => AddStockAssemblyDetail(
s, doc.AddDetail, doc.UpdateItemCostWithStandardCost));
try
Line 40 ⟶ 58:
}
public void AddStockAssemblyDetail(StockAssemblyDetailSource source,
Func<BCE.AutoCount.Manufacturing.StockAssembly.StockAssemblyDetail> addDetail,
Action<System.Data.DataRow> calcItemCost)
{
BCE.AutoCount.Manufacturing.StockAssembly.StockAssemblyDetail dtl = addDetail();
dtl.ItemCode = source.ItemCode;
dtl.Description = source.Description ?? dtl.Description;
dtl.Location = source.Location ?? dtl.Location;
dtl.
if (source.Department != null)
dtl.DeptNo = source.Department;
dtl.Qty = source.Quantity;
//When UnitCost is null, Calculate Cost using system update Cost.
if (source.UnitCost.HasValue)
dtl.ItemCost = source.UnitCost.Value;
else
calcItemCost(dtl.Row);
dtl.OverHeadCost = source.OverheadCost;
//Item's UOM is always Base UOM
Line 61 ⟶ 89:
public string DocNo { get; set; }
public DateTime DocDate { get; set; }
public string Description { get; set; }
//Finished Goods
public string ItemCode { get; set; }
Line 69 ⟶ 98:
public string Department { get; set; }
public string ReferenceNo { get; set; }
public decimal? AssemblyCost { get; set; }
public List<StockAssemblyDetailSource> Detail = new List<StockAssemblyDetailSource>();
Line 82 ⟶ 112:
public string Department { get; set; }
public decimal Quantity { get; set; }
public decimal? UnitCost { get; set; }
public decimal OverheadCost { get; set; }
}
Line 88 ⟶ 118:
===Implementation===
[[File:PrgApiSTKAsembly1.PNG|link=]]
<syntaxhighlight lang="csharp">
public void MainEntry(BCE.Data.DBSetting dbSetting)
{
StockAssemblySource newDoc = new StockAssemblySource()
{
DocDate = new DateTime(2017, 12, 7),
//Finished Goods
ItemCode = "FG00001",
Quantity = 3,
};
//Raw Materials
newDoc.Detail.Add(new StockAssemblyDetailSource() { ItemCode = "RW00001", Description = "Metal", Quantity = 12, UnitCost = 1 });
newDoc.Detail.Add(new StockAssemblyDetailSource() { ItemCode = "RW00002", Description = "Casing", Quantity = 1, UnitCost = 20, OverheadCost = 30 });
newDoc.Detail.Add(new StockAssemblyDetailSource() { ItemCode = "RW00003", Description = "WireRed", Quantity = 5, UnitCost = 0.40M });
newDoc.Detail.Add(new StockAssemblyDetailSource() { ItemCode = "RW00003", Description = "WireBlue", Quantity = 5, OverheadCost = 30 });
//Warning: API does not check if "FG00001" is maintained in Item BOM.
//Though Stock Card does record this entry.
CreateNewStockAssembly(dbSetting, newDoc);
}
</syntaxhighlight>
==Sample Code of Stock Assembly Transferred from Stock Assembly Order==
* If the transfer quantity of Stock Assembly is greater than the remaining quantity in Stock Assembly Order, an error of "exceeded Qty Limit" will be thrown;
* and this stock assembly will not be created or updated.
<syntaxhighlight lang="csharp">
private void NewStockAssemblyTransferFromAssemblyOrder(BCE.Data.DBSetting dbSetting)
{
//two parameter of Assembly Order is required,
//(1) Assembly Order Document No.
//(2) Qty of Assembly Order to be transferred to this Stock Assembly
DataSet ds = LoadAODataSet("AO-000001", dbSetting);
if (ds != null)
{
BCE.AutoCount.Manufacturing.StockAssembly.StockAssemblyCommand cmd =
BCE.AutoCount.Manufacturing.StockAssembly.StockAssemblyCommand.Create(dbSetting);
BCE.AutoCount.Manufacturing.StockAssembly.StockAssembly doc = cmd.AddNew();
doc.TransferFromAO(ds, 2);
try
{
doc.Save();
//Log success
BCE.Application.AppMessage.ShowMessage($"Assembly Created {doc.DocNo}");
}
catch (BCE.Application.AppException ex)
{
//log fail
BCE.Application.AppMessage.ShowMessage(ex.Message);
}
}
else
{
//log fail when DocNo of Assembly Order cannot be found,
//or connection to database server failed.
}
}
private DataSet LoadAODataSet(string docNoAO, BCE.Data.DBSetting dbSetting)
{
BCE.AutoCount.Manufacturing.StockAssemblyOrder.StockAssemblyOrderCommand cmd =
BCE.AutoCount.Manufacturing.StockAssemblyOrder.StockAssemblyOrderCommand.Create(dbSetting);
BCE.AutoCount.Manufacturing.StockAssemblyOrder.StockAssemblyOrder ao = cmd.View(docNoAO);
return ao.StockAssemblyOrderDataSet;
}
</syntaxhighlight>
{{SeeAlsoStock}}
{{NavigateDeveloper}}
|