Две ошибки в коде1. markupTransNew.data(markupTrans); - после такой команды надо сделать markupTransNew.recid = 0; - это мелочь, но советую эту команду применять наравне с markupTransNew.clear();2. Зацикливание неизбежно. Условие выборки включает вновь создаваемые записи. Можно конечно ловить новые записи разными ухищрениями, но лучше делать по рекомендациям поставщика программы - см ниже
X++:
void copyBOM(BOMId _FromBOM, BOMId _ToBOM)
{
RecordInsertList BOMList;
BOM BOM, newBOM;
;
BOMList = new RecordInsertList(tableNum(BOM));
while select BOM where BOM.BOMId == _FromBOM
{
newBOM.data(BOM);
newBOM.BOMId = _ToBOM;
BOMList.add(newBOM);
}
BOMList.insertDatabase();
}
И еще совет - если внутри цикла по курсору идет обновление, удаление, запись по той же самой таблице, что присутствет в выборке (select, query) всегда создавать массив (например приведенный класс, класс MAP, SET (аккуратно - это ссылки а не сами записи) ) и только после выхода из цикла выполнить комит в базе - просто, но надежно защитит вас в будущем от непонятных глюков. Еще на многих таблицах есть метод findRecid - это еще один вариант - идем по циклу выборки для чтения - в контейнер recid и newValue - потом во втором цикле - обновление.