Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.02.10;
Скачать: CL | DM;

Вниз

Подсчет итогов по столбцу таблицы   Найти похожие ветки 

 
Jeka   (2003-01-22 15:46) [0]

Здраствуйте мастера!
Как сделать подсчет данных из одной таблици в другую
Имеется 2 таблици ЗАКАЗЫ(номер заказа, дата, сумма_заказа) и
АссортиментЗаказа(номер заказа , товар, цена, кол-во, сумма)
они связаны(главная/подчиненая) по номеру заказа.
Как сделать чтоб в ЗАКАЗЫсумма_заказа подсчитывались данные
из АссортиментЗаказаСумма.
Заранее спасибо!


 
Johnmen ©   (2003-01-22 15:51) [1]

UPDATE Tглавная TM
SET TM.сумма_заказа=
(SELECT SUM(TD.сумма)
FROM Tподчиненая TD
WHERE TD.номер заказа=TM.номер заказа)


 
Jeka   (2003-01-22 15:54) [2]

а с TTable как)


 
kkot   (2003-01-22 16:01) [3]

А никак :)) И можешь смело от него отказаться


 
Johnmen ©   (2003-01-22 16:02) [4]

Путем написания программного кода.


 
MsGuns ©   (2003-01-22 16:03) [5]

Ставишь на подчиненную обработчики AfterPost, AfterDelete и в них обращаешься к процедуре, которая работает примерно так:

1. Отключает грид детала от датасорса
2. Запоминает тек.запись детала в букмарке
3. К первой записи детала, переменная ComSum=0
4. Пока не конец курсора детала
ComSum=ComSum+<сумма по строке>
<Детал>.Next
5. Позиционируешь детал к запомненной букмарке
6. Удаляешь букмарку
7. Грид детала привязываешь к датасорсу
8. <Мастер>.Edit
9. <Мастер>.FieldByName("<Поле суммы заказа>").AsFloat :=
Round(ComSum*100)/100
10. <Мастер>.Post

Это без единого квери !



 
kkot   (2003-01-22 16:38) [6]

>MsGuns

Я не говорю, что вообще нельзя, но это самый настоящий онанизм, да еще и левой рукой, из-под ноги :)) Про расход памяти и системных ресурсов я просто молчу. Мы же не американцы, у которых недостаток серого вещества заменяют мегабайты и гигагерцы. Один полудурок сделал выборку по Id_smth: select from xxx where Id_smth = (4,5,6 ..., 968) или что-то в этом роде :)) between мы не знаем, а про Id_smth>4 and Id_smth<968 догадаться сложно :)))


 
Anatoly Podgoretsky ©   (2003-01-22 16:44) [7]

Знаешь яя такое видел и у не американцев и что?


 
dolmat ©   (2003-01-22 17:07) [8]

У меня работает примерно так как описал MsGuns
sum:=0;
ЗАКАЗЫ.first;
while not ЗАКАЗЫ.eof do begin
sum:=sum+ЗАКАЗЫсумма_заказа.asfloat;
ЗАКАЗЫ.next;
end;
АссортиментЗаказаСумма.asfloat:=sum;

на то что курсор прыгает никто из бухгалтеров не обращает внимания, а если необходимо, то используй метки.


 
kkot   (2003-01-22 17:15) [9]

>на то что курсор прыгает никто из бухгалтеров не обращает внимания, а если необходимо, то используй метки.

А контролы пробовал отключать на время выполнения твоей "процедуры"?


 
MsGuns ©   (2003-01-22 17:28) [10]

>dolmat © (22.01.03 17:07)

перед While .. do
DBGrid1.DataSource := nil;

после завершения цикла и установка датасета в исх.точку
DBGrid1.DataSource := DataSource1;

и не будет ничего прыгать и мигать. Да и шустрее бу существенно.

>kkot (22.01.03 16:38)
Не согласен. Не бывает плохих методов,- бывают кривые программеры. В данном случае, если все УЖЕ ПОСТРОЕНО на TTable и размер деталов небольшой (до 100 записей), все будет работать достаточно быстро в парадоксе. Если, конечно, таблица детала в это время не обновляется 20-ю юзерами. Пример, приведенный Вами, для данного случая считаю некорректным.




 
dolmat ©   (2003-01-22 17:32) [11]

а если контролы отрубать то курсор станет на последнюю record.


 
Johnmen ©   (2003-01-22 17:40) [12]

>dolmat © (22.01.03 17:32)
>а если контролы отрубать то курсор станет на последнюю record.

И как ты это увидишь ? :)




 
MsGuns ©   (2003-01-22 17:51) [13]

>dolmat © (22.01.03 17:32)

Если на видимой форме масса контролов, привязанных к ОДНОМУ сорсу на "пробегаемый" датасет, то можно "вырубать" не датасорс, а датасет в датасорсе, а потом врубать. В этом случае все связанные с табличным деталом контролы буду синхронно "отключаться" - "подключаться"

Есть и еще один способ, заключающийся в использовании параллельного датасета, идентично с основным деталом связанного с мастером. "Бегать" можно по нему. В этом случае вообще не надо никаких "отрубаний". Его, кстати, можно и рефрешить через секунду-другую - больших видимых задержек это за собой не повлечет. Но это для большого числа активных (т.е. реально изменяющих таблы) изеров


 
dolmat ©   (2003-01-22 17:54) [14]

точнее все равно курсор станет на последнюю record т.к. цикл заканчивается на последней record а курсор gridа перепрыгивает. Так быть должно, но вот только что проверил на своей программе и он даже не прыгает и сумму подсчитывает и работает все правильно. В программе все то же что я описал, но я вместо стандартного dbGrid использую QuntumGrid который связывается с таблицей немного по другому, может по этому и не прыгает.


 
MsGuns ©   (2003-01-22 21:08) [15]

>dolmat © (22.01.03 17:54)
Я использую TDBGrid из поставки делфи и у меня ничего не прыгает.
А уж с параллельным датасетом вообще никаких подвижек не будет. Так что дело-то не в гриде...



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

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

Наверх




Память: 0.5 MB
Время: 0.023 c
1-28860
Юный_программер
2003-01-30 13:26
2003.02.10
Вопрос про Аски-код клавиши BaskCape, типа


1-28698
Separator
2003-01-31 11:31
2003.02.10
У меня глюки


1-28758
defenseur
2003-02-01 12:17
2003.02.10
Проверка наличия пути на диске


3-28602
alex_bredin
2003-01-22 17:35
2003.02.10
столбцы DBGrid


1-28886
Сергей
2003-01-30 17:36
2003.02.10
Инициализация