Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.89/18: Рейтинг темы: голосов - 18, средняя оценка - 4.89
0 / 0 / 0
Регистрация: 21.03.2016
Сообщений: 102
MS SQL

Добавление записей в таблицу из CheckListBox

20.10.2019, 21:03. Показов 3657. Ответов 25
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
На форме расположены 4 dbcomboboxeh и 2 checklistbox
Как добавить все записи в таблицу, где бы присутствовали все значения из checklistbox1 и checklistbox2
Я так понимаю если выбрано 2 значения в checklistbox1 и 3 значения в checklistbox2, должно получится 6 записей в таблице, где dbcomboboxEhЫ имели б одинаковые значения полей
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
20.10.2019, 21:03
Ответы с готовыми решениями:

Из каждого CheckListBox вставить определённое количество записей в таблицу MSWORD
Такая вот проблема есть четыри чеклиста из каждого необходимо вставить определённое количество записей в таблицу MSWORD. У меня получился...

Добавление записей в таблицу и связанную с ней таблицу, с учётом связи
Имеются 3 таблицы: кабинет id_cab n_cab устройства ...

Добавление записей в таблицу
Пытаюсь добавить запись в таблицу . Приведу ниже скрины. Как пофиксить то, что у меня свойство UserPhotoId=3, а после команды...

25
 Аватар для Пытливый
3763 / 2267 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
20.10.2019, 22:35
Вы ничего не сказали о свое таблице, а кофе у меня для гадания кончился
0
0 / 0 / 0
Регистрация: 21.03.2016
Сообщений: 102
20.10.2019, 23:04  [ТС]
В таблице есть поле статус типа bit, которое я хочу обновлять из DBGridEh нажатием checkbox
0
 Аватар для Пытливый
3763 / 2267 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
20.10.2019, 23:09
Бит значит одно значение, а полей 6.
Решение: Либо делайте поле типа байт и используйте булеву арифметику для хранения своих 6 значений в одном поле, либо заводите 6 полей в таблице, либо создавайте дополнительную таблицу связанную по главному ключу с основной и пишите туда 6 записей для каждого из полей.
0
0 / 0 / 0
Регистрация: 21.03.2016
Сообщений: 102
20.10.2019, 23:28  [ТС]
В таблице есть 6 полей типа int и одно поле bit (по умолчанию пишется 0) в которые пишутся данные из формы (4 dbcombobox и 2 checklistbox) добавление производится, только последних выделенных checklistboxОВ. Так же есть 7-он поле bit, которое принимает значение 1 или 0, его необходимо обновлять CheckBoxОМ из DBGidEh + как занести все записи, где стоит галка в checklistbox

Добавлено через 11 минут
Цитата Сообщение от Пытливый Посмотреть сообщение
Вообще-то значение должно вносится в базу как надо, без доп выкрутасов. Вы описываете нормальное поведение грида для логического поля. Непонятно в чем проблема.
Вот это можете подсказать почему не получается?
0
 Аватар для Пытливый
3763 / 2267 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
21.10.2019, 00:57
Понимаете в чем дело, если у вас на форме все дб-компоненты настроены на источник данных и соответствующее поле в нем, то ничего настраивать дополнительно не требуется, но это для стандартных компонент, а вы используете DBGidEh, которого у меня нет и поведение его, для такого типа поля, мне неизвестно.
Вот чего я не понимаю, так зачем вы для 6 логических условий взяли тип поля int и там как я понял все у вас работает, а вот для 7 выбрали тип бит и теперь с ним мучаетесь?
0
0 / 0 / 0
Регистрация: 21.03.2016
Сообщений: 102
21.10.2019, 02:07  [ТС]
Нет. 6 полей интеджер. Все норм. По поводу чекбокса, ответил в другой теме. Меня здесь интересует вопрос как записывать данные из checklistbox которые помечены галочками необходимо записать в базу. Пишется только последняя выделенная строка.
При том в checklistbox1 у меня пользователи а в checklistbox2 права этих пользователей.
Необходимо записать для каждого выделенного элемента checklistbox1 выделенные элементы checklistbox2.
Пример: Если мы выбрали 3 пользователей в checklistbox1 и назначили им 4 права из checklistbox2 то в результирующей таблице должно добавится 12 записей (для каждого пользователя по 4 права) это как я вижу
Потом буду в DBGridEh формировать запрос на выборку этих записей и отображать через запятую.

Добавлено через 17 минут
Добавить в базу для каждой выделенной записи checklistbox1 выделенные записи в checklistbox2:

Пользователи Права
1————————25
1 ————————36
2 ————————25
2 ————————36
4————————25
4————————36
0
 Аватар для Пытливый
3763 / 2267 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
21.10.2019, 02:33
Для этого вам надо собрать информацию из всех элементов списка, т.е. пройтись циклом по элементам и проверить значение:
Delphi
1
2
3
 for i := 0 to CheckListBox1.Count - 1
 do if CheckListBox1.Checked[i]
    then ToDo()
Но тут есть один нюанс. Для вас элементами CheckListBox1 являются имена пользователей. В базе скорее всего это тоже имена пользователей, а вот для CheckListBox1 строковое значение это второстепенная информация, он оперирует индексами элементов в списке, поэтому вам для каждого элемента в списке надо будет найти пользователя в базе и уже после этого изменять его права в базе.
0
0 / 0 / 0
Регистрация: 21.03.2016
Сообщений: 102
21.10.2019, 05:31  [ТС]
В базу как раз пишутся айди тех пользователей чьи текстовые данные отображены в checkboxlist

Как будет запрос выглядеть перед отправкой?

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
for i := 0 to CheckListBox1.Count - 1 do
if CheckListBox1.Checked[i] then
begin
for i := 0 to CheckListBox2.Count - 1 do
if CheckListBox2.Checked[i] then
begin
ADOQuery.SQL.Text:=Insert(Пользователи,Права) (Value’
+IntToStr(Integer(CheckListBox1.Items.Objects(CheckListBox1.ItemIndex)),
+IntToStr(Integer(CheckListBox2.Items.Objects(CheckListBox2.ItemIndex)) );
End;
End;
ADOQuery.ExecSQL;
Или

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
procedure TForm1.Button1Click(Sender: TObject);
  var
  i:integer;
 begin
 ADOQuery.First;
 for i:=0 To ListBox1.Count-1 do
 do if CheckListBox1.Checked[i] then
 begin
   for i:=0 To ListBox2.Count-1 do
   do if CheckListBox2.Checked[i] then
  begin
    ADOQuery.Insert;
    ADOQuery.FieldByName('Пользователи').Value:=ListBox1.Items[i];
    ADOQuery.FieldByName('Права').Value:=ListBox2.Items[i];
    ADOQuery.Post ;
  end;
 end;
end;
Мне нужно как то получить табличку которую я в 7 посте изобразил
0
 Аватар для Мудрый Ижик
32 / 26 / 7
Регистрация: 18.10.2019
Сообщений: 187
21.10.2019, 17:00
Нет не так. CheckListBox элементы нумерует с 0, а вот в базе у вас ID пользователя может быть какой угодно, поэтому нельзя по нему ориентироваться, но можно заполнять CheckListBox методом AddItem(), где вторым параметром указывать идентификатор пользователя:
Delphi
1
CheckListBox1.AddItem(AdoQuery['Пользователи'], TObject(AdoQuery['ID']));
тогда у вас будет доступ к нужному id пользователя:
Delphi
1
CheckListBox1.Items.Objects[i]
0
0 / 0 / 0
Регистрация: 21.03.2016
Сообщений: 102
21.10.2019, 17:36  [ТС]
Все конечно хорошо но мне не нужен id пользователя. Вернее нужен, но...

Есть таблица права, куда нужно записать значения из ChekListBox1 (Пользователи) и ChekListBox2 (Права) но таким образом чтобы на 1 пользователя писались все выделенные в ChekListBox2 значения
Список ChekListBox1 и ChekListBox2 формируется из базы как раз AddItem(string, id)

Таблица итоговая представлена в 7 посте

Можно мне пример такого заполнения? Или хотяб на мысль натолкнуть, может додумаю...
0
 Аватар для krapotkin
6847 / 4674 / 1463
Регистрация: 14.04.2014
Сообщений: 20,656
Записей в блоге: 21
21.10.2019, 19:12
наталкиваю)))
любые операции с таблицами это всего лишь DELETE UPDATE INSERT
если вам нужно вставить в таблицу записи , вы используете INSERT
(хотя я бы сначала удалил старые записи, а потом бы писал новые, но это не суть, ибо ровно так же запросом работает)
еще раз отошлю для начала сюда
https://www.cyberforum.ru/blog... g5254.html
там ближе к концу есть пример с INSERT

единственное что меня смущает, что у вас поля называются "Пользователи" и "Права"
каждое поле хранит ОДНО значение поэтому логичнее назвать "Пользователь" и "Право"
и кроме того, с правами можно еще подумать, но поле пользователь уж точно ДОЛЖНО хранить ID пользователя из справочника пользователей, который должен быть отдельной таблицей
Надеюсь, это так и есть

в результате получим что-то такое

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
var ID: integer;
  Rght: string;
.....
ADOQuery123.Close;
ADOQuery123.SQL.Text := 'INSERT INTO ваша_таблица ("пользователь", "право") VALUES (:USER,:RGHT)';
ADOQuery123.Parameters.ParamByName('USER').DataType := ftInteger;
ADOQuery123.Parameters.ParamByName('RGHT').DataType := ftString;
 
