|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
06.09.2011, 09:33 | #1 |
Заблокирован
Регистрация: 04.07.2011
Сообщений: 261
|
Выбор из динамического списка checkbox - кто как реализует?
Здравствуйте!
В БД есть таблицы ТД и ТЮ с некими данными, а также ТС где должны храниться связи отдельных записей ТД с записями ТЮ. В программе есть 3 окна - 1.Каталог берущий данные из ТД, 2.Редактор конкретной записи ТД, 3.Список выбора связей этой записи с некими другими данными при помощи checkbox сохраняется в БД в таблицу ТС. Юзер открывает 1.Каталог и выбирает нужную запись, открывает 2.Редактор и правит там данные - всё очевидно. Вопрос со списком выбора - как его правильно реализовать? как правильно построить логику сохранения списка и хранения выбранных связей в БД при условиях, что: - обе таблицы ТД и ТЮ изменяются пользователем - дополняются, редактируются и удаляются. - при открытии в редакторе записи ТД, юзер должен видеть полный список ТЮ с возможностью поставить напротив каждой записи галочку. - второстепенно - желательно уменьшить объём хранимых данных в БД и упростить саму БД по возможности. PS Как быстрее работает - если хранить каждую связь таблиц отдельной записью в отдельной "таблице связей ТС" или если хранить в одном поле таблицы ТД весь список и затем парсить его в БД при необходимости (во втором случае отсутствует необходимость в поиске-выборке, отсутствует таблица и все данные ТС)? |
06.09.2011, 10:04 | #2 |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
В любом случае эти ссылочки лучше в отдельной таблице хранить, с ней на порядки удобней работать, чем со строковым списком (если реализуете, то замучаетесь в последствии). В случае удаления записей из основных таблиц легко через триггера удалять соответствующие ссылки, да и программо нет проблем
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Последний раз редактировалось Аватар; 06.09.2011 в 10:07. |
06.09.2011, 10:41 | #3 |
Заблокирован
Регистрация: 04.07.2011
Сообщений: 261
|
Видимо да, но объём лишних данных и процедур несколько огорчает.
В частности пока не очень понял как записывать выбранные значения в БД в таблицу ТС? Подробнее - чтобы отобразить пользователю список всех ТЮ - в БД при помощи хранимой процедуры склеиваем ТЮ и ТС, из ТС берутся значения "связь да/нет". Отправили в интерфейс - получили таблицу в которой видно все ТЮ и напротив используемых стоит галочка из ТС. Всё понятно. Далее юзер ставит/убирает галочки в интерфейсе показывая какие связи ему нужно записать в БД - понятно. А вот как это дело обратно записать в БД непонятно тк это же не прямая правка реальной таблицы, а правка в таблице собранной из нескольких и значение не одно, а список, каждая строка которого - новая строка в таблице ТС. То есть задача типа "delete or insert" - но как это реализовать не очень понимаю... возможно опять таки при помощи ХП, но она же обработает только одну строку, а не все. Можно было бы использовать отправку в БД сразу по нажатию на галочку то есть редактировать каждую строку ТС по-отдельности, но только для редактирования, тогда как при создании новой записи ТД в 2.Редакторе ещё неизвестен номер будущей записи ТД и поэтому в ТС записать без номера ТД не получится - поэтому нужно записывать связи ТС сразу все скопом. (используются FIBplus и FB) Подскажите, пожалуйста, как это реализовать! Последний раз редактировалось delphicoding; 06.09.2011 в 10:45. |
06.09.2011, 11:21 | #4 | |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
Цитата:
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
|
|
06.09.2011, 11:27 | #5 |
Заблокирован
Регистрация: 04.07.2011
Сообщений: 261
|
Можно и без ХП, это мне без разницы.
Просто не очень понимаю как реализовать delete or insert связей в ТС да ещё когда создаётся новая запись и ТД_ID неизвестен до момента записи в самой БД... |
06.09.2011, 11:36 | #6 |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
Delete в TC очень просто через триггера на удаление записей основных таблиц. Вставив новую запись в основную таблицу, идентификатор в ней видимо автоинкриментный, тут же выдерните из базы максимальное значение этого идентификатора - это и будет ваш неизвестный ID. Такой механизм для работы с базой одновременно нескольких пользователей мне не нравится. Поэтому и не использую автоинкриментность, а сам уникальные идешки формирую
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Последний раз редактировалось Аватар; 06.09.2011 в 11:41. |
06.09.2011, 11:43 | #7 |
Заблокирован
Регистрация: 04.07.2011
Сообщений: 261
|
Это криво именно из-за работы нескольких юзеров. Триггер имхо ничем не лучше ХП, а только хуже.
Нет, нужно сделать именно так, как я описал выше, только я не знаю как это сделать... Для получения правильного номера новой вставленной записи ТД можно использовать RETURNING, но мне кажется работать он будет исключительно внутри самой БД и в программу обратно он никак не дойдёт, в частности тк FIBDataset просто не станет принимать никаких ответов после Post... в общем я не очень понимаю как эти связи обратно insert or delete в БД ??? |
06.09.2011, 11:46 | #8 |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
А SELECT MAX(id) FROM ... уже отменили?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
|
06.09.2011, 11:49 | #9 |
Заблокирован
Регистрация: 04.07.2011
Сообщений: 261
|
Если два юзера А и Б одновременно создают разные новые записи ТД, спрашивают maxid ТД, а затем отправляют данные ТС на insert... что получится??? хрень получится - мало того, что связи отправленные юзером Б перезапишут/дополнят связи записанные юзером А, так ещё и у записи ТД отправленной юзером Б вообще не будет связей в ТС!
И вообще использовать Max(ID) некорректно, тк если ранее была добавлена запись 100, а затем удалили записи 91-100, то значение Max(ID) выдаст 90, тогда как правильное значение которое задаст Генератор - 101 !!! Так что ваш вариант не подходит. Последний раз редактировалось delphicoding; 06.09.2011 в 12:28. |
06.09.2011, 12:32 | #10 | ||
Старожил
Регистрация: 20.04.2008
Сообщений: 5,526
|
Цитата:
Код:
если пользователи вводят одинаковые товары в каталог, то нужны или административные меры или нормальные средства поиска в каталоге, а не показывать ВСЕ записи в окне 1 (список товаров). И для одинаковых товаров без разницы кто ввел их связи. Цитата:
программа — запись алгоритма на языке понятном транслятору
Последний раз редактировалось evg_m; 06.09.2011 в 12:40. |
||
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Атрибуты выпадающего списка, как ускорить выбор в выпадающем списке | sevalery | PHP | 1 | 01.08.2011 13:51 |
Как задать выбор значения с помошью списка в VBA? | k.soldatova | Помощь студентам | 4 | 20.07.2011 16:58 |
как реализовать сложный выбор из выпадающего списка? | yulkas | Помощь студентам | 9 | 22.03.2010 09:54 |
Как ограничить выбор списка или сделать зависимость? | Стасон | Microsoft Office Excel | 4 | 29.03.2009 09:18 |
сортировка динамического списка | new_sergei | Помощь студентам | 1 | 19.12.2008 00:36 |