![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Здравствуйте!
В БД есть таблицы ТД и ТЮ с некими данными, а также ТС где должны храниться связи отдельных записей ТД с записями ТЮ. В программе есть 3 окна - 1.Каталог берущий данные из ТД, 2.Редактор конкретной записи ТД, 3.Список выбора связей этой записи с некими другими данными при помощи checkbox сохраняется в БД в таблицу ТС. Юзер открывает 1.Каталог и выбирает нужную запись, открывает 2.Редактор и правит там данные - всё очевидно. Вопрос со списком выбора - как его правильно реализовать? как правильно построить логику сохранения списка и хранения выбранных связей в БД при условиях, что: - обе таблицы ТД и ТЮ изменяются пользователем - дополняются, редактируются и удаляются. - при открытии в редакторе записи ТД, юзер должен видеть полный список ТЮ с возможностью поставить напротив каждой записи галочку. - второстепенно - желательно уменьшить объём хранимых данных в БД и упростить саму БД по возможности. PS Как быстрее работает - если хранить каждую связь таблиц отдельной записью в отдельной "таблице связей ТС" или если хранить в одном поле таблицы ТД весь список и затем парсить его в БД при необходимости (во втором случае отсутствует необходимость в поиске-выборке, отсутствует таблица и все данные ТС)? |
#2
|
||||
|
||||
![]() Начнем с конца. Если количество связей не исчисляется тысячами, то без разницы как вы будете хранить их, вертикально или горизонтально. Но вот удобнее и перспективнее все-же вертикальный вариант, в этом случае вы можете использовать ресурсы БД.
По первому вопросу складывается впечатление, что вы не знаете о реализации в дельфи связи данных через мастер-детайл. Или я чего-то не понял? Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#3
|
|||
|
|||
![]() Кол-во связей исчесляется кол-вом записей в каталоге ТЮ, которых и правда всего-то будет ну максимум 100-300
"Вертикальный метод хранения" - то есть создание ещё одной таблицы ТС с пересекающимися значениями (связями) - это конечно преумножение сущностей, тк только ради указания связи приходится хранить (автоинкрементальный номер записи в ТС, номер ТД, номер ТЮ, возможно ещё булеан вкл/выкл) - не слишком ли это много ради указания связи? Связи данных через мастер-детайл возможно не знаю или не понимаю о чём Вы говорите... объясните, пожалуйста. И таки главный вопрос - как данную задачу принято реализовывать? как Вы реализуете? |
#4
|
|||
|
|||
![]() В частности пока не очень понял как записывать выбранные значения в БД в таблицу ТС? Подробнее - чтобы отобразить пользователю список всех ТЮ - в БД при помощи хранимой процедуры склеиваем ТЮ и ТС, из ТС берутся значения "связь да/нет". Отправили в интерфейс - получили таблицу в которой видно все ТЮ и напротив используемых стоит галочка из ТС. Всё понятно. Далее юзер ставит/убирает галочки в интерфейсе показывая какие связи ему нужно записать в БД - понятно. А вот как это дело обратно записать в БД непонятно
![]() |
#5
|
|||
|
|||
![]() Профи, подскажите, пожалуйста, код:
а) Создание новой записи ТД, масса полей, все ассоциированы с Dataset_ТД - всё прекрасно пашет при редактировании записи ТД и отлично Update. Но использовать Dataset_ТД для создания новой записи ТД с Insert нельзя, тк почему-то не приходит в него RETURNING, который необходим для записи связей ТС. Попробуем использовать FIBQuery, который должен получить RETURNING. Вопрос - как написать код, чтобы в FIBQuery не прописывать все поля новой записи ТД а использовать настройки Dataset? то есть нужен код вроде: FIBQuery.Query(Dataset.Insert) или типа того, то есть использовать в запросе FIBQuery данные и поля из Dataset. (чтобы не нагромождать лишний код и использовать универсальную унаследованную форму с FIBQuery). б) Если а) невозможно, то тогда прошу подсказать код как наиболее правильно и легко взять поля из Dataset и отправить с FIBQuery? в) Пост связей в таблицу ТС - можно как-то запостить их в одну строку скопом? без цикла перебора каждой записи? Нужен код вида: Post All where Checked. |
#6
|
|||
|
|||
![]() а,б-решено.
в - пока не очень - можно как-то в одну строку запостить все строки Dataet2 отмеченные галочкой? При этом нужно им всем ещё назначить новый ТД_ID... |
#7
|
|||
|
|||
![]() FIBDataset при команде Post постит по каждой команде по одной строке на которой курсор? Или сразу сам постит всю свою таблицу?
|
#8
|
|||
|
|||
![]() Вот ещё непонятки
![]() а) в FIBDataset2 строка DeleteSQL = delete from Table where (ID=:ID) Но для того, чтобы удалились все те записи которые нужно удалить, нужно из Dataset1 взять текущий ID и выполнить с этим ID delete из Dataset2... Вопрос - сделать через Dataset не получилось, тк он удаляет по одной записи или вообще не позволяет изменять строку SQL тк уже открыт, получилось через Query... если знаете как таки сделать через Dataset2 напишите код, пожалуйста... б) нужно запостить все записи из Dataset2 в таблицу Table2, но взялись все эти записи в датасете автоматически из запроса и затем были лишь слегка подправлены юзером, то есть записи в таблице Dataset2 созданы НЕ в режиме Insert, как их теперь все Insert в БД? Пробовал Edit,Post и Insert,Post - не пашет. |
#9
|
|||
|
|||
![]() Решено, тему можно закрывать/удалять.
|