Topic: Запись значений в таблицу через чекбокс.

Добрый день, Дмитрий. Возможно ли реализовать запись значений в БД через чекбокс? Т.е к примеру, есть несколько чекбоксов, допустим a,b и c.  Им соответствуют какие либо свои текстовые выражения, например AA,BB,CC. При нажатии на какой либо чекбокс, сопутствующее ему значение записывается в поле в таблице БД. Нажал чекбокс "а"- в поле внеслось значение АА, и тд. Таких полей, как  я понимаю нужно делать 3 (для текстовых выражений АА,ВВ и СС). Для вывода можно эти поля объединить (если одновременно нажато несколько чекбоксов - они занеслись в соответствующие поля БД, а потом вывелись в одном столбце) .В скрипте наверно должно быть что то типо, если значение чекбокса "a"=1 то в поле Edit1 внеслась запись "AA".  Если значение чекбокса "b"=1 то в поле Edit2 внеслась запись "BB". Можете ли помочь с данным вопросам? Я не особо силен на данный момент в написании скриптов)

Re: Запись значений в таблицу через чекбокс.

Дмитрий?

Re: Запись значений в таблицу через чекбокс.

Приветствую,


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


Правильно будет создать таблицу БД, в которой будут содержаться записи
AA
BB
CC


после чего на форме можно будет разместить три ComboBox-а, в которых можно будет выбрать перечисленное значение.


Возможно мне будет проще подсказать правильный способ организовать это, если расскажите для каких целей вам это необходимо.

Dmitry.

Re: Запись значений в таблицу через чекбокс.

Это делается для осуществления множественного выбора по сути (при добавлении записи). Примером может быть обычная анкета по сути, например укажите цвет,который Вам нравится и несколько вариантов в виде чекбоксов. Ему может нравится один цвет- черный, а может и 10 цветов. 10 комбобоксов реализовывать не удобно, причем придется многие оставлять пустыми, а тут отметил галочками что нужно, значения занеслись в поля и потом вывелись все вместе. Если в таблице будут повторяться одни и те же значения (к примеру 10 вариантов) в этом нет же ничего плохого, как я понимаю.

Re: Запись значений в таблицу через чекбокс.

Если с помощью комбобоксов,пусть их будет несколько, но активный будет только один, и следующие будут появляться только в случае,если в предыдущем выбрана запись. Но,незнаю насколько это будет сложнее сделать.

Re: Запись значений в таблицу через чекбокс.

Да, в этом случае комбобоксы не подойдут.


Есть два пути, правильный и компромисный.


Правильный, завести словарную таблицу для хранения всех доступных цветов и еще одну дочернюю таблицу, в которой будут храниться выбранные цвета для данной анкеты.



Компромисный, ваш вариант с чекбоксами, при отмечании которых, будет формироваться текстовая строка вида
"зеленый, красный, желтый"
которую будем сохранять в одно текстовое поле.



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


какой вариант выбираете?

Dmitry.

Re: Запись значений в таблицу через чекбокс.

А реализовать вариант с активными и не активными комбобоксами на данный момент возможности нет? Отчетов точно не планируется, да и главное, чтобы ее удобно было заполнять. Поэтому если вариант с появлением новых комбобоксов, когда в предыдущем выбрана запись не подходит, тогда чекбоксы.

Re: Запись значений в таблицу через чекбокс.

Можно и с комбоксами, но тогда будет возможность указать одновременно 2 и более раз один и тот же цвет.


С чекбоксами по моему будет быстрей и наглядней выбирать цвета,
почему бы в базе данных не создать поля Да/Нет, например
is_red
is_green
is_blue
is_yellow
и т.д.


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

Dmitry.

Re: Запись значений в таблицу через чекбокс.

Попробовал, создал таблицу Color, добавил green,blue,red. Добавил чекбоксы. При запросе в поиске выводится как Color.green, Color,red и тд. Можно ли избежать это как то?

Re: Запись значений в таблицу через чекбокс.

приложите пожалуйста ваш проект, и как бы вы хотели чтобы в гриде отображались выбранные цвета.

Dmitry.

Re: Запись значений в таблицу через чекбокс.

Проект смогу приложить немного позже. Хотелось бы что ни отображались по человечески, т.е зеленый, красный и тд. Сейчас они отображаются как Название таблицы. Цвет. Как описано выше

Re: Запись значений в таблицу через чекбокс.

это можно сделать с помощью вычисляемого поля, пример:

rtrim(
CASE WHEN is_red=1 THEN 'красный, ' ELSE '' END ||
CASE WHEN is_green=1 THEN 'зеленый, ' ELSE '' END ||
CASE WHEN is_blue=1 THEN 'синий, ' ELSE '' END
, ', ')
Dmitry.

Re: Запись значений в таблицу через чекбокс.

Попробовал, все работает если выводить информацию без SQL запроса. У меня поиск осуществляется по SQL запросу:

Select
person.ФИО
,person.Организация
,person.Интерес
,person.analog
,CONCAT(IFNULL(Diapazon_f.diap_f,''),' ',IFNULL(person.drugoe_f,''))
,person.id


From person

LEFT OUTER JOIN Diapazon_f ON Diapazon_f.id=person.id_Diapazon_f
LEFT OUTER JOIN Appparat ON Appparat.id=person.id_Appparat
LEFT OUTER JOIN phone ON phone.id_person=person.id
LEFT OUTER JOIN Email ON Email.id_person=person.id

WHERE
(CASE WHEN {chbFIO}=1 THEN ФИО LIKE '%{edSearch}%' ELSE 1=0 END) OR
(CASE WHEN {chbORG}=1 THEN Организация LIKE '%{edSearch}%' ELSE 1=0 END) OR
(CASE WHEN {chbINT}=1 THEN Интерес LIKE '%{edSearch}%' ELSE 1=0 END) OR
(CASE WHEN {chbF}=1 THEN diap_f LIKE '%{edSearch}%' ELSE 1=0 END)
GROUP BY person.id

При попытке вставить в SELECT вычисляемое поле, к примеру person.RED, содержит  (CASE WHEN RED=1 THEN 'Красный' ELSE '' END), запрос уже не работает. Ну наверно это логично. Видимо как то нужно реализовать это сразу в запросе, без вычисляемого поля в таблице Person. ?

Re: Запись значений в таблицу через чекбокс.

Необходимо выч. поле вставить непосредственно в SQL запрос:

Select
person.ФИО
,person.Организация
,person.Интерес
,person.analog
,CONCAT(IFNULL(Diapazon_f.diap_f,''),' ',IFNULL(person.drugoe_f,''))
, rtrim(
CASE WHEN is_red=1 THEN 'красный, ' ELSE '' END ||
CASE WHEN is_green=1 THEN 'зеленый, ' ELSE '' END ||
CASE WHEN is_blue=1 THEN 'синий, ' ELSE '' END
, ', ')
,person.id


From person

LEFT OUTER JOIN Diapazon_f ON Diapazon_f.id=person.id_Diapazon_f
LEFT OUTER JOIN Appparat ON Appparat.id=person.id_Appparat
LEFT OUTER JOIN phone ON phone.id_person=person.id
LEFT OUTER JOIN Email ON Email.id_person=person.id

WHERE
(CASE WHEN {chbFIO}=1 THEN ФИО LIKE '%{edSearch}%' ELSE 1=0 END) OR
(CASE WHEN {chbORG}=1 THEN Организация LIKE '%{edSearch}%' ELSE 1=0 END) OR
(CASE WHEN {chbINT}=1 THEN Интерес LIKE '%{edSearch}%' ELSE 1=0 END) OR
(CASE WHEN {chbF}=1 THEN diap_f LIKE '%{edSearch}%' ELSE 1=0 END)
GROUP BY person.id
Dmitry.

Re: Запись значений в таблицу через чекбокс.

Полная конструкция выглядит так:
CONCAT(IFNULL((CASE WHEN L=1 THEN 'L-диапазон' ELSE '' END),''),' ',IFNULL((CASE WHEN C=1 THEN 'C-диапазон' ELSE '' END),''),' ',IFNULL(person.drugoe_f,''))
Огород конечно,но вроде работает. Спасибо за помощь.

Re: Запись значений в таблицу через чекбокс.

А искать теперь не получится по этому?
(CASE WHEN {chbF}=1 THEN diap_f LIKE '%{edSearch}%' ELSE 1=0 END)  пока было текстовое поле в таблице все работало. Щас этого поля нет, и вместо него поля L,C,S,X и тд. Типа да/нет.

Было так:  ,CONCAT(IFNULL(Diapazon_f.diap_f,''),' ',IFNULL(person.drugoe_f,'')) и поиск по этому: (CASE WHEN {chbF}=1 THEN diap_f LIKE '%{edSearch}%' ELSE 1=0 END). Все работало.

Сейчас:
,CONCAT(IFNULL((CASE WHEN L=1 THEN 'L-диапазон' ELSE '' END),''),' ',IFNULL((CASE WHEN C=1 THEN 'C-диапазон' ELSE '' END),''),' ',IFNULL(person.drugoe_f,'')) и поиск по этому:  (CASE WHEN {chbF}=1 THEN drugoe_f LIKE '%{edSearch}%' ELSE 1=0 END)

Можно сделать что то с этим?

Re: Запись значений в таблицу через чекбокс.

memult
Пожалуйста сформулируйте вопрос более ясно, еще лучше приложите тестовый проект, в котором я смог бы помочь, так как довольно трудно подсказать что то конкретное по этим кускам запросов.

Dmitry.

18 (edited by memult 2015-12-19 19:03:05)

Re: Запись значений в таблицу через чекбокс.

Прикрепил проект,если коротко, проблема: щас не работает поиск по этим чебоксам. Т.е если при заполнении поставить галочку L- диапазон, или C-диапазон (к SQL прикручены пока только эти чекбоксы) то поиск потом на них не реагирует, и реагирует на значения из поля "drugoe_f" , с которым они объединены при выводе в гриде.

Файл оказался большим- отправил на почту.

Re: Запись значений в таблицу через чекбокс.

Вы еще не смотрели проект,Дмитрий?

Re: Запись значений в таблицу через чекбокс.

В SQL запросе, где прописывается поиск по чекбоксу, заменил обычное поле на вычисляемое:
(CASE WHEN {chbF}=1 THEN (CASE WHEN L=1 THEN 'L-диапазон' ELSE '' END) LIKE '%{edSearch}%' ELSE 1=0 END). Вроде заработало, или это неправильный подход?

Re: Запись значений в таблицу через чекбокс.

memult
Если работает, значит можно )
Возможно этот способ будет медленно работать, когда данных будет много, т.к. подобный поиск более правильно реализовать с помощью CheckBox-ов.


К сожалению не могу протестировать ваш проект без доступа к базе на MySQL сервере.

Dmitry.

Re: Запись значений в таблицу через чекбокс.

Отправил информацию на почту.

Re: Запись значений в таблицу через чекбокс.

memult wrote:

Отправил информацию на почту.

Зачем? вы говорите что все работает.

Dmitry.

Re: Запись значений в таблицу через чекбокс.

Я думал Вы хотите потестить, в любом случае пусть будет.