2016-08-02 2 views
2

В настоящее время у меня есть 3 таблицы.Копировать значения столбца через X ++ на основе сравнения значений

KEV_PackTable KEV_Persons HcmWorkerRecId

Я фазирования из таблицы KEV_Persons, которая в настоящее время имеет соотношение:

Kev_PackTable.PersonId -> KEV_Persons.PersonId

Вместо этой таблицы, я хочу для использования таблицы HcmWorker, создавая отношения: Kev_PackTable.HcmWorker_RecId -> HcmWorker.RecId

Если K EV_PackTable.Personid - это то же значение, что и HcmWorker.PersonnelNumber, затем заполните RecId этой строки в столбце: HcmWorker_RecId в таблице: KEV_PackTable.

Это скорее вопрос запроса, чем вопрос AX2012, но я не могу найти решение для заполнения RecId, когда Personid соответствует значению PersonnelNumber.

Я думаю, что мой SQL заявление должно быть:

UPDATE KEV_PackTable 
SET HcmWorkerRecId = HcmWorker.RecId 
FROM KEV_PackTable 
JOIN HcmWorker 
ON KEV_PackTable.PersonId = HcmWorker.PersonnelNumber 

Как я могу запустить этот запрос в X ++? Я начинаю с предложения select forUpdate?

+1

Не могли бы вы показать нам код/​​запрос, который вы уже пробовали? Я бы скорее помог вам найти проблемы в вашем существующем коде, чем дать вам копию и вставить ответ. –

+0

Конечно! Я редактировал свой оригинальный пост. – user6639789

+2

В вашей таблице (вторая строка) последняя таблица HcmWorkerRecId должна, вероятно, быть HcmWorker, правильно? – DAXaholic

ответ

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 и использования внутренних), который, вероятно, будет ncrease общее время выполнения, но может привести к меньшему количеству заблокированных сеансов.