![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
![]() Есть две таблицы "Поставщики" и "Счета". Таблицы связаны. "Счета" (подчиненная) подцепляется по key1 к id "Поставщики" через MasterSource.
В итоге, один поставщик может иметь несколько счетов. В таблице "Счета" имеется колонка сумма (денежная). У меня задача просуммировать колонку "сумма" из таблицы "Счета" и вывести в отдельную колонку в таблицу "Поставщики". Т.е. у каждой записи уникального поставщика, будет отображаться своя общая сумма из таблицы "Счета". В таблице "Поставщики" создал поле fkCalculated. Написал такой обработчик: Код:
procedure TForm1.ADOTable1CalcFields(DataSet: TDataSet); var x,y:Integer; begin ADOTable2.First; y:=0; While not ADOTable2.Eof do begin x:=ADOTable2['Сумма']; y:=x+y; ADOTable2.Next; end; ADOTable1schet.Value:=y; end; Хотя, если выводить результат в Label, то все работает нормально. Код:
procedure TForm1.DBGrid1CellClick(Column: TColumn); var x,y:Integer; begin ADOTable2.First; y:=0; While not ADOTable2.Eof do begin x:=ADOTable2['Сумма']; y:=x+y; ADOTable2.Next; end; Label1.Caption:=IntToStr(y); end; |
#2
|
||||
|
||||
![]() Фильтр на таблицу 2 повесь перед циклом, чтоб он у тебя в цикле проходил не всю таблицу а только те записи которые соответствуют поставщику
|
#3
|
|||
|
|||
![]() Цитата:
Попытался нечто подобное сделать: Код:
procedure TForm1.ADOTable4CalcFields(DataSet: TDataSet); var x,y:Integer; begin ADOTable2.Filtered:=True; ADOTable2.Filter:='Сумма'=+Form1.DBGrid1.Fields[0].AsString; ADOTable2.First; y:=0; While not ADOTable3.Eof do begin x:=ADOTable2['Сумма']; y:=x+y; ADOTable3.Next; end; ADOTable1schet.Value:=y; end; |
#4
|
||||
|
||||
![]() Цитата:
|
#5
|
|||
|
|||
![]() Да. Ругается.
|
#6
|
||||
|
||||
![]() Цитата:
Код:
... ADOTable2.Filter:='Сумма='+DBGrid1.Fields[0].AsString; ... |
#7
|
||||
|
||||
![]() Цитата:
Код:
ADOTable2.Filtered:=True; ADOTable2.Filter:='Сумма='+Form1.DBGrid1.Fields[0].AsString; Местами поменяй, фильтр включать после того как в него значение поставишь. И этой строчкой ты пытаешься отфильтровать значения по сумме, а надо по поставщику. и я бы сделал так Код:
ADOTable2.Filter:='key1='+VarToStr(ADOTable1['ID']); //или можно ADOTable2.Filter:='key1='+ADOTable1.FieldByName('ID').AsString; //кому как нравится и да, почему у тебя цикл идёт по Table3 а суммируешь одну и туже запись из Table2? Давай разберёмся Код:
procedure КалькФиелдс; var наша переменная begin //ставим значение фильтра для таблицы счета, такое чтоб таблица счета показывала только те записи которые относятся к текущему поставщику из таблицы поставщиков (см. ваыше) //включаем фильтр //ставим начальное значение нашей переменной //Цикл пока не дойдем до конца таблицы счетов (ведь сумма значений именно из неё нас интересует) //после включения фильтра курсор автоматом ставится на первую запись //в цикле сумируем текущее значении из таблицы счетов с нашей переменной //переходим к следующей записи в таблице счетов //конец цикла //ну и на выходе у нас нужная сумма end; Последний раз редактировалось Lost_Fish, 30.08.2012 в 14:46. |
#8
|
|||
|
|||
![]() Цитата:
Пробую по подсказкам твоим сейчас работать. Спасибо. |
#9
|
||||
|
||||
![]() Можно кстати обойтись без объявления переменных в процедуре
|