Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.05.2009, 22:37   #1
LANDER
 
Регистрация: 26.05.2009
Сообщений: 7
По умолчанию SQL-запрос на поиск

1. Ребят, такая ситуация: необходимо реализовать поиск фирм по введенному пользывателем в Edit году. Не знаю как вытащить из даты сам год. А простой запрос при вводе в эдит полной даты выглядит так (Дата - название поля в базе данных, base - название базы, формат даты 00.00.0000):

procedure TSearchForm.BitBtn1Click(Sender: TObject);
begin
DataModule1.FindQuery.Active:=false ;
DataModule1.FindQuery.SQL.Clear;
DataModule1.FindQuery.SQL.Add('SELE CT *');
DataModule1.FindQuery.SQL.Add('FROM base');
DataModule1.FindQuery.SQL.Add('WHER E Дата LIKE '''+FindEdit.Text+'''');
DataModule1.FindQuery.Active:=true;
Close;
end;

Как сделать так, чтобы при поиске вводился только год?

2. Вторая проблема такого рода. Все таже база данных скриншот которой ниже. Необходимо вывести фирму, которая чаще всего выступала в роли истца. Буду очень благодарен за помощь!

LANDER вне форума Ответить с цитированием
Старый 26.05.2009, 22:50   #2
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

1. Что-то типа:
Код:
DataModule1.FindQuery.SQL.Add('WHERE Дата BETWEEN '+QuotedStr('01.01.'+FindEdit.Text) AND QuotedStr('31.12.'+FindEdit.Text));
mihali4 вне форума Ответить с цитированием
Старый 27.05.2009, 07:18   #3
S@fer
Форумчанин
 
Аватар для S@fer
 
Регистрация: 29.01.2009
Сообщений: 411
По умолчанию

1. Можно написать так
Код:
DataModule1.FindQuery.SQL.Add('WHERE (Year(Дата) ='+FindEdit.Text+'));
2. нужно создать еще одно поле которое будет считать количество вхождений записи
Код:
SELECT Таблица1.istec, Count(Таблица1.istec) AS [Count-istec]
FROM Таблица1
GROUP BY Таблица1.istec
ORDER BY Count(Таблица1.istec) DESC;
Этот код сортирует вхождение исца по убыванию, первый будет который чаще всех входил, и т.д.
S@fer вне форума Ответить с цитированием
Старый 27.05.2009, 09:06   #4
LANDER
 
Регистрация: 26.05.2009
Сообщений: 7
По умолчанию

Так, с поиском вы помогли за что вам спасибо! А вот со вторым всеравно проблема. Есть ли еще какие-нибудь способы?

DataModule1.FindQuery.SQL.Add('WHER E (Year(Дата) ='+FindEdit.Text+')');

Последний раз редактировалось LANDER; 27.05.2009 в 09:57.
LANDER вне форума Ответить с цитированием
Старый 27.05.2009, 09:10   #5
S@fer
Форумчанин
 
Аватар для S@fer
 
Регистрация: 29.01.2009
Сообщений: 411
По умолчанию

Цитата:
А вот со вторым всеравно проблема
В чем конкретно проблема?
Как пробуете сделать?
Чем не устривает приведенный мною запрос?
S@fer вне форума Ответить с цитированием
Старый 27.05.2009, 09:44   #6
LANDER
 
Регистрация: 26.05.2009
Сообщений: 7
По умолчанию

Принцип работы не могу понять, так как SQL не владею вовсе. Возможно ли както просто сделать проверку на max Истец? Ваш запрос я так понимаю должен выглядить следующим образом в моем случае?

procedure TForm1.Button8Click(Sender: TObject);
begin
DataModule1.RequestQuery.Active:=fa lse;
DataModule1.RequestQuery.SQL.Clear;
DataModule1.RequestQuery.SQL.Add('S ELECT base.Истец, Count(base.Истец) as [Count-Истец]');
DataModule1.RequestQuery.SQL.Add('F ROM base');
DataModule1.RequestQuery.SQL.Add('G roup by base.Истец');
DataModule1.RequestQuery.SQL.Add('O rder by Count(base.Истец) Desc');
DataModule1.RequestQuery.Active:=tr ue;
RequestForm.ShowModal;
end;

Последний раз редактировалось LANDER; 27.05.2009 в 10:06.
LANDER вне форума Ответить с цитированием
Старый 27.05.2009, 12:14   #7
S@fer
Форумчанин
 
Аватар для S@fer
 
Регистрация: 29.01.2009
Сообщений: 411
По умолчанию

Цитата:
Ваш запрос я так понимаю должен выглядить следующим образом в моем случае
Да
Если нужно вывести только того исца у кого больше всех записей,то можно сделать следующее
Кидаем на форму еще один Query в его свойстве SQL пишем
Код:
SELECT base.Истец, Count(base.Истец) as [Count-Истец] FROM base Group by base.Истец Order by Count(base.Истец) Desc
затем в Query который связан с dbgrid прописываем следующий запрос
Код:
procedure TForm1.Button8Click(Sender: TObject);
begin
DataModule1.Query1.Active:=True;
DataModule1.Query1.First;

DataModule1.RequestQuery.Active:=False;
DataModule1.RequestQuery.SQL.Clear;
DataModule1.RequestQuery.SQL.Add('SELECT * FROM base');
DataModule1.RequestQuery.SQL.Add('WHERE Истец="'+DataModule1.Query1.Fields[0].AsString+'"');
DataModule1.RequestQuery.Active:=true;
RequestForm.ShowModal;
end;
S@fer вне форума Ответить с цитированием
Старый 27.05.2009, 13:35   #8
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Да ну вас совсем...
А вложенные запросы с объединением по одной таблице - не слышали?
Зачем еще один Query-то?
Обзовите таблицу в одном случае BASE1, а для вложенной выборки - BASE2...
mihali4 вне форума Ответить с цитированием
Старый 27.05.2009, 15:03   #9
LANDER
 
Регистрация: 26.05.2009
Сообщений: 7
По умолчанию

Ну сдесь или я чтото не пойму или вы чтото упустили. Смотрите, RequestQuery также должен содержать в свойстве SQL строки иначе я не смогу добавить необходимые поля для связи. Цитирую: "затем в Query который связан с dbgrid прописываем следующий запрос" - это же сам запрос по клику на кнопку. Также? Но все же я пробывал в SQL свойство RequestQuery прописывать код что для Button8. Результат конечно же ошибка.

Последний раз редактировалось LANDER; 28.05.2009 в 08:50.
LANDER вне форума Ответить с цитированием
Старый 27.05.2009, 21:19   #10
LANDER
 
Регистрация: 26.05.2009
Сообщений: 7
По умолчанию

Цитата:
Если нужно вывести только того исца у кого больше всех записей
Ну вывести в грид нужно не истца, а фирму. Мне еще сделали намек на такое. Насколько я понял этот запрос выводит две колонки где в первой фирма, а во второй сколько раз данная фирма была истецом, но как теперь используя этот запрос сделать вывод фирмы, которая чаще всего была истецом? Задание судя по всему упростилось, но опять же я и с этим застрял. И опять мучу вас с надеждой на помощь.

ADOQuery1 с запросом:
Код:
Select Фирма Count (Фирма);
from base;
Group by Фирма;
LANDER вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
SQL запрос + SQL запрос BeSeech Microsoft Office Access 10 14.02.2009 17:04
запрос sql sleeper_Izh SQL, базы данных 2 20.06.2008 11:27
SQL запрос SERG1980 БД в Delphi 6 19.10.2007 23:03
SQL-запрос Alexey_vyb БД в Delphi 4 22.05.2007 18:52
SQL запрос на основе другого SQL запрса... Timoxa БД в Delphi 1 07.01.2007 18:15