# How can I recalculate estimated costs for all unfirm jobs?

We had a huge error on our standard cost of a part. Without running a complete regen MRP run is there a way to get Epicor MRP to update the estimated costs on all the unfirm jobs?

@JimA You could use a bpm on a UD table.Update to reset the cost on each jobmtl, but a regen seems easier.

Unfortunately Epicor chose to store the Estimated cost calculation in each assembly rather than just recalate the estimate each time. And if an assembly is inside another assembly that total would have to be updated as well. Then again at the zero level assembly. I was just hoping that maybe the “MRP Recalc Needed” or some method similar might update all the hard coded estimates since the standard cost of the part changed. The MRP regen takes us 2-3 days while net change takes about 2-1/2 hours depending on how may Boats were added to the schedule.

Btw it is one materials estimated cost. The standard was entered one decimal place off. And this single material is used in every BOM. The part really costs 172.02/sheet but was entered as 1720.20/sheet … usage is different depending on the assembly.

@JimA here is how I would have done this in 9. I used a UD table and made a bpm on update. You add the UDxx maintenance screen to the menu and then adding a record to the table kicks off the routine. I believe that changing the one Job material triggers a job update. Try this manually in test first.

THIS IS NOT TESTED. RUN IN A TEST ENVIRONMENT FIRST.

``````/* reset estimate based on standard  */

Message " IN JOB Fix ".

def var stdMtlCost as decimal init 0.
def var stdMtlBurdenCost as decimal init 0.

For each ttUD15 where (ttUD15.rowmod = 'A' or ttUD15.rowmod = 'U') and ttUD15.Company = cur-comp.

for each JobHead where JobHead.Company=cur-comp and JobHead.JobNum=JobHead.JobNum.

If JobHead.JobFirm = false then next.

for	each JobMtl where JobMtl.Company=cur-comp and JobMtl.JobNum=JobMtl.JobNum and JobMtl.AssemblySeq=JobMtl.AssemblySeq and JobMtl.MtlSeq=JobMtl.MtlSeq and JobMtl.PartNum = "XXXX",
each partCost where JobMtl.partNum = PartCost.PartNum and partCost.CostID = partCost.CostID and JobMtl.Company = PartCost.Company:

stdMtlCost = PartCost.StdMaterialCost.
stdBurdenCost = PartCost.StdMtlBurCost.

Message "JobMtl Est Unit cost = " + string(JobMtl.EstMtlUnitCost) + " Std " + string(PartCost.StdMaterialCost).

Assign JobMtl.EstMtlUnitCost = StdMtlCost
JobMtl.EstBurUnitCost = StdMtlBurdenCost
JobMtl.EstUnitCost = JobMtl.EstMtlUnitCost + JobMtl.EstLbrUnitCost + JobMtl.EstBurUnitCost + JobMtl.EstSubUnitCost.
END.
END.
END.

``````

Sounds like it could work. I will test in test company. Do you think this code will update the “Unfirm” jobs and not throw an error because un-firm jobs aren’t updatable?
You said: " I believe that changing the one Job material triggers a job update." are you saying that the “job update” will update the JobAsmbl.EstMtlUnitCost?

Thanks for your help!

@JimA I did not know about updating unfirm jobs, we do not use them here. I had one in my dev system and could not update its cost in job entry, so this may be a dead end. This code I used to reset the estimated cost when a job was released. I just wrapped it up with how I did other UD mass updates.

When I update a job material when a job is released it does update JobAsmbl costs.

You may have to fix them individually as they are firmed or released.

Sounds like a plan. I will modify the code you sent me to fire when jobs goes from any to released. Thanks again!