Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 12.04.2012
Сообщений: 8
1

Запрос на счет записей

18.04.2012, 14:14. Показов 1070. Ответов 16
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет.
sql начал осваивать совсем недавно.
проблема такая:
Мне нужно посчитать количество записей с возвратом меньше 35 и количество вывести в stringgrid.
Делаю так:
Delphi
1
2
3
4
5
6
7
8
9
procedure TTab2.Button1Click(Sender: TObject);
var  a: TADOQuery;
a:= TADOQuery.Create(nil);
a.Connection:= fDM.ADOConnection1;
a.SQL.Text:='select count(*) as cnt from LichDan where Year([Дата рождения])>35;
a.Open;
StringGrid1.Cells[4,0]:=a.FieldByName('cnt').Asstring;
a.Close;
a.Free;
выдает ошибку на 6 строке: [Error] ftab2.pas(153): Unterminated string
Поле "дата рождения" имеет краткий формат даты.
Подскажите как надо правильно написать.
Заранее спасибо
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.04.2012, 14:14
Ответы с готовыми решениями:

Счет записей СЧЕТЗ в сводной таблице
Добрый день! При формировании сводной таблицы возникла необходимость подсчитать количество записей...

Запрос на счет в БД Гостиница
Не работает запрос на счет. Должна перемножаться разница дней из таблицы Оформление на Стоимость...

Запрос на распределение записей
Имеются таблицы Дипломник, Руководитель, Специализация, Специализация диплома, Специализация...

Запрос и разделение записей
ковыряю внешнюю печатную форму. там есть запрос: ВЫБРАТЬ ЛимитыОтпуска.ЛимитОтпуска КАК Лимит...

16
132 / 129 / 31
Регистрация: 12.12.2011
Сообщений: 462
18.04.2012, 16:55 2
Попробуй так:
Delphi
1
... := DateToStr(ADOQuery1.FieldValues['cnt']);
Еще проверь, что данные отбираются. Например кинь на форму Table и посмотри, что в запросе получается.
0
498 / 251 / 56
Регистрация: 16.06.2011
Сообщений: 904
18.04.2012, 17:27 3
Кавычку не забыл закрыть в этой строке?
Delphi
1
a.SQL.Text:='select count(*) as cnt from LichDan where Year([Дата рождения])>35';
1
0 / 0 / 0
Регистрация: 12.04.2012
Сообщений: 8
19.04.2012, 08:38  [ТС] 4
Пропустил ковычку в конце, только вот запрос стал работать но не коректно т.е он отбирает все ячейки с заполненой датой а условие >35 не выполняется. Незнаете почему?
0
Модератор
4217 / 3058 / 583
Регистрация: 21.01.2011
Сообщений: 13,205
19.04.2012, 10:05 5
А что выдает функция Year([Дата рождения]) ?
И какой результат все таки нужно получить? Случаем не возраст?
0
0 / 0 / 0
Регистрация: 12.04.2012
Сообщений: 8
19.04.2012, 10:12  [ТС] 6
Нужно получить количество записей удовлетворяющие условие >35 лет, а данный запрос считает все записи где введена дата. почему не знаю.
0
Модератор
4217 / 3058 / 583
Регистрация: 21.01.2011
Сообщений: 13,205
19.04.2012, 10:17 7
Цитата Сообщение от Aps Посмотреть сообщение
Нужно получить количество записей удовлетворяющие условие >35 лет, а данный запрос считает все записи где введена дата. почему не знаю.
Очень просто. Year скорее всего возвращает год даты рождения, который всегда больше 35
Возраст же определяется как разница в годах между текущей датой и датой рождения
0
0 / 0 / 0
Регистрация: 12.04.2012
Сообщений: 8
19.04.2012, 10:23  [ТС] 8
ну да просто если знать) а я впервые с этим сталкнулся и не знаю как это реализовать
0
Модератор
4217 / 3058 / 583
Регистрация: 21.01.2011
Сообщений: 13,205
19.04.2012, 10:30 9
Набор функций, которые можно использовать в SQL, зависят от конкретной СУБД. Если написать на псевдокоде, то где-то так:

Year([Текущая дата]) - Year([Дата рождения]) > 35

