Страница 1 из 2

Уникальные поля

Добавлено: 15 апр 2016, 18:04
nikorn
Для некоторых полей требуется обеспечить уникальность значения (например, артикул товара, номер договора).

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

Re: Уникальные поля

Добавлено: 15 апр 2016, 18:51
support
Да, уже было предложение по этому поводу, по этому добавил в план, но это уже для 1.8
Если руками в базе сделать поле уникальным, будет работать?
Нет, будет просто ошибка при добавлении...

Нужно перед добавление посылать дополнительный запрос на проверку...

Re: Уникальные поля

Добавлено: 15 апр 2016, 18:54
nikorn
Ошибка будет только в случае совпадающих значений? Или всегда?

Если только в случае совпадения, то пускай. Напишем в инструкции, что эта ошибка возникает при неуникальности значений

Re: Уникальные поля

Добавлено: 15 апр 2016, 18:57
support
Ошибка будет только в случае совпадающих значений? Или всегда?
только в случае совпадающих значений

Re: Уникальные поля

Добавлено: 16 апр 2016, 10:51
nikorn
Увы, просто сделать не получается. Все пользовательские поля имеют текстовый тип, а текстовые поля в InnoDB нельзя сделать уникальными. :(

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

Re: Уникальные поля

Добавлено: 19 май 2016, 09:06
support
По версии 1.7 уже почти все готово, осталось несколько мелочей, по этому планирую включить данную функцию в 1.7.

Но мне нужен совет в данном вопросе.

Изначально я подумал сделать отдельное поле для уникального значения, но потом подумал что уникальным может быть и дата и текст и число или другие типы полей, по этому может стоит добавить отдельную настройку "Уникальное поле" для определенных типов полей, но тогда каких?

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

Re: Уникальные поля

Добавлено: 19 май 2016, 09:30
nikorn
К сожалению, уникальным действительно может быть любое поле в зависимости от требования информационной системы (кроме текстового поля типа "Примечания").

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

*) В базе данных есть уникальный идентификатор - поле ID, но оно не доступно пользователю и неудобно для использования.

Re: Уникальные поля

Добавлено: 19 май 2016, 13:09
alcompstudio
Добрый день!

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

В моей практике уникальное поле встречалось только в виде артикулов (идентификаторов) для товаров, которые заполнялись во многих случаях вручную (если база данных автоматически не формировала уникальный ID). При этом сам артикул может состоять либо из только числовых значений, либо "буквенных" или тех и иных. Т.е. по сути уникальным логично делать только короткие текстовые поля (поле ввода в нашем случае) и числовое поле. Для всех остальных типов я пока не вижу смысла добавлять уникальность, потому как они в той или иной степени могут иметь предустановленные значения, которые по своей сути уже должны повторяться в записях или просто для них нецелесообразно делать уникальность.
В предыдущем посте ув. nikorn в принципе так и отметил - уникальность сделать для "поля ввода" (и возможно числового), этого думаю достаточно на первом этапе для уникализации записей и исключения дублирования.

НО, например, у меня специфика работы такова, что и эти уникальные поля могут "дублироваться" - в моих сущностях, например, уникальный артикул может проходить по нескольким Проектам (по специфике работы не может быть просто "привязан" ко множеству проектов). Поэтому можно ли сделать как бы предупреждение совпадения значения поля (для которого создана функция уникализации), когда пользователь будет добавлять новую запись ? Я не знаю как это повлияет на обработку в базе, но было бы неплохо если бы предупреждение выводилось сразу после ввода значения в данное поле, а не после нажатия кнопки "Сохранить". Вот, а далее пользователь может выбрать - добавить новую запись и проигнорировать дублирование или ввести другое значение (и еще тут момент может быть - заменить существующую в базе запись с таким же уникальным полем). Но это если работать с единичной записью.

Тут возникает еще момент с импортом записей. Тогда тут можно сделать настройку для импорта по указанному выше принципу (1- проигнорировать и добавить, 2- не добавлять, 3 - заменить - как бы обновить значения).

Если что-то не по теме написал или неясно выразил мысль - прошу прощения :) .

Re: Уникальные поля

Добавлено: 19 май 2016, 13:22
nikorn
alcompstudio, Вы все правильно описали.

1) Обычно требуется обеспечить уникальность значений полей в пределах одной таблицы. Это то, о чем мы вели речь выше. Как правило, уникальность в пределах таблицы проверяется на уровне СУБД, но особенность системы "Руководитель" такова, что все поля по умолчанию являются многострочными текстовыми полями, для которых задать уникальность на уровне БД не возможно. Тем не менее, разработчик, видимо, нашел какое-то решение.

2) Если требуется обеспечить уникальность в пределах всей системы, а не только одной таблицы, то лучше всего использовать глобальные списки, в которых будет обеспечена требуемая уникальность значений (например, глобальный список товаров/артикулов). Глобальные списки в системе "Руководитель" появятся с версии 1.7

Re: Уникальные поля

Добавлено: 20 май 2016, 22:06
support
Готово.

В 1.7 опция "Уникальное поле" добавлена для типов поле "Поле ввода" и "Числовое поле"

Если данная опция установлена, то после ввода значения в поле, выполняется проверка на уникальность (событие focusout)

Если введенное значение не уникально то появляется ошибка "Значение поля должно быть уникально"