Главная страница
    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.45 MB
Время: 0.039 c
1-1084697643
Blackgrin
2004-05-16 12:54
2004.05.30
отработка при нажатии на клавиатурные стрелки


3-1084288115
TohaNik_
2004-05-11 19:08
2004.05.30
ХП. В чем разница?


7-1082582532
Mosquito
2004-04-22 01:22
2004.05.30
Функция PlaySound


1-1085043800
finger
2004-05-20 13:03
2004.05.30
Динамическая работа с компнентами


4-1082444220
Сережа550
2004-04-20 10:57
2004.05.30
EnumChildWindows





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский