Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Добавление множества значений в таблицу, добавить сразу целый список 
:(
    Опции темы
ALeXandrK
  Дата 9.9.2007, 02:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 342
Регистрация: 31.1.2007
Где: Санкт-Петербург

Репутация: 2
Всего: 6



Помогите найти оптимальное решение:
Нужно добавлять сразу список значений в таблицу.

Поясняю: Есть таблица "АудиторииПредмета" и таблица "Аудитории".

Нужно добавлять из списка аудитории те, которые выберет пользователь. Само собой, что добавлять по одной аудитории посредством нажатия кнопки добавить и выбором из всего списка аудиторий нужную неподходит.
А как можно организовать наилучшим образом список наподобие CheckListBox, чтобы выбранные в этом списке добавились, а не выбранные, если есть в базе, удалились?

... нужно создавать доп. поле в таблице "выбрано" или ... вообщем, какие варианты, как вы поступали в подобных случаях???

Это сообщение отредактировал(а) ALeXandrK - 9.9.2007, 02:31


--------------------
Богат не/ни тот, у кого много, а тот, кому хватает
PM WWW   Вверх
Anark1
Дата 9.9.2007, 08:25 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 622
Регистрация: 15.12.2006
Где: RF -> Moscow

Репутация: 1
Всего: 11



Код

count,i : integer;
mystr : string;
count := MyCheckListBox.Items.Count;
...
for i:=1 to count do
begin
mystr := MyCheckListBox.Items.Strings[i]
if (MyCheckListBox.Items.Selected[i] = true) then
Proc_Ins(mystr)
else
Proc_Del(mystr);
end; 

Где Proc_Del и Proc_Ins - процедуры формирования SQL запроса. Соответственно для удаления записей и вставке.


--------------------
Enjoy yourself, still you can...;)

user posted image

user posted image
PM MAIL ICQ   Вверх
ALeXandrK
Дата 9.9.2007, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 342
Регистрация: 31.1.2007
Где: Санкт-Петербург

Репутация: 2
Всего: 6



У предложенного алгоритма есть недостаток: если поле уже существует в базе и оно уникально, то при добавлении его очередном
добавлении будет ошибка.
Может проще сначала удалить все поля для предмета, а потом просто добавить выделенные, тогда ошибок не будет.

Да и потом получается, что удобнее создавать временную колонку с галочками, а потом запросом добавлять выделенные.

Это сообщение отредактировал(а) ALeXandrK - 9.9.2007, 12:37


--------------------
Богат не/ни тот, у кого много, а тот, кому хватает
PM WWW   Вверх
ALeXandrK
  Дата 9.9.2007, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 342
Регистрация: 31.1.2007
Где: Санкт-Петербург

Репутация: 2
Всего: 6



Вообщем самым простым выходом пощетал следующий: 

1. Добавел дополнительное поле в таблицу "Аудитории" - "Checked" типа boolean;
2. Создал три запроса:
  • Отмечает все Аудитории, которые есть в таблице для определенного предмета
    Код

    UPDATE Аудитории SET Checked = TRUE
    WHERE инАудитории In (SELECT ИнАудитории FROM АудиторииПредмета WHERE инПредмета = :IdSubj);

  • Добавляет в АудиторииПредмета выделенные Аудитории
    Код

    INSERT INTO АудиторииПредмета ( инАудитории, инПредмета)
    SELECT инАудитории, [:IdSubj]
    FROM Аудитории
    WHERE Аудитории.Checked=True;

  • Удаляет все Аудитории для определенного предмета
    Код

    DELETE *
    FROM АудиторииПредмета
    WHERE инПредмета=[:IdSubj];

3. Соответственно, запускаем это все в нужном порядке и все прекрасно работает smile 

Я эту задачу уже решал. Думал, может уже есть готовое универсальное и более оптимальное решение, чем мое.
Ведь у такого подхода есть недостаток: нужно для каждого случая создавать свои запросы, со своими полями,
хотя конечно можно это все превратить в переменные...




Это сообщение отредактировал(а) ALeXandrK - 9.9.2007, 15:52


--------------------
Богат не/ни тот, у кого много, а тот, кому хватает
PM WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.0416 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.