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 и посылает клиенту длину поля — максимально возможную
У оракла такой эффект проявляется при использовании функций (SP), возвращающих строки. Все время приходится писать в оберкте substr. |
|
|