Part II: Critical Program Logic
1.BOM Explosion / 展BOM
BOM表的结构抽象化之后一般如下:
A
|
--------------------------
| |
B(2) C(1)
|
-----------------------
| |
D(1) E(1)
|
--------------------
| |
F(1) G(1)
Table Name: BOM
BOMId ItemId ItemType BOMType BOMQty FromDate ToDate
A B BOM Item 2
A C Item Item 1 2009-05-31
B D BOM Phantom 1
B E Item Item 1
D F Item Item 1
D G Item Item 1
经典的展BOM程序如下:
void BOMExplosion(_TopBOMId, _BOMId, _BOMDate = today(), _BOMQty = 1)
{
while select BOM
where BOM.BOMId == _BOMId
&& (!BOM.FromDate || BOM.FromDate <= _BOMDate)
&& (!BOM.ToDate || BOM.ToDate >= _BOMDate)
{
if (BOM.ItemType != BOM)
{
TmpBOM.TopBOMId = _TopBOMId;
TmpBOM.ItemId = BOM.ItemId;
TmpBOM.BOMQty = BOM.BOMQty * _BOMQty;
TmpBOM.insert();
}
else
{
if (BOM.BOMType == Item)
{
TmpBOM.TopBOMId = _TopBOMId;
TmpBOM.ItemId = BOM.ItemId;
TmpBOM.BOMQty = BOM.BOMQty * _BOMQty;
TmpBOM.insert();
}
BOMExplosion(_TopBOMId, BOM.ItemId, _BOMDate, BOM.BOMQty * _BOMQty);
}
}
}
根据以上程序展开的BOM结果如下:
Table Name: TmpBOM
TopBOMId ItemId BOMQty
A B 2
A C 1
A D 2
A E 2
A F 2
A G 2