Why is GlideRecord update causing duplicate primary key error?

MBarrott
Mega Sage

The issue is tied to the last couple lines of the script, the setValue and update. 

 

If I create an entirely new GlideRecord for the table then it works fine, but I thought initialize() should clear out the GlideRecord for re-use?

 

Any help would be appreciated. 

 

// ********** find and add new stakeholders to register **********
// declare gliderecord and execute query against stakeholder group
var grStakeGrpMem = new GlideRecord('sys_user_grmember');
grStakeGrpMem.addEncodedQuery('group=25dcde621b58a850f30dfc03cc4bcb53'); // EDI Applications Managers group (test sample)
grStakeGrpMem.query();

// variable declarations
var addStakeArr = []; // add stakeholders 

// loop through found records
while(grStakeGrpMem.next())  
{
	if(grStakeGrpMem.getDisplayValue('user') != '') // // push record(s) to array if display value is not null
	{
		addStakeArr.push(grStakeGrpMem.getValue('user'));
	}
}

// retrive array values and populate registry with new records
for(var i = 0; i < addStakeArr.length; i++) 
{
	var grStakeHolReg = new GlideRecord('dmn_stakeholder_register'); // declare gliderecord object and insert new records
	grStakeHolReg.initialize();
	grStakeHolReg.setValue('user', addStakeArr[i]);
	grStakeHolReg.insert();
}

// find and deactivate stakeholders with inactive user records
grStakeHolReg.initialize();
grStakeHolReg.addEncodedQuery('sys_class_name=dmn_stakeholder_register^user.active=false');
grStakeHolReg.query();
while(grStakeHolReg.next())
{
	grStakeHolReg.setValue('active', false); // ISSUE IS HERE
	grStakeHolReg.update(); // ISSUE IS HERE
}

 

 

1 ACCEPTED SOLUTION

Ivan Betev
Mega Sage
Mega Sage

Hi @MBarrott ,

 

You are initializing variable grStakeHolReg that is being declared inside the loop. Declare it outside and see what changes.

 

var grStakeHolReg = new GlideRecord('dmn_stakeholder_register'); // declare gliderecord object and insert new records
// retrive array values and populate registry with new records
for(var i = 0; i < addStakeArr.length; i++) 
{	
	grStakeHolReg.initialize();
	grStakeHolReg.setValue('user', addStakeArr[i]);
	grStakeHolReg.insert();
}

Regards, Ivan

View solution in original post

6 REPLIES 6

Ivan Betev
Mega Sage
Mega Sage

Hi @MBarrott ,

 

You are initializing variable grStakeHolReg that is being declared inside the loop. Declare it outside and see what changes.

 

var grStakeHolReg = new GlideRecord('dmn_stakeholder_register'); // declare gliderecord object and insert new records
// retrive array values and populate registry with new records
for(var i = 0; i < addStakeArr.length; i++) 
{	
	grStakeHolReg.initialize();
	grStakeHolReg.setValue('user', addStakeArr[i]);
	grStakeHolReg.insert();
}

Regards, Ivan

Hi @Ivan Betev

 

Thank you! I felt like it was a simple user-error on my part. 

 

Moving the GlideRecord declaration to the top with the other var declare resolved it. 

Hi @Ivan Betev

 

Looks like the same issue is occurring when executing the script on the second attempt, after any changes have taken place. 

 

Again, switching to an entirely new GlideRecord resolves it which is weird to me. 

Hi @MBarrott ,

 

What do you mean by the second attempt, and in general what are you trying to achieve by implementing it this way? Performance?

It's always better to follow a single responsibility principle (SOLID).

Btw. we can also do something like this to optimize a bit:

 

grStakeHolReg.initialize();
grStakeHolReg.addEncodedQuery('sys_class_name=dmn_stakeholder_register^user.active=false');
grStakeHolReg.query();

grStakeHolReg.setValue('active', false); 
grStakeHolReg.updateMultiple();

 

Regards, Ivan