C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
PostgreSQL+DBGrid, Отображение объединенных полей
gen
Отправлено: 11.03.2006, 14:24


Дежурный стрелочник

Группа: Участник
Сообщений: 36



Привет.

Сталкивался ли кто-нибудь с проблемой отображения значения объединенных полей в Gride при использовании БД PostgreSQL. Проблема в следующем:
нужно вывести в одно поле Gridа несколько полей (к примеру фамилию, имя , отчество из разных полей таблицы БД). Делаю так: формирую запрос вида
QUOTE
select FAM || " " || NAME || " "  || FATHER As FIO from STAFF

но в результате в Gridе получаю столбец значений (MEMO), т.е. объединенное поле не может отобразиться, т.к. Grid считает его большим объектом.
Для доступа к БД был использован как BDE, так и компоненты прямого доступа — результат одинаков. Также результаты выводились в разные Grid (стандартный DBGrid, DBGridEh, RxDBGrid, DBAdvStringGrid) — из них нормально отображает только DBAdvStringGrid, но хотелось бы получить результат в DBGridEh.
Кроме того, похоже, такая проблема только при работе с PostgreSQL, т.к. запрос к аналогичной таблице в Interbase отображается нормально.
AVC
Отправлено: 13.03.2006, 09:29


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE

Кроме того, похоже, такая проблема только при работе с PostgreSQL

Это не так. Такая "проблема" может встать при работе с любым сервером. Дело в том, что если размер симаольного поля превосходит некую критическую величину (зачастую 255 символов) то компонет типа dataset говорит, что это поле типа мемо, ну а сетка сама затем настраивается по этому типу.
Так что решение нужно искать в том компоненте, которым получают данные. Например у DOA для этого есть специальный параметр в Session.

Еще один путь решения — ограничить длину строки на стороне сервера до значения когда компонент станет считать поле строковым. Например так
Select
SubString(FAM || " " || NAME || " " || FATHER, 1, 250) as FIO
From staff
(синтаксис зависит от СУБД, функций PostgreSQL не знаю).

Ну и наконец можно переопределить содержимое клетки сетки обрабатывая событие OnDrawColumnCell. Например так
CODE

AnsiString text = "";
if (cln->Field && !cln->Field->IsNull)
{  TFieldType fdt = cln->Field->DataType;
   if (fdt == ftMemo || fdt == ftBlob || fdt == ftOraClob)
text = cln->Field->AsString.SubString(1,...);
}
...// в сетке будет показано содержимое text


Я использую все три способа.
Первый (параметр сессии) для общей настройки приложения.
Второй (подстрока в select) самый распространённый, особенно для полей "толко для просмотра".
Третий (OnDraw) — для показа начала мемо поля в сетке.
Valdemar
Отправлено: 13.03.2006, 12:34


Мастер участка

Группа: Участник
Сообщений: 433



В DBGridEh усть свойсто DrawMemoText, пробовали его менять?
gen
Отправлено: 13.03.2006, 15:51


Дежурный стрелочник

Группа: Участник
Сообщений: 36



Привет.

Блин, протупил, спасибо Valdemar

В TMS свойство ShowMemoFields увидел, а у Eh не заметил.
AVC также спасибо, будем знать как можно принудительно ограничить длину строки — иногда полезно.
Но все же, не совсем понятно почему Grid считает длину объединенных полей большой. К, примеру, достаточно объединить поле длиной 30 знаков и просто пробел (Fam || ' '), как значение автоматом переходит в MEMO, хотя суммарная длина поля заведомо меньше "критической". Правда такое заметил только при работе с PostgeSQL. А вот в при работе с Interbase поля действительно нормально отображаються до некоторого размера (255), а тосле надо искать способ отобразить MEMO поле.
avc*
Отправлено: 13.03.2006, 16:28


Не зарегистрирован







QUOTE

Но все же, не совсем понятно почему Grid считает длину объединенных полей большой

Так ей предписывает dataset а ему протокол получения данных. Видимо PG не может сообразить (или не хочет) что если к 30 символам добавить пробел будет не больше 31 и посылает клиенту длину поля — максимально возможную biggrin.gif

У оракла такой эффект проявляется при использовании функций (SP), возвращающих строки. Все время приходится писать в оберкте substr.

Вернуться в Работа с базами данных в C++Builder