Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.05.30;
Скачать: 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 вся ветка

Текущий архив: 2004.05.30;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.028 c
9-1075286593
ZAROLF
2004-01-28 13:43
2004.05.30
Редактировать JPEG рисунки


1-1084595929
IrBisoff
2004-05-15 08:38
2004.05.30
Как правильно очистить массив элементов ?


9-1075006676
Vaso
2004-01-25 07:57
2004.05.30
Canalization


14-1083159353
SeriousSam
2004-04-28 17:35
2004.05.30
Помогите выбрать комп


1-1084558612
NikeOLD
2004-05-14 22:16
2004.05.30
Построение кривых Безье