Показать сообщение отдельно
Старый 02.06.2010, 17:39   #6  
titov is offline
titov
Участник
 
73 / 87 (3) ++++
Регистрация: 23.12.2005
Адрес: Казань
Две ошибки в коде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 - потом во втором цикле - обновление.