Struggling with Configurator

Hi,
I’m hoping to get some help or guidance on this. We are currently upgrading from Epicor 9.07 to Epicor 10.2.7, and I’m working on migrating our existing product configurator over from our 9 environment to 10. I’ve got everything cleaned up from some coding issues, but have been struggling with one particular configurator.

We have one operation that is set if there is some value in Small Inserts, Medium Inserts, Large Inserts, Reactors, Small Lifters or Large Lifters, so if these values are all 0, the operation should not be created and the configurator should move on to the next.

The issue that I’m having is that even if the values for those are set to 0, the configurator will still move on to the configurators for the small inserts, medium inserts, etc. On the plus side, it does not create the operation or the parts for the configurator. I’m struggling to figure out why this is, though.

We have another configurator that does a similar thing, but with different inserts and lifters and if those values are set to 0, then it doesn’t run the insert or lifter configurators.

In the rules, I have for Operation 240:
keep if return (Inputs.SmlSubIns.Value * 2) + (Inputs.MedSubIns.Value * 5) + (Inputs.LrgSubIns.Value * 12) + (Inputs.CustomSubIns.Value * 25) + (Inputs.CvrRetractors.Value * 15) + (Inputs.SmallCavLifters.Value * 2) + (Inputs.MediumCavLifters.Value * 5) > 0;

And rule actions of:
if(Context.Entity.Equals(“QuoteOpr”, StringComparison.OrdinalIgnoreCase)) QuoteOpr.ProdStandard = (Inputs.SmlSubIns.Value * 2) + (Inputs.MedSubIns.Value * 5) + (Inputs.LrgSubIns.Value * 12) + (Inputs.CustomSubIns.Value * 25) + (Inputs.CvrRetractors.Value * 15) + (Inputs.SmallCavLifters.Value * 2) + (Inputs.MediumCavLifters.Value * 5);

if(Context.Entity.Equals(“JobOper”, StringComparison.OrdinalIgnoreCase)) JobOper.ProdStandard = (Inputs.SmlSubIns.Value * 2) + (Inputs.MedSubIns.Value * 5) + (Inputs.LrgSubIns.Value * 12) + (Inputs.CustomSubIns.Value * 25) + (Inputs.CvrRetractors.Value * 15) + (Inputs.SmallCavLifters.Value * 2) + (Inputs.MediumCavLifters.Value * 5);

Then each material I have in there is set to:
keep if return Inputs.SmlSubIns.Value > 0;
and a rule action of
if(Context.Entity.Equals(“QuoteAsm”, StringComparison.OrdinalIgnoreCase)) QuoteAsm.QtyPer = Inputs.SmlSubIns.Value;

I’m going to take a guess on this and assume that if you have a null, it’s going to give you a false no matter what, so you might need to check for null, and replace with a 0 on your calculations.

I have all the initial values of the fields set to 0.
For some reasons, the configurators that are tied to Opr 240 for Main Cavity Block will run regardless of their value.

So, for example, if I say that there are 0 Custom Sub Inserts (that’s the only one I have approved right now for testing)

It still runs through the sequence for the custom sub inserts. On the positive side, no operations are added to the quote. It’s just an annoyance and the user may think that these are being added.

It does this for any of the ones associated to that operation. Originally, the “Keep Component” rule said:
return QuoteOpr.ProdStandard > 0;

But that needed to be changed because the way Epicor 10 handles the rules over Epicor 9.
In Epicor 9, QuoteOpr.ProdStandard value was set based on the number of inserts, and lifters, then it was checked to see if the value was > 0 but Epicor 10 checks if it should keep the component first then decide if it should run the other rules. So I altered it to:
Keep component when return (Inputs.SmlSubIns.Value * 2) + (Inputs.MedSubIns.Value * 5) + (Inputs.LrgSubIns.Value * 12) + (Inputs.CustomSubIns.Value * 25) + (Inputs.CvrRetractors.Value * 15) + (Inputs.SmallCavLifters.Value * 2) + (Inputs.MediumCavLifters.Value * 5) > 0;

Then I set the actions as:
if(Context.Entity.Equals(“QuoteOpr”, StringComparison.OrdinalIgnoreCase)) QuoteOpr.ProdStandard = (Inputs.SmlSubIns.Value * 2) + (Inputs.MedSubIns.Value * 5) + (Inputs.LrgSubIns.Value * 12) + (Inputs.CustomSubIns.Value * 25) + (Inputs.CvrRetractors.Value * 15) + (Inputs.SmallCavLifters.Value * 2) + (Inputs.MediumCavLifters.Value * 5);

and

if(Context.Entity.Equals(“JobOper”, StringComparison.OrdinalIgnoreCase)) JobOper.ProdStandard = (Inputs.SmlSubIns.Value * 2) + (Inputs.MedSubIns.Value * 5) + (Inputs.LrgSubIns.Value * 12) + (Inputs.CustomSubIns.Value * 25) + (Inputs.CvrRetractors.Value * 15) + (Inputs.SmallCavLifters.Value * 2) + (Inputs.MediumCavLifters.Value * 5);

Then, material 320: Custom Sub Insert is:
Keep component when return Inputs.CustomSubIns.Value > 0;

So…in essence, it should see the value of Inputs.CustomSubIns on Page 3, and set it accordingly. Initial value is set at 0.

So, if I’m following it right, when it goes to determine if it should keep Opr 240, and all the values are set to 0 for the inserts and lifters, it should conclude that:
(02)+(05)+(012)+(025)+(015)+(02)+(0*5) = 0 and not keep the component so move on with its life.
And even if there was say 1 Medium Cavity lifter, the customsubins value should still be 0, so don’t keep Operation 240 Material 320 (for the custom sub insert)

And if it’s not keeping the component, it shouldn’t run the configurator for it.

And the really odd thing is Main Core does the similar checks for core lifters and inserts. Only, it always keeps Opr 240 because Mtl 910: Milestone is always added.
But, if the lifters and inserts are at 0, then it doesn’t bother running the configurators for them.