Valdemar |
Отправлено: 20.12.2005, 16:18 |
|
Мастер участка
Группа: Участник
Сообщений: 433
|
Есть таблица, в одном из полей которой хранятся картинки. Запросом я выбираю нужные данные, включая поле с картинкой. Данные (кроме картинок) отображаются в DBGrid, а чтобы посмотреть картинку (если он есть) пользователь нажимает дополнительную кнопку. Свойство Enabled этой кнопки, а также кнопок Добавить и Удалить картинку, зависит от наличия картинки в поле БД.
Но при таком подходе картинки выбираются зарпросом из БД, но пользователю они могут и не понадобиться. А если в запросе не выбирать поле с картинкой, то как узнать есть ли картинка или нет, что-бы правильно задать свойство Enabled для кнопок Посмотреть, Дабавить и Удалить картинку?
Может быть можно написать запрос, который будет возвращать нужные данные, а вместо картинки будет выдан флаг наличия картинки, например, 1-есть картинка, 0-нет?
Можно написать храниую процедуру, которая будет выбирать из таблицы нужные данные, а вместо картинки 0 или 1, а запрос делать не к таблице, к этой ХП. Но может можно обойтись без хранимой процедуры? |
|
olegenty |
Отправлено: 20.12.2005, 18:40 |
|
Ветеран
Группа: Модератор
Сообщений: 2412
|
однозначно необходимы 2 запроса:
1. запрос всех данных + флага наличия картинки
2. запрос картинки по идентификатору, который будет выполняться ТОЛЬКО если картинка ЕСТЬ, и ТОЛЬКО если пользователь ВОЗЖЕЛАЛ её увидеть.
|
|
Valdemar |
Отправлено: 20.12.2005, 19:49 |
|
Мастер участка
Группа: Участник
Сообщений: 433
|
В том-то и вопрос, как получить флаг наличия картинки? |
|
Admin |
Отправлено: 20.12.2005, 22:31 |
|
Владимир
Группа: Администратор
Сообщений: 1190
|
Добавьте в таблицу поле — 1 байт — флаг наличия картинки.
Тогда по 1 запросу всегда возвращайте данные в Grid без
картинок все, в поле где картинка сможете сразу отражать
ее наличие/отсутствие, а при клике (запросе) пользователем
определенной картинки во 2 запросе возвращайте именно
запрошенную картинку.
Можете это делать и через ХП, это уж как захотите.
Заодно уменьшите и нагрузку на БД, так как не придется
читать-передавать все картинки.
|
|
Valdemar |
Отправлено: 21.12.2005, 08:40 |
|
Мастер участка
Группа: Участник
Сообщений: 433
|
Дополнительное поле — тоже не плохая идея. Спасибо за совет. |
|
olegenty |
Отправлено: 21.12.2005, 08:54 |
|
Ветеран
Группа: Модератор
Сообщений: 2412
|
по-моему дополнительное поле не нужно, вместо него лучше воспользоваться вьюхой, где одно поле будет расчётным: 0 — если поле картинки = NULL и 1 — в противном случае.
|
|
Valdemar |
Отправлено: 21.12.2005, 10:13 |
|
Мастер участка
Группа: Участник
Сообщений: 433
|
А как составить запрос для такого представления чтобы
QUOTE | одно поле будет расчётным: 0 — если поле картинки = NULL и 1 — в противном случае | |
|
olegenty |
Отправлено: 21.12.2005, 11:31 |
|
Ветеран
Группа: Модератор
Сообщений: 2412
|
думать надо, смотреть условные функции. на MSSQL это было бы WHEN CASE, а как на IB/FB — надо подумать, я с ним уже второй год не работаю.
|
|
olegenty |
Отправлено: 21.12.2005, 11:32 |
|
Ветеран
Группа: Модератор
Сообщений: 2412
|
лобовое решение — написать UDF. если средствами языка невозможно, я сделал бы именно так.
|
|
Valdemar |
Отправлено: 21.12.2005, 13:02 |
|
Мастер участка
Группа: Участник
Сообщений: 433
|
В Firebird я условных функций не нашел (кроме как в ХП и триггерах). Я больше склоняюсь к использованию хранимой процедуры. |
|
Gedeon |
Отправлено: 21.12.2005, 13:39 |
|
Ветеран
Группа: Модератор
Сообщений: 1742
|
А что хранится в поле если там картинки нет, не NULL случайно?
|
|
Valdemar |
Отправлено: 21.12.2005, 20:45 |
|
Мастер участка
Группа: Участник
Сообщений: 433
|
Да, если картинки нет, то NULL |
|
Valdemar |
Отправлено: 21.12.2005, 21:20 |
|
Мастер участка
Группа: Участник
Сообщений: 433
|
Gedeon, ваш вопрос натолкнул меня на хорошую мысль:
CODE | SELECT field1, field2, 1 flag_img FROM table WHERE img is not null
union
SELECT field1, field2, 0 flag_img FROM table WHERE img is null | |
|
Gedeon |
Отправлено: 22.12.2005, 09:42 |
|
Ветеран
Группа: Модератор
Сообщений: 1742
|
Ну именно для этого я его и задавал .
Только мне кажется можно обойтись без юнион, щас нет под рукой хэлпа к файрбёрд, но мне кажется какой-нить каст или конверт там есть, должно сработать приведение к булеву типу.
|
|
Guest |
Отправлено: 25.12.2005, 15:41 |
|
Не зарегистрирован
|
QUOTE | А как составить запрос для такого представления чтобыQUOTE |
одно поле будет расчётным: 0 — если поле картинки = NULL и 1 — в противном случае
|
|
Не указана версия сервера. Если 1.5 и далее со всеми остановками,
(к чему, кстати не вижу препятствий), то:
1. (Field_With_Picture==NULL ? 0 : 1)CODE |
SELECT
Field1,
...
FieldN,
CASE
WHEN (Field_With_Picture IS NULL) THEN 0
ELSE 1
END
FROM
YourTable |
2. Не так, как в условии, но вдруг понадобится:
(Field_With_Picture==NULL ? 0 : picture_field )CODE |
SELECT
COALESCE(Field_With_Picture, 0)
FROM
YourTable |
PS: читайте Firebird 1.5 Release Notes, там много интересного... |
|
Valdemar |
Отправлено: 26.12.2005, 08:45 |
|
Мастер участка
Группа: Участник
Сообщений: 433
|
Спасибо |
|