![]() |
|
|
![]()
|
|
| Sniper |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 511 Регистрация: 8.5.2002 Репутация: нет Всего: 2 |
собственно вот. Пишу приложение, которое считывает из Excel данные в DBGrid, разбивает данные на кусочки. В каждом кусочке считаем мин макс и среднее и стоим график.
Вот кусок кода
Название таблицы(лист в Excel) 2006; Поля таблицы(столбики): DateQ(один столбик) firstvvod, secondvvod Теперь проблемы: 1. Выделять нужный кусок(это делает первый селект) а потом в этом куске находить мин макс и среднее это делает второй кусок. Как их объёдинить? 2. нужно разбивать таблицу на куски по полминуты(по времени в ячейке DateQ) и вычислять стреднее мин и макс каждого такого разбиения. Как находить время и организовать цикл по полям? p.s в прилагаемом проекте (для большей понятности и теста) измените путь к файлу el_pitan1.xls или поместите в папку c:\work\exceldelphi2 Это сообщение отредактировал(а) Sniper - 30.7.2006, 21:34 Присоединённый файл ( Кол-во скачиваний: 9 )
exceldelphi2.zip 20,99 Kb-------------------- "Я испытываю отвращение к системе, разработаннной для "пользователя", если в слове "пользователь" закодировано уничижительное значение "тупой и примитивный". Кен Томпсон, создатель Unix |
|||
|
||||
| Sniper |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 511 Регистрация: 8.5.2002 Репутация: нет Всего: 2 |
Хоть каким нибудь советом помогите!! Плиз!
-------------------- "Я испытываю отвращение к системе, разработаннной для "пользователя", если в слове "пользователь" закодировано уничижительное значение "тупой и примитивный". Кен Томпсон, создатель Unix |
|||
|
||||
| DimW |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1330 Регистрация: 24.2.2005 Где: Орёл Репутация: 5 Всего: 44 |
на сколько я понял, тебе нужно разбить таблицу на группы по 30 сек.
и на каждую группу найти max, min и avg. в АДО давно не работал, не помню как там можно извратиться, а в оракле все делается одним запросом без всяких циклов.
вобщем смысл такой - берем дату (которую нужно бить по 30 сек.), отризаем у нее секунды и смотрим - если меньше 30 то выводим 1 если больше, выводим 31, затем результат склеиваем с датой переведенной в строку в формате dd.mm.yyyy hh24:mi и груперуем по результату. в итоге имея такой набор данных: 25.07.2006 0:00:02 10 25.07.2006 0:00:10 20 25.07.2006 0:00:17 30 25.07.2006 0:00:41 10 25.07.2006 0:00:45 20 25.07.2006 0:01:01 10 получаем: 25.07.2006 00:00:1 10 30 20 25.07.2006 00:00:31 10 20 15 25.07.2006 00:01:1 10 10 10 скорей всего есть в АДО аналогичные функции, верней для работы с типом date точно есть, а вот с проверками значения в селекте - возможно, помнится мне оператор IF(1, 1, 1) - (если 1 = 1 вывести 1), только не помню где я его применял... |
|||
|
||||
| Sniper |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 511 Регистрация: 8.5.2002 Репутация: нет Всего: 2 |
У меня запаси идут строго через 1 сек
25.07.2006 0:01:01 25.07.2006 0:01:02 25.07.2006 0:01:03 25.07.2006 0:01:04 25.07.2006 0:01:05 25.07.2006 0:01:06 ... 25.07.2006 0:01:59 25.07.2006 0:02:00 -------------------- "Я испытываю отвращение к системе, разработаннной для "пользователя", если в слове "пользователь" закодировано уничижительное значение "тупой и примитивный". Кен Томпсон, создатель Unix |
|||
|
||||
| DimW |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1330 Регистрация: 24.2.2005 Где: Орёл Репутация: 5 Всего: 44 |
да без разницы. я же пояснил: вопрос лишь в том как перевести этот в селект, который бы работал в АДО. |
|||
|
||||
| Sniper |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 511 Регистрация: 8.5.2002 Репутация: нет Всего: 2 |
Бился над этим целый день. книжки по АДО нету да и знаком я с этим самым АДО всего неделю.
-------------------- "Я испытываю отвращение к системе, разработаннной для "пользователя", если в слове "пользователь" закодировано уничижительное значение "тупой и примитивный". Кен Томпсон, создатель Unix |
|||
|
||||
| YurikGL |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 196 Регистрация: 5.7.2005 Где: Уфа Репутация: нет Всего: 2 |
ADO c Excel работает крайне медленно.
Я бы посоветовал считать данные с помощью OLE, а потом делать с ними все что угодно... --------------------
|
|||
|
||||
| Sniper |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 511 Регистрация: 8.5.2002 Репутация: нет Всего: 2 |
Заказщик сказал "Да будет оно работать через АДО", значит так тому и быть %( -------------------- "Я испытываю отвращение к системе, разработаннной для "пользователя", если в слове "пользователь" закодировано уничижительное значение "тупой и примитивный". Кен Томпсон, создатель Unix |
|||
|
||||
| YurikGL |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 196 Регистрация: 5.7.2005 Где: Уфа Репутация: нет Всего: 2 |
Ну считывай данные через ADO в массив, и делай с ним что угодно не как с набором данных, а как с массивом. --------------------
|
|||
|
||||
| Fedia |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 465 Регистрация: 2.8.2006 Где: первым встречаю р ассвет Репутация: 3 Всего: 13 |
В приведенном тобой коде в первой части выбираются все данные за период, а во второй находится максим. и миним. значение не в выбранных данных, а во всем листе 2006 !
Запрос на выбор дынных и запрос с использованием агрегированных функций лучше не объединять, даже если это возможно. Расчет показателей за определенных период можно организовать так:
Ну а если считать приходится с интервалом в пол минуты, то DTPickStart.DateTime и DTPickEnd.DateTime можно заменить на переменные, вычислять из значения в цикле, начиная с наименьшей даты, с каждой итерацией добавляя пол минуты и рассчитывать показатели за эти промежутки времени. -------------------- Накануне решающей битвы Я иду, и надеждою зыбкой Озаряется эта дорога, Я мечтаю увидеть улыбку На лице победившего Бога… |
||||||
|
|||||||
| DimW |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1330 Регистрация: 24.2.2005 Где: Орёл Репутация: 5 Всего: 44 |
Fedia, такие утверждения аргументировать надо! ты что предрагаешь вместо того что бы использовать один sql оператор, крутить набор данных в цикле и выискивать нужные данные? вожможно! использовать такой подход выгодней, чем считывать набор данных, а потом над ним извращаться средствами датасет. |
|||
|
||||
| SergeBS |
|
||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1111 Регистрация: 10.6.2005 Где: Владимир Репутация: 11 Всего: 22 |
Sniper,
Как обычно: select max(bla-bla-bla) as tatata , min(bla-bla-bla) as tytyty ... where [DateQ] BETWEEN :DataS AND :DataE Полезно посмотреть в сторону CasheSize.
Если с тебя исходники требуют, то и в этом случае можно замаскировать другой вариант. А если не требуют - как он узнает, пытать будет Другой вопрос, что через OLE вряд ли быстрее будет. |
||||
|
|||||
| Fedia |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 465 Регистрация: 2.8.2006 Где: первым встречаю р ассвет Репутация: 3 Всего: 13 |
DimW,
Подумай ! Что тебе может вернуть запрос select MAX(first), first from ... В лучшем случае набор значений first и бесполезый дубль к нему значений MAX(first). А при группировке в этом примере по др. полю, например second каким будет набор значений поля first понимаешь ? Я это имел в виду, посмотрев на запросы автора ветки, которые он привел в первом постинге.
На счет того, что одним запросом получать данные выгодней, чем потом их обрабатывать в цикле я и не спорил -------------------- Накануне решающей битвы Я иду, и надеждою зыбкой Озаряется эта дорога, Я мечтаю увидеть улыбку На лице победившего Бога… |
|||
|
||||
| SergeBS |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1111 Регистрация: 10.6.2005 Где: Владимир Репутация: 11 Всего: 22 |
Fedia,
Есть базовый набор фунций ADO, а есть возможность использовать SQL-диалект конкретного сервера, опять же из ADO. Поэтому что более функционально - вопрос просто не стоит. Одно - средство доступа (ADO), другое - средство обработки и хранения (SQL server - например), если он есть Насчет цикла - ошибка. В ADO это встроено (агрегирование). В результате весьма ехидно выглядит сочетание чего-то типа TDbf и т.п. для редактирования записей и ADO для формирования всяких сумм, средних значений и т.п. по какой-либо таблице. |
|||
|
||||
| DimW |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1330 Регистрация: 24.2.2005 Где: Орёл Репутация: 5 Всего: 44 |
||||
|
||||
![]()
|
| Правила форума "Delphi: Базы данных и репортинг" | |
|
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами Обязательно указание: 1. Базы данных (Paradox, Oracle и т.п.) 2. Способа доступа (ADO, BDE и т.д.)
FAQ раздела лежит здесь! Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |