Skip to main content
Dynamics 365
  • 3 min read

Troubleshooting Inplace Upgrade Script updateDirDartyRelationshipXDSLegalEntity()


You might recieve the following message when  running the upgrade script Classes\ReleaseUpdateDB62_GABMinor\updateDirDartyRelationshipXDSLegalEntity() during  an inplace upgrade from MS Dynamics AX 2012 R2 to R3:

“Cannot create a record in Party relationships (DirPartyRelationship). Invalid value specified for ‘Expiration:’. It cannot be greater than or equal to the ‘Expiration:’ of the first record.”

One possible background could be unsufficient customer data quality in terms of partly missing data in the field “PartyID”
The following script is a slightly modified version of the standard script updateDirDartyRelationshipXDSLegalEntity(). It loops through the records sequentially instead of block wise and will list records where a PartyID might be missing:

“Microsoft provides programming examples for illustration only, without warranty either expressed or implied, including, but not limited to, the implied warranties of merchantability or fitness for a particular purpose. This blog post  assumes that you are familiar with the X++ programming language that is being demonstrated . Always test the script in test environments first in detail! ”

<<<<<<< 
static void UpdateDirPartyRelationship_Test(Args _args) 
{ 
#DirParty 
HcmWorker worker; 
HcmEmployment employment; 
CompanyInfo companyInfo; 
DirPartyRelationship partyRelationship; 
DirRelationshipTypeId workerTypeId, applicantTypeId, partyInLETypeId; 
utcdatetime validFrom = DateTimeUtil::minValue(), validTo =
DateTimeUtil::maxValue(); 
DirDataAreaId systemDataAreaId = #SystemDataAreaId;
workerTypeId =
DirRelationshipTypeTable::findBySystemType(DirSystemRelationshipType::Worker)
.RelationshipTypeId; 
applicantTypeId =
DirRelationshipTypeTable::findBySystemType(DirSystemRelationshipType::Applica
nt).RelationshipTypeId; 
partyInLETypeId =
DirRelationshipTypeTable::findBySystemType(DirSystemRelationshipType::PartyIn
LE).RelationshipTypeId;
partyRelationship.skipDatabaseLog(true); 
partyRelationship.skipEvents(true); 
partyRelationship.skipDataMethods(true);
info(strFmt("systemDataAreaId: ", systemDataAreaId)); 
info(strFmt("workerTypeId: ", workerTypeId)); 
info(strFmt("applicantTypeId: ", applicantTypeId)); 
info(strFmt("partyInLETypeId: ", partyInLETypeId));
ttsbegin;
// Delete all worker and applicant relationships 
delete_from partyRelationship 
where partyRelationship.RelationshipTypeId == workerTypeId || 
partyRelationship.RelationshipTypeId == applicantTypeId;
info("Finish deleting record in partyRelationship table");
// Insert worker relationships with employment record 
/*insert_recordset 
partyRelationship (RelationshipTypeId, ChildParty, ValidFrom, ValidTo,
LegalEntityDataAreaId) 
select workerTypeId, Person from worker 
join ValidFrom, ValidTo from employment where employment.Worker ==
worker.RecId 
join DataArea from companyInfo where companyInfo.RecId ==
employment.LegalEntity;*/
while select Person from worker 
join ValidFrom, ValidTo from employment where employment.Worker ==
worker.RecId 
join DataArea from companyInfo where companyInfo.RecId ==
employment.LegalEntity 
{ 
  partyRelationship.clear(); 
  partyRelationship.RelationshipTypeId = workerTypeId; 
  partyRelationship.ChildParty = worker.Person; 
  partyRelationship.ValidFrom = employment.ValidFrom; 
  partyRelationship.ValidTo = employment.ValidTo; 
  partyRelationship.LegalEntityDataAreaId = companyInfo.DataArea; 
try 
{ 
partyRelationship.insert(); 
} 
catch(Exception::DuplicateKeyException) 
{ 
  error(strFmt("Duplicated key error on inserting HcmWorker record with recId
%1 and
relationship type %2 with Child Party %3", 
  worker.RecId, workerTypeId, worker.Person)); 
} 
  catch(Exception::UpdateConflict) 
{ 
  error(strFmt("Update conflict error on inserting HcmWorker record with recId
%1 and relationship type %2 with Child Party %3", 
  worker.RecId, workerTypeId, worker.Person)); 
} 
catch(Exception::Error) 
{ 
  error(strFmt("Error on inserting HcmWorker record with recId %1 and
relationship type %2 with Child Party %3", 
  worker.RecId, workerTypeId, worker.Person)); 
} 
}
info("Finish inserting worker relationships with employment record");
// Insert workers without employment records that does not existing party
relationship 
/*insert_recordset 
partyRelationship (RelationshipTypeId, ChildParty, ValidFrom, ValidTo,
LegalEntityDataAreaId) 
select partyInLETypeId, Person, validFrom, validTo, systemDataAreaId from
worker 
notexists join employment 
where employment.Worker == worker.RecId 
notexists join partyRelationship 
where partyRelationship.ChildParty == worker.Person && 
partyRelationship.LegalEntityDataAreaId == systemDataAreaId;*/
while select Person from worker 
notexists join employment 
where employment.Worker == worker.RecId 
notexists join partyRelationship 
where partyRelationship.ChildParty == worker.Person && 
partyRelationship.LegalEntityDataAreaId == systemDataAreaId 
{ 
  partyRelationship.clear(); 
  partyRelationship.RelationshipTypeId = partyInLETypeId; 
  partyRelationship.ChildParty = worker.Person; 
  partyRelationship.ValidFrom = validFrom; 
  partyRelationship.ValidTo = validTo; 
  partyRelationship.LegalEntityDataAreaId = systemDataAreaId; 
try 
{ 
  partyRelationship.insert(); 
} 
catch(Exception::DuplicateKeyException) 
{ 
  error(strFmt("Duplicated key error on inserting HcmWorker record with recId
%1 and relationship type %2 with Child Party %3", 
  worker.RecId, partyInLETypeId, worker.Person)); 
} 
catch(Exception::UpdateConflict) 
{ 
  error(strFmt("Update conflict error on inserting HcmWorker record with recId
%1 and relationship type %2 with Child Party %3", 
  worker.RecId, partyInLETypeId, worker.Person)); 
} 
  catch(Exception::Error) 
{ 
  error(strFmt("Error on inserting HcmWorker record with recId %1
and relationship type %2 with Child Party %3", 
  worker.RecId, partyInLETypeId, worker.Person)); 
} 
}
info("Finish workers without employment records that does not existing party
relationship");
ttsabort;
info("The script finishes without error!"); 
} 
>>>>>>>

Get started with Dynamics 365

Drive more efficiency, reduce costs, and create a hyperconnected business that links people, data, and processes across your organization—enabling every team to quickly adapt and innovate.