Показать сообщение отдельно
Старый 13.11.2012, 12:51   #60  
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.