Restrict Replace by Alternate Across Sites in Manage Alternate Substitute Command

Understanding the "Replace by Alternate Validation" Opening ID

In real-world manufacturing and product development, you often need backup parts or substitutes. These are called alternates or substitutes, and they ensure production doesn’t stop if the main part is unavailable.

Now imagine you're in the 3DEXPERIENCE platform, and someone tries to replace a part with one of its alternates from the "Manage Alternates/Substitutes" panel.

But not all substitutes are good to use right away. Some might be "proposed" but not yet validated. Others might be obsolete.

That’s where this Opening ID steps in and it checks: "Is the replacement allowed or not?"

Environment Details:

  • Version: 2025x FD03 (FP.CFA.2523)

Required Licenses

License NamePurpose
 CSV (Collaborative Industry Innovator) 
XEN (Product Release Engineer)To create EBOM and add alternates
 PPL (Process Engineer) Create MBOM

Note: Licenses listed are per 2025x documentation.

Execution Context

AspectDetails
Type of Customization Execution 
Where it Runs on Client side 
Purpose To determine whether the replacement of a manufactured item with an alternate is allowed
Triggered when a user runs the Replace by Alternate command from the Manage Alternates/Substitutes panel

Input & Output Details

Input Objects:

  • ThisObject: The current Manufactured Item you’re trying to replace
  • Parameters: Holds all the context details needed to make a decision

Key Input Parameters:

ParameterTypePurpose
iChosenReplaceItemReferenceObjectThe alternate item being selected as replacement
iPartofChosenReplaceItemReferenceObjectThe part associated with the alternate
iAlternateQualificationStateStringTells whether the alternate is Proposed, Qualified, or Obsolete
iEBOMAlternateRelationTypeStringTells the type of replacement (Alternate, Reference Substitute, Instance Substitute)
iRelationTypeStringHow the replacer item and part are related (e.g., Scope, Resulting Product)
iInstanceSubstituteContextObjectOnly used if it's an Instance Substitute
iReferenceSubstituteContextObjectOnly used if it's a Reference Substitute

Output Parameter:

ParameterTypePurpose
oReplaceValidationStatusStringFinal answer - "Yes" or "No" to the replacement

Use Case Overview

Imagine you're working with a car manufacturer that has multiple production sites, like:

  • Austin site
  • Houston site

Each site has its own localized MBOM (Manufacturing Bill of Materials), even though the EBOM (Engineering Bill of Materials) might be global. You start by:

  1. Using the Engineering Release app to create an EBOM for a vehicle part.
  2. Defining alternates/substitutes (e.g., alternate battery or radiator) on EBOM.

  3. Logging in to the Austin site.

  4. Creating MBOM for Austin site using Create/update item structure command as shown and MBOM is created

  5. Launch Manage Alternate Substitute command from Authoring Tab

    This will show the alternate engineering part in the command whose part is not yet created

  6. Click on Add button and select the required OOTB or custom type

                                        

The item for alternate part is created as seen in (Item) Title icon
 

 

7. Now select the item and use Replace by Alternate command to replace one part with its alternate.
 

Item is replaced by alternate part and item is created in Austin Site

Later, at the Houston site, you:

 

  1. Create the MBOM for Houston [step no 4]
  2. Launch Manage Alternate/Substitute to replace a part [step 5]. Even though item for alternate is not created at Houston, dialog shows alternates from another sites 

User needs to follow same steps as step 6 to 8 

BUT here's the problem:

 You accidentally pick an alternate part that was provided by Austin, not Houston.
This would break plant-level traceability and introduce a site mismatch.

What Does This BL Do?

This Business Logic (BL), linked to the Opening ID DELMA_ReplaceByAlternate_Validation_ID, blocks replacement if the chosen alternate part was provided by a different plant/site.

In simple terms:

You can only replace a part with an alternate from the same site/project - no cross-site replacements allowed.

Without BL:

The system might allow this - even though Houston has no authority over Austin’s part.

With BL:

The system checks:

  • CurrentItemReference.project = Houston
  • ReplacerItemReference.project = Austin
  • Blocked with message:
    "Replace By Alternate failed as chosen item to replace belongs to different plant"

How It Works – Behind the Scenes

Triggered When:

  • User clicks Replace by Alternate from the Manage Alternates/Substitutes panel.

⚙️ The BL Checks:

  • The site/project of the current part (e.g., Houston).
  • The site/project of the selected alternate (e.g., Austin).
  • If they match, the replacement is allowed.
  • If they don’t match, it’s blocked, and the user is notified.

EKL Flow and Sample


 


/*
 * Rule: ERI_RestrictReplaceByalternates
 * Created by: ABE26 on 8/1/2025
 * Purpose:
 *   Validates that the selected alternate item for replacement 
 *   belongs to the same project/site as the current item.
 * Output:
 *   oReplaceValidationStatus (yes / no)
 */

Trace(1 , "### ERI_RestrictReplaceByalternates")
/*----- local variables ----*/
Let CurrentManufacturedItem(MfgProcessOccurrence)
Let CurrentItemReference(DELFmiFunctionReference)
Let ReplacerItemReference(DELFmiFunctionReference)

Let oValidationStatus(String)

Let CurrentItemProject(String)
Let ReplacerItemProject(String)
oValidationStatus = "No"

set CurrentManufacturedItem = ThisObject


/* ----- Get Reference of the Current Mfg Item (Item on which panel is launched) ----- */
if (NULL <> CurrentManufacturedItem)
{
	set CurrentItemReference = CurrentManufacturedItem.Reference
	
	if(NULL <> CurrentItemReference)
	{
		set CurrentItemProject = CurrentItemReference.project
		Trace(1, "    CurrentItemProject  : ",CurrentItemProject)
	}
}

/* ---- Reference of the Replacer Mfg Item [Choosen from listview] ---- */
if (true == Parameters.HasAttribute("iChosenReplaceItemReference") )
{
	set ReplacerItemReference = Parameters->GetAttributeObject("iChosenReplaceItemReference")
	if(NULL <> ReplacerItemReference)
	{
		set ReplacerItemProject = ReplacerItemReference.project
		Trace(1, "    ReplacerItemProject  : ",ReplacerItemProject)
	}
}

/* ----- Validation: Project/Site of both items must match ----- */
if (ReplacerItemProject == CurrentItemProject)
{
	
	set oValidationStatus = "yes"
	
}
else{
	Notify("Replace By Alternate failed as chosen item to replace belongs to site # Expected Item Site should be # ", ReplacerItemProject,CurrentItemProject)
}


/* ---- FILL OUTPUT PARAMETERS ---- */
Parameters.SetAttributeString("oReplaceValidationStatus" ,oValidationStatus)

Benefits of This BL

  • Prevents cross-site mistakes
  • Ensures plant-level data integrity
  • Enforces site-specific MBOM control

Business Rule Deployment

You may refer the below page for Business Rule deployment.

How to Deploy Business Rule

For deployment using Data Setup app following Resource set ID and opening needs to be used:

  • Resource Set ID:

  • Opening ID:

  • Fact Type:

Deploy the BL using Data Setup for "Fact type" = "FProcessOccurrence"

References

Person of Contact

@Akansha BHASAKHETRE