![]() |
Модераторы: gambit, Partizan |
![]() ![]() ![]() |
|
Server |
|
|||
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 22.11.2005 Репутация: нет Всего: нет |
Доброго времени суток.
Например. У меня в DataSet есть две таблицы между ними есть Relation. В таблице "Товар" поле - "Единицы измерения" связано с полем EdIzmerID Таблицы "Еденицы измерения" В XtraGrid можно настроить этот Relation, что бы в таблице "Товар" в поле "Единицы измерения" вместо идов подставлялось их наименование? Я это делал на обыкновенном DataGrid, нужно было дописывать метод Pint. Подскажите как с XtraGrid? Заранее благодарю. |
|||
|
||||
Exception |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 4525 Регистрация: 26.12.2004 Репутация: 5 Всего: 186 |
Просто составь запрос INNER JOIN вроде
|
|||
|
||||
mr.DUDA |
|
||||||
![]() 3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 24 Всего: 232 |
Есть два варианта решения этой проблемы.
Первый вариант (через дизайнер) - создать repository editor с типом LookupEdit, который настроить на таблицу "Единицы измерения" (в DataSource прописываем таблицу "Единицы измерения", DisplayMember - имя колонки с наименованием ед. измерения, ValueMember - имя колонки с Id единицы измерения),тогда грид всё сделает сам. Второй вариант - через код. Пишем где-нибудь в OnLoad-е:
здесь myGridColumn - колонка с айдишником единицы измерения. Класс "ФорматтерЕдиницИзмерения" (да, можно и по-русски ![]()
Можно к примеру передать в конструктор форматтера ссылку на датасет, и в Format() делать запрос к таблице датасета типа:
Добавлено @ 16:39 З.Ы. всё это есть в примерах для DevExpress. -------------------- ![]() |
||||||
|
|||||||
Server |
|
|||
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 22.11.2005 Репутация: нет Всего: нет |
Спасибо огромное за советы.
Буду пробовать. Я дядя взрослый (30 лет) но только начинаю изучать SQL Server, С#. До этого и на сегодняшний день программирую на 1С. |
|||
|
||||
Exception |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 4525 Регистрация: 26.12.2004 Репутация: 5 Всего: 186 |
Дуда, а зачем же так сложно-то
![]() ![]() |
|||
|
||||
mr.DUDA |
|
|||
![]() 3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 24 Всего: 232 |
А ты вопрос внимательней почитай... ![]() -------------------- ![]() |
|||
|
||||
Server |
|
|||
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 22.11.2005 Репутация: нет Всего: нет |
Вопрос: Подскажите может есть в SQL Server хранимая процедура которая принимала в качестве параметра название таблицы и возвращала все её Relation? Название или номер поля и с какой таблицей(название) связано?
Я программно получаю название таблицы загружаю её в ДатаСет затем должен получить все таблицы с какими она связана и их тоже подгрузить в этот же ДатаСет. Первая таблица будет главной и будет редактироваться все остальные таблицы которые подгрузятся в ДатаСет это таблицы с какими первая связана. Зачем мне это нужно? Я пишу класс который бы дал возможность редактировать все справочники в базе данных. Может есть у кого на эту тему свои соображения буду благодарен. |
|||
|
||||
mr.DUDA |
|
|||
![]() 3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 24 Всего: 232 |
Такого понятия как Relation нет в SQL Server-е, вроде.
Взаимосвязи в датасете зависят от того, как построен запрос. Можно трактовать одни и те же таблицы как угодно: например, выбрать все заказы по поставщику, или всех поставщиков по заказу, получая в обоих случаях датасет с двумя таблицами, но разными связями. Это всё к тому, что взаимосвязи по данным обычно задаются отдельно, в виде метаданных (в отдельной таблице, в XSD-файле, прямо в программе или как-нибудь ещё). P.S. Модератор: Пожалуйста, один топик - один вопрос. Первый вопрос был по WinForms, а этот уже в раздел по БД... -------------------- ![]() |
|||
|
||||
Exception |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 4525 Регистрация: 26.12.2004 Репутация: 5 Всего: 186 |
Честно говоря, я не понял, чем не подходит мой вариант
![]() ![]() |
|||
|
||||
mr.DUDA |
|
|||
![]() 3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 24 Всего: 232 |
Так вопрос про это и был. Как имея датасет с двумя конкретными таблицами и рилейшном, вывести их на клиенте. Похожая проблема возникала у меня по ходу работы. Вот есть конкретный датасет, в него загружаются данные через веб-сервис. Необходимо вывести датагрид с колонками, в которых отображается актуальное содержимое. Если есть колонка, связанная с другой таблицей через relation, необходимо вывести её содержимое в приемлемом виде - не ID'шник, а строку или числовое значение, связанное по relation с данной строкой основной таблицы. Можно взять такие правила за основу: есть форма, выводящая данные. Есть датасет, из которого форма выводит данные. Есть таблица датасета, на которую отображается форма. Эта таблица называется "root table". Все остальные таблицы связаны с корневой по relation, так или иначе. Предположим, нужно вывести поле-значение из какого-то фиксированного набора (массива). Таблица, содержащая "массив", называется "перечисление", и связана с корневой по relation "многие-к-одному" (потенциально много записей в корневой таблице ссылаются на одну запись в таблице возможных значений перечисления). В гриде выводится не поле Id, а некое другое поле, замещающее числовой айдишник. К примеру, перечисление состоит из 10-ти числовых значений, каждому из которых соответствует строковая константа. Тогда в корневой таблице достаточно завести int-поле, ссылающееся на запись с соответствующим Id в таблице перечисления. Таблица перечисления содержит 2 поля: Id и DisplayName. Другой use case: если корневая таблица содержит ссылку на некую запись другой таблицы, то в корневой таблице существует поле с типом "ассоциация", содержащее числовой идентификатор записи в другой таблице того же датасета; другая таблица содержит одну или более записей, ID'шники которой соответствуют значениям полей-ассоциаций из корневой таблицы датасета. Это очень просто представить: предположим, есть таблица "заказы" и таблица "клиенты". Каждая запись в таблице "заказы" имеет ID-шник клиента. В приложении нужно показать имя, адрес и телефон клиента, имея только айдишник из корневой таблицы. Это делается элементарно, т.к. большинство современных контролов понимают соотношение "многие-к-одному", каковое и представлено в данном случае (множество заказов могут быть связаны с одним клиентом). Наконец, допустим в корневой таблице есть поле-коллекция. Это поле связано с таблицей, каждая запись которой содержит ссылку на запись корневой таблицы. Таким образом, получаем соотношение "многие-к-одному" (множество записей из таблицы Х соответствуют одной записи из корневой таблицы). Пример: каждый заказ может иметь множество позиций заказов, где каждая позиция заказа - это отдельная строка в таблице OrderLine, со своими полями (Id товара, кол-во товара, Id клиента, единица измерения и т.п.) Помимо всего перечисленного, существует ещё возможное отношение "многие-ко-многим", реализуемое через отдельную таблицу "ParentId -> ChildId", с relation'ами к таблицам, связываемым по отношению "м-к-м". Вот такие вот шишки ![]() ![]() -------------------- ![]() |
|||
|
||||
Exception |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 4525 Регистрация: 26.12.2004 Репутация: 5 Всего: 186 |
Усе, понял
![]() Добавлено @ 23:56 Кстати, невольно вспомнился пример отношения "м-к-м": сборки и пространства имен. Одна сборка может содержать много пространств имен, а одно пространство имен, в свою очередь, может быть разбито на несколько сборок ![]() |
|||
|
||||
mr.DUDA |
|
|||
![]() 3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 24 Всего: 232 |
Тоже вариант. Жжош ![]() -------------------- ![]() |
|||
|
||||
-ser- |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 344 Регистрация: 1.2.2005 Репутация: 4 Всего: 13 |
[/OFFTOPIC]
mr.DUDA, не знаю как ты докатился до такой жизни, но действительно работает ![]()
[OFFTOPIC] -------------------- "Тонкая, однако, работа." |
||||
|
|||||
Server |
|
||||
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 22.11.2005 Репутация: нет Всего: нет |
Если я правильно понял сам запрос к данным,которые будут в результирующей таблице, формируется отдельно, а связи отдельно. mr.DUDA если можно ещё о связях, может куски кода как работать с XMLSchema1.xsd файлом ПОЖАЛУЙСТА. В исходниках по XtraGrid есть XML*.xsd файлы но для чего они нужны и как с ними работать не понимаю, хотя догадываюсь что в этом файле можно построить связи всех необходимых таблиц и эти связи будут как XML документ. На каждую таблицу свой файл с связями. Затем в программе подгружать XML*.xsd файл по названию и получать эти связи. Я что-то такое пробовал
или
XMLSchema1.xsd документе посоздавал аналогичные таблицы с ихними связями. но что дальше с ним делать не знаю. Заранее благодарю. |
||||
|
|||||
mr.DUDA |
|
|||
![]() 3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 24 Всего: 232 |
С XSD работать гораздо проще, чем это кажется. Всё "шаманство" можно выразить в трёх действиях:
1) добавляем в проект XSD-файл 2) открыв в дизайнере, добавляем туда таблицы и тянем нужные колонки drag&drop'ом чтоб создать relation-ы 3) в том же дизайнере в контекстном меню ставим галку "Generate DataSet" - и всё, получаем типизированный датасет с именем как у XSD-файла Что такое типизированный датасет: это наследник от датасета, в котором есть свойства с именами как у таблиц в XSD. Каждое такое свойство возвращает типизированную таблицу. Каждая типизированная таблица содержит коллекцию типизированных DataRow-ов, каждый типизированный DataRow содержит свойства с именами как у полей таблицы. Использование типизированных датасетов: можно зачитывать в них данные полученные от датаадаптера, так же как и в обычных датасетах. Relation-ы превращаются в свойства DataRow-ов. Например, если есть таблица "Заказы" и таблица "Поставщики", и от поставщиков торчит ParentRelation в таблицу заказов (много заказов - к - одному поставщику), то в ЗаказRow будет свойство типа ПоставщикRow, вот так всё просто. -------------------- ![]() |
|||
|
||||
![]() ![]() ![]() |
Прежде чем создать тему, посмотрите сюда: | |
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Разработка Windows Forms | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |