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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 13.11.2012, 12:51   #1  
Narayana is offline
Narayana
Участник
 
241 / 100 (4) +++++
Регистрация: 05.01.2009
Адрес: Москва
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Верно. Только с одной поправкой. Вычисления эти будут происходить не "во время", а "после" выборки очередной записи в буфер табличной переменной. Они [вычисления] непосредственно над этим выбранным буфером и будут происходить.

Narayana, невозможно do something запихнуть в текст SQL запроса. Query, как уже говорилось, не содержит обрабатываемые данные, Query хранит только текст запроса. У него не предусмотренно никаких методов постобработки данных, потому что никакие данные он не обрабатывает. Данные обрабатывает QueryRun. Query только описывает какие данные будут доступны QueryRun'у и к сожалению это описание не предусматривает даже декларативного описания вычисляемых полей, не говоря уже о возможности процедурного вычисления do something.

Именно это ограничение я и имел в виду когда говорил о том что многие вещи "за один запрос" не решаются.
Стандартных выхода (о которых вам уже в этой ветке не раз говорили) два:
1) либо максимально отсрочить окончательные расчёты и перенести их на сторону интерфейсной части (display-методы)
2) либо, если вычисление требуется не в конце, а в середине процесса сбора данных, создавать вспомогательные таблицы, в которые складировать промежуточный результат.
м-м-м... э-э-э...
А я попробовал сделать вот такой примерчик, дак, вроде бы, в нем удалось запихнуть вычисления внутрь запроса. Только почему-то результаты не сохраняются в поле баланса. Наверное какое-нибудь волшебное слово типа update() надо в правильное место поставить?

X++:
static void Job2(Args _args)
{
Query q;
QueryRun qr;
QueryBuildDatasource qbds1, qbds2;
QueryBuildRange qbr;
EmplCommissionWageEndBalance a;
;
q = new Query();
qbds1 = q.addDataSource(tablenum(EmplCommissionWageEndBalance));
qr = new QueryRun(q);
while(qr.next())
{
a = qr.get(tableNum(EmplCommissionWageEndBalance));
a.EndBalanceMST = a.SumOfAmountMST_In - a.SumOfAmountMST_Out;
print "сотр = ", a.EmplId, " сюда = ", a.SumOfAmountMST_In, " отсюда ", a.SumOfAmountMST_Out, " баланс ", a.EndBalanceMST;
pause;
}
}

Кажется, понятно, почему они вместо переменных для ссылки на таблицы используют системные номера таблиц. Как раз затем, чтобы обойти проблему с областью видимости таблицы...!

Последний раз редактировалось Narayana; 13.11.2012 в 12:55.
Старый 13.11.2012, 13:03   #2  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,443 / 1781 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от Narayana Посмотреть сообщение
м-м-м... э-э-э...
А я попробовал сделать вот такой примерчик, дак, вроде бы, в нем удалось запихнуть вычисления внутрь запроса.
Внутрь запроса?
Внутр цикла вы хотели сказать?
Цитата:
Сообщение от Narayana Посмотреть сообщение
Только почему-то результаты не сохраняются в поле баланса. Наверное какое-нибудь волшебное слово типа update() надо в правильное место поставить?
Update конечно же можно сделать, но при этом обновится значение в БД, а не только в запросе. Если таблица вспомогательная, а не рабочая то всё вроде бы хорошо.
Старый 13.11.2012, 13:10   #3  
Narayana is offline
Narayana
Участник
 
241 / 100 (4) +++++
Регистрация: 05.01.2009
Адрес: Москва
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Внутрь запроса?
Внутр цикла вы хотели сказать?
Да, конечно, внутри цикла.
Кажется, начинаю понимать, что именно вы считали невозможным, - залезть внутрь процедуры именно выполнения самого запроса.
Сорри, детские болезни неустоявшейся лексики ).

Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Update конечно же можно сделать, но при этом обновится значение в БД, а не только в запросе. Если таблица вспомогательная, а не рабочая то всё вроде бы хорошо.
Я уже смирился с тем, чтобы использовать для вычислений не временную, а постоянную таблицу в БД. Можно, наверное, очищать ее перед вычислениями. Особенно, если вычисления делать только по одному сотруднику, который зашел в личный кабинет, на производительность БД никак не должно повлиять.

Только вот, попытка затолкать a.update(); внутрь цикла вызывает ошибку, а если поставить эту штуку после цикла, то говорит, что сначала нужно выбрать запись для обновления... Как быть?!
Старый 13.11.2012, 13:17   #4  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,443 / 1781 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от Narayana Посмотреть сообщение
Только вот, попытка затолкать a.update(); внутрь цикла вызывает ошибку, а если поставить эту штуку после цикла, то говорит, что сначала нужно выбрать запись для обновления... Как быть?!
Нужно выставить флаг
X++:
QueryBuildDatasource.update(true)
и ещё поместить обновление внутрь транзакции
X++:
ttsbegin;
// цикл
ttscommit;
Старый 13.11.2012, 13:07   #5  
ice is offline
ice
Участник
Аватар для ice
Лучший по профессии 2014
 
1,816 / 402 (17) +++++++
Регистрация: 23.03.2006
Цитата:
Сообщение от Narayana Посмотреть сообщение
м-м-м... э-э-э...
А я попробовал сделать вот такой примерчик, дак, вроде бы, в нем удалось запихнуть вычисления внутрь запроса. Только почему-то результаты не сохраняются в поле баланса. Наверное какое-нибудь волшебное слово типа update() надо в правильное место поставить?
вам не удалось поставить вычисление внутрь запроса. вам удалось исполнить запрос, и попытаться вычислить значение в цикле по перебору результата исполненного запроса по каждой выбранной строке. а чтобы сохранить изменения, нужно было выбрать строки "для записи" в запросе и в цикле выполнить update строки и не забыть про транзакцию

упс опередили

Последний раз редактировалось ice; 13.11.2012 в 13:16.
Старый 13.11.2012, 13:20   #6  
Narayana is offline
Narayana
Участник
 
241 / 100 (4) +++++
Регистрация: 05.01.2009
Адрес: Москва
Цитата:
Сообщение от ice Посмотреть сообщение
вам не удалось поставить вычисление внутрь запроса. вам удалось исполнить запрос, и попытаться вычислить значение в цикле по перебору результата исполненного запроса по каждой выбранной строке. а чтобы сохранить изменения, нужно было выбрать строки "для записи" в запросе и в цикле выполнить update строки

упс опередили
Насколько я понимаю, qr.next() в моем случае, это как раз и есть выбор строки, но вызов внутри цикла a.update(); приводит к ошибке
"Невозможно отредактировать запись в EmplCommissionWageEndBalance (EmplCommissionWageEndBalance).
Обновление должно выполняться внутри проводки."

Внутри какой проводки? Ниче не понимаю...
Старый 13.11.2012, 13:21   #7  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,443 / 1781 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от Narayana Посмотреть сообщение
Внутри какой проводки? Ниче не понимаю...
Это так переводчики на русский перевели слово transaction
Старый 13.11.2012, 15:14   #8  
Narayana is offline
Narayana
Участник
 
241 / 100 (4) +++++
Регистрация: 05.01.2009
Адрес: Москва
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Это так переводчики на русский перевели слово transaction
Хорошо...
Допустим, вот этот код делает примерно то, что мне нужно, и сохраняет данные в таблице.

static void Job2(Args _args)
{
Query q;
QueryRun qr;
QueryBuildDatasource qbds1, qbds2;
QueryBuildRange qbr;
EmplCommissionWageEndBalance a;
;
q = new Query();
qbds1 = q.addDataSource(tablenum(EmplCommissionWageEndBalance));
qbds1.update(true);
qr = new QueryRun(q);
ttsbegin;
while(qr.next())
{
a = qr.get(tableNum(EmplCommissionWageEndBalance));
a.EndBalanceMST = a.SumOfAmountMST_In - a.SumOfAmountMST_Out;
a.update();
print "сотр = ", a.EmplId, " сюда = ", a.SumOfAmountMST_In, " отсюда ", a.SumOfAmountMST_Out, " баланс ", a.EndBalanceMST;
pause;
}
ttscommit;
}


А как все это засунуть в АОТ???
Старый 13.11.2012, 15:17   #9  
ice is offline
ice
Участник
Аватар для ice
Лучший по профессии 2014
 
1,816 / 402 (17) +++++++
Регистрация: 23.03.2006
Цитата:
Сообщение от Narayana Посмотреть сообщение

А как все это засунуть в АОТ???
какую часть AOT вы имеете ввиду, тк ваш job уже находится в AOT?
Старый 13.11.2012, 15:24   #10  
Narayana is offline
Narayana
Участник
 
241 / 100 (4) +++++
Регистрация: 05.01.2009
Адрес: Москва
Цитата:
Сообщение от ice Посмотреть сообщение
какую часть AOT вы имеете ввиду, тк ваш job уже находится в AOT?
м-м-м... )

Я имел в виду, если я создам запрос средствами АОТ, а не кода, какой метод нужно перекрыть, чтобы в нем сделать все, что делается в примере в цикле?
Старый 13.11.2012, 15:25   #11  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,443 / 1781 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от Narayana Посмотреть сообщение
А как все это засунуть в АОТ???

Цитата:
Сообщение от Narayana Посмотреть сообщение
Кажется, начинаю понимать, что именно вы считали невозможным
Старый 13.11.2012, 15:28   #12  
Narayana is offline
Narayana
Участник
 
241 / 100 (4) +++++
Регистрация: 05.01.2009
Адрес: Москва
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение



Так все плохо...?
Теги
query, архитектура, как правильно

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Обновление поля с определённым типом во всех таблицах. Corel DAX: Программирование 1 20.12.2008 13:37
Достаточно ли изменить дату в таблицах inventTrans, inventTransPosting, VendPackingSlipJour? DmitryS DAX: Программирование 3 18.09.2008 14:37
Проверки заполненных значений в связанных таблицах. miklenew DAX: База знаний и проекты 11 25.12.2007 14:40
Как не использовать relations на таблицах demetra DAX: Программирование 13 14.07.2006 11:00
Осторожнее с CTRL+S на таблицах mit DAX: Администрирование 7 25.07.2005 19:09

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

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

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