Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 18.10.2010, 20:20
coolon coolon вне форума
Прохожий
 
Регистрация: 15.10.2010
Сообщения: 16
Репутация: 131
По умолчанию Объясните балбесу как это работает

Всем доброго времени суток. У меня конечно идиотский вопрос но задать надо. Я не могу понять как работать с компонентом Query после выполнения запроса. Непонятно где находятся данные. обясните дуралею. можно ли после выполнения 1го запроса обработать результат другим запросом. Или надо сохранить результат куда нибудь а только потом выполнять следующий. Вопрос возник потому при программировании программы надо несколько таких операций. Расскажите пожалуйста принцип работы. И еще чуть не забыл что быстрее выполняется несколько запросов или очень сложный один с вложенными подзапросами? заранее благодарен...
Ответить с цитированием
  #2  
Старый 18.10.2010, 20:41
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Для начала есть два вида запросов, исполняемые - ничего обычно не возвращают, но что-то мудрое делают с данными. И второй вид - это как раз то что вас интересует. Для получения результат запрос должен начинаться с волшебного слова Select.
Результат выполнения этого запроса можно увидеть воспользовавшись например готовым компонентом TDBGrid, достаточно добавить промежуточный компонентик TDataSource который надо связать с вашим Query и гридом. Можно так-же самому ручками обрабатывать результат, примерно так:
Код:
while not Query.Eof
do begin
    ShowMessage(Query.FieldByName('Field1').asString);
    Query.Next; 
    end;  
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #3  
Старый 18.10.2010, 20:57
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

1. Данные находятся в памяти в виде рекордсета. Для доступа к данным текущей записи надо пользоваться Query1.Fields[Index].XXX, где Index - индекс поля, XXX - метод конвертации (AsInteger, AsString, AsTDateTime, etc). Еще можно обращаться по имени поля: Query1.FieldByName('FieldName').XXX.
2. Нет, дополнительно еще одним запросом обработать их нельзя, за исключением наложения разных фильтров, но это делается уже на киентской стороне.
3. Если тебе надо сложно обработать данные, то обычно для этого делается хранимая процедура на сервере. Или набор view.
4. Сравнительная скорость зависит от кол-ва передаваемой информации. На самом деле в большинстве случаев быстрее сложный запрос, если он правильно (оптимально) написан.
Ответить с цитированием
  #4  
Старый 18.10.2010, 20:59
coolon coolon вне форума
Прохожий
 
Регистрация: 15.10.2010
Сообщения: 16
Репутация: 131
По умолчанию

Перефразирую вопрос. Вобщем есть БД основных сущностей 3 и результат 4-й 1-я сущность это паспорт обекта состоит из 7 таблиц, 2-я сущность это неисправность этого обекта(это основные входные данные 1 таблица) 3 -я это нормы времени на устранение из 1таблицы. Задача посторить план работы на месяц. Условия выбора следующие у каждого замечания есть срок выполнения ,у каждого обекта есть группа рабочих, при построении плана нужно расчитать норму времени на каждое замечание если они повторяются то получить общее кол-во число работников не должно первышать к примеру 30 чел. на каждый день, исходя из полученного, разбросать работы на месяц не превышая срок устранения. Как я понимаю такой запрос в один не засунешь. По этому и спросил как работать с Query в таких случаях. Я пока как, использовать промежуточные таблицы способа не вижу. Но может есть другая технология для работы с промежуточными результатами?
Ответить с цитированием
  #5  
Старый 18.10.2010, 21:01
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Скорость исполнения запроса еще во многом зависит от правильных индексов, но все это имеет смысл обычно когда количество перелопачиваемых данных исчисляется миллионами.
Вообще оптимизация запроса - это настолько большая тема, что парой фраз тут не ограничится.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #6  
Старый 18.10.2010, 21:05
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Если речь идет об SQL-сервере, то для таких сложных выборок используются хранимки, которые позволяют выполнить ряд запросов и результат выполнения подать на выход в виде одной или группы записей.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #7  
Старый 18.10.2010, 21:08
coolon coolon вне форума
Прохожий
 
Регистрация: 15.10.2010
Сообщения: 16
Репутация: 131
По умолчанию

А каккой принцип их работы все выборки делать в одной процедуре или передовать результат к следующей а потом к следующей?
Ответить с цитированием
  #8  
Старый 18.10.2010, 21:09
coolon coolon вне форума
Прохожий
 
Регистрация: 15.10.2010
Сообщения: 16
Репутация: 131
По умолчанию

Программа предназначена для локального использования то есть на обной машине и клиент и сервер.
Ответить с цитированием
  #9  
Старый 18.10.2010, 23:11
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Делается все в одной процедуре. Она может быть по сути просто запросом, а может быть очень сложной с большой кучей внутренних запросов. И в первом и втором случае результат будет возвращен в виде набора данных.
Передача данных между запросами может быть реализована посредством создания временной таблицы или курсоров. В общем это тема большая, вы почитайте про SQL-сервера и хранимые процедуры.
Из бесплатных Sql-серверов я бы рекомендовал firebird - это ответвление Interbase, но в отличие от последнего бесплатное.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #10  
Старый 19.10.2010, 10:46
Аватар для friz
friz friz вне форума
Местный
 
Регистрация: 04.04.2008
Адрес: Минск
Сообщения: 596
Версия Delphi: 2007 & JAVA EE
Репутация: 10670
По умолчанию

По своему опыту скажу что хранимые процедуры рулят! Был один проект под oracle где база пару миллиардов, причем использование индексов было невозможно... я сперва ломал голову пытаясь оптимизировать запросы,использовал всякие партишины и все равно было оооочень доооолго. Потом мне посоветовали посмотреть в сторону хранимых процедур... и результат превзошел ожидания! Раньше 100 записей выбиралось пару часов, а на хранимках пару минут! Так что если база большая то сразу делай все на хранимых процедурах!
__________________
Последний раз редактировалось Admin, Сегодня в 10:32.
Ответить с цитированием
  #11  
Старый 21.10.2010, 17:35
Error Error вне форума
Прохожий
 
Регистрация: 10.01.2007
Сообщения: 33
Репутация: 10
По умолчанию

Скажите, почему ничего не происходит при выполнении кода? Вообще ничего, таблица остается такой же, как и была. Я уже облазил весь интернет, но так и не нашел ничего.
Код:
AdoQuery7.Close;
AdoQuery7.SQL.Text:='SELECT * FROM Narad WHERE Номер='+FindEdit.Text;
AdoQuery7.ExecSQL;
AdoQuery7.Close;
или
Код:
AdoQuery7.Close;
AdoQuery7.SQL.Text:='SELECT * FROM Narad WHERE Номер=:Param1;
AdoQuery7.Parameters.ParamByName('Param1').Value:=Finder.Text;
AdoQuery7.ExecSQL;
AdoQuery7.Close;
Ответить с цитированием
  #12  
Старый 21.10.2010, 17:47
Аватар для friz
friz friz вне форума
Местный
 
Регистрация: 04.04.2008
Адрес: Минск
Сообщения: 596
Версия Delphi: 2007 & JAVA EE
Репутация: 10670
По умолчанию

Код:
AdoQuery7.Close;
AdoQuery7.SQL.Text:='SELECT * FROM Narad WHERE Номер=:Param1;
AdoQuery7.Parameters.ParamByName('Param1').Value:=Finder.Text;
AdoQuery7.open;
AdoQuery7.Close;

А так?
__________________
Последний раз редактировалось Admin, Сегодня в 10:32.
Ответить с цитированием
  #13  
Старый 22.10.2010, 08:21
Error Error вне форума
Прохожий
 
Регистрация: 10.01.2007
Сообщения: 33
Репутация: 10
По умолчанию

Ничего(
Таблица не изменилась. Всё остальное (Update, Insert, Delete) работает, а Select нет. Я уже почти отчаялся.
Ответить с цитированием
  #14  
Старый 22.10.2010, 11:10
Аватар для friz
friz friz вне форума
Местный
 
Регистрация: 04.04.2008
Адрес: Минск
Сообщения: 596
Версия Delphi: 2007 & JAVA EE
Репутация: 10670
По умолчанию

а ты точно правильно настроил связку datesource,AdoConnect,Dbgrid и AdoQuery ?
__________________
Последний раз редактировалось Admin, Сегодня в 10:32.
Ответить с цитированием
  #15  
Старый 22.10.2010, 11:22
Error Error вне форума
Прохожий
 
Регистрация: 10.01.2007
Сообщения: 33
Репутация: 10
По умолчанию

AdoConnection2 указывает на базу данных Stages, где есть таблица Narad
AdoTable7 на AdoConnection2
DataSource на AdoTable7
AdoQuery7 на AdoConnection2
DBGrid2 на DataSource7

В гриде же должны измениться колонки при select? Или нет?
Может есть исходники с Select, самые простые, с одним-двумя параметрами?
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 01:44.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter