|
![]() |
#1 |
Участник
|
Цитата:
Сообщение от 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. |
|
![]() |
#2 |
Участник
|
Цитата:
Narayana, невозможно do something запихнуть в текст SQL запроса. Query, как уже говорилось, не содержит обрабатываемые данные, Query хранит только текст запроса. У него не предусмотренно никаких методов постобработки данных, потому что никакие данные он не обрабатывает. Данные обрабатывает QueryRun. Query только описывает какие данные будут доступны QueryRun'у и к сожалению это описание не предусматривает даже декларативного описания вычисляемых полей, не говоря уже о возможности процедурного вычисления do something. Именно это ограничение я и имел в виду когда говорил о том что многие вещи "за один запрос" не решаются. Стандартных выхода (о которых вам уже в этой ветке не раз говорили) два: 1) либо максимально отсрочить окончательные расчёты и перенести их на сторону интерфейсной части (display-методы) 2) либо, если вычисление требуется не в конце, а в середине процесса сбора данных, создавать вспомогательные таблицы, в которые складировать промежуточный результат. Последний раз редактировалось S.Kuskov; 13.11.2012 в 08:33. |
|
|
За это сообщение автора поблагодарили: lev (3). |
![]() |
#3 |
Участник
|
Цитата:
Сообщение от 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. |
|
![]() |
#4 |
Участник
|
Цитата:
![]() Внутр цикла вы хотели сказать? Update конечно же можно сделать, но при этом обновится значение в БД, а не только в запросе. Если таблица вспомогательная, а не рабочая то всё вроде бы хорошо. |
|
![]() |
#5 |
Участник
|
Да, конечно, внутри цикла.
Кажется, начинаю понимать, что именно вы считали невозможным, - залезть внутрь процедуры именно выполнения самого запроса. Сорри, детские болезни неустоявшейся лексики ). Цитата:
Только вот, попытка затолкать a.update(); внутрь цикла вызывает ошибку, а если поставить эту штуку после цикла, то говорит, что сначала нужно выбрать запись для обновления... Как быть?! |
|
![]() |
#6 |
Участник
|
Цитата:
X++: QueryBuildDatasource.update(true) X++: ttsbegin; // цикл ttscommit; |
|
![]() |
#7 |
Участник
|
Цитата:
упс опередили Последний раз редактировалось ice; 13.11.2012 в 13:16. |
|
![]() |
#8 |
Участник
|
Цитата:
Сообщение от ice
![]() вам не удалось поставить вычисление внутрь запроса. вам удалось исполнить запрос, и попытаться вычислить значение в цикле по перебору результата исполненного запроса по каждой выбранной строке. а чтобы сохранить изменения, нужно было выбрать строки "для записи" в запросе и в цикле выполнить update строки
упс опередили "Невозможно отредактировать запись в EmplCommissionWageEndBalance (EmplCommissionWageEndBalance). Обновление должно выполняться внутри проводки." Внутри какой проводки? Ниче не понимаю... |
|
![]() |
#9 |
Участник
|
|
|
![]() |
#10 |
Участник
|
Хорошо...
Допустим, вот этот код делает примерно то, что мне нужно, и сохраняет данные в таблице. 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; } А как все это засунуть в АОТ??? |
|
![]() |
#11 |
Сенбернар
|
Ну, вот.. обозвали, практически.. земляным червяком
![]() Narayana, Не волнуюсь, нисколько. Инициируемые вами обсуждения (ответы в основном.. не вопросы ![]() Не воспримите как наезд - я бы на вашем месте добавил конкретики к постановке задачи. Пока что у мну есть четкое впечатление, что где-то вы пытаетесь.. впихнуть невпихуемое.. Если нетрудно - напишите, вкратце, что конкретно вы хотите получить в результате, в Axapta. Чем смогу - помогу. Можно в личку ![]()
__________________
Best Regards, Roman |
|
![]() |
#12 |
Участник
|
Цитата:
Сообщение от RVS
![]() Ну, вот.. обозвали, практически.. земляным червяком
![]() Narayana, Не волнуюсь, нисколько. Инициируемые вами обсуждения (ответы в основном.. не вопросы ![]() Не воспримите как наезд - я бы на вашем месте добавил конкретики к постановке задачи. Пока что у мну есть четкое впечатление, что где-то вы пытаетесь.. впихнуть невпихуемое.. Если нетрудно - напишите, вкратце, что конкретно вы хотите получить в результате, в Axapta. Чем смогу - помогу. Можно в личку ![]() Но, если будете обижать маленьких, буду применять "метод упреждающего возмездия" ![]() |
|
Теги |
query, архитектура, как правильно |
|
|