|
|
Регистрация | << Правила форума >> | 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 огромное! Очень помог.
|