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

Axapta 通过X+复制列值+;基于比较值,axapta,x++,data-conversion,Axapta,X++,Data Conversion,目前我有3张桌子 可包装的 KEV_人 HcmWorkerRecId 我正在逐步淘汰KEV_人员表,该表目前与以下内容有关: Kev_PackTable.PersonId->Kev_Persons.PersonId 我想使用HcmWorker表来代替此表,建立一个关系: Kev_PackTable.HcmWorker_RecId->HcmWorker.RecId 如果KEV_PackTable.Personid与HcmWorker.PersonnelNumber的值相同,则将该行的RecId填入

目前我有3张桌子

可包装的 KEV_人 HcmWorkerRecId

我正在逐步淘汰KEV_人员表,该表目前与以下内容有关:

Kev_PackTable.PersonId->Kev_Persons.PersonId

我想使用HcmWorker表来代替此表,建立一个关系: Kev_PackTable.HcmWorker_RecId->HcmWorker.RecId

如果KEV_PackTable.Personid与HcmWorker.PersonnelNumber的值相同,则将该行的RecId填入表:KEV_PackTable中的:HcmWorker_RecId列中

与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语句开始的吗?

如果一切都正确,那么这段代码应该适合您使用,这样您就有机会执行批量更新

KEV_PackTable packTable;
HcmWorker     hcmWorker;
;

update_recordset packTable
    setting HcmWorkerRecId = hcmWorker.RecId
    join firstOnly RecId from hcmWorker
        where hcmWorker.PersonnelNumber == packTable.PersonId;
另一种解决方案是在选择更新时使用
,就像这样

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
,并使用内部事务),这可能会增加总执行时间,但可能会减少阻塞的会话。

您能否向我们展示您迄今为止尝试的代码/查询?我宁愿帮助您找到现有代码中的问题,也不愿给您一个复制粘贴的答案。当然!我已经编辑了我的原始帖子。在您的表列表(第2行)中,最后一个表hcmworkerCID应该是HcmWorker,对吗?