Лена |
Отправлено: 01.10.2006, 18:46 |
|
Мастер участка
Группа: Участник
Сообщений: 501
|
В базе данных есть таблица со столбцом типа bool. В этот столбец я могу вводить в гриде у клиента только значения 1 или 0. Для ввода значений я использую PickList колонки грида. Мне бы хотелось, используя PickList колонки грида выбирать значения “Да” или “Нет” и на основании этого записывать 1 или 0 в базу данных, а в гриде пользователь будет видеть “Да” или “Нет”. Как это организовать самым простым способом? Если просто записать в PickList колонки грида “Да” и “Нет” то попытка выбрать эти значения вызывает исключение при пересылке в базу. Может надо организовать отдельную колонку в гриде и в ней сравнивать программно значения “Да” или “Нет” с реальной колонкой, в которой 1 или 0, сделав ее предварительно не видимой? Или есть другой способ?
Спасибо.
|
|
olegenty |
Отправлено: 02.10.2006, 06:43 |
|
Ветеран
Группа: Модератор
Сообщений: 2412
|
Что за грид?
|
|
Shagg |
Отправлено: 02.10.2006, 08:47 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 69
|
Возможно у PickList есть свойство ItemIndex. Если так, то в Items загоняем значения "Нет" и "Да" и при сохранении используем ItemIndex.
ПРавда вохникает проблема если ничего не выбрано то ItemIndex будет равен -1. ТОгда лучше брать значение по умолчанию ("нет" например) или вообще не сохранять. |
|
Лена |
Отправлено: 02.10.2006, 09:13 |
|
Мастер участка
Группа: Участник
Сообщений: 501
|
QUOTE (olegenty @ 02.10.2006, 06:43) | Что за грид?
|
Стандартный DBGrid.
>Возможно у PickList есть свойство ItemIndex
Нет, не нашла.
DBGrid1->Columns->Items[2]->PickList-> |
|
olegenty |
Отправлено: 02.10.2006, 10:05 |
|
Ветеран
Группа: Модератор
Сообщений: 2412
|
либо тебе придётся сделать через Lookup, либо я даже не знаю, например через события самого TField, типа OnValidate
либо перейди на DBGridEh, у его колонок есть не только свойство PickList, но и свойство KeyList. в Pick — отображаемые значения, в Key (если заполнено) — используемые.
|
|
AVC |
Отправлено: 02.10.2006, 10:24 |
|
Ветеран
Группа: Модератор
Сообщений: 1583
|
DisplayFormat для bool пробовали? Не помню как он ведет себя при редактировании а при показе все ок. |
|
Admin |
Отправлено: 02.10.2006, 10:43 |
|
Владимир
Группа: Администратор
Сообщений: 1190
|
В свойстве DisplayValues = "Да;Нет";
и то-же самое — в DBGrid — PickList
и все нормально работает.
|
|
Admin |
Отправлено: 02.10.2006, 11:06 |
|
Владимир
Группа: Администратор
Сообщений: 1190
|
А на DBGridEh в любом случае имеет смысл переходить.
|
|
Лена |
Отправлено: 02.10.2006, 11:20 |
|
Мастер участка
Группа: Участник
Сообщений: 501
|
QUOTE (Admin @ 02.10.2006, 11:06) | А на DBGridEh в любом случае имеет смысл переходить. |
Я делаю только маленькую часть проекта, поэтому не могу использовать сторонние компоненты т.к. тогда общий проект не будет компилироваться на других машинах.
Что касается свойства DisplayValues, так правильно?:
TBooleanField(DataModule2->ADOQueryKey->FieldByName("enabled")).DisplayValues = "Да;Нет";
Отредактировано Лена — 02.10.2006, 11:43 |
|
Лена |
Отправлено: 02.10.2006, 11:53 |
|
Мастер участка
Группа: Участник
Сообщений: 501
|
Нет не работает.
Написала в событии FormCreate строчку:
TBooleanField(DataModule2->ADOQueryKey->FieldByName("enabled")).DisplayValues = "Да;Нет";
а в колонке грида заполнила PickLict "Да" и "Нет"
При загрузке из базы данных вижу в колонке, как и прежде, единицы и нули. Если попробовать вставить из PickLict значение, то вставляется только одна буква "Д" или "Н" и при попытке ClientDataSetKey->ApplyUpdates(-1); сразу исключение.
|
|
Admin |
Отправлено: 02.10.2006, 14:58 |
|
Владимир
Группа: Администратор
Сообщений: 1190
|
Я проверял с обычным BDE-шным Table — все работает. С ADO не смотрел.
QUOTE | В базе данных есть таблица со столбцом типа bool |
А вы уверены, что в базе это поле описано как bool, а не как
integer или char(1) ?
|
|
Лена |
Отправлено: 02.10.2006, 15:16 |
|
Мастер участка
Группа: Участник
Сообщений: 501
|
Вот описание этой таблицы в базе:
CREATE TABLE keys
(
code varchar(32) NOT NULL,
description varchar(50),
enabled bool NOT NULL,
person_id int4,
CONSTRAINT pk_keys PRIMARY KEY (code)
)
WITHOUT OIDS;
ALTER TABLE keys OWNER TO postgres;
Речь идет о поле enabled. В самой базе в этом поле находятся слова TRUE, FALSE.
У меня связь: ADOQueryKey -> TDatasetProvider -> TClientDataset -> TDatasource
Отредактировано Лена — 02.10.2006, 15:19 |
|
Admin |
Отправлено: 02.10.2006, 15:43 |
|
Владимир
Группа: Администратор
Сообщений: 1190
|
А какая база данных ?
Проверил — все работает и с ADOTable c .mdb (Access),
там логическое поле имеет тип bit — тоже все работает.
|
|
Лена |
Отправлено: 02.10.2006, 16:16 |
|
Мастер участка
Группа: Участник
Сообщений: 501
|
QUOTE (Admin @ 02.10.2006, 15:43) | А какая база данных ?
|
PostgreSQL
Она на сервере, я ее смотрю программой pgAdmin. |
|
Admin |
Отправлено: 02.10.2006, 17:52 |
|
Владимир
Группа: Администратор
Сообщений: 1190
|
Думаю что Вам надо разбираться как организован тип bool
в этой базе, может быть дело в этом.
Или в связке
ADOQueryKey -> TDatasetProvider -> TClientDataset -> TDatasource
где то это поле определено не как bool, может в TClientDataset ?
Потому как и Paradox (через BDE) и Access (через ADO)
нормально работают с вышеуказанным мною кодом.
|
|
Лена |
Отправлено: 02.10.2006, 18:18 |
|
Мастер участка
Группа: Участник
Сообщений: 501
|
QUOTE (Admin @ 02.10.2006, 17:52) | где то это поле определено не как bool, может в TClientDataset ?
|
Написала в FormCreate:
CODE |
TBooleanField(DataModule2->ADOQueryKey->FieldByName("enabled")).DisplayValues = "Нет;Да";
DataModule2->ClientDataSetKey->FieldByName("enabled")->AsBoolean;
|
Заполнила PickList. Все равно получаю из базы 1 или 0. А при попытке вставить в гриде запись из PickList исключение. Наверное мне надо делать через поле Lookup, иначе никак.
|
|
Admin |
Отправлено: 02.10.2006, 19:49 |
|
Владимир
Группа: Администратор
Сообщений: 1190
|
Только что попробовал — построил эту связку
ADOQueryKey -> TDatasetProvider -> TClientDataset -> TDatasource
взяв в качестве примера учебную базу GlobalCar (.mdb) в одной
из таблиц которой есть поле типа bool.
В ADOQueryKey в Fields Editor добавил через Add Fields это поле,
(посмотрел — поле имеет тип TBooleanField — проверьте у себя тип поля)
в свойстве DisplayValues ничего не вписывал.
(можно и вписать — тоже работает)
В ClientDataSet в Fields Editor добавил через Add Fields это поле,
(посмотрел — поле имеет тип TBooleanField — проверьте у себя тип поля)
в свойстве DisplayValues этого поля вписал Да;Нет
В DBGrid в Column Editor создал column данного поля,
в свойстве PickList вписал эти две строчки
Да
Нет
Все нормально работает.
Если у вас 0-1 похоже что там тип данных integer
В общем, разберитесь с PostgreSQL похоже дело в этом.
Либо где-то в ней можно задать представление для bool.
|
|
Admin |
Отправлено: 02.10.2006, 20:02 |
|
Владимир
Группа: Администратор
Сообщений: 1190
|
QUOTE | Речь идет о поле enabled. В самой базе в этом поле находятся слова TRUE, FALSE.
...
Она на сервере, я ее смотрю программой pgAdmin.
|
Значит pgAdmin как-то преобразует эти 0-1 в True/False
и у вас должно получиться.
|
|
Лена |
Отправлено: 02.10.2006, 21:32 |
|
Мастер участка
Группа: Участник
Сообщений: 501
|
Спасибо за разъяснения! Завтра попробую все на работе. База данных там. |
|
Лена |
Отправлено: 03.10.2006, 10:30 |
|
Мастер участка
Группа: Участник
Сообщений: 501
|
Кажется, найден источник проблем.
В базе данных нужное поле описано как bool, а именно:
CREATE TABLE keys
(
code varchar(32) NOT NULL,
description varchar(50),
enabled bool NOT NULL, //вот оно
person_id int4,
CONSTRAINT pk_keys PRIMARY KEY (code)
)
Я добавила это поле в свой ADOQuery и вижу, согласно рисунка, что это поле почему то воспринимается как String. Как переформатировать в bool?
Наверное, эта проблема из-за провайдера Provider=MSDASQL.1 который не правильно интерпретирует тип bool. В моем случае наверное только такой выход: надо организовывать дополнительное поле и программно анализировать 1 и 0 и подставлять Да или Нет, а поле с 1 и 0 скрыть?
Отредактировано Лена — 03.10.2006, 11:27
Присоединить изображение
|
|
Admin |
Отправлено: 03.10.2006, 11:42 |
|
Владимир
Группа: Администратор
Сообщений: 1190
|
QUOTE | Кажется, найден источник проблем.
В базе данных нужное поле описано как bool, а именно: |
Что и требовалось доказать.
___
Может попробовать поменять провайдера, там их в списке много,
при формировании строки подключения, может какой другой
подойдет ? Например, попробовать Microsoft.Jet.OLEDB.4.0 ?
Мне идея с дополнительным полем не нравиться, лишнее усложнение,
конечно вам виднее по ситуации.
|
|
Лена |
Отправлено: 03.10.2006, 12:02 |
|
Мастер участка
Группа: Участник
Сообщений: 501
|
> Microsoft.Jet.OLEDB.4.0
Этот драйвер можно где-то скачать?
>Мне идея с дополнительным полем не нравиться, лишнее усложнение,
Мне самой не нравиться.
Там семь таблиц и у каждой есть поле bool. Ужас!
|
|
Лена |
Отправлено: 03.10.2006, 12:24 |
|
Мастер участка
Группа: Участник
Сообщений: 501
|
Может ли другой драйвер обеспечить соединение с моей базой PostgreSQL? Вот я сейчас использую такое окно настройки как на рисунке. Тут и сервер задается и все остальное.
Отредактировано Лена — 03.10.2006, 12:27
Присоединить изображение
|
|
Admin |
Отправлено: 03.10.2006, 12:31 |
|
Владимир
Группа: Администратор
Сообщений: 1190
|
QUOTE | Из FAQ по PostgreSQL:
2.1) Существуют ли ODBC драйвера для PostgreSQL?
Существует два ODBC драйвера, PsqlODBC и OpenLink ODBC.
Вы можете скачать PsqlODBC с http://gborg.postgresql.org/project/psqlod...projdisplay.php.
OpenLink ODBC можно взять на http://www.openlinksw.com. Этот драйвер работает с их стандартным клиентским программным обеспечением, использующим ODBC, и таким образом, ODBC драйверы для PostgreSQL доступны для каждой из поддерживаемых ими платформ (Win, Mac, Unix, VMS).
|
---
Может также дело в самой базе PostgreSQL,
а не в провайдере/драйвере.
Может поможет http://docs.luksian.com/db/pgsql/
|
|
Лена |
Отправлено: 03.10.2006, 15:17 |
|
Мастер участка
Группа: Участник
Сообщений: 501
|
Начну с самого главного: ПОЛУЧИЛОСЬ!
Получилось на старом провайдере.
Сначала установила новый провайдер. Выяснилось, что он не поддерживает тип для фотографий в базе, а у меня было такое поле. Совсем расстроилась. Вернула к старому провайдеру проект.
Потом стала рассматривать окно настроек соединения и, случайно нажав на кнопку, увидела настройку. Надо было сбросить галочку и все стало как нужно и DisplayValues заработало!
Спасибо, что у вас хватило терпения на объяснения с DisplayValues, очень полезная и нужная вещь, ни одной строчки кода не написала!
Присоединить изображение
|
|