On occasion, an Epicor ERP user will want to write a report that requires a hierarchical view of a part’s multi-level bill of material. In Epicor, we would prefer to do this using a Business Activity Query (BAQ). The Epicor 10 BAQ tool is much more powerful than the tool from version 9, so it comes close to being able to do this, but just misses the mark. In order to query a hierarchical BOM, we must write the SQL and create a view in the database. Once we create the view, we can use a BAQ to access it (in version 9 or version 10 as long as we’re using SQL Server), or we can query it directly using an SSRS report. Herewith, we provide the SQL:
with pm as (select x.Company, x.PartNum, x.RevisionNum, QtyPer, FixedQty, MtlPartNum as ChildPartNum from erp.PartMtl x inner join erp.PartRev pr on pr.Company = x.Company and pr.PartNum = x.PartNum and pr.RevisionNum = x.RevisionNum and pr.Approved = 1 and pr.EffectiveDate <= GetDate() and pr.EffectiveDate = (select max(effectiveDate) from erp.PartRev pr2 where pr2.Company = pr.Company and pr2.PartNum = pr.PartNum and pr2.Approved = 1 and pr2.EffectiveDate <= GetDate()) ), bm as (select 1 as BOMLevel, root.PartNum as TopLevelPartNum, root.*, cast(root.QtyPer as decimal(30,10)) as PartQty from pm as root where not exists (select null from Erp.PartMtl b where b.MtlPartNum = root.PartNum) union all select BOMLevel + 1 as BOMLevel, bm.TopLevelPartNum, node.*, cast(node.QtyPer * bm.PartQty as decimal(30,10)) as PartQty from pm as node inner join bm on bm.Company = node.Company and bm.ChildPartNum = node.PartNum) select * from bm