# Save MaterialClass and MaterialDef MESObject gives error on first run

**URL:** <https://forum.inductiveautomation.com/t/save-materialclass-and-materialdef-mesobject-gives-error-on-first-run/97216>\
**Category:** Ignition\
**Tags:** sepasoft\
**Created:** [October 14, 2024, 12:26pm UTC](https://forum.inductiveautomation.com/t/save-materialclass-and-materialdef-mesobject-gives-error-on-first-run/97216 "2024-10-14T12:26:05Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![luuk\_hendriks](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/luuk_hendriks/32/68401_2.png) [@luuk\_hendriks](https://forum.inductiveautomation.com/u/luuk_hendriks)\
**Post date:** [October 14, 2024, 12:26pm UTC](https://forum.inductiveautomation.com/t/save-materialclass-and-materialdef-mesobject-gives-error-on-first-run/97216/1 "2024-10-14T12:26:05Z")

</div>

Hello everyone,

i want to create an MaterialClass and a MaterialDefinition in the same script. When i run the script once it gives an error. But when i run the same script for the second time it works. Can someone help figure out why it fails on the first run?

The script:

```python
className = 'Finished Goods' 
matName ='Nuts 8oz'

addToRoot = True 
objClassLink, retVal = Material.CreateClass(className, addToRoot) 
print retVal 

objClassLinks, retVal = Material.CreateDef(matName, objClassLink)
#print retVal

```

the Functions

```python
# MaterialClass
def CreateClass(name, addToRoot):
   
# This function is passed a name for a Material Class and will create it if it doesn't already exist.
# If addToRoot is True, then this class will be added to the Material Root, allowing any material 
# definitions in this class to be used by The OEE Material Manager
# Inputs - name: material class as string
# Inputs - addToRoot: boolean
# Outputs - link: MESObjectLink to the Material Class
# Outputs - RetVal: String status
   
	filter = system.mes.object.filter.createFilter()
	filter.setMESObjectTypeName('MaterialClass')
	filter.setMESObjectNamePattern(name)
	list = system.mes.searchMESObjects(filter)

	if list.size() == 0:
		retVal = "Creating Material Class " + name + "."
		obj = system.mes.createMESObject('MaterialClass')
		obj.setPropertyValue('Name', name)
		link = system.mes.object.link.create(obj)
	else:
		link = list.get(0)
		obj = list.get(0).getMESObject()      
		retVal = "Material Class " + name + " already exists."

	if addToRoot:
		rootFolder = 'Material Root'
		parentList = obj.getParentCollection().getList()
		if parentList.findByName(rootFolder) is None:       
			retVal = retVal + " Added to " + rootFolder
			obj.addParent(system.mes.loadMESObject(rootFolder, 'MaterialRoot'))
		else:
			retVal = retVal + ' It is already a child of ' + rootFolder

	system.mes.saveMESObject(obj)

	return link, retVal

# MaterialDef
def CreateDef(name, objClassLink):
   
#This function will check if the passed Material definition exists and if not creates it.
#It will then check to see if it is a member of the given Material class and if not will add it.
#Inputs - name: material def as String
#Inputs - objClassLink: MaterialClass
#Outputs - link: MESObjectLink to the Material Definition
#Outputs - RetVal: String status
  
	filter = system.mes.object.filter.createFilter()
	filter.setMESObjectTypeName('MaterialDef')
	filter.setMESObjectNamePattern(name)
	list = system.mes.searchMESObjects(filter)

	if list.size() == 0:
		obj = system.mes.createMESObject('MaterialDef')
		obj.setPropertyValue('Name', name)
		retVal = "Created Material Definition " + name + "."
	else:
		retVal = "Material Definition " + name + " already exists."
		obj = list.get(0).getMESObject()
	objLink = system.mes.object.link.create(obj)

	if (objClassLink is not None):
		clsName = objClassLink.getName()
		parentList = obj.getParentCollection().getList()
		if parentList.findByName(clsName) is None:              
			obj.addParent(objClassLink)
			retVal = retVal + " Adding to Material Class " + clsName
		else:
			retVal = retVal + " It is already a child of the Material Class"
	print retVal
	system.mes.saveMESObject(obj)

	return objLink, retVal

```

Output run 1 with only the most important part of the error

```python
Creating Material Class Finished Goods. Added to Material Root
Material Definition Nuts 8oz already exists. Adding to Material Class Finished Goods
Java Traceback:
Traceback (most recent call last):
  File "<input>", line 10, in <module>
  File "<module:Material>", line 73, in CreateDef
	at com.inductiveautomation.ignition.client.gateway_interface.GatewayInterface.newGatewayException(GatewayInterface.java:360)
	at com.inductiveautomation.ignition.client.gateway_interface.GatewayInterface.sendMessage(GatewayInterface.java:334)
	at com.inductiveautomation.ignition.client.gateway_interface.GatewayInterface.sendMessage(GatewayInterface.java:287)
	at com.inductiveautomation.ignition.client.gateway_interface.GatewayInterface.moduleInvokeSafe(GatewayInterface.java:930)
	at com.inductiveautomation.ignition.client.gateway_interface.ModuleRPCFactory$DynamicRPCHandler.invoke(ModuleRPCFactory.java:53)
	at jdk.proxy2/jdk.proxy2.$Proxy41.saveMESObjects(Unknown Source)
	at jdk.internal.reflect.GeneratedMethodAccessor107.invoke(Unknown Source)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.base/java.lang.reflect.Method.invoke(Unknown Source)
	at com.sepasoft.production.rpc.ProductionRPCProxy$1.invoke(ProductionRPCProxy.java:28)
	at jdk.proxy2/jdk.proxy2.$Proxy41.saveMESObjects(Unknown Source)
	at com.sepasoft.production.script.MESClientScript.saveMESObject(MESClientScript.java:204)
	at jdk.internal.reflect.GeneratedMethodAccessor106.invoke(Unknown Source)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.base/java.lang.reflect.Method.invoke(Unknown Source)
com.inductiveautomation.ignition.client.gateway_interface.GatewayException: com.inductiveautomation.ignition.client.gateway_interface.GatewayException: Cannot save object (MaterialClass, Finished Goods, 80bffea1-dd26-4363-ab4c-b064942ee9be) without a version when the object already exists

```

output run 2

```python
Material Class Finished Goods already exists. It is already a child of Material Root
Material Definition Nuts 8oz already exists. Adding to Material Class Finished Goods

```
