Harry
Команда клуба
Offline
|
|
« Ответ #30 : 05-04-2005 08:26 » |
|
ОРГАНИЗАЦИЯ БД: две таблицы - People и Vznosi. Связь по полю PeopleCode как один ко многим (один человек-много выплат) ИНТЕРФЕЙС: основная форма - представлена в виде таблицы пиплов, переходим на любого, клацаем кнопку Форма, заходим в форму конкретного пипла. В этой форме таблица выплат этого конкретного пипла и общая сумма по пиплу. Запрос в виде, который дал HandKot приводит к ошибке, говорит, что нет поля Sum(Summa). Неясно, глюк это парадокса или просто нужно писать по другому. По идее, высчитываемое поле должно отображаться в списке полей....
|
|
|
Записан
|
Слабый пол силен в силу слабости сильного пола к слабому
|
|
|
Harry
Команда клуба
Offline
|
|
« Ответ #31 : 05-04-2005 08:46 » |
|
SELECT People.*, (SELECT Sum(Vznosi."Summa") FROM "Vznosi.DB" Vznosi WHERE Vznosi."PeopleCode"=People."PeopleCode") FROM "People.DB" People
Вот этот запрос. Он выдает ошибку, говорит не найдено поле Sum(Summa). Действительно, в выпадающем списке доступных полей его нет. Т.е. второй Select не выполняется.
|
|
|
Записан
|
Слабый пол силен в силу слабости сильного пола к слабому
|
|
|
HandKot
Молодой специалист
Offline
|
|
« Ответ #32 : 05-04-2005 09:55 » |
|
Harry, вылож на форум структуры таблиц, всеж легче будет
|
|
|
Записан
|
I Have Nine Lives You Have One Only THINK!
|
|
|
HandKot
Молодой специалист
Offline
|
|
« Ответ #33 : 06-04-2005 05:54 » |
|
тут появилась еще одна идея - использовать св-во Filter объекта Recordset, либо объекта таблица
(делфи не знаю, пишу на басике)
На главной форме : dim rsPeople as ADODB.Recordset
rsPeople.Open "SELECT * FROM People", connection set dbgrdPeople.DataSource = rsPeople ' присваиваем таблице источник строк BoundColumn = rs!PeopleCode
На форме взносов: dim rsVznosy as ADODB.Recordset dim rsTotalVznosy as ADODB.Recordset
rsVznosy.Open "SELECT * FROM Vznosy", connection rsTotalVznosy.Open "SELECT PeopleCode, SUM(Summa) AS [TotalSum] FROM Vznosy GROUP BY PeopleCode" set dbgrdVznosy = rsVznosy set txtTotal.Text = rsTotalVznosy!TotalSum
при открытий формы взносов устанавливаем фильтр sub frmVznosyLoad() rsVznosy.Filter = "PeopleCode = " & frmPeople.dbgrdPeople.BoundColumn rsTotalVznosy.Filter = "PeopleCode = " & frmPeople.dbgrdPeople.BoundColumn end sub
в Дельфи может отличатся, но идею вроде нормально объяснил
|
|
« Последнее редактирование: 20-12-2007 19:04 от Алексей1153++ »
|
Записан
|
I Have Nine Lives You Have One Only THINK!
|
|
|
Harry
Команда клуба
Offline
|
|
« Ответ #34 : 06-04-2005 08:17 » |
|
Структура - см. выше. Главная таблица - пиплы, подчиненная - выплаты, связанная с главной по коду пипла. Что касается идеи - попробую сваять что-либо подобное, если по другому не получится. Просто странно, что такую простую проблему не получается решить обычным запросом. Ну не может же в Делфях INNER JOIN не работать..... что-то я пишу неправильно. Я тут уже ссылку дал, на форуме по Delphi, может чего подскажут....
|
|
|
Записан
|
Слабый пол силен в силу слабости сильного пола к слабому
|
|
|
Sla
|
|
« Ответ #35 : 06-04-2005 09:30 » |
|
Ну не может же в Делфях INNER JOIN не работать..... что-то я пишу неправильно.
а причем здесь inner join и дельфи, не путай праведное с грешным и где в твоей задаче нужен inner join?
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
Harry
Команда клуба
Offline
|
|
« Ответ #36 : 06-04-2005 10:23 » |
|
а причем здесь inner join и дельфи, не путай праведное с грешным и где в твоей задаче нужен inner join?
Да ладно, не придирайся Понятно, что имеется в виду организация данных в Парадокс. А INNER JOIN я использовал бы для подзапросов. Увы, как я только что вычитал в мануале, в Local SQL (Парадокс в частности) вложенные подзапросы не поддерживает....
|
|
|
Записан
|
Слабый пол силен в силу слабости сильного пола к слабому
|
|
|
Sla
|
|
« Ответ #37 : 06-04-2005 10:36 » |
|
а разве так нельзя? SELECT People.PeopleCode, Sum(Vznosi."Summa") FROM "Vznosi.DB" Vznos, "People.DB" People WHERE Vznosi."PeopleCode"=People."PeopleCode" Group by People.PeopleCode
в принципе это и есть inner join
|
|
« Последнее редактирование: 06-04-2005 10:38 от Sla »
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
HandKot
Молодой специалист
Offline
|
|
« Ответ #38 : 06-04-2005 11:55 » |
|
Sla согласен, но в данном запросе не будет доп.информации по пиплам, а она может нужна, либо надо в GROUP BY добавлять и остальные поля, которые нужно выбрать
|
|
« Последнее редактирование: 06-04-2005 11:58 от HandKot »
|
Записан
|
I Have Nine Lives You Have One Only THINK!
|
|
|
Sla
|
|
« Ответ #39 : 06-04-2005 12:03 » |
|
да конечно, но код приведен как пример
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
HandKot
Молодой специалист
Offline
|
|
« Ответ #40 : 06-04-2005 12:03 » |
|
Harry в таком случае остается сразу выбрать все данные (пиплы, выплаты) в рекордсеты, настроить таблицы с источниками на эти рекордсеты и, к примеру, на событие "Изменение строки" таблицы "пиплов" устанавливать фильтр на рекордсете "выплат" (осталось узнать, если такое св-во в рекордсете в дельфи)
(у меня был такой проект для синхронного отображения данных в двух таблицах)
|
|
|
Записан
|
I Have Nine Lives You Have One Only THINK!
|
|
|
Harry
Команда клуба
Offline
|
|
« Ответ #41 : 08-04-2005 07:05 » |
|
Harry в таком случае остается сразу выбрать все данные (пиплы, выплаты) в рекордсеты, настроить таблицы с источниками на эти рекордсеты и, к примеру, на событие "Изменение строки" таблицы "пиплов" устанавливать фильтр на рекордсете "выплат" (осталось узнать, если такое св-во в рекордсете в дельфи)
(у меня был такой проект для синхронного отображения данных в двух таблицах)
Так и придется делать. Я соорудил следующий запрос: SELECT People."PeopleCode", (Sum(Vznosi."Summa")) AS Total FROM "People.DB" People, "Vznosi.DB" Vznosi WHERE Vznosi."PeopleCode"=People."PeopleCode" GROUP BY People."PeopleCode" ORDER BY Total
Но он выбирает сумму по текущей записи, теперь придется учесть перемещение курсора по записям, чтобы динамически менялись суммы.
|
|
« Последнее редактирование: 08-04-2005 07:08 от Harry »
|
Записан
|
Слабый пол силен в силу слабости сильного пола к слабому
|
|
|
HandKot
Молодой специалист
Offline
|
|
« Ответ #42 : 08-04-2005 11:04 » |
|
Harry, я имелл ввиду следующее: главная форма rsP = "select * from people"
это источник строк грида
подчиненная форма (или грид) rsV = "select peoplecode, sum(Summa) from Vznozy group by peoplecode" rsV.Filter = "PeopleCode = " & rsP!PeopleCode источник строк для грида
на событие смены строки в гриде sub грид_People_RowChange() rsV.Filter = "PeopleCode = " & rsP!PeopleCode end sub
примерно так
PS: хотя не мне учить, разработчик сам решает как лучше сделать
|
|
« Последнее редактирование: 08-04-2005 11:18 от HandKot »
|
Записан
|
I Have Nine Lives You Have One Only THINK!
|
|
|
|