AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 28.07.2011, 11:50   #1  
JuniorAx is offline
JuniorAx
Участник
 
134 / 20 (1) +++
Регистрация: 20.07.2011
Адрес: Санкт-Петербург
Работа с транзакциями
Здраствуйте! Помогите разобраться в чем дело!
X++:
 real     sumEur, sumUsd,Coef;
    date     dt = systemdateget();// <-ïîëó÷àåì ñåãîäíÿøíóþ äàòó
    str      Eur, Usd, stVal;


    while select cur // Âûáèðàåì âàëþòû êîò. ÿâë óñëîâíûìè åäèíèöàìè
    where cur.UE == NoYes::Yes
     {
       stVal = cur.CurrencyCode; // Çàïîìèíàåì íàèìåíîâàíèå âàëþòû
       Coef  = cur.rate; // Çàïîìèíàåì êîýôôèöèåíò
       select excR
       where  excR.CurrencyCode == cur.CurrencyCodeParent
              && excR.FromDate == dt;
        {
           if (excR.CurrencyCode == enum2str(CurrencyUECod::EURcod))
           {
            sumEur = excR.ExchRate * Coef;
            ttsbegin;
            excR.FromDate = dt;
            excR.ExchRate = sumEur;
            excR.CurrencyCode = stVal;
            excR.insert();
            ttscommit;
           }
            else
             if (excR.CurrencyCode == enum2str(CurrencyUECod::USDcod))
            {
             sumUsd = excR.ExchRate * Coef;
             ttsbegin;
             excR.FromDate = dt;
             excR.ExchRate = sumUsd;
             excR.CurrencyCode = stVal;
             excR.insert();
             ttscommit;
            }
Вообщем почему когда я запускаю этот код, он в первый раз выводит по одной строке каждой усл. един. (допустим на сегодня), при последующих щапусках он выдает по 2 строки на каждую усл.ед. P.S. валют всего 2 т.е. на каждый должно быть по одной строке! Может я допускаю какуюто ошибку в работе с транзакциями??? Спасибо!
Старый 29.07.2011, 11:05   #2  
AlGol is offline
AlGol
Участник
 
277 / 93 (4) ++++
Регистрация: 24.12.2001
Адрес: Тверь.
Этот код даже не компилируется.
Неясно же что за табличные переменные ты используешь и что у тебя после него входит в цикл.
А уж если нормально его отформатируешь с отступами и пр. может кто-то даже и ответит...
__________________
Ален ноби, ностра алис.
Что означает - если один человек построил, другой завсегда разобрать может.
Старый 29.07.2011, 11:19   #3  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Судя по кракозябрам у вас ax3.0
совет: переключайтесь в русский язык ПЕРЕД копированием в буфер обмена, чтобы сохранить русский текст неизменным.

Очень подозрительным выглядит этот участок кода.
Цитата:
Сообщение от JuniorAx Посмотреть сообщение
select excR
where excR.CurrencyCode == cur.CurrencyCodeParent
&& excR.FromDate == dt;
{
С чего это после точки запятой идет открывающая фигурная?
скорее всего, были какие-то правки.

Что касается кода вообще, то вот как он переводится на человеческий:
1. перебрать ВСЕ валюты, удовлетворяющие условию
2. выбрать ОДИН курс, удовлетворяющий условию
3. если курс выбран И его код равен некоему enumstr(!!!!!!)
3.1. то ДОБАВИТЬ еще один курс
... и так далее

Во-первых, по смыслу - вы ДОБАВЛЯЕТЕ курс, если он УЖЕ ЕСТЬ.
Поэтому во втором проходе получаете ДВА курса.
Аксапточка сделала ровно то, что ей сказали.

Во-вторых, по стилю - сравнивать CurrencyCode с EnumStr - предельно некорректно. Прежде всего потому, что Аксапта может работать с разными языками и никто не гарантирует, что enumstr в разных языках будут одинаковыми. НИКОГДА так не делайте. Заведите строковые параметры в таблице параметров.
__________________
полезное на axForum, github, vk, coub.
Старый 29.07.2011, 15:31   #4  
JuniorAx is offline
JuniorAx
Участник
 
134 / 20 (1) +++
Регистрация: 20.07.2011
Адрес: Санкт-Петербург
Здраствуйте! Спасибо что обратили внимание! На счет Axapta 3.0 вы правы! А алгоритм работы следующий:
->Заходим в Currency, ищем валюты у кот. есть признак у.е. и от какой валюты они считаются и запоминаем коеффициент
->Заходим в ExchRates, там находим валюту и ее значение на сегодняшний день (т.к. предполагается что курсы валют грузятся до работы этого кода)
->Потом через if делаются записи, валюты всего 2 поэтому 2 транзакции.
Не понятно почему если я один раз запускаю код, он может создать по 2 записи для каждой у.е.??? Ниже приведу нормальный листинг с коментариями и отступами.
Старый 29.07.2011, 15:35   #5  
JuniorAx is offline
JuniorAx
Участник
 
134 / 20 (1) +++
Регистрация: 20.07.2011
Адрес: Санкт-Петербург
X++:
void clicked()
{
    Currency  cur;
    ExchRates excR, excRval;

    real     sumEur, sumUsd,Coef;
    date     dt = systemdateget();// <-получаем сегодняшную дату
    str      Eur, Usd, stVal, StrDt;

    StrDt = Date2Str(dt,2,2,2,2,2,4);
    while select cur // Выбираем валюты кот. явл условными единицами
    where cur.UE == NoYes::Yes
     {
       stVal = cur.CurrencyCode; // Запоминаем наименование валюты напр. YEEUR
       Coef  = cur.rate; // Запоминаем коэффициент
       select excR
       where  excR.CurrencyCode == cur.CurrencyCodeParent
              && excR.FromDate == dt;
        {
           if (excR.CurrencyCode == enum2str(CurrencyUECod::EURcod))
           {
            sumEur = excR.ExchRate * Coef;
            ttsbegin;
            excR.FromDate = dt;
            excR.ExchRate = sumEur;
            excR.CurrencyCode = stVal;
            excR.insert();
            ttscommit;
           }
            else
             if (excR.CurrencyCode == enum2str(CurrencyUECod::USDcod))
            {
             sumUsd = excR.ExchRate * Coef;
             ttsbegin;
             excR.FromDate = dt;
             excR.ExchRate = sumUsd;
             excR.CurrencyCode = stVal;
             excR.insert();
             ttscommit;
            }
        }
     }
    element.closeCancel();
    info(strfmt("На: %1", StrDt));
    info("Курсы у.е. успешно расчитаны");
    info(strfmt("Курс YEEUR: %1", sumEur));
    info(strfmt("Курс YEUSD: %1", sumUsd));
}
Если убрать ; там где она вас смущает, то выдает ошибку!!
Старый 29.07.2011, 16:11   #6  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от JuniorAx Посмотреть сообщение
Если убрать ; там где она вас смущает, то выдает ошибку!!
понятно почему вы поставили точку с запятой.
непонятно почему вы не убрали фигурную скобку - по синаксису ее здесь не должно быть.
но если бы выше было "while select excR", то фигурная скобка обязательна, а точка с запятой была бы лишней.

вы определитесь что именно у вас лишнее.

==============
Цитата:
Сообщение от JuniorAx Посмотреть сообщение
->Потом через if делаются записи
Что значит "делаются записи"?
записи могут: insert, update, delete. Что именно вы подразумеваете под словом "делаются"

Пожалуйста, пока не постите в эту ветку ваш код - на него просто физически больно смотреть.

Сформулируйте на простом и родном для вас языке - что именно вы хотите получить в результате. Пожалуйста, не надо в стиле "акына" - заходим, запоминаем, делаем. А именно каков ожидаемый результат?
__________________
полезное на axForum, github, vk, coub.
Старый 29.07.2011, 18:00   #7  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 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).
Старый 29.07.2011, 20:37   #8  
JuniorAx is offline
JuniorAx
Участник
 
134 / 20 (1) +++
Регистрация: 20.07.2011
Адрес: Санкт-Петербург
Спасибо большое всем за помощь! Изначально надо было четко сформулировать конечную цель)))) А по поводу двойного inserta, я проверяю работу кода так: изменяю системную дату, завожу в таблице курсы валют на эту дату, и запускаю процедуру! и допустим на сегодня создалось всего 2 записи (т.к. валют 2 YEEUR и YEUSD), а допустим меняю сист. дату на завтра и запускаю выдает по 2 записи для каждой у.е. - вот сама проблема!!!)))) У меня есть не большая просьба к участникам скинуть какую нибудь ссылку на то как запихнуть мне это в пакетную обработку??? Я читаю несколько книг по Axapta, и все что я нашел так это то, что надо создать наследник класса RunBaseBath и т.д, но не одного примера пока ни видел, тяжело опираться только на теорию! Спасибо
Старый 29.07.2011, 20:53   #9  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от JuniorAx Посмотреть сообщение
Я читаю несколько книг по Axapta, и все что я нашел так это то, что надо создать наследник класса RunBaseBath и т.д, но не одного примера пока ни видел
Classes\Tutorial_RunbaseBatch
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
функционал Работа с документами и создание договора в Word GM2005 DAX: Функционал 5 28.09.2009 14:49
Доступ к меню "Работа с документами" Kuat DAX: Администрирование 4 16.11.2007 17:07
Совместная работа заказчика и исполнителя в разных или одном слое? Кузин Владимир В. DAX: Программирование 6 08.08.2006 10:02
Работа с главным меню в Axapta Alexey DAX: Программирование 0 04.01.2002 23:31

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 15:05.