![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
SQL. Агрегатные функции [Access]
Bee © (2004-08-08 12:44:00)Добрый день!
База данных Access. Подключение через ADO. Структура БД следующая: главная таблица, содержащая названия фирм и дочерняя со сделками для каждой фирмы. Связь - 1:М по полю FCode.
Мне необходимо, чтобы над каждым полем, содержащим числовые значения, в гриде со сделками высвечивалась сумма.
Использую TDBEdit. Понятно, что при навигации по фирмам меняются записи со сделками, соответственно и суммы.
Запрос имеет следующий вид:
SELECT SUM (MTorgDom) FROM Main WHERE Main.FCode=:FCode;
К сожалению, в поле ничего не показывается, однако если подставить конкретное значение, такое как -
SELECT SUM (MTorgDom) FROM Main WHERE Main.FCode=1; или FCode=2 или 3 и т.д.,
то всё работает отлично.
Замечу, что главная таблица с дочерней соединяется в программе простым запросом:
SELECT *FROM Main WHERE Main.FCode=:FCode;
Так почему же при вычислении суммы запрос не отлавливает связь между таблицами? Может, что-то неверно?
Bee (2004-08-08 22:10:00) [1]:) Это событие AfterScroll - поторопилась....
Большое спасибо за помощь!!
Bee (2004-08-08 22:05:00) [2]Теперь ясно.
Но FCode=10 - эта десятка берётся из главной таблицы.
10. фирма - Adidas (условно). У фирмы Адидас сделки:
10.1. - сделка такая-то
10.2. - сделка вторая
.......
10.n. - сделка n - это записи дочерней таблицы. Связь - один ко многим.
Суммы подсчитываются по полям из дочерней таблицы.
При перемещении на фирму №11 будут новые суммы, т.к. сделки уже другие.
код:
n := form1.ADOQuery1.FieldByName('some_field').Value; (ловим номер текущей фирмы)
form1.ADOQuery2.sql.text:='SELECT SUM (MTorgDom) FROM Main WHERE Main.FCode = '+ n; (записываем значение)
form1.ADOQuery2.open;
Тогда следующий вопрос: в обработчике какого события прописыть этот код? Какое событие возникает при навигации по таблице в гриде?
сергей1 (2004-08-08 15:32:00) [3]может я тоже чего-то непонимаю, но когда ты хочешь подсчитать сумму по определенным полям, тебе в SQL запрос к главной таблице надо подставить значение поля, например WHERE Main.FCode = 10. Подсчитается сумма по строкам в главной таблице, где FCode = 10. Эта десятка берется из дочерней таблицы, когда ты по ней перемещаешься, правильно ? Что-же тебе мешает прочитать эту десятку в переменную и подставить в запрос
n = form1.ADOQuery1.FieldByName('some_field').AsString
form1.ADOQuery2.sql.text:='SELECT SUM (MTorgDom) FROM Main WHERE Main.FCode = '+ n
form1.ADOQuery2.open
sniknik (2004-08-08 14:53:00) [4]> Что-то мысль немного неясна....
думаеш твой вопрос кристально ясен?
подпущу еще немного мути. ;о))
> SELECT *FROM Main WHERE Main.FCode=:FCode;
:FCode это параметр, а не поле для связи. (если делать стандартными методами), если нестандартными то как сделано?
> Зачем мне обращаться к какому-либо полю? Тем более, мне кажется, это можно сделать напрямую через SQL-запрос, не прибегая к коду в
> модуле.
както придется, SQL-запрос выполняется на сервере, мастер детайл (если конечно реч о нем, в чем неуверен) на клиенте, както общатся им нужно...
Bee (2004-08-08 14:29:00) [5]Что-то мысль немного неясна....
Суммы по числовым полям показываются только когда я в запросе подставляю конкретное значение:
SELECT SUM (MTorgDom) FROM Main WHERE Main.FCode=n;
если же делать связь между таблицами, используя по правилу SQL такую запись:
SELECT SUM (MTorgDom) FROM Main WHERE Main.FCode=FCode;
FCode - поле типа счётчик, по которому таблицы связаны, то при перемещении по фирмам ничего не показывается.
Зачем мне обращаться к какому-либо полю? Тем более, мне кажется, это можно сделать напрямую через SQL-запрос, не прибегая к коду в модуле.
сергей1 (2004-08-08 13:45:00) [6]дочерняя таблица получается из запроса TADOQuery ? тогда может лучше использовать это :
form1.ADOQuery1.FieldByName('some_field').AsString
когда перемещаешся по query этот оператор вернет значение текущей строки из поля 'some_field', теперь это значение можно подставить в запрос к главной таблице