Форум: "Базы";
Текущий архив: 2003.02.10;
Скачать: [xml.tar.bz2];
ВнизПодсчет итогов по столбцу таблицы Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.01 c