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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 12.11.2012, 15:36   #1  
Narayana is offline
Narayana
Участник
 
241 / 100 (4) +++++
Регистрация: 05.01.2009
Адрес: Москва
ну, хорошо...
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Narayana, боюсь окончательно вас запутать, но просто чтобы вы понимали - в аксапте табличные переменные присутствуют ещё с тех времён, когда аксата ещё не была продуктом Microsoft. Поэтому говорить о "традиционности" не приходится.
В аксапте табличная переменная - это больше чем просто recordset
Параметры и табличные переменные
Благодаря вашим подсказкам мне удалось изменить свое представление о табличных переменных до вполне удовлетворительного, но дальше...

Допустим, запрос, это самый гибкий механизм выборки данных из базы данных в буфер переменной. Ок.
Но, вот ведь какая штука.
Произвольного вида запрос мы можем создать только на Х++.
Возможности графического конструктора АОТ по этой части сильно ограничены.

Моя задача в этом случае (создать вычислимое поле во View) остается нерешенной, потому что, даже построив удовлетворяющий меня запрос в коде Х++, я не могу этот запрос перенести как сохраненный в АОТ.

Что в этом случае делать?
Старый 12.11.2012, 16:12   #2  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,449 / 1792 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от Narayana Посмотреть сообщение
Произвольного вида запрос мы можем создать только на Х++.
Далеко не произволного. В X++ сильно урезанная реализация SQL. Сложные запросы здесь принято разбивать на несколько вложенных. И под вложенными здесь я имею в виду не подчинённые, а независимые запросы выполняемые для вычисления промежуточного значения. Т.е. многие вещи реализовать "за один запрос" в аксапте просто нельзя.

Цитата:
Сообщение от Narayana Посмотреть сообщение
Возможности графического конструктора АОТ по этой части сильно ограничены.
Отнюдь.
Цитата:
Сообщение от Narayana Посмотреть сообщение
Моя задача в этом случае (создать вычислимое поле во View) остается нерешенной, потому что, даже построив удовлетворяющий меня запрос в коде Х++, я не могу этот запрос перенести как сохраненный в АОТ.
Любой запрос, который можно построить программно, можно собрать и мышкой в AOT.
Друго дело что в вашей формулировке вы и на X++ не сможете получить нужные вам данные "за один запрос".

Последний раз редактировалось S.Kuskov; 12.11.2012 в 16:19.
Старый 12.11.2012, 16:30   #3  
Narayana is offline
Narayana
Участник
 
241 / 100 (4) +++++
Регистрация: 05.01.2009
Адрес: Москва
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Любой запрос, который можно построить программно, можно собрать и мышкой в AOT.
Это хорошие новости.
А как в графическом конструкторе сделать "field3 = mytable.field1 + mytable.field2;" ?

Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Друго дело что в вашей формулировке вы и на X++ не сможете получить нужные вам данные "за один запрос".
Ну, это, вроде, ничего.
Можно ведь результаты выполнеия промежуточного запроса вывести во View... А потом использовать как датасорс для окончательного... ?
Старый 12.11.2012, 16:35   #4  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,449 / 1792 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от Narayana Посмотреть сообщение
А как в графическом конструкторе сделать "field3 = mytable.field1 + mytable.field2;" ?
Амм... Погорячился. Извините. Как реализовать http://www.axaptapedia.com/Expressions_in_query_ranges мышкой в AOT не знаю.

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

Последний раз редактировалось S.Kuskov; 12.11.2012 в 16:51.
Старый 12.11.2012, 16:45   #5  
oip is offline
oip
Axapta
Лучший по профессии 2014
 
2,564 / 1416 (53) ++++++++
Регистрация: 28.11.2005
Записей в блоге: 1
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Амм... Погорячился. Извините. Как реализовать http://www.axaptapedia.com/Expressions_in_query_ranges мышкой в AOT не знаю.
Не совсем мышкой, конечно.. Например, в одном из запросов в AOT у нас когда-то был сделан следующий фильтр на поле RecId (прям в поле Value прописано):
Цитата:
((custTransOpen_1.AccountNum == custTransOpen.AccountNum) && (((custTransOpen_1.AmountCur>0) && (custTransOpen.AmountCur<0)) || ((custTransOpen_1.AmountCur<0) && (custTransOpen.AmountCur>0)))
За это сообщение автора поблагодарили: S.Kuskov (1).
Старый 12.11.2012, 23:58   #6  
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   #7  
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   #8  
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, 09:41   #9  
RVS is offline
RVS
Сенбернар
Аватар для RVS
Злыдни
 
696 / 130 (6) +++++
Регистрация: 27.02.2003
Адрес: Королев МО
Цитата:
Сообщение от Narayana Посмотреть сообщение
RVS, спокойно, не волнуйтесь...!
Ну, вот.. обозвали, практически.. земляным червяком

Narayana,

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

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

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

Можно в личку
__________________
Best Regards,
Roman
Старый 13.11.2012, 12:48   #10  
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, время: 10:07.