Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
14-28986
PavelOKES
2003-01-22 14:28
2003.02.10
Как обновить настройки IE?


1-28905
RomanaPro
2003-01-30 22:16
2003.02.10
Нет вывода


3-28666
lats
2003-01-24 09:10
2003.02.10
BDE не видит InterBase


14-29100
Serjio Moro
2003-01-26 02:19
2003.02.10
Совместимость железяк...


1-28929
kva
2003-01-31 10:54
2003.02.10
Глюк UpDown





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