目前我有3张桌子。
KEV_PackTable KEV_Persons HcmWorkerRecId
我正在逐步淘汰KEV_Persons表,该表目前有一个关系:
Kev_PackTable.PersonId - > KEV_Persons.PersonId
而不是这个表,我想使用HcmWorker表,建立一个关系: Kev_PackTable.HcmWorker_RecId - > HcmWorker.RecId
如果KEV_PackTable.Personid与HcmWorker.PersonnelNumber的值相同,则将该行的RecId填入列中:HcmWorker_RecId在表中:KEV_PackTable。
这是一个查询问题而不是AX2012问题,但是当Personid与PersonnelNumber值匹配时,我找不到填写RecId的解决方案。
我认为我的SQL语句必须是:
UPDATE KEV_PackTable
SET HcmWorkerRecId = HcmWorker.RecId
FROM KEV_PackTable
JOIN HcmWorker
ON KEV_PackTable.PersonId = HcmWorker.PersonnelNumber
如何在X ++中运行此查询?我是否从select forUpdate语句开始?
答案 0 :(得分:3)
如果我把所有内容都搞定了,那么此代码应该可以使用update_recordset为您服务,以便您有机会执行批量更新
KEV_PackTable packTable;
HcmWorker hcmWorker;
;
update_recordset packTable
setting HcmWorkerRecId = hcmWorker.RecId
join firstOnly RecId from hcmWorker
where hcmWorker.PersonnelNumber == packTable.PersonId;
另一种解决方案是使用while select forUpdate
,如此
KEV_PackTable packTable;
HcmWorker hcmWorker;
;
ttsbegin;
while select forUpdate packTable
join firstOnly RecId from hcmWorker
where hcmWorker.PersonnelNumber == packTable.PersonId
{
// ttsbegin;
packTable.HcmWorkerRecId = hcmWorker.RecId;
packTable.update();
// ttscommit;
}
ttscommit;
有了这个,您可以 - 根据您的需要 - 切换到多个较小的事务(通过注释掉外部ttsbegin
/ ttscommit
并使用内部事务),这可能会增加总执行时间,但可能会减少被阻止的会话。