Вниз
Скачать: CL | DM;

Суммирование полей   Найти похожие ветки 

← →
Shade_   (2004-05-09 02:03) [0]

Может кто подскажет как отображать сумму значений полей одной таблицы в другой таблице, если они связаны через индекс один ко многим. Например есть заказ, на этот заказ в дополнительной таблице по номеру заказа хранятся все изделия, с ценой изделия. И нам нужно в главной таблице видеть эту сумму. При смене цены на изделия, автоматически менять сумму в главной таблице.


← →
mike-d ©   (2004-05-09 09:45) [1]

Поля таблицы 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 из примеров прилагаемых к Дельфи.


← →
Shade_   (2004-05-11 02:36) [2]

Спасибо огромное за такой исчерпывающий ответ... Сейчас попробую всё это реализовать...



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.45 MB
Время: 0.023 c
1-1084720501
Lammo
2004-05-16 19:15
2004.05.30
Использование PChar в dll


6-1081684143
iraizor
2004-04-11 15:49
2004.05.30
Чат в Интернете на сокетах


4-1081716403
pohil
2004-04-12 00:46
2004.05.30
Привилегии


3-1083617193
SergP
2004-05-04 00:46
2004.05.30
Модификация записей в одной таблице сразу из двух TAdoQuery.


8-1079292951
Mixvictor
2004-03-14 22:35
2004.05.30
Пожирание памяти




   Наверх