基于比较值通过 X++ 复制列值

Copy column values via X++ based on comparing values

目前我有 3 tables.

KEV_PackTable KEV_Persons HcmWorkerRecId

我正在逐步淘汰 KEV_Persons table,它目前有一个关系:

Kev_PackTable.PersonId -> KEV_Persons.PersonId

我想使用 HcmWorker table 而不是这个 table,建立关系: Kev_PackTable.HcmWorker_RecId -> HcmWorker.RecId

如果KEV_PackTable.Personid与HcmWorker.PersonnelNumber的值相同,则在table的HcmWorker_RecId列中填入该行的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 语句开始?

如果我做对了,那么这段代码应该适合你使用 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 并使用内部交易)这可能会增加总执行时间,但可能会导致更少的阻塞会话。