Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Подсчет итогов по столбцу таблицы [D6, Paradox]


Jeka ©   (2003-01-22 15:46:00) 

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


MsGuns   (2003-01-22 21:08:00) [1]

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


dolmat   (2003-01-22 17:54:00) [2]

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


MsGuns   (2003-01-22 17:51:00) [3]

>dolmat © (22.01.03 17:32)

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

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


Johnmen   (2003-01-22 17:40:00) [4]

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

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



dolmat   (2003-01-22 17:32:00) [5]

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


MsGuns   (2003-01-22 17:28:00) [6]

>dolmat © (22.01.03 17:07)

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

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

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

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



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

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

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


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

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

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


Anatoly Podgoretsky   (2003-01-22 16:44:00) [9]

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


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

>MsGuns

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


MsGuns   (2003-01-22 16:03:00) [11]

Ставишь на подчиненную обработчики 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

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


Johnmen   (2003-01-22 16:02:00) [12]

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


kkot   (2003-01-22 16:01:00) [13]

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


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

а с TTable как)


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

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо