0 / 0 / 0
Регистрация: 21.03.2016
Сообщений: 102
MS SQL

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

20.10.2019, 21:03. Показов 3798. Ответов 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
 Аватар для Пытливый
3764 / 2272 / 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
 Аватар для Пытливый
3764 / 2272 / 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
 Аватар для Пытливый
3764 / 2272 / 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
 Аватар для Пытливый
3764 / 2272 / 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
6851 / 4677 / 1465
Регистрация: 14.04.2014
Сообщений: 20,674
Записей в блоге: 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
6851 / 4677 / 1465
Регистрация: 14.04.2014
Сообщений: 20,674
Записей в блоге: 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
6851 / 4677 / 1465
Регистрация: 14.04.2014
Сообщений: 20,674
Записей в блоге: 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
6851 / 4677 / 1465
Регистрация: 14.04.2014
Сообщений: 20,674
Записей в блоге: 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru