![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как реализовать поле с суммой значений из другой таблицы? [D5, Paradox]
Morrison © (2004-09-17 17:47:00)Т. е.
Таблица Visits: visitId, date, clientId + serviceSum;
Таблица Services: serviceId, name, price, visitId;
Таблицы связаны по полю VisitId. Поле serviceSum должно содержать сумму значений поля price. Причем подсчет должен осуществляться только для текущей записи таблицы Visits. Поэтому вычилсяемые поля в этом случае не подходят. Я пытался написать собственную процедуру вычиления суммы и запускать ее, когда надо, но Делфи имеет привычку обнулять вычисляемые поля каждый раз, когда должно выполняться событие OnCalcFields. Может есть способ сделать так, чтобы не обнулял? Т. е. просто чтобы было поле, куда я могу записывать все что угодно?
ЮЮ (2004-09-20 03:27:00) [1]1) Запрос
SELECT SUM(Price) Price FROM Services WHERE visitId = :visitId
оформляешь как Detail Query
2) Если суииа нужна в гриде вместе с полями из Visits, то используем вложенный подзапрос: price.sql (текстовый файл в папке с таблицами):
SELECT visitId, SUM(Price) Price FROM Services GROUP BY visitId
Тогда запрос из Visits имее вид:
SELECT Visits.*, Price
FROM
Visits
LEFT JOIN price.sql price ON Visits.visitId = price.visitId
сергей1 (2004-09-18 08:33:00) [2]ой, ошибочка,
>form1.ADOQuery1.SQL.Text:='select visitId, date, clientId + + '+ v + 'from Visits';
читать как
form1.ADOQuery1.SQL.Text:='select visitId, date, clientId + '+ v + 'from Visits';
сергей1 (2004-09-18 08:31:00) [3]не знаю насчет paradoxa, но для MSSQL это делается элементарно.
сначала считаем сумму
form1.ADOQuery2.SQL.Text:='select sum(ServiceSum) as res from Services';
form1.ADOQuery2.Open;
v:=form1.ADOQuery2.FieldByName('res').AsString;
теперь другой query (а можно даже то-же самый использовать) посылает запрос и результат светиться в гриде.
form1.ADOQuery1.SQL.Text:='select visitId, date, clientId + + '+ v + 'from Visits';
form1.ADOQuery1.Open;
все, или я что-то неправильно понял ?
kaif (2004-09-18 00:55:00) [4]Т. е. просто чтобы было поле, куда я могу записывать все что угодно?
Может быть сделать режим CachedUpdates = True и записывть туда все, что угодно?
Хотя я бы все же сделал через SQL-запросили в крайнем случае через OnCalcFields. Почему бы не вычислять много раз? Если не хочется вычислять много раз - можно массив соорудить и там хранить результаты вычислений, а в OnCalcFields только присваивать значение, извлекая из массива (если оно там есть).
Morrison (2004-09-18 00:20:00) [5]И всё же...
Morrison (2004-09-17 18:09:00) [6]Роман Снегирев,
Именно это я и хотел сделать. Но тогда какое поле добавлять в таблицу? Data требует, чтобы поле реально существовало, Calculated -- я уже говорил, Lookup тоже не подходит...
Morrison (2004-09-17 18:03:00) [7]Поле ServiceSum -- это такое поле, которого у меня нет, но которое мне хочется чтобы было :) Поэтому оно приплюсовано. В этом поле должна быть суммы значений price из таблицы Sevices.
Таблица Visits: visitId, date, clientId+ serviceSum;
Роман Снегирев (2004-09-17 18:00:00) [8]а при чем тут вычисляемые поля. Просто напиши процедуру типа "пересчет", в которой беги в цикле по таблице визитс, для каждой записи вычисляй сумму поля price из таблицы Services и присваивай ее значение полю serviceSum текущей записи таблицы Visits (фу, вроде ничего не перепутал)
menart (2004-09-17 17:59:00) [9]напиши устроиство таблиц по подробнее, а то:
> Таблица Visits: visitId, date, clientId + serviceSum;
> Таблица Services: serviceId, name, price, visitId;
не совсем понятно