Announcements
I have a piece of code that works 90% the other 10% occasionally it breaks and I receive the "record has never been selected" error. I've checked smmActivities table up and down and while I'm sure there's something I'm missing it just isn't evident to me. Is there something my code is missing? Why does it work sometimes and other times it doesn't?
This code is meant to reassign open activities to a worker when assigned to new territory.
Thanks in advance,
Doug
static void AssignActivitiesByCustomer(Args _args) { CustTable _custTable; smmActivityParentLinkTable _smmActivityParentLinkTable; smmActivities _smmActivities; while select * from _custTable where _custTable.MainContactWorker == HcmWorker::findByPersonnelNumber("000297").RecId { while select * from _smmActivityParentLinkTable where _smmActivityParentLinkTable.RefTableId == 77 && _smmActivityParentLinkTable.RefRecId == _custTable.RecId { _smmActivities = smmActivities::find(_smmActivityParentLinkTable.ActivityNumber, true); if(_smmActivities.Closed == NoYes::No) { if(_custTable.MainContactWorker != _smmActivities.ResponsibleWorker) { _smmActivities.ResponsibleWorker = _custTable.MainContactWorker; _smmActivities.update(); } } } } info("Complete"); }
Thanks for the quick response everyone! Adding the check for existing records allowed me to proceed with the job for this user.
Hi Doug,
Have you checked if you have orphaned records in smmActivityParentLinkTable with non existing activityNumber (you can create non exist join query to check it)? There could be some process that deletes activity without cleaning linkTable and it's causing issues in your code.
As a quick solution, you can check if activity exists, but who know how the system will behave in other processes.
Doug what you can also do is refresh the _smmActivites buffer before you set the reference. There is a bug in X++ on using same buffers for different values in while loops. add line below before line 12
_smmActivities.refresh();
_smmActivities = smmActivities::find(_smmActivityParentLinkTable.ActivityNumber, true);
Hi,
Add a condition to check if _smmActivities exists.
static void AssignActivitiesByCustomer(Args _args) { CustTable _custTable; smmActivityParentLinkTable _smmActivityParentLinkTable; smmActivities _smmActivities; while select * from _custTable where _custTable.MainContactWorker == HcmWorker::findByPersonnelNumber("000297").RecId { while select * from _smmActivityParentLinkTable where _smmActivityParentLinkTable.RefTableId == 77 && _smmActivityParentLinkTable.RefRecId == _custTable.RecId { _smmActivities = smmActivities::find(_smmActivityParentLinkTable.ActivityNumber, true); if(_smmActivities && _smmActivities.Closed == NoYes::No) { if(_custTable.MainContactWorker != _smmActivities.ResponsibleWorker) { _smmActivities.ResponsibleWorker = _custTable.MainContactWorker; _smmActivities.update(); } } } } info("Complete"); }
Hio Doug,
Maybe there are no matching smmActivities records for the times they are failing. You can have a check for that to get rid of this error -
static void AssignActivitiesByCustomer(Args _args) { CustTable _custTable; smmActivityParentLinkTable _smmActivityParentLinkTable; smmActivities _smmActivities; while select * from _custTable where _custTable.MainContactWorker == HcmWorker::findByPersonnelNumber("000297").RecId { while select * from _smmActivityParentLinkTable where _smmActivityParentLinkTable.RefTableId == 77 && _smmActivityParentLinkTable.RefRecId == _custTable.RecId { _smmActivities = smmActivities::find(_smmActivityParentLinkTable.ActivityNumber, true); if(_smmActivities && _smmActivities.Closed == NoYes::No) { if(_custTable.MainContactWorker != _smmActivities.ResponsibleWorker) { _smmActivities.ResponsibleWorker = _custTable.MainContactWorker; _smmActivities.update(); } } } } info("Complete"); }
André Arnaud de Cal...
294,099
Super User 2025 Season 1
Martin Dráb
232,866
Most Valuable Professional
nmaenpaa
101,158
Moderator