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

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

Сортировка по Lookup-полю [D6, MSSQL]


Страницы:   1 2

Fantom_ ©   (2003-10-08 13:13:00) 

Добрый день. Вопрос такой: как отсортировать данные в Lookup-поле не по хранимому значению, а по отображаемому в DBGridEh?
Результатом моих изысканий стало зыбкое мнение, что нужно нечто сотворить с гридом, а что именно - неясно.
Помогите пожалуйста.


Fantom_   (2003-10-15 12:18:00) [1]

Читал я, читал. И делал. Эффекта нет, вернее я не заметил.
Так. Давайте с самого начала и поподробнее.
Значит есть такие таблицы:
1) Prihods{ ID_Prihod,...,KodMat,KodRazmer,...}
В АДО - просто запрос на выборку по параметру, (см. [17], но без всяких объединений)
2)Nameprokat{ KodMat,namemat,}
3)NomRazmer{ KodMat,KodRazmer,Namerazmer}
Подчеркнуты ключи.
Все 3 таблицы в БД соединены.
При вставке новой записи в Prihods в зависимости от выбранного материала (Nameprokat) для поля Prihods.KodRazmer формируется список типоразмеров этого материала (NomRazmer). Естественно, в списке в гриде отображается не код типоразмера, а его наименование. Все прекрасно работает.
Теперь возникла задача: отсортировать данные для пользователя именно по наименованию типоразмера.
Была попытка объединить таблицы Prihods и NomRazmer и отсортировать по NomRazmer.Namerazmer (по совету уважаемого Johnmen [4]). Сортирует. При удалении ругается - нормально, ведь коды в NomRazmer повторяются снова для каждого материала.
Но: мне не нужно ничего удалять из NomRazmer, нужно удалить запись только в Prihods. Причем совет из ссылки [16] не действует.
И тут я как молодой и зеленый уперся лбом в стену и не знаю где ее перелезть...
Кажется все...


Danilka   (2003-10-15 11:40:00) [2]

хотя, пишешь, что статью прочитал :)


Danilka   (2003-10-15 11:38:00) [3]

[21] Fantom_ (15.10.03 11:36)
А ты вот-так: [14] Fiend © (15.10.03 09:40)
сделал?

Или хотя-бы статью: [16] Fiend © (15.10.03 09:43)
прочитал?


Fantom_   (2003-10-15 11:36:00) [4]

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

P.S. Наверное мне нужно спросить: как мне правильно задать вопрос, чтобы получить ответ?


Val   (2003-10-15 11:04:00) [5]

как удаляете-то??


Fantom_   (2003-10-15 10:48:00) [6]

И все-таки она не пропала.:(


Sergey13   (2003-10-15 10:20:00) [7]

2Fantom_ (15.10.03 10:11) [17]
Сори, что встрял. Я просто не в курсе и думал, что это в принципе невозможно. Но после прочтения ссылки [16] понял, что ничего невозможного не бывает. 8-)


Fantom_   (2003-10-15 10:11:00) [8]


> Sergey13 © (15.10.03 09:36) [13]

> Так в принципе НЕ должно быть, если делать правильно. И
> с чего ты вообще решил, что удаляется "и в связанной таблице".

Не спорю, уже понял. Мораль: надо сначала думать, а потом спрашивать.

> Fiend © (15.10.03 09:43) [16]

Статью читал, спасибо, она как раз лежит передо мной. Кое-что проясняет. Кстати, интересно, имеет ли значение порядок: устанавливать это свойство (или св-во "Update Resync") до или после открытия запроса?


> Val © (15.10.03 09:42) [15]

Попробую разобраться.
Я тут поэкспериментировал, кажется ошибка пропадает, если в запросе вместо

SELECT PRIHODS.*, NOMRAZMER.*
FROM NOMRAZMER INNER JOIN PRIHODS ON NOMRAZMER.KODRAZMER = PRIHODS.KODRAZMER
where PRIHODS.KODMAT=:kodmat

использовать

**** RIGHT JOIN ****


Fiend   (2003-10-15 09:43:00) [9]

да, и советую почитать статью по этому поводу
http://www.delphikingdom.com/helloworld/ado03.htm


Val   (2003-10-15 09:42:00) [10]

>Fantom_ (15.10.03 09:17) [12]
..если запись удаляется из запроса на объединение двух таблиц..
вот об этом я и говорил - не нужно удалять запись из НД(такого объекта ведь нет в БД!), нужно удалять запись только из "основной" таблицы, где ID = ID текущей записи из НД, затем переоткрыть запрос.


Fiend   (2003-10-15 09:40:00) [11]

у меня тоже было подобное при удалении. я так понял используется АДО?
тогда вот это вам поможет:
надо сразу после того как сделали Open для ADOQuery с тем самым запросом установить свойство
ADOQuery.Properties["Unique Table"].Value:="MyMainTable";


Sergey13   (2003-10-15 09:36:00) [12]

2Fantom_ (15.10.03 09:17) [12]
Ты бы написал конкретно свой запрос и то как удаляешь. А то

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

Так в принципе НЕ должно быть, если делать правильно. И с чего ты вообще решил, что удаляется "и в связанной таблице".

ЗЫ:Я с МССКЛ не работал, но что то мне подсказывает...


Fantom_   (2003-10-15 09:17:00) [13]

Да, прошу прощения, я имел в виду удаление записей.
Не могли бы вы объяснить, по каким правилам система производит удаление записи, если запись удаляется из запроса на объединение двух таблиц - справочника, и "основной" таблицы (надеюсь, я правильно сформулировал)? Что необходимо знать об этом при разработке приложений?

Кстати, триггеров таких нет и ограничений на каскадное удаление не установлено. Может проблема в том, что с одной стороны справочник участвует в объединении, а с другой его записи используются для наполнения выпадающего списка в гриде (не Loockup поля, а именно программного наполнения) и при удалении возникает какая-то конфликтная ситуация? Я пытался это все анализировать - на мой взгляд алгоритм последовательный и безконфликтный. Но ошибка имеет место, значит я ошибся в рассуждениях.


Val   (2003-10-14 17:11:00) [14]

>Fantom_ (14.10.03 16:57) [10]
Тут нужны знания больше не в делфи, а в базах данных.
Вы вероятно говорите об удалении записей все-таки, а не полей.
Записи из подчиненной таблицы удаляются потому, что у вас, вероятно, соответствующим образом написано ограничение (on delete cascade) или срабатывает триггер.
Справочник, в данном случае - главная таблица, а не подчиненная, поскольку не ее записи зависят от других таблиц, а наоборот.


Fantom_   (2003-10-14 16:57:00) [15]

Я недавно занялся Делфи, поэтому за глупые вопросы извиняюсь - за прошлые и впредь.


> так из таблицы-то запись нужно удалять, на которую запрос/просмотр
> опирается, а не из просмотра/НД.


Поясни, пожалуйста, подробнее. Я же не с сервером работаю, а пишу клиент под него. Мне еще многое не понятно.

Смотри: бросаю я на форму ADOQwery и пишу запрос, объединяющий две таблицы - главную и справочник. Отображаются поля только главной. Но таблицы-то связаны и удаление поля в главной влечет за собой удаление в подчиненной.


Val   (2003-10-14 15:23:00) [16]

>Fantom_ (14.10.03 15:06) [8]
???
так из таблицы-то запись нужно удалять, на которую запрос/просмотр опирается, а не из просмотра/НД.


Fantom_   (2003-10-14 15:06:00) [17]

Привет после выходных!


>
> Johnmen © (08.10.03 14:01) [4]
>
> Так добавь это поле в запрос. Т.е. в запросе будет соединение
> таблиц, основной и справочника. И в запросе же сортируй...


Рано я обрадовался. Сортировать-то запрос сортирует, внешне все прекрасно, но при попытке удаления записи движок честно и добросовестно пытается удалить запись не только в главной, но и в связанной таблице. Так, в принципе и должно быть, если бы не пара важных моментов:
А)объективно - подчиненных записей в справочнике МНОГО;
б)субъективно - удалять записи из справочника незачем.
Итог - получили ошибку. Но все равно спасибо за совет.


Vick   (2003-10-08 15:55:00) [18]

А есть еще вариант - использовать Мидас, в Clientdataset перекачивать данные и там уже с ними делать чего угодно, кстати это касается и вычисляемых полей...


Fantom_   (2003-10-08 14:44:00) [19]

Попробовал. Работает. Так все просто оказывалось. э-э-х...
Спасибо!


Fantom_   (2003-10-08 14:09:00) [20]

Попробуем-попробуем...


Страницы:   1 2

Наверх

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