Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Lookup или не lookup - вот в чём вопрос (программирующий Гамлет) [D6, D7, MSSQL]


Страницы:   1 2

31512 ©   (2004-02-11 14:40:00) 

Проблема заключена в заставлении DBGrid работать так (или примерно так), как это сделано в Access. Итак есть на MS SQL Server 2000 база данных. В базе данных имеется несколько таблиц, связанных отношениями. Например пусть есть

таблица "Организации", с полями:
"Наименование организации"- ключевое поле (nvarchar(255)),
"Юридический адрес" (nvarchar(255)), и т.д. (атрибуты организации).
Вторая таблица "Регистрационные номера"с полями "Регистрационный номер"- ключевое поле (nvarchar(255)), "Наименование организации"(nvarchar(255)) - оно берётся из таблицы "Организации". Таблицы, естественно связаны отношением один-ко-многимВот так:

Организации1------------| Регистрационные номера
Наименование организации| Регистрационный номер
Юридический адрес |-->Наименование организации
ПолеX $ ПолеY
ПолеY ПолеZ
ПолеZ .
. .
. .
.
Значок $ заменяет значок бесконечности...

Первое: является ли поле [Регистрационные номера].[Наименование организации] lookup полем?

Ясно что что в нём хранятся значения ключевого поля таблицы Организации. Если бы в Организацииключевым полем был бы "Счётчик", то в Регистрационные номера].[Наименование организации] хранились бы соответсвующие значения это счётчика из таблицы Организации.

Второе: как заставить DBGrid поступать так же как это делает редактор в Access?.

Ведь Access формирует на клетке сетки Комбобокс, а из него выбираются значения поля подстановки ( не значения ключевого поля).


не МС   (2004-02-13 11:13:00) [1]

Удалено модератором
Примечание: Гуляй от сюда


31512   (2004-02-13 09:10:00) [2]

Одно из решений (к сожалению не самых удачных) я здесь приведу. Цель этого возбудить процесс обсуждения.
Нет ничего проще:
На форму бухаем, например, TADOConnection, 2 TDataSource, 2 TADOQuery. Связаваем компоненты. В ADOQuery1.SQL пишем: select * from Организации. В ADOQuery2.SQL пишем: select * from [Регистрационные номера]. Для ADOQuery2 добавляем поля (в результате запроса) в редакторе полей. Там же создаём новое Lookup-поле, задаем для него все параметры. Для грида прописываем DataSource2. И вот имеем 2 поля со смыслом "Наименование организации". Подстановочное(созданное нами) и не очень(то которое родное). Добавляем все поля в грид для колонок. и убираем колонку, соответсвующую "родному" полю "Наименование организации". Всё.

На мой взгляд это глупое решение. Я на него посмотрел и решил задать вопрос в форум. Собственно с этого всё и началось.

Чего хотелось бы:

Некоторый класс(над ним я и работаю), который позволяет по заранее заданому подключению (TADOConnection) сформировать для грида (свойство DataSource) однозначное понимание того какие поля "подстановочные" (ковычки поставлены сознательно) а какие поля простые-смертные.

Надеюсь на обсуждение. Спасибо.


Sandman25   (2004-02-12 12:19:00) [3]

[29] 31512 © (12.02.04 12:14)

Хотели услышать подтверждение Ваших догадок? Посоветоваться, так сказать? :)


31512   (2004-02-12 12:16:00) [4]

Sergey13
Разумеется предусмотрены специальные формы ввода. Фильтровать можно.


31512   (2004-02-12 12:14:00) [5]

для Sandman25

Дорогой мой! Ну хоть кто-то меня услышал! Спасибо огромное! Вместо пустой болтовни - конкретика. Только поправлю TCustomDBGrid - класс предок TDBGrid. Мыслю так же.


31512   (2004-02-12 12:09:00) [6]

Для Соловьев

Ты описал мечту любого пользователя и программиста. Кстати, к этому всё и идёт.


Sandman25   (2004-02-12 12:08:00) [7]

[26] 31512 © (12.02.04 11:59)

Логически мысля...
Вы не хотите явно указывать, что данное поле является foreign key, значит, программа должна опеределять это сама. Как она может это определять? Либо через какой-нибудь DBExpress, либо явно завязываясь на системные таблицы конкретной СУБД (для MS SQL это sysobjects и т.д., если я не ошибаюсь).
После того, как определено, из какой-таблицы брать вторую часть "foreign key", нужно опеределить, какое поле использовать для отображение. Либо это будет поле с некоторым заранее известным индексом, либо это будет заранее известное имя. После полученя этой информации вставка ComboBox уже будет технической деталью.
Значит, можно написать потомка какого-нибудь TCustomDBGrid, который будет все это делать, либо при создании компонента, либо при открытии связанного DataSet, либо при первом клике на ячейке, либо вообще при явном вызове некоторого метода.


31512   (2004-02-12 11:59:00) [8]

Для Sergey13
Нет. Для Кембриджа я мелко плаваю - попу видно.
От тебя кроме пустой болтовни я ничего не услышал, отсюда и скука твоя к ветке. Разумеется тривиальное решение помогло. Тупо, но работает. Это скучно, согласен: создай, укажи, подставь... Я не прошу от тебя указавыть решения. Ибо, возможно, оно мне не подойдёт, но может навести на орпеделённые мысли. Мне нужно от тебя обсуждение. И только-то. Например: Я бы сделал так и вот так. Пока я от тебя ничего не услышал. Все равно спасибо.


Sergey13   (2004-02-12 11:56:00) [9]

2 31512 © (12.02.04 11:33) [21]
>Но хотлелось бы всё делать автоматом. То есть снизить зависимость от базы данных до минимума.
Ты думаешь что данный способ работы (в гриде с лукапами в комбобоксах) самый оптимальный и крутой? Ты мягко говоря ошибаешься. Прикинь если возможно выбирать из 1000 значений, а не из 3(где это действительно удобно).


Sergey13   (2004-02-12 11:52:00) [10]

2Соловьев © (12.02.04 11:40) [23]
Так и Делфу через микрофон, чем она лутше то? 8-)


Соловьев   (2004-02-12 11:40:00) [11]

А может еще сделать так: запустить Делфи сказать в микрофон - хочу! - и F9 - и с принтера деньги уже полезли за поргу?
Автоматом не получится - просто в Ацесе это за тебя сделали, а тут надо самому ручками.


Sergey13   (2004-02-12 11:39:00) [12]

231512 © (12.02.04 11:27) [19]
>Special for you, my dear.
О как загнул. Круто. Кембридж небось кончал. 8-)

>Ставлю проблему ребром.
Через колено, если не сказать через....

>Есть БД вообще.
Согласен.

>Как переделать DBGrid, чтобы он работал как в Access.
А Делфа у тебя есть? Что ты все про аксес то...

>Очевидно, что анализируя связи, он поступает так (или примерно так):....
Ты шибко большого мнения о гриде.

>При этом при запросе SELECT * FROM [Регистрационные номера] никаких комбобоксов не возникает.
И не возникнет. Это не джин, чтоб из бутылки возникать. И уж никак не при селекте из регномеров.
К датасету по организациям добавь лукап-поле со ссылкой на регномера. Они (номера) появятся в гриде как комбобокс. Если все правильно сделаешь то это ВСЕ.

ЗЫ: Что то доставать меня начала эта ветка.


31512   (2004-02-12 11:33:00) [13]

Для Соловьев

Согласен. Но хотлелось бы всё делать автоматом. То есть снизить зависимость от базы данных до минимума.


Соловьев   (2004-02-12 11:30:00) [14]

кликаем дважды по компоненте и добавляем все поля а потом и новое - и ставим ему тип Lookup


31512   (2004-02-12 11:27:00) [15]

Sergey13

Хорошо. Special for you, my dear. Ставлю проблему ребром. Есть БД вообще. Как переделать DBGrid, чтобы он работал как в Access.
Очевидно, что анализируя связи, он поступает так (или примерно так):
Смотрит входит ли поле в связь. Если да, то выясняет из какой таблицы берутся значения первичного ключа. Лупит на ячейке комбобокс. Туда заливает значения поля подстановки. А при выборе значения из комбобокса, в ячейку подставляет соотвествующий первичный ключ. При этом при запросе SELECT * FROM [Регистрационные номера] никаких комбобоксов не возникает.


Соловьев   (2004-02-12 11:23:00) [16]


Второе: как заставить DBGrid поступать так же как это делает редактор в Access?.

А это о чем ты спрашивал?


31512   (2004-02-12 11:17:00) [17]

Для stone

lookup fields тут вообще не причём. [Регистрационные номера].[Наименование организации] не есть lookup field.


Плохиш   (2004-02-12 10:52:00) [18]

>stone © (12.02.04 10:46) [15]

Если все будут F1 нажимать .... (c) ...


stone   (2004-02-12 10:46:00) [19]


> 31512 © (12.02.04 10:31)

Тип базы данных тут не имеет никакого значения, если мы говорим о клиентском приложении.

Я не понимаю одного - ветка открыта 11.02.04 14:40. Неужели почти за сутки трудно нажать F1 и набрать lookup fields?


Sergey13   (2004-02-12 10:45:00) [20]

2 31512 © (12.02.04 10:31) [12]
>Просто хотелось упростить проблему
Упростил. 8-)

>То есть вообще решить задачу, для любых баз данных MS SQL Server 2000. Блин, ну трудно объясняться на расстоянии.

Ты, ИМХО, просто путаешь понятия БД и прикладной программы для БД - это две большие разницы. Если тебя волнует грид (т.е. приклада), то не за чем описывать свой сервер и ссылаться при этом на другую БД+средство разработки (аксес). Иными словами - правильно заданный вопрос - половина ответа.

ЗЫ: Будь попроще, и люди к тебе потянутся. 8-)


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо