Changing subassembly BOM in Product Configurator

Hi everyone,

We are migrating to Epicor from our current system, It is quite old and certain things are handled in very particular ways, which are no longer valid today. I will try to explain the problem as clearly as I can.

We are working with complex machines with multi-level BOMs and a multitude of available options. To accommodate this we are building a number of configurators and so far they worked well with less complex machines. However with more complex machines we ran into the following problem:

Let’s say the base machine BOM looks like this:

  1. Machine A
    1.1. Subassembly A
    1.1.1. Material A
    1.1.2. Material B
    1.1.3. Material C
    1.2. Subassembly B
    1.2.1. Material A
    1.2.2. Material B
    1.2.3. Material C
    1.3. Subassembly C
    1.3.1. Material A
    1.3.2. Material B
    1.3.3. Material C

Now, the way our current system works is by combining a base BOM with a kind of an overlay BOM that would contain additional parts required for a specific variant selected, but also parts which need to be removed with a negative quantity. When combined, the negative quantity in overlay BOM would cancel out material quantities in base BOM.

Base subassembly BOM:

  1. Subassembly A
    1.1. Material A (Q:1)
    1.2. Material B (Q:1)
    1.3. Material C (Q:1)

Overlay BOM:

  1. Subassembly A-1
    1.1. Material C (Q:-1)
    1.2. Material D (Q:1)

Combined BOM:

  1. Subassembly A
    1.1. Material A (Q:1)
    1.2. Material B (Q:1)
    1.3. Material C (Q:0)
    1.4. Material D (Q:1)

I know that this exact behaviour cannot be replicated in Epicor as we cannot use negative quantities in materials. The simple solution is to engineer a full BOM for Subassembly A-1 and let the configurator pull the correct one. However I am trying to save our engineers time having to create/modify 100s, maybe even 1000s of BOMs. Also later on down the road, a single change in spec could result in having to modify 30-40 BOMs with all the different options we have.

My question is this: is there a way to modify the BOM of a subassembly on the fly during configuration? I’d like to try to avoid sub-configurators as we don’t want to add unnecessary complexity here.

2 Likes

I don’t believe so. I think that is the purpose of the subconfigurators… You can make all the necessary programming/logic on the subconfigurators therefore making the setup/maintenance much simpler because you’re only maintaining those instead of the 100s and 1000s of combinations.

Within any given configurator, you can only mess with the materials on that level in the configurator.

1 Like

Why not have a selectable phantom that contains the proper BOM items instead of trying to use negatives. You can however replicate this behavior with Keep When rules. If you add in the overlay, material C would have a keep when rule setting of false.

I think you might need to take a look at how you are setting up your configurators. Ideally, the single change wouldn’t require a change to the BOM at all, but to Configurator rules.

From your example, you would have a configurator to select the type with the same overlay, and based on that selection, it would alter the BOM.

So you would have a combo box in your configurator, and they would select overlay A-1.

In your configurator method rules, on Subassembly 0 Material 30 (equivalent to Subasm A, Material 1.3), you would have the following rule:

if ( Inputs.OverlaySelection.Value == "Subassembly 1-A" ) // this is the combo box selected at configuration
{
    if (Context.Entity == "JobMtl")
    {
        JobMtl.PartNum = "Material D PartNum";
        JobMtl.QtyPer = 1;
    }

    if (Context.Entity == "QuoteMtl")
    {
        QuoteMtl.PartNum = "Material D PartNum";
        QuoteMtl.QtyPer = 1;
    }
}

This would replace Material C with Material D. So the final BOM would be equivalent to what you show in your example.

Alternatively, you could create a starting BOM with both Material C and Material D. If that overlay is selected, you use the Keep/When rules in the Configurator Method Rules to drop Material C in this example.

// On Subassembly A, Mtl 30
if ( Inputs.OverlaySelection.Value == "Subassembly 1-A" )
{
    return false;
}
else
{
    return true;
}

In this scenario, the initial BOM looks like this:

  1. Subassembly A
    1.1. Material A (Q:1)
    1.2. Material B (Q:1)
    1.3. Material C (Q:1)
    1.4. Material D (Q:1)

and the final, configured BOM looks like this:

  1. Subassembly A
    1.1. Material A (Q:1)
    1.2. Material B (Q:1)
    1.4. Material D (Q:1)

Material 1.3 (in Epicor, MtlSeq 30) is removed, which is the same result.

My example above is obviously the simplified version. You mentioned that a change would require changing 30 - 40 BOMs, so your code on these would likely be more extensive and include both Keep When rules and changing parts / quantities. You have a lot of tools like the Configurator Lookup Tables and Configurator UD Methods that would make the code a lot more manageable, but it would function similar to this:

// Material 30 Keep-When Rule:

//
// List of Overlay Selections where Material C is kept
//
    List<string> MtlC_Overlays = {

        "Overlay 2-B",
        "Overlay 2-C",
        "Overlay 2-D",
        "Overlay 3-B",
        "Overlay 3-C",
        "Overlay 3-D",
        "Overlay 4-B",
        "Overlay 4-C",
        "Overlay 4-D"
    };


