Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Запрос ничего не вернул, Как определить? 
:(
    Опции темы
bursa
Дата 5.4.2005, 08:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Всегда делаю во так
if Query1.FieldByName('ID').asString='' then...
Может, это извращение, но зато работает надежно и всегда, при условии, что ID-идентификатор not null. А тип - м.б. и number.

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


Опытный
**


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

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



2Петрович: Да-да, согласен. Хм..
Может действительно как Бурса предлагает?.....
PM MAIL   Вверх
Петрович
Дата 5.4.2005, 10:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 6
Всего: 55



Цитата(bursa @ 5.4.2005, 09:43)
Всегда делаю во так
if Query1.FieldByName('ID').asString='' then...
Может, это извращение, но зато работает надежно и всегда, при условии, что ID-идентификатор not null. А тип - м.б. и number.

Дело опять-же в наличии агрегативных функций. О каком ID при этом может идти речь? smile



--------------------
Все знать невозможно, но хочется
PM ICQ   Вверх
DDX
Дата 5.4.2005, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



проверять все поля на пустое значение
--
а полезно все-таки читать форум - на самых казалось бы примитивных вещах могут обнаружиться интересности
--------------------
Учиться, учитьcя и ещё раз учиться  
PM MAIL WWW   Вверх
bursa
Дата 5.4.2005, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата
О каком ID при этом может идти речь?

Редко когда бывают запросы (по крайней мере, у меня) когда не выводишь идентификатор.
Выбор там или списка товаров, покупателей или лет - у всего есть идентификатор

PM MAIL   Вверх
Петрович
Дата 5.4.2005, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 6
Всего: 55



Цитата(bursa @ 5.4.2005, 13:52)
Редко когда бывают запросы (по крайней мере, у меня) когда не выводишь идентификатор.

Повторяю еще раз. Речь идет о запросах содержащих агрегативную функцию!
Для примера, в демо БД от Borland (DBDEMOS) есть таблица country.db. Там есть поля:
Name - Нзвание страны
Capital - Столица
Continent - Континент
Area - Площадь
Population - Численность населения
Поле Name имеет уникальный индекс. Т.е. данное поле служит тем самым ID записи.
Теперь, предположим я хочу получить площадь всех государств располагающихся на континенте 'Atlantida'. Для этого, я использую запрос с агрегативной функцией Sum:
Код
SELECT Sum(Area) FROM Country.db WHERE Continent = 'Atlantida'


Ну а теперь, покажи мне, куда здесь вставить то самое поле Name?

Это сообщение отредактировал(а) Петрович - 5.4.2005, 15:10


--------------------
Все знать невозможно, но хочется
PM ICQ   Вверх
Bes
Дата 5.4.2005, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Не спорьте, вы говорите о разных вещах. smile Короче типа я так понял бурсу: нет id - нет результата.
К Петровичу: Раз агрегативная ф-я не имеет id (если его специально так не обозвать) значит нет и результата. Все сходится.
PM MAIL   Вверх
Петрович
Дата 5.4.2005, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 6
Всего: 55



Цитата(Bes @ 5.4.2005, 16:20)
Раз агрегативная ф-я не имеет id (если его специально так не обозвать) значит нет и результата. Все сходится.

smile


--------------------
Все знать невозможно, но хочется
PM ICQ   Вверх
Bes
Дата 5.4.2005, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



smile Это типа "ни хрена себе........." ? smile
PM MAIL   Вверх
bursa
Дата 5.4.2005, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата
Ну а теперь, покажи мне, куда здесь вставить то самое поле Name

Вариант №1
Код

SELECT Count(*) as c, Sum(Area) FROM Country.db WHERE Continent = 'Atlantida'

и если с=0 ....
А по нормальному должно выглядеть так
Код

SELECT t2.id_continent, t2.name, Sum(Area) FROM Country.db t1 , Continent.db t2 
WHERE t2.Name = 'Atlantida'
and t1.id_continent=t2.id_continent
group by t2.id_continent, t2.name






PM MAIL   Вверх
Петрович
Дата 5.4.2005, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 6
Всего: 55



Цитата(bursa @ 5.4.2005, 17:04)
Вариант №1
Код

SELECT Count(*) as c, Sum(Area) FROM Country.db WHERE Continent = 'Atlantida'

Вот это выход!

Цитата(bursa @ 5.4.2005, 17:04)
А по нормальному должно выглядеть так
Код

SELECT t2.id_continent, t2.name, Sum(Area) FROM Country.db t1 , Continent.db t2 
WHERE t2.Name = 'Atlantida'
and t1.id_continent=t2.id_continent
group by t2.id_continent, t2.name

А вот это нет. Проблема остается если в Continent.db отсутствует запись Name = 'Atlantida'.
А потом, нормализация БД до такой степени совсем не практична.
Кстати, можно тоже самое записать и с одной таблицей Country.db:
Код

SELECT t2.Continent, Sum(Area) FROM Country.db t1 , Country.db t2 
WHERE t2.Continent = 'Atlantida'
and t1.Continent=t2.Continent
group by t2.Continent



--------------------
Все знать невозможно, но хочется
PM ICQ   Вверх
bursa
Дата 5.4.2005, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата
можно тоже самое записать и с одной таблицей Country.db

t2.Continent может быть null. А вот ID не может. И потому проверка
t2.id_continent='' должна работать


PM MAIL   Вверх
Петрович
Дата 5.4.2005, 17:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 6
Всего: 55



Цитата(bursa @ 5.4.2005, 17:38)
t2.Continent может быть null.

В данном случае, даже если на Continent навесить условие not null, ничего не изменится.

Цитата(bursa @ 5.4.2005, 17:38)
А вот ID не может. И потому проверка
t2.id_continent='' должна работать

Да это он в таблице не может быть null, а в результате запроса может! Ты попробуй.



--------------------
Все знать невозможно, но хочется
PM ICQ   Вверх
bursa
Дата 6.4.2005, 08:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Петрович, хватит спорить. Лучше давай подведем итог темы.
Итак, если у вас
а) не агрегативный запрос, можете проверять наличие записей
1. При наличии ID not null - проверкой
Код

