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

 
Тип bool, в базе данных
Лена
Отправлено: 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



Нет не работает. sad.gif
Написала в событии 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, иначе никак. sad.gif

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



Спасибо за разъяснения! Завтра попробую все на работе. База данных там. smile.gif
Лена
Отправлено: 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, а именно:


Что и требовалось доказать. smile.gif
___

Может попробовать поменять провайдера, там их в списке много,
при формировании строки подключения, может какой другой
подойдет ? Например, попробовать Microsoft.Jet.OLEDB.4.0 ?

Мне идея с дополнительным полем не нравиться, лишнее усложнение,
конечно вам виднее по ситуации.
Лена
Отправлено: 03.10.2006, 12:02


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

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



> Microsoft.Jet.OLEDB.4.0

Этот драйвер можно где-то скачать?

>Мне идея с дополнительным полем не нравиться, лишнее усложнение,

Мне самой не нравиться. smile.gif
Там семь таблиц и у каждой есть поле bool. Ужас! wizard.gif

Лена
Отправлено: 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, очень полезная и нужная вещь, ни одной строчки кода не написала!

yahoo.gif

Присоединить изображение

Присоединить изображение


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