for i:=0 clBox1.items.Count-1 do
begin
  if clBox1.Checked[i] then
  begin
    for j:=0 to clBox2.Items.Count-1 do
    begin
      if clBox2.Checked[i] then
      begin
        // нужно ID пользователя достать для clBox1.items[i]
        // думаю вы найдете способ
        ID := ....
        ADOQuery123.Parameters.ParamByName('USER').Value := ID;
        // ну а тут предположим, что у вас права хранятся строкой, и именно эту строку вы показываете
        // во втором checklist'е
        Rght := clBox.Items[j];
        ADOQuery123.Parameters.ParamByName('RGHT').Value := Rght;
        ADOQuery123.ExecSQL;
      end;
    end;
  end;
end;
0
0 / 0 / 0
Регистрация: 21.03.2016
Сообщений: 102
21.10.2019, 20:16  [ТС]
Права выбираются из CheckListBox2 тоже должны писаться в бд не строкой а новой записью
Права тоже пишутся ID которые берутся из справочника прав (другая таблица)
0
 Аватар для krapotkin
6847 / 4674 / 1463
Регистрация: 14.04.2014
Сообщений: 20,656
Записей в блоге: 21
21.10.2019, 20:39
замените Rght вместо string на integer и в строке 7 тоже поменяйте
остальное остается без изменений

обычно в VCL используют старинный костылик - нужные ID пишут прямо в items маскируя их под ссылки на объекты
для этого при заполнении
Delphi
1
clBox1.items.AddObject('Текст', TObject(ID));
а чтобы достать оттуда
Delphi
1
ID := integer( clBox1.items.objects[i] );
это не Best practice конечно, но чаще всего сойдет
1
22.10.2019, 03:13

Не по теме:

Цитата Сообщение от krapotkin Посмотреть сообщение
обычно в VCL используют старинный костылик
Уже плюс вам krapotkin. Осталось только согласиться с тем, что это не "костылик" а "фитча"! Ни сколь не вредная, но порой полезная. :)
Рано или поздно, но я уверен что вы с этим согласитесь.

0
0 / 0 / 0
Регистрация: 21.03.2016
Сообщений: 102
22.10.2019, 13:31  [ТС]
Можете 6, 7 строчку пояснить? Для чего нужны указания DataType?
0
 Аватар для krapotkin
6847 / 4674 / 1463
Регистрация: 14.04.2014
Сообщений: 20,656
Записей в блоге: 21
22.10.2019, 14:19
northener, а в ARC это работать не будет, и мы будем читать посты "ой всегда работало а тут сломалось, ой, почему ОНИ все испортили" )))

комментаторы выше могут посчитать это вредным и излишним, но указывать тип передаваемых данных довольно важно)
они по-разному обрабатываются сервером
0
0 / 0 / 0
Регистрация: 21.03.2016
Сообщений: 102
22.10.2019, 15:12  [ТС]
Чего как то не так работает.
1) При выборе 2 пользователей и 2 прав в CLBox1 и CLBox2 соответственно, добавляется 368 записей последних отмеченных в CLBoxах, а по идее должно 4 записи и не однотипных
2) Если в CLBox только одна запись выдаёт ошибку List index bound (2) с чем это может быть связано? Но данные записываются
0
 Аватар для krapotkin
6847 / 4674 / 1463
Регистрация: 14.04.2014
Сообщений: 20,656
Записей в блоге: 21
22.10.2019, 15:29
никто не видит ваш кот...
ну и на слово тоже не верит)
и не верит, что вы почистили старые записи прежде чем писать новые

но верит, что если выполнить 4 раза INSERT то не более 4 записей появится в таблице...

Добавлено через 1 минуту
ну и код писан на коленке, не проверен, чисто для образца
например в строке 15
if clBox2.Checked[i] then
должно быть
if clBox2.Checked[j] then
0
0 / 0 / 0
Регистрация: 21.03.2016
Сообщений: 102
22.10.2019, 15:53  [ТС]
Цитата Сообщение от krapotkin Посмотреть сообщение
должно быть
if clBox2.Checked[j] then
Огромное спасибо

А по поводу только последних выделенных записей в CLBox? While do?

Добавлено через 9 минут
Тоесть если выделены 2 сотрудника и 2 право нужно 4 записи создать, тоесть первому сотруднику 2 записи и второму 2 записи
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.10.2019, 15:53
Помогаю со студенческими работами здесь

Добавление записей в таблицу
Здравствуйте. Пытаюсь добавить данные в таблицу вот код: OracleCommand command = new OracleCommand(); ...

Добавление записей в таблицу
SqlConnection connection1 = new SqlConnection("Data Source=.\\SQLEXPRESS;AttachDbFilename=C:\\bd\\bdtest.mdf;Integrated...

Добавление записей в таблицу
bagsar - скрин табличек gszConnection.Open(); gCommand.Connection = gszConnection; for (int i...

Добавление записей в таблицу
Как при нажатии на кнопку добавить 10 любых записей в таблицу и при нажатии на другую кнопку удалить вторую запись?

Добавление записей в таблицу
Здравствуйте! В силу своих познаний начал допиливать ранее предложенный мне код, но столкнулся с такой проблемой, что записей в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru