Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > использование Ado


Автор: Golar 20.6.2006, 21:58
Подскажите пожалуйста, я только начала изучать БД. если я пишу прогу с БД на Delphi и использую Access, то лучше работать с вкладкой Ado. у меня возникла проблема, наверно глупая, но я не знаю как ее решить. как отразить булевское поле в DBGrid, чтобы там было не true||false?, а например муж//жен? не используя создание полей для AdoQuery и установку там св-ва DisplayValues?   

Автор: Palladin 20.6.2006, 22:26
Тебе обязательно для этого использовать DBgrid, если да то это сделать сложно(покрайней мере мне сложноsmile) но можно пойти по пути наименьшего сопротивления и просто когда ты будеш добавлять запись в БД, то все строки заносить через dbedit а булевские данные сделать через ... ну скажем dbcombobox 

Если подходит такой вариант отпиши здесь или мне на аську 243673233, я смогу помочь, лучше в асю там быстрееsmile 

Автор: Golar 20.6.2006, 22:37
спасибо, но при вставке у меня проблем пока нет, а проблема: как отразить запрос select уже существующей таблицы с булевским полем.
удобнее всего конечно создать поля для adoquery, но мне нужно этот же компонент(adoquery) использовать для запросов из др. таблиц, а тогда он ругается!!! это плохо, если у меня на одной форме будет несколько adoquery, отвечающих каждый за свою таблицу?

Добавлено @ 22:44 
а как определить кол-во записей в запросе селект, не пользуясь спец. функцией count? есть какое-нибудь поле? 

Автор: Palladin 22.6.2006, 06:26
Незнаю точно, но это вроде как невозможно, через селект я думаю нельзя, да и зачем это может быть нужно когда можно просто: 

Код

var
x:integer;
begin
x:=adotable1.RecordCount;
 

Автор: bas 22.6.2006, 08:24
http://www.citforum.ru/programming/advice/advice04.shtml 

Автор: skyboy 22.6.2006, 10:46
Golar, можно запрос просто сформулировать типа такого:
Код

SELECT id1,field1,"Муж" FROM table1 WHERE sex=True
UNION ALL
SELECT id1,field1,"Жен" FROM table1 WHERE sex=False

Где id1 и field1  - какие-то "левые" поля, к сути дела отношения не имеющие, но подчёркивающие логику запроса.
Идея ясна? Объединаяешь два запроса, каждый из которых в нужной позиции возвращает тебе пол константой... Правда, мне не нравится константы. Я бы использовал ещё одну таблицу 
idsex: logical   name_sex: string
   True                    Муж
   False                   Жен
И запрос тогда выглядел бы так:
Код

SELECT t.id1,t.field1,s.name_sex FROM table1 as t,sex_table as s WHERE t.sex=s.idsex

или так(будут выведены записи только тех людей, у которых пол указан):
Код

SELECT t.id1,t.field1,s.name_sex FROM table1 INNER JOIN sex_table s ON t.sex=s.idsex

или так(у тех, у которых пол не задан, будет выведено "бесполое создание")
Код

SELECT t.id1,t.field1,s.name_sex FROM table1 INNER JOIN sex_table s ON t.sex=s.idsex
UNION ALL
SELECT id1,field1,"бесполое" FROM table1 WHERE sex is null

или так(у тех, у которых пол не задан, будет возвращено значение "null")
Код

SELECT t.id1,t.field1,s.name_sex FROM table1 LEFT JOIN sex_table s ON t.sex=s.idsex

Этот метод "требует" наличия дополнительной таблицы, но если захочешь изменить названия полов(например, на "man"/"woman" или ещё чего), не придётся менять запрос, доступа к которому к тому времени уже может не быть(на руках - только программа без исходников)
примечание:
как мне кажется, UNION ALL будет работать бустрее UNION, так как не будет искать повторяющиеся значения. Если не прав - прошу меня исправить. 

Автор: Savek 22.6.2006, 11:37
А чем не нравится DisplayValue?
Мне кажется гораздо проще управлять отображением булевых значений так

ADOQuery.Open;
TBooleanField(ADOQuery.FieldByName('Sex')).DisplayValue:='Муж;Жен';

 

Автор: Golar 22.6.2006, 13:23
Спасибо большое!!!! smile  

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)