Как я могу контролировать повторяющиеся строки во временной таблице в Ax 2009?
Я вставляю записи во временную таблицу в запросе выбора времени. Мне нужно контролировать, если я добавлю запись раньше, возможно ли это?
3 ответа
Решение
Используйте метод setTmpData для второго буфера того же типа
Пример:
SomeTable someTable;
TmpTable tmpTable;
TmpTable tmpTableCheck;
// Use tmpTable as primary data set, and tmpTableCheck to check for duplicates
while select someTable
{
tmpTable.initFromSomeTable(someTable);
// Check if key is already used.
tmpTableCheck.setTmpData(tmpTable);
select firstOnly tmpTableCheck
where tmpTableCheck.Key == tmpTable.Key;
// Only insert record in tmpTable if the key has not been used before.
if (! tmpTableCheck)
{
tmpTable.insert();
}
}
Если у вас есть уникальный индекс, вы можете уловить проблему:
SysInfoLogLevel prevLevel = infolog.infologLevel()
try
{
infolog.setInfoLogLevel(SysInfoLogLevel::None);
whatever.insert();
infolog.setInfoLogLevel(prevLevel);
}
catch (Exception::DuplicateKeyException)
{
infolog.setInfoLogLevel(prevLevel);
}
Просто проверьте запись, прежде чем вызывать процесс вставки.
//Build query above
while (qr.next())
{
SourceTable = qr.get(tablenum(SourceTable));
select DestTable
where DestTable.Field1 == SourceTable.Field1; //Replace with criteria that determines if records are the same
if (!DestTable)
{
DestTable.Field1 = SourceTable.Field1;
DestTable.Field2 = SourceTable.Field2;
DestTable.Field3 = SourceTable.Field3;
DestTable.Insert();
}
}
//Once processing is finished
if (element.prompt())
{
while select DestTable
{
element.send(DestTable);
}
}
else
{
return false;
}
По сути, попробуйте выбрать запись, которая будет соответствовать тому, что будет вставлено. Если записи не возвращаются, вставьте их. В противном случае он просто переходит к следующей записи.