Форум по 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...
  #7  
Старый 09.09.2011, 13:48
delphicoding delphicoding вне форума
Активный
 
Регистрация: 04.07.2011
Сообщения: 206
Репутация: -461
По умолчанию

FIBDataset при команде Post постит по каждой команде по одной строке на которой курсор? Или сразу сам постит всю свою таблицу?
  #8  
Старый 09.09.2011, 21:54
delphicoding delphicoding вне форума
Активный
 
Регистрация: 04.07.2011
Сообщения: 206
Репутация: -461
По умолчанию

Вот ещё непонятки
а) в 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  
Старый 11.09.2011, 14:03
delphicoding delphicoding вне форума
Активный
 
Регистрация: 04.07.2011
Сообщения: 206
Репутация: -461
По умолчанию

Решено, тему можно закрывать/удалять.
Закрытая тема


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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