Поиск:

Ответ в темуСоздание новой темы Создание опроса
> SELECT в ADO 
:(
    Опции темы
Sniper
Дата 30.7.2006, 21:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 511
Регистрация: 8.5.2002

Репутация: нет
Всего: 2



собственно вот. Пишу приложение, которое считывает из Excel данные в DBGrid, разбивает данные на кусочки. В каждом кусочке считаем мин макс и среднее и стоим график.
Вот кусок кода
Код

procedure TForm1.Button1Click(Sender: TObject);
begin 
 ADODataSet1.Close;
 ADODataSet1.Parameters[0].DataType := ftDateTime;
 ADODataSet1.Parameters[0].Name :='DataS';
 ADODataSet1.Parameters[0].Value := DTPickStart.DateTime;

 ADODataSet1.Parameters[1].DataType := ftDateTime;
 ADODataSet1.Parameters[1].Name :='DataE';
 ADODataSet1.Parameters[1].Value := DTPickEnd.DateTime;

 ADODataSet1.CommandText :=  'SELECT * FROM [''2006$''] WHERE [DateQ] '+
 'BETWEEN :DataS AND :DataE;'; 
 ADODataSet1.Open;
 ADODataSet1.Active := true;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
 ADODataSet1.Close;
 ADODataSet1.CommandText := 'SELECT MAX(firstvvod) AS First_Max,' +
 'MIN(firstvvod) AS First_Min, AVG(firstvvod) AS First_Avg,'+
 'MAX(secondvvod) AS Second_Max, MIN(secondvvod) AS Second_Min,'+
 'AVG(secondvvod) AS Second_Avg FROM [''2006$''];';
 ADODataSet1.Open;
 ADODataSet1.Active := true;


Название таблицы(лист в 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
PM MAIL   Вверх
Sniper
Дата 31.7.2006, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 511
Регистрация: 8.5.2002

Репутация: нет
Всего: 2



Хоть каким нибудь советом помогите!! Плиз! 


--------------------
"Я испытываю отвращение к системе, разработаннной для "пользователя", если в слове "пользователь" закодировано уничижительное значение "тупой и примитивный".
Кен Томпсон, создатель Unix
PM MAIL   Вверх
DimW
Дата 31.7.2006, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 5
Всего: 44



на сколько я понял, тебе нужно разбить таблицу на группы по 30 сек.
и на каждую группу найти max, min и  avg.

Цитата(Sniper @  31.7.2006,  13:24 Найти цитируемый пост)
Хоть каким нибудь советом помогите!! Плиз!


в АДО давно не работал, не помню как там можно извратиться, а в оракле все делается одним запросом без всяких циклов.

Код

select 
 to_char(t.d_date, 'dd.mm.yyyy hh24:mi:') || case when to_number(to_char(t.d_date, 'ss')) <= 30 then '1' else '31' end
,min(t.summ)
,max(t.summ)
,avg(t.summ)  
from 
 dimw_tst t
group by 
  to_char(t.d_date, 'dd.mm.yyyy hh24:mi:') || case when to_number(to_char(t.d_date, 'ss')) <= 30 then '1' else '31' end 


вобщем смысл такой - берем дату (которую нужно бить по 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), только не помню где я его применял...






 
PM MAIL ICQ   Вверх
Sniper
Дата 1.8.2006, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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
PM MAIL   Вверх
DimW
Дата 1.8.2006, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 5
Всего: 44



Цитата(Sniper @  1.8.2006,  11:18 Найти цитируемый пост)
У меня запаси идут строго через 1 сек


да без разницы. я же пояснил: 
Цитата(DimW @  31.7.2006,  15:49 Найти цитируемый пост)
 отризаем у нее секунды и смотрим - если меньше 30 то выводим 1 если больше, выводим 31, затем результат склеиваем с датой переведенной в строку в формате dd.mm.yyyy hh24:mi и груперуем по результату.


вопрос лишь в том как перевести этот в селект, который бы работал в АДО.


PM MAIL ICQ   Вверх
Sniper
Дата 1.8.2006, 21:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 511
Регистрация: 8.5.2002

Репутация: нет
Всего: 2



Бился над этим целый день. книжки по АДО нету да и знаком я с этим самым АДО всего неделю.


--------------------
"Я испытываю отвращение к системе, разработаннной для "пользователя", если в слове "пользователь" закодировано уничижительное значение "тупой и примитивный".
Кен Томпсон, создатель Unix
PM MAIL   Вверх
YurikGL
Дата 1.8.2006, 21:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 196
Регистрация: 5.7.2005
Где: Уфа

Репутация: нет
Всего: 2



ADO c Excel работает крайне медленно.
Я бы посоветовал считать данные с помощью OLE, а потом делать с ними все что угодно...
--------------------
 
PM MAIL WWW ICQ   Вверх
Sniper
Дата 2.8.2006, 00:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 511
Регистрация: 8.5.2002

Репутация: нет
Всего: 2



Цитата(YurikGL @ 1.8.2006,  18:46)
ADO c Excel работает крайне медленно.
Я бы посоветовал считать данные с помощью OLE, а потом делать с ними все что угодно...

Заказщик сказал "Да будет оно работать через АДО", значит так тому и быть %(


--------------------
"Я испытываю отвращение к системе, разработаннной для "пользователя", если в слове "пользователь" закодировано уничижительное значение "тупой и примитивный".
Кен Томпсон, создатель Unix
PM MAIL   Вверх
YurikGL
Дата 2.8.2006, 20:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 196
Регистрация: 5.7.2005
Где: Уфа

Репутация: нет
Всего: 2



Цитата

Заказщик сказал "Да будет оно работать через АДО", значит так тому и быть %( 


Ну считывай данные через ADO  в массив, и делай с ним что угодно не как с набором данных, а как с массивом.
--------------------
 
PM MAIL WWW ICQ   Вверх
Fedia
Дата 3.8.2006, 05:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 465
Регистрация: 2.8.2006
Где: первым встречаю р ассвет

Репутация: 3
Всего: 13



Цитата

Выделять нужный кусок(это делает первый селект) а потом в этом куске находить мин макс и среднее это делает второй кусок. 

В приведенном тобой коде в первой части выбираются все данные за период, а во второй находится максим. и миним. значение не в выбранных данных, а во всем листе 2006 !

Цитата

Как их объёдинить?

Запрос на выбор дынных и запрос с использованием агрегированных функций лучше не объединять, даже если это возможно. 

Расчет показателей за определенных период можно организовать так:
Код

 ADODataSet1.Close;
 ADODataSet1.Parameters.Clear;
 ADODataSet1.Parameters.AddParameter;
 ADODataSet1.Parameters[0].DataType := ftDateTime;
 ADODataSet1.Parameters[0].Name :='DataS';
 ADODataSet1.Parameters[0].Value := DTPickStart.DateTime;

 ADODataSet1.Parameters.AddParameter;
 ADODataSet1.Parameters[1].DataType := ftDateTime;
 ADODataSet1.Parameters[1].Name :='DataE';
 ADODataSet1.Parameters[1].Value := DTPickEnd.DateTime;

 ADODataSet1.CommandText :=  'SELECT MAX(first) AS First_Max,' +
 'MIN(first) AS First_Min, AVG(first) AS First_Avg,'+
 'MAX(second) AS Second_Max, MIN(second) AS Second_Min,'+
 'AVG(second) AS Second_Avg FROM  [2006$] WHERE [DateQ] '+
 'BETWEEN :DataS AND :DataE;';

 ADODataSet1.Open;


Ну а если считать приходится с интервалом в пол минуты, то DTPickStart.DateTime и DTPickEnd.DateTime можно заменить на переменные, вычислять из значения в цикле, начиная с наименьшей даты, с каждой итерацией добавляя пол минуты и рассчитывать показатели за эти промежутки времени.


--------------------
Накануне решающей битвы
Я иду, и надеждою зыбкой
Озаряется эта дорога,
Я мечтаю увидеть улыбку
На лице победившего Бога…
PM MAIL ICQ   Вверх
DimW
Дата 3.8.2006, 09:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 5
Всего: 44



Цитата(Fedia @  3.8.2006,  05:34 Найти цитируемый пост)
Запрос на выбор дынных и запрос с использованием агрегированных функций лучше не объединять 

Fedia, такие утверждения аргументировать надо! ты что предрагаешь вместо того что бы использовать один sql оператор, крутить набор данных в цикле и выискивать нужные данные?
Цитата(Fedia @  3.8.2006,  05:34 Найти цитируемый пост)
даже если это возможно

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

PM MAIL ICQ   Вверх
SergeBS
Дата 3.8.2006, 09:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 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.

Цитата

Заказщик сказал "Да будет оно работать через АДО", значит так тому и быть %( 

Если с тебя исходники требуют, то и в этом случае можно замаскировать другой вариант. А если не требуют - как он узнает, пытать будет smile ?
Другой вопрос, что через OLE вряд ли быстрее будет.
PM MAIL   Вверх
Fedia
Дата 3.8.2006, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 465
Регистрация: 2.8.2006
Где: первым встречаю р ассвет

Репутация: 3
Всего: 13



DimW,  
Цитата(DimW @  3.8.2006,  09:07 Найти цитируемый пост)
Цитата(Fedia @  3.8.2006,  05:34 )    
Запрос на выбор дынных и запрос с использованием агрегированных функций лучше не объединять  

Fedia, такие утверждения аргументировать надо! ты что предрагаешь вместо того что бы использовать один sql оператор, крутить набор данных в цикле и выискивать нужные данные?

Подумай ! 
Что тебе может вернуть запрос select MAX(first), first from ... В лучшем случае набор значений first и бесполезый дубль к нему значений MAX(first). А при группировке в этом примере по др. полю, например second каким будет набор значений поля first понимаешь ? Я это имел в виду, посмотрев на запросы автора ветки, которые он привел в первом постинге.

Цитата

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

На счет того, что одним запросом получать данные выгодней, чем потом их обрабатывать в цикле я и не спорил  smile. Если конечно такой запрос не поедает ресурсы сервера БД на пол часа.  Средства Sql СУБД оракл намного более функциональны, чем у ADO компонентов, поэтому ИМХО без цикла в данном случае не обойтись.


--------------------
Накануне решающей битвы
Я иду, и надеждою зыбкой
Озаряется эта дорога,
Я мечтаю увидеть улыбку
На лице победившего Бога…
PM MAIL ICQ   Вверх
SergeBS
Дата 3.8.2006, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1111
Регистрация: 10.6.2005
Где: Владимир

Репутация: 11
Всего: 22



Fedia, 
Цитата

Средства Sql СУБД оракл намного более функциональны, чем у ADO компонентов, поэтому ИМХО без цикла в данном случае не обойтись. 

Есть базовый набор фунций ADO, а есть возможность использовать SQL-диалект конкретного сервера, опять же из ADO. Поэтому что более функционально - вопрос просто не стоит. Одно - средство доступа (ADO), другое - средство обработки и хранения (SQL server - например), если он есть smile.  Поскольку из ADO можно и с dbf-ками работать, имея при этом SQL-92 набор функций (встроенный в ADO). 

Насчет цикла - ошибка. В ADO это встроено (агрегирование). В результате весьма ехидно выглядит сочетание чего-то типа TDbf и т.п. для редактирования записей и ADO для формирования всяких сумм, средних значений и т.п. по какой-либо таблице.
PM MAIL   Вверх
DimW
Дата 3.8.2006, 17:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 5
Всего: 44



Цитата(Fedia @  3.8.2006,  12:27 Найти цитируемый пост)
 Я это имел в виду, посмотрев на запросы автора ветки, которые он привел в первом постинге.

все понял о чем ты, извини что погорячился.

PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.4196 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.