Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2004.03.14;
Скачать: [xml.tar.bz2];

Вниз

Lookup или не lookup - вот в чём вопрос (программирующий Гамлет)   Найти похожие ветки 

 
31512   (2004-02-11 14:40) [0]

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

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

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

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

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

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

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


 
VLAD-MAL   (2004-02-11 14:45) [1]

TDBLookupComboBox

---------------
Интересно, у тебя что, у одной организации много рег. номеров может быть?


 
Fiend   (2004-02-11 14:45) [2]

самому надо анализировать таблицу и добавлять лукап поля. Ничего сложного. Я такое делал, тока для ФБ


 
Anatoly Podgoretsky   (2004-02-11 14:48) [3]

Это все таки один ко одному связь


 
VLAD-MAL   (2004-02-11 14:50) [4]

Ой, блин, чего это я?

Не TDBLookupComboBox, конечно же, а Lookup - поля!


 
Shaman   (2004-02-11 15:31) [5]

используй join в запросе


 
31512   (2004-02-12 08:44) [6]

Для VLAD-MAL:
Да, много. Приведу пример:
Супермаркет "Рамстор" имеет регистрационный номер X как производитель товара, регистрационный номер Y как покупатель товара, регистрационный номер Z как перепродавец товара. Так очень удобно классифицировать организации. Могу дать детальные пояснения.


 
31512   (2004-02-12 08:46) [7]

Для Anatoly Podgoretsky. Нет, один ко многим. Каждое предриятие может иметь несколько регистрационных номеров.


 
Sergey13   (2004-02-12 09:04) [8]

to 31512 © (11.02.04 14:40)
Че то, сдается мне, ты напутал при проектировании, а решаешь проблему с гридом. Какое поле у тебя ПК?
>"Наименование организации" - ключевое поле (nvarchar(255))
А завтра название поменяли, и что? Все перелопачивать? Я уж не говорю про производительность такого ключа.

Регистрационные номера - их может быть сколько угодно, или все таки ограниченное количество? Есл второе, я бы прямо в первую таблицу вставил. Да и вообще, что организация является продавцом, покупателем или производителем, ИМХО, должно следовать из ОПЕРАЦИИ (продажи, покупки...). Иначе не исключены возможности записи продажи на покупателя и наоборот.


 
31512   (2004-02-12 09:51) [9]

Для Sergey13!!!!
Для начала хочу сказать спасибо что откликнулся.
Ты не прав в корне.
Во-первых
Это пример, возможно, неудачный, на самом деле всё сложнее. Я лишь пытался облегчить понимание проблемы. Я не просил анализировать пример базы данных. Базу данных я давно сделал и к ней претензий нет. Она не имеет отношения к продавцам, покупетелям и т.д. Ещё раз, это просто пример, от балды...
Во-вторых
Забудь про 1С. Нет её. Просвоение регистрационного номера - это операция. Этому соответсвует целая кипа государственных докумунтов и сам номер не просто набор цифр. Тоже самое относится и к отмене регистрационного номера. Поясню: даже если организация исчезла с лица планеты, то регистрационный номер за неё всё равно остаётся. И его нельзя присвоить другой организации. Отмена регистрационного номера - операция (тоже с кипой документов).
В третьих
Вопрос прост: как заставить DBGrid работать так как это сделано в Access.


 
Соловьев   (2004-02-12 09:56) [10]

чтобы в сентке появилось выпадающий список - надо сделать новое поле Lookup и при редактировании автоматически будет список


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

231512 © (12.02.04 09:51) [9]
>Ты не прав в корне.
1. Я прав всегда
2. Если я не прав см. п.1
8-)

>Это пример, возможно, неудачный
Да уж.

>Забудь про 1С
А что это?

>Первое: является ли поле [Регистрационные номера].[Наименование организации] lookup полем?
Как ты сделаешь в апликухе, так и будет. Сделаешь лукапом, будет им (но скорее не им а полем связи для лукапного поля, если я не запутался в твоих именах полей 8-). Вставишь в запрос, не будет лукапом.

>Второе: как заставить DBGrid поступать так же как это делает редактор в Access?.Ведь Access формирует на клетке сетки Комбобокс
Я уж не помню как в стандартном гриде (давно не юзал), в EhLib-овском вроде будет так же.

>Вопрос прост: как заставить DBGrid работать так как это сделано в Access.

Вот и изъяснялся бы попроще (не по Гамлетовски 8-) - как вделать в грид комбобокс. Было бы проще. ИМХО. А то ... ту би не ту би. Как в Аксес да на МS SQL. Нет у меня этого аксеса на МS SQL.
8-)


 
31512   (2004-02-12 10:31) [12]

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


 
Плохиш   (2004-02-12 10:41) [13]


> 31512 © (12.02.04 10:31) [12]

> Блин, ну трудно объясняться на расстоянии


Блин, ну ни фига себе, угрозы пошли.


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

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

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

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

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


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


> 31512 © (12.02.04 10:31)

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

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


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

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

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


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

Для stone

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


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


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

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


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

Sergey13

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


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

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


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

Для Соловьев

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


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

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

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

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

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

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

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

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


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

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


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

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


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

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


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

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


 
Sandman25   (2004-02-12 12:08) [27]

[26] 31512 © (12.02.04 11:59)

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


 
31512   (2004-02-12 12:09) [28]

Для Соловьев

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


 
31512   (2004-02-12 12:14) [29]

для Sandman25

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


 
31512   (2004-02-12 12:16) [30]

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


 
Sandman25   (2004-02-12 12:19) [31]

[29] 31512 © (12.02.04 12:14)

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


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

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

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

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

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

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


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

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



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2004.03.14;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.54 MB
Время: 0.02 c
1-43460
pomashok
2004-02-29 20:26
2004.03.14
Hook


3-43345
DimaF
2004-02-17 03:53
2004.03.14
SQL


1-43640
CRACKISH
2004-03-02 10:51
2004.03.14
Сортировка ListView в режиме vsReport при нажатии на заголовок


3-43311
nejest
2004-02-10 16:24
2004.03.14
Можно ли обойтись 1 запросом?


1-43447
Petrovitch
2004-02-26 14:33
2004.03.14
установить курсор (мышкин) в какую-то определенную позицию Form.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский