Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.10.2016, 02:32   #1
delphi159
Подтвердите свой е-майл
 
Регистрация: 27.01.2015
Сообщений: 28
По умолчанию Как суммировать Calculated поле в агрегатное

делается накладная прихода.
DBGrid>DataSource>IBDataset

Есть Calculated поле ("DedVat") в котором получаю ндс(18% от цены закупки) в процедуре CalcFields(DataSet: TDataSet).

Нужно получить итог умножения DedVat на количество в LabelDedVat(сумма ндс).
Для этого создаю аггрегатное поле AggrVat.
В NewField выбираю: type Aggregate, FieldType-calculated.
В expression аггрегатного поля AggrVat пишу: SUM(RS*DEDVAT)- количество прихода умножить на ндс товара.

Код:
procedure TFsem.QrecsCalcFields(DataSet: TDataSet);
begin

QrecsDedVat.AsFloat:=(QrecsFsl2.AsFloat*18/118)*10;  
LabelDedvat.Caption:=VarToStr(QrecsAggrVat.Value);
end;
Но AggrVat не получает значение: AggrVat.Value=Null.
Изображения
Тип файла: jpg Screenshot_1.jpg (79.5 Кб, 134 просмотров)
delphi159 вне форума Ответить с цитированием
Старый 13.10.2016, 10:34   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Для ClientDataSet вычисляемое поле для того, что бы агрегатное его съело нужно объявлять fkInternalCalc вместо fkCalculated. Может и для IBDataset чего-то в этом духе есть?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 13.10.2016, 11:43   #3
xxbesoxx
Участник клуба
 
Регистрация: 10.08.2010
Сообщений: 1,389
По умолчанию

если вычислять всё на SQL запросе в SELECT-е и компилировать его на сервере как "view представление" и это "представление" вызвать потом как такблица SELECT-е
xxbesoxx вне форума Ответить с цитированием
Старый 13.10.2016, 11:46   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

И зачем, если агрегатные поля предоставляют возможно подбивать итоги по полю. Или по группам записей в соответствии с индексом, по-крайней мере в ClientDataSet и родственниках это можно. А вычисляемое конечно можно и запросом сделать
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 13.10.2016, 12:03   #5
xxbesoxx
Участник клуба
 
Регистрация: 10.08.2010
Сообщений: 1,389
По умолчанию

Цитата:
И зачем, если агрегатные поля предоставляют возможно подбивать итоги по полю.
Аватар Я так думаю, преимущество в том что
1) Лучше вычилять все на сервере и вызвать резултать ! чем из клиентское приложение
2) Можеть через некоторый время работодатель захочет уже НЕ (18% от цены закупки) А (25% от цены закупки) или 11% что бы не компилировать программа и не менять .exe файл везде "если ешё программа многопользовательски"
3) Для сопровождение проекта я думаю что все (вычисление поля) компилировать на сервере !
Это я так думаю ! не спорю ! и не забиваю что МНОГО ЧЕГО НАУЧИЛ ОТ ВАС
xxbesoxx вне форума Ответить с цитированием
Старый 13.10.2016, 12:38   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Вообще-то все в разумных пределах нужно делать. Запросом удобней и, возможно предпочтительней, и код клиента короче, но с вычисляемыми полями запрос или представление дольше работает и трафик сетевой увеличивает. Да и не всякое вычисляемое поле на сервере можно эффективно вычислить
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 13.10.2016, 12:39   #7
delphi159
Подтвердите свой е-майл
 
Регистрация: 27.01.2015
Сообщений: 28
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Для ClientDataSet вычисляемое поле для того, что бы агрегатное его съело нужно объявлять fkInternalCalc вместо fkCalculated. Может и для IBDataset чего-то в этом духе есть?
Захотел поменять fkCalculated на fkInternalCalc в инспекторе но ругается: QrecsDEDVAT: Invalid field kind!

Последний раз редактировалось delphi159; 13.10.2016 в 12:44.
delphi159 вне форума Ответить с цитированием
Старый 13.10.2016, 12:43   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Нельзя fkCalculated на fkAggregate менять, это совершенно разное. Речь шла о замене fkCalculated на fkInternalCalc. Если еще для этого датасета это прокатит

ЗЫ вижу подправил сообщение, значит не прокатит. Сделай в запросе вычисляемое поле как xxbesoxx подсказывает и не парься

еще ЗЫ - а в самом датасете есть свойство для активизации агрегатных полей. чего-то типа AggregatesActive?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 13.10.2016 в 12:52.
Аватар вне форума Ответить с цитированием
Старый 13.10.2016, 14:35   #9
delphi159
Подтвердите свой е-майл
 
Регистрация: 27.01.2015
Сообщений: 28
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
а в самом датасете есть свойство для активизации агрегатных полей. чего-то типа AggregatesActive?
В самом датасете нет такое свойство. Есть только Active у агрегатного поля. Установил Active в true но ...


Цитата:
Сообщение от xxbesoxx
если вычислять всё на SQL запросе в SELECT-е и компилировать его на сервере как "view представление" и это "представление" вызвать потом как таблица SELECT-е
Дело в том, что в бд записываю записи прихода, там есть поле "цена прихода вместе ндс".
я хочу:
1) цену без ндс-а и сам ндс хранить не в бд, а вычислять в calculated полях и отобразить в DBGrid-е.
2) суммировать вычисляемые значения calculated поля "ндс" каждой записи и в Label получать общую сумму ндс-а(количество товара*ндс).

Не могу понять как написать параметризированный запрос, посколько тогда в while цикле надо перебирать записи датасета и проверять первый товарь облагается или нет ндс-ом и так до конца. Тогда while цикл для, например, 1000 записей будеть работать медленно!
delphi159 вне форума Ответить с цитированием
Старый 13.10.2016, 17:47   #10
xxbesoxx
Участник клуба
 
Регистрация: 10.08.2010
Сообщений: 1,389
По умолчанию

Цитата:
Не могу понять как написать параметризированный запрос, посколько тогда в while цикле
Я не магу понять причем тут в месте (параметризированный запрос while цикле) если все можно в SELECT написат CASE WHEN.... THEN

Последний раз редактировалось xxbesoxx; 13.10.2016 в 18:30.
xxbesoxx вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как суммировать 7 книг в 8 ? Xp_Dron Microsoft Office Excel 5 24.12.2013 18:24
как суммировать в db grid deadneoo Компоненты Delphi 0 01.05.2010 15:41
Си. Как суммировать элементы массива? dma Помощь студентам 2 06.12.2008 17:11
как суммировать только определенный месяц? Алька Microsoft Office Excel 2 08.05.2007 08:50