Показать сообщение отдельно
Старый 29.07.2011, 18:00   #7  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,715 / 1204 (44) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Ну, тут явная кастомизация сделана. В данном случае, в таблице Currency записаны не коды валют, а коды условных единиц. Причем сделана иерархия. Добавлены следующие поля

Currency.UE - признак того, что данная запись относится к условным единицам
Currency.CurrencyCodeParent - код валюты "родителя". Т.е. той валюты, по отношению к которой следует рассчитывать курс этих самых условных единиц

Задача сводится к тому, чтобы найти курс "родительской" валюты на текущую дату и на ее основе создать (записать) курс условной единицы тоже на текущую дату. Внешний цикл - это просто перебор всех условных единиц.

В принципе, код, вроде бы, рабочий ("корявенько", но работает ), если не считать того, что не проверяется факт существования курса условных единиц на текущую дату. Это значит, что сколько раз запустишь код, столько раз заново и будет создано по еще одной записи с курсами условных единиц на текущую дату.

Или что подразумевается под фразой "он может создать по 2 записи для каждой у.е"?

Если я правильно понял, что надо сделать, то код должен быть примерно таким

X++:
void clicked()
{
    Currency  currency;
    ExchRates exchRates;
    ExchRates exchRatesUE;

    FromDate  fromDate = systemdateget();
    ;

    while select exchRates
        where exchRates.FromDate == fromDate

        join currency
        where   currency.CurrencyCodeParent == exchRates.CurrencyCode
            &&  currency.UE == NoYes::Yes
    {
        // Сначала проверяем тот факт, что курс УЕ на текущую дату уже заведен
        select firstonly exchRatesUE
            where   exchRatesUE.FromDate      == fromDate
                &&  exchRatesUE.CurrencyCode  == currency.CurrencyCode;

        // Если уже есть, то берем следующую запись выборки
        if (exchRatesUE)
        {
            continue;
        }

        // Если нет, то создаем новую запись
        exchRatesUE.clear();
        exchRatesUE.CurrencyCode    = currency.CurrencyCode;
        exchRatesUE.FromDate        = fromDate;
        exchRatesUE.ExchRate        = exchRates.ExchRate * currency.Rate;
        exchRatesUE.insert();

        info(strFmt("Курс %1: %2", exchRatesUE.CurrencyCode, exchRatesUE.ExchRate));

    }   // while select exchRates

    info(strFmt("Формирование курсов УЕ на %1 завершено!", fromDate));
    element.closeCancel();

}
Транзакцию здесь делать не обязательно, поскольку нет "пакета" взаимосвязанных записей. Вставка по одной записи за раз. Впрочем, можно окружить транзакцией весь цикл. Но, в любом случае к "задвоению" транзакция не имеет никакого отношения.
За это сообщение автора поблагодарили: JuniorAx (1).