|
![]() |
#1 |
Участник
|
ну, хорошо...
Цитата:
Сообщение от S.Kuskov
![]() Narayana, боюсь окончательно вас запутать, но просто чтобы вы понимали - в аксапте табличные переменные присутствуют ещё с тех времён, когда аксата ещё не была продуктом Microsoft. Поэтому говорить о "традиционности" не приходится.
В аксапте табличная переменная - это больше чем просто recordset Параметры и табличные переменные Допустим, запрос, это самый гибкий механизм выборки данных из базы данных в буфер переменной. Ок. Но, вот ведь какая штука. Произвольного вида запрос мы можем создать только на Х++. Возможности графического конструктора АОТ по этой части сильно ограничены. Моя задача в этом случае (создать вычислимое поле во View) остается нерешенной, потому что, даже построив удовлетворяющий меня запрос в коде Х++, я не могу этот запрос перенести как сохраненный в АОТ. Что в этом случае делать? |
|
![]() |
#2 |
Участник
|
Далеко не произволного. В X++ сильно урезанная реализация SQL. Сложные запросы здесь принято разбивать на несколько вложенных. И под вложенными здесь я имею в виду не подчинённые, а независимые запросы выполняемые для вычисления промежуточного значения. Т.е. многие вещи реализовать "за один запрос" в аксапте просто нельзя.
Цитата:
Цитата:
Друго дело что в вашей формулировке вы и на X++ не сможете получить нужные вам данные "за один запрос". Последний раз редактировалось S.Kuskov; 12.11.2012 в 16:19. |
|
![]() |
#3 |
Участник
|
Цитата:
А как в графическом конструкторе сделать "field3 = mytable.field1 + mytable.field2;" ? Цитата:
Можно ведь результаты выполнеия промежуточного запроса вывести во View... А потом использовать как датасорс для окончательного... ? |
|
![]() |
#4 |
Участник
|
Цитата:
Не уверен, но может если так прямо и написать в значение выражение в скобках... Сейчас попробовал. Получилось ![]() Последний раз редактировалось S.Kuskov; 12.11.2012 в 16:51. |
|
![]() |
#5 |
Axapta
|
Цитата:
Сообщение от S.Kuskov
![]() Амм... Погорячился. Извините. Как реализовать http://www.axaptapedia.com/Expressions_in_query_ranges мышкой в AOT не знаю.
Цитата:
((custTransOpen_1.AccountNum == custTransOpen.AccountNum) && (((custTransOpen_1.AmountCur>0) && (custTransOpen.AmountCur<0)) || ((custTransOpen_1.AmountCur<0) && (custTransOpen.AmountCur>0)))
|
|
|
За это сообщение автора поблагодарили: S.Kuskov (1). |
![]() |
#6 |
Участник
|
Цитата:
Сообщение от 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. |
|
![]() |
#7 |
Участник
|
Цитата:
Narayana, невозможно do something запихнуть в текст SQL запроса. Query, как уже говорилось, не содержит обрабатываемые данные, Query хранит только текст запроса. У него не предусмотренно никаких методов постобработки данных, потому что никакие данные он не обрабатывает. Данные обрабатывает QueryRun. Query только описывает какие данные будут доступны QueryRun'у и к сожалению это описание не предусматривает даже декларативного описания вычисляемых полей, не говоря уже о возможности процедурного вычисления do something. Именно это ограничение я и имел в виду когда говорил о том что многие вещи "за один запрос" не решаются. Стандартных выхода (о которых вам уже в этой ветке не раз говорили) два: 1) либо максимально отсрочить окончательные расчёты и перенести их на сторону интерфейсной части (display-методы) 2) либо, если вычисление требуется не в конце, а в середине процесса сбора данных, создавать вспомогательные таблицы, в которые складировать промежуточный результат. Последний раз редактировалось S.Kuskov; 13.11.2012 в 08:33. |
|
|
За это сообщение автора поблагодарили: lev (3). |
![]() |
#8 |
Участник
|
Цитата:
Сообщение от 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. |
|
![]() |
#9 |
Сенбернар
|
Ну, вот.. обозвали, практически.. земляным червяком
![]() Narayana, Не волнуюсь, нисколько. Инициируемые вами обсуждения (ответы в основном.. не вопросы ![]() Не воспримите как наезд - я бы на вашем месте добавил конкретики к постановке задачи. Пока что у мну есть четкое впечатление, что где-то вы пытаетесь.. впихнуть невпихуемое.. Если нетрудно - напишите, вкратце, что конкретно вы хотите получить в результате, в Axapta. Чем смогу - помогу. Можно в личку ![]()
__________________
Best Regards, Roman |
|
![]() |
#10 |
Участник
|
Цитата:
Сообщение от RVS
![]() Ну, вот.. обозвали, практически.. земляным червяком
![]() Narayana, Не волнуюсь, нисколько. Инициируемые вами обсуждения (ответы в основном.. не вопросы ![]() Не воспримите как наезд - я бы на вашем месте добавил конкретики к постановке задачи. Пока что у мну есть четкое впечатление, что где-то вы пытаетесь.. впихнуть невпихуемое.. Если нетрудно - напишите, вкратце, что конкретно вы хотите получить в результате, в Axapta. Чем смогу - помогу. Можно в личку ![]() Но, если будете обижать маленьких, буду применять "метод упреждающего возмездия" ![]() |
|
Теги |
query, архитектура, как правильно |
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|