![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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
|
|||
|
|||
|
Точно такую же ошибку компилятор выводит.
|
|
#8
|
||||
|
||||
|
Цитата:
Код:
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. |
|
#9
|
|||
|
|||
|
Цитата:
Пробую по подсказкам твоим сейчас работать. Спасибо. |
|
#10
|
||||
|
||||
|
Можно кстати обойтись без объявления переменных в процедуре
|
|
#11
|
|||
|
|||
|
Вроде, все правильно написал. Ошибку выдает: Filter property cannot be used for detail tables. Как я понял, нельзя применить фильтрацию в подчиненной таблице. Надо какой-то другой способ искать.
Наверно, через запросы ADOQuery1. |
|
#12
|
||||
|
||||
|
Тогда убери фильтр.
Вообще OnCalcFields происходит в самом начале при открытии и при редактировании, может у тебя не открыта в этот момент вторая таблица? Если вышлешь проект могу посмотреть Последний раз редактировалось Lost_Fish, 31.08.2012 в 07:09. |
|
#13
|
|||
|
|||
|
Цитата:
Отправлю проект. Он готов практически. Эта единственная проблема из-за чего показать не могу его. CalcFields закомментирован у меня пока. В общем, не получается чтобы на главной форме третий столбец заработал "Сумма выставленных счетов", как справа Label-метки, которые показывают то что нужно. (На Оплату не смотри, этот столбец я потом сам сделаю, на основе Счетов. Метки-Лабел удалятся ест-но) Последний раз редактировалось SFproG, 31.08.2012 в 09:02. |
|
#14
|
||||
|
||||
|
намучено у тебя))
ADOTable при калькулировании не скролит таблицу в связи с чем будем сами скролить отвязываешь ADOTable2 от МастерСурс в обработчик ADOTable4AfterScroll пихаешь Код:
ADOTable2.Filter:='Key1='+VarToStr(ADOTable4['ID']);
ADOTable2.Filtered:=True;а в ADOTable4CalcFields Код:
ADOTable2.Filter:='Key1='+VarToStr(ADOTable4['ID']);
ADOTable2.Filtered:=True;
y:=0;
While not ADOTable2.Eof do
begin
x:=ADOTable2['Ñóììà ïî ñ÷åòó'];
y:=x+y;
ADOTable2.Next;
end;
ADOTable4schet.Value:=y; |
| Этот пользователь сказал Спасибо Lost_Fish за это полезное сообщение: | ||
SFproG (01.09.2012)
| ||
|
#15
|
|||
|
|||
|
Да, все работает
Спасибо тебе Lost_Fish огромное! Очень помог. |