|
![]() |
#1 |
Участник
|
Цитата:
Сообщение от 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. |
|
![]() |
#2 |
Участник
|
Цитата:
![]() Внутр цикла вы хотели сказать? Update конечно же можно сделать, но при этом обновится значение в БД, а не только в запросе. Если таблица вспомогательная, а не рабочая то всё вроде бы хорошо. |
|
![]() |
#3 |
Участник
|
Да, конечно, внутри цикла.
Кажется, начинаю понимать, что именно вы считали невозможным, - залезть внутрь процедуры именно выполнения самого запроса. Сорри, детские болезни неустоявшейся лексики ). Цитата:
Только вот, попытка затолкать a.update(); внутрь цикла вызывает ошибку, а если поставить эту штуку после цикла, то говорит, что сначала нужно выбрать запись для обновления... Как быть?! |
|
![]() |
#4 |
Участник
|
Цитата:
X++: QueryBuildDatasource.update(true) X++: ttsbegin; // цикл ttscommit; |
|
![]() |
#5 |
Участник
|
Цитата:
упс опередили Последний раз редактировалось ice; 13.11.2012 в 13:16. |
|
![]() |
#6 |
Участник
|
Цитата:
Сообщение от ice
![]() вам не удалось поставить вычисление внутрь запроса. вам удалось исполнить запрос, и попытаться вычислить значение в цикле по перебору результата исполненного запроса по каждой выбранной строке. а чтобы сохранить изменения, нужно было выбрать строки "для записи" в запросе и в цикле выполнить update строки
упс опередили "Невозможно отредактировать запись в EmplCommissionWageEndBalance (EmplCommissionWageEndBalance). Обновление должно выполняться внутри проводки." Внутри какой проводки? Ниче не понимаю... |
|
![]() |
#7 |
Участник
|
|
|
![]() |
#8 |
Участник
|
Хорошо...
Допустим, вот этот код делает примерно то, что мне нужно, и сохраняет данные в таблице. 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; } А как все это засунуть в АОТ??? |
|
![]() |
#9 |
Участник
|
|
|
![]() |
#10 |
Участник
|
|
|
![]() |
#11 |
Участник
|
|
|
![]() |
#12 |
Участник
|
|
|
Теги |
query, архитектура, как правильно |
|
|