bool KeepMaterialC = MtlC_Overlays.Contains( Inputs.OverlaySelection.Value );

return KeepMaterialC;
// Material 30 Rule Action to set the quantity:

//
// List of overlays with their associated Mtl C Quantities
//
    Dictionary<string,decimal> dictMtlQty = {

        { "Overlay 2-B", 1.0m }, 
        { "Overlay 2-C", 3.0m },
        { "Overlay 2-D", 2.0m },
        { "Overlay 3-B", 1.0m },
        { "Overlay 3-C", 3.0m },
        { "Overlay 3-D", 2.0m },
        { "Overlay 4-B", 1.0m },
        { "Overlay 4-C", 3.0m },
        { "Overlay 4-D", 2.0m }
    };


// Now set the quantity to the value.

    if ( Context.Entity == "JobMtl" ) // For configured Sales Orders / Jobs
    {
        JobMtl.QtyPer = dictMtlQty[ Inputs.OverlaySelection.Value ];
    }
    else if (Context.Entity == "QuoteMtl") // For Configured Quotes
    {
        QuoteMtl.QtyPer = dictMtlQty[ Inputs.OverlaySelection.Value ];
    }

Adding these long lists and maintaining them in code is not best practice though. Ideally, you would use a combination of Lookup Tables (essentially an excel sheet that the configurator can reference), and a UD method. Then you would almost never need to change the actual Method Rules once they are set up.

You would have a Lookup Table that includes the overlays in the first column, then additional columns to identify if the various materials are kept or removed, and what quantities to use.

Thank you for your input Kevin. What you are suggesting here is perfectly applicable when configuring the top assembly, but I won’t be able to apply method rules to subassemblies within that configurator without using subconfigurators. Unless I am missing something obvious here?

The essence of my issue lies with the way our BOMs are made. They were created and adapted around an old system that works differently to Epicor.

I understand that I can pull a different subassembly into the configurator based on a selection, however I won’t be able to change materials that make up this subassembly, correct?

It is quite difficult to portray exactly what I mean to do. Let me try with a real life example. I am building a trailer that has a body assembly and a chassis assembly. Our base BOM contains a standard body and a base chassis. I decide to change the chassis to a different type, which has a different fitting. To make it fit to my standard body, I need to take standard fittings off and replace with ones matching the new chassis.

Does that make sense?

I see what you’re saying. In that example, I would probably opt to use additional revisions of the chassis rather than a subassembly configurator. So if I changed the selection from Part: StandardChassis to Part: PremiumChassis, I would have a Part: PremiumChassis, Rev: A with standard fittings, and Part: PremiumChassis, Rev: B with the alternate fittings. However, I can see how that would get out of hand if there are many options, and / or many combinations of parts to build the subassemblies.

I haven’t used subassembly configurators myself, so I might not be able to help much beyond this. It does sound like a scenario where you wouldn’t necessarily need anybody to actually make selections in the subassembly configurator, though. You could have the selections made automatically, so that the correct fittings are selected for the selected Chassis based on the selected Body. It would require more complexity in the front end of the configurator, but would allow you to bypass all the engineering changes.

I would probably opt to use additional revisions

Our process engineer would unalive me with his basilisk death stare if I proposed to have multiple active revisions on a part :joy: That idea is definitely off the table. But you gave me another idea - what about alternate methods? I could have a base part and any number of alternatives, each with its own revision. I could then determine which one to be used based on the configuration. Does that sound reasonable in this scenario?

It does sound like a scenario where you wouldn’t necessarily need anybody to actually make selections in the subassembly configurator, though.

That is correct. I don’t need the users to make any selections in the subconfigurator. Is there a way for this to happen in the background without having a separate page pop up for each configured subassembly?

P.S. I know you said you haven’t used subconfigurators, but I am hoping you might have some knowledge on it regardless. Or someone else who has experience with the issue at hand?

Can’t speak to the subconfigurators, but I tried doing something similar with multi-page configurators, and ended up giving up in frustration. As far as I know, there isn’t a reliable way to skip pages.

For a trailer, building out a BOM is exactly what we do with placeholder assemblies. All of these are built out by choices for upper level selection to define the set of options for trailer type/model selected providing individual selections for BOOMS, TONGUE, AXLES, WHEELS, ETC.

You don’t need sub-configurators if you use pages and use the preceding pages or even upper level choices to assist populating the option choices for subsequent pages and option choices.

Yes, you should be able to skip pages if needed.

Here is example of simple keep when rule (tooltip is same as keep when above) to use instead of negative quantity:

I do not intend to use negative quantities, I was only explaining how our current system does it. I am using keep when rules in my configurators together with a template BOM and placeholder assemblies. Still, it will only let me keep or discard top level assemblies. What I am looking for is a way to interact with a subassembly BOM.

Can you expand on that? How do I make a configurator skip a page and still run its logic in the background? Will using pages instead of subconfigurators enable me to modify a subassembly BOM?