![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Суммирование полей [D7, Paradox]
Shade_ © (2004-05-09 02:03:00)Может кто подскажет как отображать сумму значений полей одной таблицы в другой таблице, если они связаны через индекс один ко многим. Например есть заказ, на этот заказ в дополнительной таблице по номеру заказа хранятся все изделия, с ценой изделия. И нам нужно в главной таблице видеть эту сумму. При смене цены на изделия, автоматически менять сумму в главной таблице.
Shade_ (2004-05-11 02:36:00) [1]Спасибо огромное за такой исчерпывающий ответ... Сейчас попробую всё это реализовать...
mike-d (2004-05-09 09:45:00) [2]Поля таблицы Master (tblM):
ID - идентификатор заказа (ключевое поле)
SUMMA - сумма заказа
Поля таблицы Detail (tblD):
ID - идентификатор заказа (ключевое поле)
Item - идентификатор изделия (ключевое поле)
ItemCount - количество изделий этого типа
ItemPrice - цена за единицу изделия
ItemSumma - сумма заказа на это изделие (вычисляемое поле)
Считаем что все таблицы у нас сгруппированы в DataModule (DM). Обрабатываем события AfterPostи AfterDeleteдля таблицы tblD. Для признака удаления всего заказа имеет смысл определить флаг DeleteItemsи манипулировать им в событии BeforePostдля таблицы tblM.
procedure TDM.tblDAfterPost(DataSet: TDataSet);
var
S: Currency;
B: TBookmarkStr;
begin
B := tblD.Bookmark;
tblD.DisableControls;
// вычисляем сумму всех позиций заказа
S := 0;
tblD.First;
while not tblD.Eof do
begin
S := S + tblD.FieldByName('ItemPrice').AsCurrency * tblD.FieldByName('ItemCount').AsFloat;
tblD.Next;
end;
// заносим полученный результат в Master table
tblM.Edit;
tblM.FieldByName('SUMMA').AsCurrency := S;
tblM.Post;
tblD.EnableControls;
tblD.Bookmark := B;
end;
procedure TDM.tblDAfterDelete(DataSet: TDataSet);
begin
// если это не удаление заказа, то пересчитаем общую сумму
if not DeleteItems then tblDAfterPost(DataSet);
end;
procedure TDM.tblMBeforeDelete(DataSet: TDataSet);
begin
DeleteItems := True;
tblD.DisableControls;
tblD.First;
while not tblD.Eof do tblD.Delete;
tblD.EnableControls;
DeleteItems := False;
end;
Это одно из решений. Также можно воспользоваться SQL-запросами.
Рекомендую изучить исходники MastApp из примеров прилагаемых к Дельфи.