Blocking transactions for parts without STD cost

Hello everyone,

My company use a STD cost, and a lot of new parts have been created recently. And when the new parts were transacted before the STD cost was registered, there was an issue.
Before the STD cost was registered, the value of the part was 0, and when the STD cost is registered, Epicor automatically deducts the quantity of the 0 value and creates a new quantity of the value of the registered cost.
Of course, the final cost is the same, but my cost department hates these complicated transactions. So, I notified users that they must enter the STD cost before creating a transaction.
But, I would like to prevent this issue from Epicor. Is there a way to block transactions of parts without STD cost in Epicor? Or is there a better way to solve this issue?
Thanks in advance!

We had a similar issue at my last company and solved it with a BPM to block the release of jobs if the part was missing its standard cost. We figured it would be cleaner and easier if we let the jobs that were already out in the wild run their course and remain unaffected. We also had 1100 jobs running at the start of this project so no one was jumping at the chance to clean all of that up.

if you create a BPM on the PartTran table, you can add an Exception Message to stop a transaction if that job’s part has a Total Standard cost of = 0

1 Like

New part releases are troublesome for lots of people. The better defined you make your new part release process, the smoother it will go. It sounds like a step is getting missed before new parts get released into the wild.

It’s hard to give a perfect answer without understanding more about your business, but there are some built in tools that could potentially prevent this from happening. Part Holds might be the simplest approach. You could even place ALL new parts on hold with a quick BPM and then control who can release the holds.

Otherwise, you could look into creating BPM’s to warn users of $0 cost parts. You could also control when the Part Rev gets Approved or who can do that.

3 Likes

I am hoping with @timshuwy 's new workflow feature in kinetic we can control the creation of parts like this… creating a workflow that ensures all the proper steps are followed. :safe_harbor:

1 Like

Yes! Workflows… workflows everywhere insert Buzz Lightyear meme

2 Likes

I love it Chad, great scene.

I was just talking about Mrs. Nesbitt this weekend.

2 Likes

Thank you for sharing your experience. Furthermore, can you please share with me how you created the BPM?

1 Like

Thanks for your insight. I’m more interested in improving system processes than improving physical processes. So, I would like to know more about how to create BPM. Could you tell me more about this way?

Assuming you create all your parts in Part Entry, you could try starting with Method Directive on the Part business object. The Method should be something like GetNewPart and you’ll want to do a Post Processing Directive.

You can then set the Hold, Hold Reason, and maybe Hold Date. You can do a trace and place a part on hold manually first to see exactly what gets set but that sounds about right.

If that doesn’t solve your issue, you could move on to more drastric measures.

1 Like

So we had this BPM run on the job entry level, that way a new part can be added, MoM’s can be updated, etc etc without cost being entered. this BPM will stop the user from entering the part onto a job assuming its total cost is equal to 0.

  • Open up Method Directives, search Method Code and change the Service Name to JobEntry.
  • Click Search and find CheckPrePartInfo.
  • Create a new Post-Processing directive
    *** Im partial to using the query conditions but im sure there’s multiple ways to do this next part.
  • create a condition using “the number of rows in the designed query” option
  • I used thePartCost table and set a criteria on that table where StdLaborCost <> 0 (for testing i only used stdlaborcost but you should use all of the fields with AND flags. that way it’ll check if ALL of the fields are empty and only if all are 0 will it stop the job from being made).
  • Click ok in the baq window and add a Raise Exception flag. Enter whatever text you’d like here to be displayed to the user creating the job.
  • connect the TRUE side of the condition to the Raise Exception
  • Save and enable the BPM!

im no expert at BPMs, this is just the way ive seen it done in my environments. let me know if you have any questions and ill do my best to help out.

2 Likes

With your help I created this BPM. And I have a few questions.

  1. Is this warning just a message or does it stop job creation?
  2. Does this feature apply to both materials and products in a Job?
  3. Does this feature work when I enter all the details of the Job and then save it? Or when I enter the part that doesn’t have a STD?
    Thanks once again!
1 Like
  1. it raises an exception so it will not allow the user to complete the JobRelease Action.
  2. i believe its just the part that the job is making. We had a few materials with no costs and it only raised an exception when the top level part had no costs attached.
  3. the way it worked for us as soon as you tried to release the job it would block you from doing so and it would let you know why its being blocked. looking back at the bpm i used in the example i believe this would still be the case. Instead of JobEntry being used in the first step you could use the JobEntry.ChangeJobHeadRelease service which would block the user once they tried to release the job. that way you can save the job without an issue and itll allow you to update the costs, then go back to your job without losing anything
2 Likes

With your help, I completed my BPM. And today, the production team attempted Job Entry for the first time. However, all parts, whether or not there was an STD, were blocked with this message.
Can you please help me see what’s wrong with my BPM?
I tried putting “=” in the Operation in Table Criteria, and also “<>”. The same thing happened in both cases.


1 Like

in your query change the <> sign to = 0

right now your query is saying “if the StdMtlCost does not = 0, raise the exception” which would make this pop up on any good part with costing.

1 Like

In the screenshot above I only showed “<>”, but I actually tried “=” too. However, when I tried “=”, all parts with or without STD passed without raising an exception.

1 Like

ahh ok try adding in most or all of the std cost fields with the AND connection…so in the end you should have:

  1. StdMaterialUnitCost = 0
    and
  2. StdLbrUnitCost = 0
    and
  3. StdBurdenUnitCost = 0
    and
  4. StdSubUnitCost = 0

A much easier method, but im sure there was a reason i didnt use it in the past, or maybe not lol, is to use the total cost field from cost management. so in your query replace StdMaterial with StdTotUnitCost = 0. this does the same thing as my 4 item list above but just with one field.

Whichever way you choose, now a row will only be added to your query if all of those cost fields are blank. because obviously some parts can have 0 material cost or 0 subcontract cost etc etc. This way only something with truly zero cost should throw the exception. let me know how that works for you.

Actually, I have already tried several things. I already tried adding all std cost fields, but got the same result. All parts were blocked, with or without STD.
I tried several different ways, but every time I got the same result for all parts (either all parts were blocked, or all parts were opened). So doesn’t this BPM look at all the parts?


And the StdTotUnitCost you mentioned is not in Field. In my other BAQs, StdTotUnitCost was created using a calculated field. For reference, my company only uses MaterialUnitCost. That’s why I only added MaterialUnitCost in my Query.

I see it. You have no filter on PartCost related to a part number. That query is checking all parts all at once, and yeah at least one of them in the entire database has no standard, so the condition is always true.

Furthermore, if you have multiple cost sets, you need to filter the CostID as well.

2 Likes

this is weird…i just rebuilt it the same way as you and it allowed me to release a job that had a stdmaterialcost of 1 with all others 0. i ran it with a part with no costs filled in and it threw the error.

ive gotta ask because i cant think of anything else…what does the cost adjustment screen look like for your 000057 part?

and for the record, heres my bpm…i dont have any part filtering in the query, just the partcost and stdmaterialcost=0 @JasonMcD

1 Like

I can’t see how that would do what you want if you don’t tell it what part(s) to look at.

I’d expect a join to JobMtl or something. (don’t use tt tables though).

4 Likes