Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Закрытая тема
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 06.09.2011, 09:33
delphicoding delphicoding вне форума
Активный
 
Регистрация: 04.07.2011
Сообщения: 206
Репутация: -461
Вопрос Выбор из динамического списка checkbox - кто как реализует?

Здравствуйте!
В БД есть таблицы ТД и ТЮ с некими данными, а также ТС где должны храниться связи отдельных записей ТД с записями ТЮ. В программе есть 3 окна - 1.Каталог берущий данные из ТД, 2.Редактор конкретной записи ТД, 3.Список выбора связей этой записи с некими другими данными при помощи checkbox сохраняется в БД в таблицу ТС. Юзер открывает 1.Каталог и выбирает нужную запись, открывает 2.Редактор и правит там данные - всё очевидно. Вопрос со списком выбора - как его правильно реализовать? как правильно построить логику сохранения списка и хранения выбранных связей в БД при условиях, что:
- обе таблицы ТД и ТЮ изменяются пользователем - дополняются, редактируются и удаляются.
- при открытии в редакторе записи ТД, юзер должен видеть полный список ТЮ с возможностью поставить напротив каждой записи галочку.
- второстепенно - желательно уменьшить объём хранимых данных в БД и упростить саму БД по возможности.

PS Как быстрее работает - если хранить каждую связь таблиц отдельной записью в отдельной "таблице связей ТС" или если хранить в одном поле таблицы ТД весь список и затем парсить его в БД при необходимости (во втором случае отсутствует необходимость в поиске-выборке, отсутствует таблица и все данные ТС)?
  #2  
Старый 06.09.2011, 09:43
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Начнем с конца. Если количество связей не исчисляется тысячами, то без разницы как вы будете хранить их, вертикально или горизонтально. Но вот удобнее и перспективнее все-же вертикальный вариант, в этом случае вы можете использовать ресурсы БД.
По первому вопросу складывается впечатление, что вы не знаете о реализации в дельфи связи данных через мастер-детайл. Или я чего-то не понял?
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
  #3  
Старый 06.09.2011, 09:53
delphicoding delphicoding вне форума
Активный
 
Регистрация: 04.07.2011
Сообщения: 206
Репутация: -461
По умолчанию

Кол-во связей исчесляется кол-вом записей в каталоге ТЮ, которых и правда всего-то будет ну максимум 100-300
"Вертикальный метод хранения" - то есть создание ещё одной таблицы ТС с пересекающимися значениями (связями) - это конечно преумножение сущностей, тк только ради указания связи приходится хранить (автоинкрементальный номер записи в ТС, номер ТД, номер ТЮ, возможно ещё булеан вкл/выкл) - не слишком ли это много ради указания связи?

Связи данных через мастер-детайл возможно не знаю или не понимаю о чём Вы говорите... объясните, пожалуйста.

И таки главный вопрос - как данную задачу принято реализовывать? как Вы реализуете?
  #4  
Старый 06.09.2011, 10:45
delphicoding delphicoding вне форума
Активный
 
Регистрация: 04.07.2011
Сообщения: 206
Репутация: -461
По умолчанию

В частности пока не очень понял как записывать выбранные значения в БД в таблицу ТС? Подробнее - чтобы отобразить пользователю список всех ТЮ - в БД при помощи хранимой процедуры склеиваем ТЮ и ТС, из ТС берутся значения "связь да/нет". Отправили в интерфейс - получили таблицу в которой видно все ТЮ и напротив используемых стоит галочка из ТС. Всё понятно. Далее юзер ставит/убирает галочки в интерфейсе показывая какие связи ему нужно записать в БД - понятно. А вот как это дело обратно записать в БД непонятно тк это же не прямая правка реальной таблицы, а правка в таблице собранной из нескольких и значение не одно, а список, каждая строка которого - новая строка в таблице ТС. То есть задача типа "delete or insert" - но как это реализовать не очень понимаю... возможно опять таки при помощи ХП, но она же обработает только одну строку, а не все. Можно было бы использовать отправку в БД сразу по нажатию на галочку то есть редактировать каждую строку ТС по-отдельности, но только для редактирования, тогда как при создании новой записи ТД в 2.Редакторе ещё неизвестен номер будущей записи ТД и поэтому в ТС записать без номера ТД не получится - поэтому нужно записывать связи ТС сразу все скопом. (используются FIBplus и FB) Подскажите, пожалуйста, как это реализовать!
  #5  
Старый 07.09.2011, 11:17
delphicoding delphicoding вне форума
Активный
 
Регистрация: 04.07.2011
Сообщения: 206
Репутация: -461
По умолчанию

Профи, подскажите, пожалуйста, код:
а) Создание новой записи ТД, масса полей, все ассоциированы с Dataset_ТД - всё прекрасно пашет при редактировании записи ТД и отлично Update. Но использовать Dataset_ТД для создания новой записи ТД с Insert нельзя, тк почему-то не приходит в него RETURNING, который необходим для записи связей ТС. Попробуем использовать FIBQuery, который должен получить RETURNING. Вопрос - как написать код, чтобы в FIBQuery не прописывать все поля новой записи ТД а использовать настройки Dataset? то есть нужен код вроде: FIBQuery.Query(Dataset.Insert) или типа того, то есть использовать в запросе FIBQuery данные и поля из Dataset. (чтобы не нагромождать лишний код и использовать универсальную унаследованную форму с FIBQuery).
б) Если а) невозможно, то тогда прошу подсказать код как наиболее правильно и легко взять поля из Dataset и отправить с FIBQuery?
в) Пост связей в таблицу ТС - можно как-то запостить их в одну строку скопом? без цикла перебора каждой записи? Нужен код вида: Post All where Checked.
  #6  
Старый 08.09.2011, 15:41
delphicoding delphicoding вне форума
Активный
 
Регистрация: 04.07.2011
Сообщения: 206
Репутация: -461
По умолчанию

а,б-решено.

в - пока не очень - можно как-то в одну строку запостить все строки Dataet2 отмеченные галочкой? При этом нужно им всем ещё назначить новый ТД_ID...
Закрытая тема


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 11:03.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025