Но к Delphi это отношения не имеет, это вопрос чисто по твоей СУБД
0
0 / 0 / 0
Регистрация: 12.04.2012
Сообщений: 8
19.04.2012, 10:49  [ТС] 10
А для делфи никто не знает как сделать?
0
Супер-модератор
8783 / 2536 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
19.04.2012, 10:57 11
Aps, возьмите нормальные компоненты, заточенные под конкретную базу и будем вам счастье... АДО - это попытка универсальности, причем не самая успешная, по крайней мере в дельфийской реализации...
0
0 / 0 / 0
Регистрация: 12.04.2012
Сообщений: 8
19.04.2012, 11:34  [ТС] 12
Время уже поджимает, поэтому придется уже работать с адо.
0
132 / 129 / 31
Регистрация: 12.12.2011
Сообщений: 462
19.04.2012, 12:59 13
Можно так попробовать:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
uses DateUtils;
 
procedure(....)....//Сам напишешь
var
     i,Count:Integer;
     D:TDateTime;
     CurrentDate:TDateTime;
begin
   CurrentDate:=SysUtils.Date;
   //Создаем Query, подключаем к БД
   ADOQuery1.SQL.Add('SELECT [Датарождения] FROM [LichDan]');
   ADOQuery1.ExecSQL;
   Count:=0;
   for i:=1 to ADOQuery1.RecordCount do
   begin
      ADOQuery1.RecNo:=i;
      D:=ADOQuery1.FieldValues['Датарождения'];
      if DateUtils.YearsBetween(CurrentDate,D)<35 then
         Count:=Count+1;
   end;
   //Удаляем Query
   //С "Count" делаем все что надо 
end;
100% будет работать. И не используй в названиях полей русские буквы!
0
498 / 251 / 56
Регистрация: 16.06.2011
Сообщений: 904
21.04.2012, 15:37 14
Только строку:
Delphi
1
2
ADOQuery1.SQL.Add('SELECT [Датарождения] FROM [LichDan]');
ADOQuery1.ExecSQL;
, надо заменить на:
Delphi
1
2
3
ADOQuery1.Close;
ADOQuery1.SQL.Add('SELECT [Датарождения] FROM [LichDan]');
ADOQuery1.Open;
Добавлено через 4 минуты
Попробуй что-то типа этого запроса:
SQL
1
2
3
4
SELECT COUNT(LichDan.[FIO]) AS [Count-FIO], LichDan.[BirthDate]
FROM LichDan
GROUP BY LichDan.[BirthDate]
HAVING ((DATE()>35));
0
Эксперт Pascal/Delphi
1134 / 615 / 129
Регистрация: 13.02.2009
Сообщений: 3,553
21.04.2012, 17:58 15
Цитата Сообщение от Grossmeister Посмотреть сообщение
Набор функций, которые можно использовать в SQL, зависят от конкретной СУБД. Если написать на псевдокоде, то где-то так:

Year([Текущая дата]) - Year([Дата рождения]) > 35

Но к Delphi это отношения не имеет, это вопрос чисто по твоей СУБД
Я прошу прощения Набор функций, которые можно использовать в SQL, зависят от конкретной СУБД = Вы говорите что если СУБД Oracle или Firebird или MS.SQL Server Запрос по разному надо писать ?
0
Модератор
4217 / 3058 / 583
Регистрация: 21.01.2011
Сообщений: 13,205
23.04.2012, 10:06 16
Цитата Сообщение от xxbesoxx
Я прошу прощения Набор функций, которые можно использовать в SQL, зависят от конкретной СУБД = Вы говорите что если СУБД Oracle или Firebird или MS.SQL Server Запрос по разному надо писать ?
Разумеется. Например, в Oracle имя поля не пишется в скобках (максимум, в двойных кавычках) и нет функции Year
1
Эксперт Pascal/Delphi
1134 / 615 / 129
Регистрация: 13.02.2009
Сообщений: 3,553
23.04.2012, 15:02 17
Цитата Сообщение от Grossmeister Посмотреть сообщение
Разумеется. Например, в Oracle имя поля не пишется в скобках (максимум, в двойных кавычках) и нет функции Year
Спасибо ! Буду знать
0
23.04.2012, 15:02
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.04.2012, 15:02
Помогаю со студенческими работами здесь

Запрос на количество записей в БД
Здравствуйте. Необходимо составить запрос: Я ввожу ГРЗ автомобиля в текстбокс и нажимаю...

Запрос с сортировкой записей
как можно отсортировать набор записей сначала по одному столбцу, а потом по другому??

Запрос на вывод записей
Здравствуйте, помогите написать запрос. Условие: Выбрать все записи у которых поле &quot;Код_товара&quot;...

Запрос на редактирование записей
Привет всем. Помогите с редактированием записей. Код ниже, вместо редактирования, полностью...

Запрос или набор записей
Вообщем опишу ситуацию, имеется регистр сведений, в котором забиты данные по абонентам... Есть...

Запрос на удаление записей по условию
помогите пожалуйста составить SQL запрос по удалению записей из таблицы Sessions по условию ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru