SQLinfo.ru - Все о MySQL PG day 17

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 01.04.2017 11:48:45

sql157
Завсегдатай
Зарегистрирован: 17.03.2016
Сообщений: 84

Как сделать на форме список с свойством поля "Разрешить несколько значений"?

Используется
Access 2016
MySql 5,7 - х64

Access использует внешние таблицы через ODBC
Таблицы расположены на MySql

Как сделать в форме  сценарий для ввода в поле нескольких значений?
Сценарий
1. Набираем с клавиатуры несколько символов меток
2. Access предлагает наиболее подходящие для набранных символов метки из справочника (см. скрин)
3. По средствам стрелок клавиатуры выбираем из списка необходимую позицию.
4. Нажимаем "Ввод".
5. По средствам нажатия "Ввод" позиция заносится в поле. После позиции ставится знак разделителя. "," (запятая) например.
6. Набираем следующую позицию.
7. Цикл повторяется. См. п.2 - п.6.

Вопрос.
1. Как реализовать данный цикл?
2. Какими другими способами можно решить данную задачу?
3. Как сделать, чтобы данные в поле, где собираются метки не повторялись?

Отредактированно sql157 (02.04.2017 16:15:04)


Прикрепленные файлы:
Attachment Icon 01.jpg, Размер: 81,138 байт, Скачано: 13

Неактивен

 

#2 01.04.2017 11:49:21

sql157
Завсегдатай
Зарегистрирован: 17.03.2016
Сообщений: 84

Re: Как сделать на форме список с свойством поля "Разрешить несколько значений"?

Скрин аналог


Прикрепленные файлы:
Attachment Icon 02cyberfor.jpg, Размер: 70,873 байт, Скачано: 15

Неактивен

 

#3 01.04.2017 11:50:16

sql157
Завсегдатай
Зарегистрирован: 17.03.2016
Сообщений: 84

Re: Как сделать на форме список с свойством поля "Разрешить несколько значений"?

Файл


Прикрепленные файлы:
Attachment Icon vpr_00_vp_sps_00.mdb, Размер: 413,696 байт, Скачано: 20

Неактивен

 

#4 01.04.2017 14:10:51

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5156

Re: Как сделать на форме список с свойством поля "Разрешить несколько значений"?

всё-таки это форум по MySql
вероятность получить ответ про аccess невелика
емнип, там есть вариант списка, в котором можно выделить несколько позиций

Активен

 

#5 01.04.2017 18:05:36

sql157
Завсегдатай
Зарегистрирован: 17.03.2016
Сообщений: 84

Re: Как сделать на форме список с свойством поля "Разрешить несколько значений"?

vasya написал:

емнип, там есть вариант списка, в котором можно выделить несколько позиций

емнип - это тип поля?

Неактивен

 

#6 01.04.2017 18:14:30

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5156

Re: Как сделать на форме список с свойством поля "Разрешить несколько значений"?

емнип - это если мне не изменяет память
посмотрите в настройках при задании свойств эл-та формы

Активен

 

#7 02.04.2017 09:04:45

sql157
Завсегдатай
Зарегистрирован: 17.03.2016
Сообщений: 84

Re: Как сделать на форме список с свойством поля "Разрешить несколько значений"?

vasya написал:

емнип - это если мне не изменяет память
посмотрите в настройках при задании свойств эл-та формы

Не получается найти ни емнип, ни emnip...
Ну да ладно..

Может есть возможность триггером как-то это решить?
Пример.
Имеется таблица

CREATE TABLE `tst_005_tbl_00` (
    `id` INT(11) NULL DEFAULT NULL,
    `metki` VARCHAR(1000) NULL DEFAULT NULL,
    `metki_sprch` ENUM('metka_1','metka_2','metka_3','metka_4','metka_5','metka_6') NULL DEFAULT NULL
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
;


Сценарий
1. В поле "metki_sprch" меняем метки,
2. Триггер добавляет через запятую новые метки в поле "metki".

Вопрос
Можно ли реализовать данный сценарий?
Если "да", то не могли бы вы показать как ориентировочно должен выглядеть триггер..

Отредактированно sql157 (02.04.2017 09:15:08)

Неактивен

 

#8 02.04.2017 12:01:51

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5156

Re: Как сделать на форме список с свойством поля "Разрешить несколько значений"?

чтобы задействовать триггер нужно обновлять запись при каждом действии
тогда после каждого обновления добавлять значение `metki_sprch` к `metki`

емнип, в аксесе можно задать выполнение кода при действиях с этом формы

Активен

 

#9 02.04.2017 12:36:49

sql157
Завсегдатай
Зарегистрирован: 17.03.2016
Сообщений: 84

Re: Как сделать на форме список с свойством поля "Разрешить несколько значений"?

vasya написал:

чтобы задействовать триггер нужно обновлять запись при каждом действии
тогда после каждого обновления добавлять значение `metki_sprch` к `metki`

Я так и предполагаю...
Пример.
1. Поле `metki_sprch`.  Выбрал 'metka_1';
2. Триггер добавил 'metka_1' в поле `metki`;
3. Поле `metki` содержит: 'metka_1';
4. Поле `metki_sprch`.  Выбрал 'metka_3';
5. Триггер добавил 'metka_3' в поле `metki`;
6. Поле `metki` содержит: 'metka_1', 'metka_3';
и т.д.

Комбинации меток в поле `metki` будут разные для каждого поля.

Или я не правильно понимаю механизм?

Неактивен

 

#10 02.04.2017 12:42:52

sql157
Завсегдатай
Зарегистрирован: 17.03.2016
Сообщений: 84

Re: Как сделать на форме список с свойством поля "Разрешить несколько значений"?

sql157 написал:

Комбинации меток в поле `metki` будут разные для каждого поля.

Ошибка
...  для каждой ЗАПИСИ.

Отредактированно sql157 (02.04.2017 13:34:54)

Неактивен

 

#11 02.04.2017 12:48:32

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5156

Re: Как сделать на форме список с свойством поля "Разрешить несколько значений"?

при выбрал в форме 'metka_1' тригер ничего не добавит
чтобы сработал триггер, нужно будет обновить данные

а так, да в триггере concat(`metki_sprch`, ', ', `metki`)

Активен

 

#12 02.04.2017 16:17:35

sql157
Завсегдатай
Зарегистрирован: 17.03.2016
Сообщений: 84

Re: Как сделать на форме список с свойством поля "Разрешить несколько значений"?

vasya написал:

при выбрал в форме 'metka_1' тригер ничего не добавит
чтобы сработал триггер, нужно будет обновить данные

а так, да в триггере concat(`metki_sprch`, ', ', `metki`)

Сделал в следующем виде.
- справочник меток;
- таблица Статей (статьям будут присваиваться метки);
- таблица журнал меток для статей;
- триггер_обновления(при обновлении метки в журнал заносится id статьи и метка.)

Вопрос.
1. Правильным ли будет реализованное мной решение.
2. Как сделать, чтобы триггер осуществлял проверку метки на уникальность? Т.е. если в журнале для статьи метка уже есть, то она не заносится в журнал... Или просто появляется сообщение об ошибке.

КОД

/*Таблица. Справочник меток */

CREATE TABLE `sprch_metki` (
    `metki_stat` CHAR(50) NULL DEFAULT NULL
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
;


/*Таблица. Статьи */
CREATE TABLE `stat` (
    `id_stat` INT(11) NOT NULL AUTO_INCREMENT,
    `name_stat` CHAR(50) NULL DEFAULT NULL,
    `content_stat` CHAR(50) NULL DEFAULT NULL,
    `metka_stat` CHAR(50) NULL DEFAULT NULL,
    PRIMARY KEY (`id_stat`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=3
;

/*Триггер для таблицы статьи */
CREATE DEFINER=`root`@`%` TRIGGER `stat_before_update` BEFORE UPDATE ON `stat` FOR EACH ROW BEGIN
    /*metka_stat*/
  IF (NOT OLD.metka_stat <=> NEW.metka_stat)
    THEN  
    INSERT INTO grnl_metki    
     (id_stat,
      metka_stat)
     
    VALUES(    
     OLD.id_stat,    
    NEW.metka_stat);    
  END IF;
END

/*Таблица журнал*/
CREATE TABLE `grnl_metki` (
    `id_metka` INT(11) NOT NULL AUTO_INCREMENT,
    `id_stat` INT(11) NULL DEFAULT NULL,
    `metka_stat` CHAR(50) NULL DEFAULT NULL,
    PRIMARY KEY (`id_metka`)
)
COMMENT='Таблица - журнал  меток'
COLLATE='utf8_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=5
;
 

Неактивен

 

#13 02.04.2017 16:30:09

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5156

Re: Как сделать на форме список с свойством поля "Разрешить несколько значений"?

я потерял нить рассуждений
что хранится в metka_stat?
дополните тестовыми значениями на несколько строк и что должно происходить при обновлении

Активен

 

#14 02.04.2017 18:50:56

sql157
Завсегдатай
Зарегистрирован: 17.03.2016
Сообщений: 84

Re: Как сделать на форме список с свойством поля "Разрешить несколько значений"?

vasya написал:

я потерял нить рассуждений
что хранится в metka_stat?
дополните тестовыми значениями на несколько строк и что должно происходить при обновлении

Для примера взял базу статей.
Присвоим каждой статье несколько меток (тегов)
Access - клиент.
Служит для заполнения таблиц.

Сделал в следующем виде.
- Таблица "sprch_metki" -  справочник меток;
- Таблица "stat" -  таблица Статей (статьям будут присваиваться метки(теги));
- Таблица "grnl_metki" - журнал меток для статей. В таблице связывается статья с несколькими метками; "stat" 1:М "grnl_metki".
  `id_stat` - id статьи;
  `name_stat` - наименование статьи;
  `content_stat`- контент статьи;
  `metka_stat` - метка статьи;
К выпадающему списку в Access подключён "sprch_metki".
В Access из выпадающего списка выбираем метку и она попадает в MySql в таблицу "stat" в поле `metka_stat`.
В результате срабатывает триггер и заносит данные в таблицу "grnl_metki"
- Триггер  stat_before_update - триггер обновления(при обновлении метки в таблице "stat" в журнал заносится id статьи и метка.)

Понимаю, что "нагородил"...
Но на сколько хватает опыта..

Если мне не удалось сформулировать, то сообщите, я попробую сделать пример с файлами.

Вопрос.
1. Правильным ли будет реализованное мной решение.
2. Как сделать, чтобы триггер осуществлял проверку метки на уникальность?
Т.е. если в журнале для статьи метка уже есть, то она не заносится в журнал... Или просто появляется сообщение об ошибке.

КОД

-- --------------------------------------------------------
-- Хост:                         127.0.0.1
-- Версия сервера:               5.7.16 - MySQL Community Server (GPL)
-- Операционная система:         Win64
-- HeidiSQL Версия:              9.4.0.5125
-- --------------------------------------------------------

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET NAMES utf8 */;
/*!50503 SET NAMES utf8mb4 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;

-- Дамп структуры для таблица 02tst.sprch_metki
CREATE TABLE IF NOT EXISTS `sprch_metki` (
  `metki_stat` char(50) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- Дамп данных таблицы 02tst.sprch_metki: ~6 rows (приблизительно)
/*!40000 ALTER TABLE `sprch_metki` DISABLE KEYS */;
INSERT INTO `sprch_metki` (`metki_stat`) VALUES
    ('metka 1'),
    ('metka 2'),
    ('metka 3'),
    ('metka 4'),
    ('metka 5'),
    ('metka 6');
/*!40000 ALTER TABLE `sprch_metki` ENABLE KEYS */;

-- Дамп структуры для таблица 02tst.stat
CREATE TABLE IF NOT EXISTS `stat` (
  `id_stat` int(11) NOT NULL AUTO_INCREMENT,
  `name_stat` char(50) DEFAULT NULL,
  `content_stat` char(50) DEFAULT NULL,
  `metka_stat` char(50) DEFAULT NULL,
  PRIMARY KEY (`id_stat`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

-- Дамп данных таблицы 02tst.stat: ~0 rows (приблизительно)
/*!40000 ALTER TABLE `stat` DISABLE KEYS */;
INSERT INTO `stat` (`id_stat`, `name_stat`, `content_stat`, `metka_stat`) VALUES
    (1, 'Статья 1', 'Статья 1 контент 1', 'Метка 2'),
    (2, 'Сатья 2', 'Статья 2 контент 1', 'Метка 2'),
    (3, 'Сатья 3', 'Статья 3 контент 1', NULL);
/*!40000 ALTER TABLE `stat` ENABLE KEYS */;

-- Дамп структуры для таблица 02tst.grnl_metki
CREATE TABLE IF NOT EXISTS `grnl_metki` (
  `id_metka` int(11) NOT NULL AUTO_INCREMENT,
  `id_stat` int(11) DEFAULT NULL,
  `metka_stat` char(50) DEFAULT NULL,
  PRIMARY KEY (`id_metka`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COMMENT='Таблица - журнал  меток';

-- Дамп данных таблицы 02tst.grnl_metki: ~0 rows (приблизительно)
/*!40000 ALTER TABLE `grnl_metki` DISABLE KEYS */;
INSERT INTO `grnl_metki` (`id_metka`, `id_stat`, `metka_stat`) VALUES
    (1, 1, 'Метка 1'),
    (2, 1, 'Метка 2'),
    (3, 2, 'Метка 1'),
    (4, 2, 'Метка 2');
/*!40000 ALTER TABLE `grnl_metki` ENABLE KEYS */;

-- Дамп структуры для триггер 02tst.stat_before_update
SET @OLDTMP_SQL_MODE=@@SQL_MODE, SQL_MODE='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
DELIMITER //
CREATE TRIGGER `stat_before_update` BEFORE UPDATE ON `stat` FOR EACH ROW BEGIN
    /*metka_stat*/
  IF (NOT OLD.metka_stat <=> NEW.metka_stat)
    THEN  
    INSERT INTO grnl_metki    
     (id_stat,
      metka_stat)
     
    VALUES(    
     OLD.id_stat,    
    NEW.metka_stat);    
  END IF;
END//
DELIMITER ;
SET SQL_MODE=@OLDTMP_SQL_MODE;

/*!40101 SET SQL_MODE=IFNULL(@OLD_SQL_MODE, '') */;
/*!40014 SET FOREIGN_KEY_CHECKS=IF(@OLD_FOREIGN_KEY_CHECKS IS NULL, 1, @OLD_FOREIGN_KEY_CHECKS) */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
 


Прикрепленные файлы:
Attachment Icon 03.jpg, Размер: 76,012 байт, Скачано: 12

Неактивен

 

#15 02.04.2017 19:29:46

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5156

Re: Как сделать на форме список с свойством поля "Разрешить несколько значений"?

т.е. в таблице статей хранится последнее значение метки для этой статьи, а зачем?
добавляйте данные сразу в таблицу grnl_metki
сделайте в ней уникальный ключ (`id_metka`, `id_stat`) и дубликаты не будут добавлятся

Активен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson