基于比较值

时间:2016-08-02 09:14:11

标签: axapta x++ data-conversion

目前我有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语句开始?

1 个答案:

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