if Query1.FieldByName('ID').asString= '' then... 

2. Без ID -
Цитата(fess @ 28.3.2005, 21:08)
SomeDataSet.DataSet.EOF
SomeDataSet.DataSet.RecordCount

Причем нужно учитывать, что RecordCount - фетчит весь запрос.

б)запрос агрегативный
1. При наличии ID not null - проверкой
Код

if Query1.FieldByName('ID').asString= '' then... 

2.Без ID - в запросе использовать
Код

select count(*), .... from


Какой выбрать вариант - дело вкуса.
Мне лично нравится вариант 1, так как базы у меня нормализованнные и код проги одинаков для агрегативных и неагрегативных запросов. И в случае добавления строки group by ... ничего в коде программы менять не надо.


PM MAIL   Вверх
Петрович
Дата 6.4.2005, 08:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 6
Всего: 55



Цитата(bursa @ 6.4.2005, 09:13)
Петрович, хватит спорить. Лучше давай подведем итог темы.

Нет давая поспорим smile
Как никак в споре рождается истина. Вот например пока мы спор не затеяли, мне и в голову не пришло использовать Count(*).

Цитата(bursa @ 6.4.2005, 09:13)
2. Без ID -

Цитата (fess @ 28.3.2005, 21:08)
SomeDataSet.DataSet.EOF
SomeDataSet.DataSet.RecordCount

Я смотрю ты забыл про существование:
Код

SomeDataSet.IsEmpty


Цитата(bursa @ 6.4.2005, 09:13)
Мне лично нравится вариант 1, так как базы у меня нормализованнные и код проги одинаков для агрегативных и неагрегативных запросов. И в случае добавления строки group by ... ничего в коде программы менять не надо.

Ну и как я уже говорил выше, с этим я согласиться не могу, поскольку считаю что это не сработает.

Что касается моих выводов, то они таковы.

Для проверки на наличие записей надо использовать:

а) для запросов не содержащих агрегативных функций:
Код
SomeDataSet.IsEmpty


б) для запросов содержащих агрегативные функции:
в запрос надо добавлять count(*)
Код
select count(*), .... from

в программе проверять так:
Код
SomeDataSet.Fields[0].AsInteger > 0


И не надо заморачиваться на степень нормализации БД, и на наличие в таблицах not null значений.

Цитата(bursa @ 6.4.2005, 09:13)
Петрович, хватит спорить.

Ну пожалуй тут ты прав smile. Мы оба высказались, т.е. для себя мы все решили. А остальные, пусть сами выбирают.



--------------------
Все знать невозможно, но хочется
PM ICQ   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.2148 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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