|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Объясните балбесу как это работает
Всем доброго времени суток. У меня конечно идиотский вопрос но задать надо. Я не могу понять как работать с компонентом Query после выполнения запроса. Непонятно где находятся данные. обясните дуралею. можно ли после выполнения 1го запроса обработать результат другим запросом. Или надо сохранить результат куда нибудь а только потом выполнять следующий. Вопрос возник потому при программировании программы надо несколько таких операций. Расскажите пожалуйста принцип работы. И еще чуть не забыл что быстрее выполняется несколько запросов или очень сложный один с вложенными подзапросами? заранее благодарен...
|
#2
|
||||
|
||||
Для начала есть два вида запросов, исполняемые - ничего обычно не возвращают, но что-то мудрое делают с данными. И второй вид - это как раз то что вас интересует. Для получения результат запрос должен начинаться с волшебного слова Select.
Результат выполнения этого запроса можно увидеть воспользовавшись например готовым компонентом TDBGrid, достаточно добавить промежуточный компонентик TDataSource который надо связать с вашим Query и гридом. Можно так-же самому ручками обрабатывать результат, примерно так: Код:
while not Query.Eof do begin ShowMessage(Query.FieldByName('Field1').asString); Query.Next; end; Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#3
|
|||
|
|||
1. Данные находятся в памяти в виде рекордсета. Для доступа к данным текущей записи надо пользоваться Query1.Fields[Index].XXX, где Index - индекс поля, XXX - метод конвертации (AsInteger, AsString, AsTDateTime, etc). Еще можно обращаться по имени поля: Query1.FieldByName('FieldName').XXX.
2. Нет, дополнительно еще одним запросом обработать их нельзя, за исключением наложения разных фильтров, но это делается уже на киентской стороне. 3. Если тебе надо сложно обработать данные, то обычно для этого делается хранимая процедура на сервере. Или набор view. 4. Сравнительная скорость зависит от кол-ва передаваемой информации. На самом деле в большинстве случаев быстрее сложный запрос, если он правильно (оптимально) написан. |
#4
|
|||
|
|||
Перефразирую вопрос. Вобщем есть БД основных сущностей 3 и результат 4-й 1-я сущность это паспорт обекта состоит из 7 таблиц, 2-я сущность это неисправность этого обекта(это основные входные данные 1 таблица) 3 -я это нормы времени на устранение из 1таблицы. Задача посторить план работы на месяц. Условия выбора следующие у каждого замечания есть срок выполнения ,у каждого обекта есть группа рабочих, при построении плана нужно расчитать норму времени на каждое замечание если они повторяются то получить общее кол-во число работников не должно первышать к примеру 30 чел. на каждый день, исходя из полученного, разбросать работы на месяц не превышая срок устранения. Как я понимаю такой запрос в один не засунешь. По этому и спросил как работать с Query в таких случаях. Я пока как, использовать промежуточные таблицы способа не вижу. Но может есть другая технология для работы с промежуточными результатами?
|
#5
|
||||
|
||||
Скорость исполнения запроса еще во многом зависит от правильных индексов, но все это имеет смысл обычно когда количество перелопачиваемых данных исчисляется миллионами.
Вообще оптимизация запроса - это настолько большая тема, что парой фраз тут не ограничится. Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#6
|
||||
|
||||
Если речь идет об SQL-сервере, то для таких сложных выборок используются хранимки, которые позволяют выполнить ряд запросов и результат выполнения подать на выход в виде одной или группы записей.
Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#7
|
|||
|
|||
А каккой принцип их работы все выборки делать в одной процедуре или передовать результат к следующей а потом к следующей?
|
#8
|
|||
|
|||
Программа предназначена для локального использования то есть на обной машине и клиент и сервер.
|
#9
|
||||
|
||||
Делается все в одной процедуре. Она может быть по сути просто запросом, а может быть очень сложной с большой кучей внутренних запросов. И в первом и втором случае результат будет возвращен в виде набора данных.
Передача данных между запросами может быть реализована посредством создания временной таблицы или курсоров. В общем это тема большая, вы почитайте про SQL-сервера и хранимые процедуры. Из бесплатных Sql-серверов я бы рекомендовал firebird - это ответвление Interbase, но в отличие от последнего бесплатное. Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#10
|
||||
|
||||
По своему опыту скажу что хранимые процедуры рулят! Был один проект под oracle где база пару миллиардов, причем использование индексов было невозможно... я сперва ломал голову пытаясь оптимизировать запросы,использовал всякие партишины и все равно было оооочень доооолго. Потом мне посоветовали посмотреть в сторону хранимых процедур... и результат превзошел ожидания! Раньше 100 записей выбиралось пару часов, а на хранимках пару минут! Так что если база большая то сразу делай все на хранимых процедурах!
Последний раз редактировалось Admin, Сегодня в 10:32. |
#11
|
|||
|
|||
Скажите, почему ничего не происходит при выполнении кода? Вообще ничего, таблица остается такой же, как и была. Я уже облазил весь интернет, но так и не нашел ничего.
Код:
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
|
||||
|
||||
Код:
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
|
|||
|
|||
Ничего(
Таблица не изменилась. Всё остальное (Update, Insert, Delete) работает, а Select нет. Я уже почти отчаялся. |
#14
|
||||
|
||||
а ты точно правильно настроил связку datesource,AdoConnect,Dbgrid и AdoQuery ?
Последний раз редактировалось Admin, Сегодня в 10:32. |
#15
|
|||
|
|||
AdoConnection2 указывает на базу данных Stages, где есть таблица Narad
AdoTable7 на AdoConnection2 DataSource на AdoTable7 AdoQuery7 на AdoConnection2 DBGrid2 на DataSource7 В гриде же должны измениться колонки при select? Или нет? Может есть исходники с Select, самые простые, с одним-двумя параметрами? |