Главная страница
    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.027 c
4-1082117282
Сергей_И
2004-04-16 16:08
2004.05.30
Запись текста в интернет форму


3-1084134130
Piter
2004-05-10 00:22
2004.05.30
DISTINCT?


3-1083695368
SergP
2004-05-04 22:29
2004.05.30
Можно ли обновить конкретную запись в запросе?


1-1084745029
killer
2004-05-17 02:03
2004.05.30
XPManifest и Panel


14-1084390507
Knight
2004-05-12 23:35
2004.05.30
Кто-нить опишите работу с TTreeNode.Data





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский