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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 12.11.2012, 23:58   #1  
Narayana is offline
Narayana
Участник
 
241 / 100 (4) +++++
Регистрация: 05.01.2009
Адрес: Москва
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Амм... Погорячился. Извините. Как реализовать http://www.axaptapedia.com/Expressions_in_query_ranges мышкой в AOT не знаю.

Не уверен, но может если так прямо и написать в значение выражение в скобках...
Сейчас попробовал. Получилось
Угумс, понятно.

Если можно, прошу вас прояснить еще один момент.

Вот, допустим, у нас есть запрос произвольной форме, написанный на Х++, в котором в цикле с помощью метода next() из класса QueryRun выбираются записи какой-то таблицы.

qr = new QueryRun(q);
while(qr.next())
{
//do something

}


Наверное, для того, чтобы производить вычисления в полях таблицы во время выборки ее записей в буфер табличной переменной, правильно эти вычисления подставлять вместо //do something.

А если мы строим запрос в АОТе?
В коде мы объявили переменную qr для запроса.
Но в АОТе-то мы никаких переменных при построении запроса не объявляли.

Нам что, нужно перекрыть какой-нибудь метод запроса, чтобы произвести вычисления так же, как в коде Х++?
А какой тогда?
Но, для того, чтобы вызвать метод, нам еще и переменную нужно объявить, но переменная с произвольным именем, вроде бы, должна быть новым экземпляром класса и при этом, скорее всего, отличным от того экзепляра, который был создан в АОТ и названия переменной которого мы не знаем...

RVS, спокойно, не волнуйтесь...!

Последний раз редактировалось Narayana; 13.11.2012 в 00:03.
Старый 13.11.2012, 08:10   #2  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,449 / 1792 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от Narayana Посмотреть сообщение
Наверное, для того, чтобы производить вычисления в полях таблицы во время выборки ее записей в буфер табличной переменной, правильно эти вычисления подставлять вместо //do something.
Верно. Только с одной поправкой. Вычисления эти будут происходить не "во время", а "после" выборки очередной записи в буфер табличной переменной. Они [вычисления] непосредственно над этим выбранным буфером и будут происходить.
Цитата:
Сообщение от Narayana Посмотреть сообщение
А если мы строим запрос в АОТе?
Narayana, невозможно do something запихнуть в текст SQL запроса. Query, как уже говорилось, не содержит обрабатываемые данные, Query хранит только текст запроса. У него не предусмотренно никаких методов постобработки данных, потому что никакие данные он не обрабатывает. Данные обрабатывает QueryRun. Query только описывает какие данные будут доступны QueryRun'у и к сожалению это описание не предусматривает даже декларативного описания вычисляемых полей, не говоря уже о возможности процедурного вычисления do something.

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

Последний раз редактировалось S.Kuskov; 13.11.2012 в 08:33.
За это сообщение автора поблагодарили: lev (3).
Старый 13.11.2012, 12:51   #3  
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   #4  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,449 / 1792 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от Narayana Посмотреть сообщение
м-м-м... э-э-э...
А я попробовал сделать вот такой примерчик, дак, вроде бы, в нем удалось запихнуть вычисления внутрь запроса.
Внутрь запроса?
Внутр цикла вы хотели сказать?
Цитата:
Сообщение от Narayana Посмотреть сообщение
Только почему-то результаты не сохраняются в поле баланса. Наверное какое-нибудь волшебное слово типа update() надо в правильное место поставить?
Update конечно же можно сделать, но при этом обновится значение в БД, а не только в запросе. Если таблица вспомогательная, а не рабочая то всё вроде бы хорошо.
Старый 13.11.2012, 13:10   #5  
Narayana is offline
Narayana
Участник
 
241 / 100 (4) +++++
Регистрация: 05.01.2009
Адрес: Москва
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Внутрь запроса?
Внутр цикла вы хотели сказать?
Да, конечно, внутри цикла.
Кажется, начинаю понимать, что именно вы считали невозможным, - залезть внутрь процедуры именно выполнения самого запроса.
Сорри, детские болезни неустоявшейся лексики ).

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

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

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

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

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

Внутри какой проводки? Ниче не понимаю...
Старый 13.11.2012, 13:21   #9  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,449 / 1792 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от Narayana Посмотреть сообщение
Внутри какой проводки? Ниче не понимаю...
Это так переводчики на русский перевели слово transaction
Старый 13.11.2012, 15:14   #10  
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, 09:41   #11  
RVS is offline
RVS
Сенбернар
Аватар для RVS
Злыдни
 
696 / 130 (6) +++++
Регистрация: 27.02.2003
Адрес: Королев МО
Цитата:
Сообщение от Narayana Посмотреть сообщение
RVS, спокойно, не волнуйтесь...!
Ну, вот.. обозвали, практически.. земляным червяком

Narayana,

Не волнуюсь, нисколько. Инициируемые вами обсуждения (ответы в основном.. не вопросы ) очень интересно читать.

Не воспримите как наезд - я бы на вашем месте добавил конкретики к постановке задачи. Пока что у мну есть четкое впечатление, что где-то вы пытаетесь.. впихнуть невпихуемое..

Если нетрудно - напишите, вкратце, что конкретно вы хотите получить в результате, в Axapta. Чем смогу - помогу.

Можно в личку
__________________
Best Regards,
Roman
Старый 13.11.2012, 12:48   #12  
Narayana is offline
Narayana
Участник
 
241 / 100 (4) +++++
Регистрация: 05.01.2009
Адрес: Москва
Цитата:
Сообщение от RVS Посмотреть сообщение
Ну, вот.. обозвали, практически.. земляным червяком

Narayana,

Не волнуюсь, нисколько. Инициируемые вами обсуждения (ответы в основном.. не вопросы ) очень интересно читать.

Не воспримите как наезд - я бы на вашем месте добавил конкретики к постановке задачи. Пока что у мну есть четкое впечатление, что где-то вы пытаетесь.. впихнуть невпихуемое..

Если нетрудно - напишите, вкратце, что конкретно вы хотите получить в результате, в Axapta. Чем смогу - помогу.

Можно в личку
Да, я че? Я ничо...!
Но, если будете обижать маленьких, буду применять "метод упреждающего возмездия"
Теги
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, время: 02:56.