Добрый день. Помогите пожалуйста с таким вопросом - я добавил в карточку редактирования, рядом с полем ввода, кнопку. Нужно, чтобы по нажатии этой кнопки скрипт проверял, не совпадает ли текст, введённый пользователем в поле с какой-либо записью в одной из колонок БД. Не могли бы оптыные разработчики указать на пример такой реализации или по шагам объяснить как это сделать?
Заранее спасибо.
Нравится
1) уточните пожалуйста, правильно ли я понимаю, что мы говорим о пользовательском поле типа "справочник" , если же это текстовое поле, то пользователь имеет свойство ошибаться и написать одно и тоже слово можно по разному.
2) так же, укажите СУБД, версию Terrasoft.
"Sergey Karpenko" написал:1) уточните пожалуйста, правильно ли я понимаю, что мы говорим о пользовательском поле типа "справочник" , если же это текстовое поле, то пользователь имеет свойство ошибаться и написать одно и тоже слово можно по разному.
2) так же, укажите СУБД, версию Terrasoft.
Нет, поле текстовое. На данном этапе мне интересен сам механизм создания подобного функционала. Буду очень признателен за помощь!
MSSQl, версия BPM 5.3.0.332
Добрый день!
Получить значение, введенное в определенное поле карточки, Вы можете через свойство Page:
string Address = Page.AddressEdit.Value.ToString();
Проверку, совпадает ли введенное пользователем значение с какой-либо записью БД можно выполнить через EntitySchemaQuery (EntitySchemaQuery – класс, с помощью которого осуществляется создание запросов в базу данных).
Подробное описание работы с данным классом Вы можете посмотреть в темах http://www.community.terrasoft.ru/blogs/8977
http://www.community.terrasoft.ru/blogs/8557
Столкнулся с проблемой. Не работает сценарий.
1. Расположил на странице кнопку.
2. Перешел на событие (CheckButtonClick)
3. Создал в процессе начальное событие (сообщение) и задание-сценарий
4. Код сценария:
string name = "111"; Page.BaseMessagePanel.Clear(); Page.BaseMessagePanel.AddMessage(Warning, name.ToString(), MessageType.Warning); return true;
В чем может быть ошибка?
Добавил такую же кнопку в стандартную карточку добавления лида - и всё заработало. С чем это связано?
Единственная видимая причина - при нажатии за знак молнии возле свойства "нажата" в процессе лида новая дорожка, сообщение и пустой сценарий появились автоматически, тогда как в описанном мною примере выше я всё создавал вручную...
Вот что получилось в итоге:
string name1 = Page.NameEdit.Value.ToString(); string text = "Книга с таким названием уже существует"; var manager = Page.Schema.SchemaManagerProvider.GetManager("EntitySchemaManager") as EntitySchemaManager; var esq = new EntitySchemaQuery(manager, "Book"); esq.AddColumn("Name"); var filter = esq.CreateFilterWithParameters(FilterComparisonType.Equal, "Name", name1); esq.Filters.Add(filter); var q = esq.GetEntityCollection(UserConnection); if(q.Count > 0){ Page.BaseMessagePanel.Clear(); Page.BaseMessagePanel.AddMessage(Warning, text.ToString(), MessageType.Warning);} return true;
EntitySchemaManager. Я так понял, это какая-то промежуточная таблица, создаваемая на лету?
Буда рад замечаниям по улучшению кода.
EntitySchemaManager - это менеджер для работы со схемами БД (образно говоря набор функций и библиотек, которые позволяют управлять схемами).
"Бондарь Наталия" написал:EntitySchemaManager - это менеджер для работы со схемами БД (образно говоря набор функций и библиотек, которые позволяют управлять схемами).
Понятно, спасибо!
А как получить список значений (полученных совпадений), которые, как я понимаю, должны содержаться в переменной q?
Я бы заменила
var manager = Page.Schema.SchemaManagerProvider.GetManager("EntitySchemaManager") as EntitySchemaManager;
на
var manager = UserConnection.EntitySchemaManager;
"Салихов А" написал:А как получить список значений (полученных совпадений), которые, как я понимаю, должны содержаться в переменной q?
q это коллекция Entity. Вы можете пробегаться по ней с помощью foreach и с каждой книгой что-то делать.
"Раловец Ольга" написал:q это коллекция Entity. Вы можете пробегаться по ней с помощью foreach и с каждой книгой что-то делать.
Однако на такой код
if(q.Count > 0){ string books; foreach(string book in q) { books = books + book; }
"Раловец Ольга" написал:Я бы заменила
var manager = Page.Schema.SchemaManagerProvider.GetManager("EntitySchemaManager") as EntitySchemaManager;на
var manager = UserConnection.EntitySchemaManager;
Спасибо. Я эту реализацию нашёл на странице исходного кода)
Ну конечно, Ваш book типа Entity, а не string. Если хотите название, то так:
if(q.Count > 0){ string books; foreach(Book book in q) { books = books + book.Name; }
string name1 = Page.NameEdit.Value.ToString(); string text = "Книги с таким названием уже существуют: "; var manager = UserConnection.EntitySchemaManager; var esq = new EntitySchemaQuery(manager, "Book"); esq.AddColumn("Name"); esq.AddColumn("Author"); var filter = esq.CreateFilterWithParameters(FilterComparisonType.Equal, "Name", name1); esq.Filters.Add(filter); var q = esq.GetEntityCollection(UserConnection); if(q.Count > 0){ var b = new System.Text.StringBuilder(); foreach(Terrasoft.Configuration.Book book in q) { b.Append(book.Name + " (" + book.Author + "); "); } string books = b.ToString(); Page.BaseMessagePanel.Clear(); Page.BaseMessagePanel.AddMessage(Warning, text+books, MessageType.Warning);} return true;
Всегда пожалуйста :)
По поводу того, что лучше использовать в Вашей ситуации строку или стрингбилдер
http://habrahabr.ru/post/166701/