Здраствуйте. У меня такая задача. Реализовать проверку на повтор номеров для переключения. Я сделал вот так: Создал выборку где указал условие номер = параметру. Потом добавил скрипт вот:
function btnOKOnClick(Control, Dataset, edtNumber ) {
// TODO
var Dataset = Services.GetNewItemByUSI('ds_Povtor');
var Numbers = new String(edtPhoneNumbers.DataField.Value);
Dataset.Close();
ApplyDatasetFilter(Dataset,'PovtorPhone', Numbers , true);
Dataset.Open();

if (!IsDatasetEmpty(Dataset)) {
ShowInformationDialog('Данный номер уже существует');
}

}
Всё работает только есть две проблемы:
1 То что надо если такого номера нет то данные сохранялись
2 То что при редактировании и копировании этот скрипт не использовался

Нравится

30 комментариев

1. Для сохранения используйте, для необходимого Dataset-а, метод Post (Dataset.Post())
2. Что бы скрипт выполнялся только при добавлении записи вставте проверку на состояние Dataset-а:

If (Dataset.State == dstInsert) {
    скрипт
} else {
    return;
}

Вы наверника перенакрыли базовый функционал
если карточка создана на основе wnd_BaseDBEdit то необходимо ещё
scr_BaseDBEdit.btnOKOnClick(Control);
(без Post())

function btnOKOnClick(Control, Dataset, edtNumber ) {
  if (Dataset.State == dstInsert) {
      var Dataset = Services.GetNewItemByUSI('ds_Povtor');
      var Numbers = new String(edtPhoneNumbers.DataField.Value);
      Dataset.Close();
      ApplyDatasetFilter(Dataset,'PovtorPhone', Numbers, true); 
      Dataset.Open();
 
      if (!IsDatasetEmpty(Dataset)) { 
         ShowInformationDialog('Данный номер уже существует');
         return;
      }
  } 
  scr_BaseDBEdit.btnOKOnClick(Control);
}

Вместо Services.GetNewItemByUSI('ds_Povtor')
Можно воспользоваться GetSingleItemByCode('ds_Povtor'), только необходимо подключить скрипт scr_Utils

Спасибо всем всё работает. Вот только возник такой вопрос: А если при изменении в карточку внести номер который уже сушествует.Тогда как бы проверка тоже нужна. Но из этого вытекает такая проблема: Если ничего не менять или поменять какое либо поле кроме номера то система выдаст сообщение что такой номер уже существует? Подскажите как исправить?

Можно воспользоваться функцией:
GetFieldsValuesAreChanged(Dataset, Поле)
Проверяет, изменялось ли указанное поле (или набор полей). Точно работает на событие Dataset-а BeforePost, как поведет себя на текущее событие (btnOKOnClick) не проверял.

Олег а какой результат она возврашает

true либо false.
Скрипт функции Вы можете посмотреть в SDK.

Вот какая у меня мысль:
function btnOKOnClick(Control, Dataset, edtNumber ) {
// проверка на совпадение номеров телефонов
if (Dataset.State == dstInsert) {

var Dataset = Services.GetNewItemByUSI('ds_Povtor');
var Numbers = new String(edtPhoneNumbers.DataField.Value);

Dataset.Close();
ApplyDatasetFilter(Dataset,'PovtorPhone', Numbers, true);

Dataset.Open();
var Nasvan = new String(Dataset.DataFields('OfficialAccountName').value);
if (!IsDatasetEmpty(Dataset)) {
ShowInformationDialog('Данный номер уже существует у '+ ' ' + Nasvan);
return;
}

}

if (Dataset.State == dstEdit){
if (!GetFieldsValuesAreChanged(Dataset,PhoneNumber){
return;
}
// Вот суда что вставить???
}
А что вставить если поле изменилось пока не могу сообразить? И вообще так можно сделать или есть другой способ?

function btnOKOnClick(Control, Dataset, edtNumber ) {
// проверка на совпадение номеров телефонов
if ((Dataset.State == dstInsert) || ((Dataset.State == dstEdit) && (!GetFieldsValuesAreChanged(Dataset,PhoneNumber)))) {
 
  var Dataset = Services.GetNewItemByUSI('ds_Povtor');
  var Numbers = new String(edtPhoneNumbers.DataField.Value);
 
  Dataset.Close();
  ApplyDatasetFilter(Dataset,'PovtorPhone', Numbers, true); 
 
  Dataset.Open();
  var Nasvan = new String(Dataset.DataFields('OfficialAccountName').value);
  if (!IsDatasetEmpty(Dataset)) { 
    ShowInformationDialog('Данный номер уже существует у '+ ' ' + Nasvan);
    return;
  }
} 
}

Ну и не забыть про:

scr_BaseDBEdit.btnOKOnClick(Control);

У меня почему то неотрабатывает проверка на
if ((Dataset.State == dstInsert)

Для проверки можно разбить условие

if ((Dataset.State == dstInsert) || ((Dataset.State == dstEdit) && (!GetFieldsValuesAreChanged(Dataset,PhoneNumber))))

На два

if (Dataset.State == dstInsert)

и

if ((Dataset.State == dstEdit) && (!GetFieldsValuesAreChanged(Dataset,PhoneNumber)))

Вставив в каждое условие выполнение скрипта проверки дубликатов.

Это то понятно. Но он просто вообще не отрабатыват эти условия. Я для проверки пробовал выводить сообщение и ничего.

Возможно вы используете не тот Dataset. Вы передаете один как параметр, а второй создаете в скрипте, при этом оба имеют один идентификатор.

Спасибо я попробую!

если вначали пременить scr_BaseDBEdit.btnOKOnClick(Control);
то датасет поменяет свое состояние на - закрытый

Естественно. scr_BaseDBEdit.btnOKOnClick(Control) необходимо выполнять после скрипта проверки, это уже было описано выше(пример скрипта).

Вот исправленный скрипт с одной датасет всё равно не работает:

function btnOKOnClick(Control) {
// проверка на совпадение номеров телефонов
var Dataset = Services.GetNewItemByUSI('ds_SAPhoneNumbers');
//if ((Dataset.State == dstInsert) || ((Dataset.State == dstEdit) && (!GetFieldsValuesAreChanged(Dataset,PhoneNumber)))) {

var Numbers = new String(edtPhoneNumbers.DataField.Value);

Dataset.Close();
ApplyDatasetFilter(Dataset,'PovtorPhone', Numbers, true);

Dataset.Open();
var Nasvan = new String(Dataset.DataFields('OfficialAccountName').value);
if (!IsDatasetEmpty(Dataset)) {
ShowInformationDialog('Данный номер уже существует у '+ ' ' + Nasvan);
return;
//}
}

scr_BaseDBEdit.btnOKOnClick(Control);
}
[/javascript]

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

Если я правильно понимаю Вы хотите предотвратить дублирование телефонных номеров у контрагентов?
Тогда это выглядит так:

function btnOKOnClick(Control) {
var Dataset = dlAccounts.Dataset;
if ((Dataset.State == dstInsert) || ((Dataset.State == dstEdit) && (!GetFieldsValuesAreChanged(Dataset,PhoneNumber)))) {
   var Number = Dataset.VAlAsStr('PhoneNumber');
   var NumberID = GetDatasetIDByFieldValue('ds_AccountCommunication', 'Number', Number);
   if (!IsEmptyGUID(NumberID)) {
      ShowInformationDialog('Данное значение телефонного номера уже существует!');
      return;
   }
}
scr_BaseDBEdit.btnOKOnClick(Control);
}

Необходимо подключить scr_DB и проследить что бы в sq_AccountCommunication существовал фильтр сравнения Name.

Нет мне нужно не те номера которые в форме контрагента обозначены как средство связи а те номера которые в нижнем реестре обозначены как номера для переключения.

Замените, по аналогии, необходимые пораметры. Что-то вроде:

function btnOKOnClick(Control) {
var Dataset = dlData.Dataset;
if ((Dataset.State == dstInsert) || ((Dataset.State == dstEdit) && (!GetFieldsValuesAreChanged(Dataset,PhoneNumber)))) {
   var Number = Dataset.VAlAsStr('PhoneNumber');
   var NumberID = GetDatasetIDByFieldValue('имя Dataset-а реестра', 'имя фильтра в соответствующем sq', Number);
   if (!IsEmptyGUID(NumberID)) {
      ShowInformationDialog('Данное значение телефонного номера уже существует!');
      return;
   }
}
scr_BaseDBEdit.btnOKOnClick(Control);
}

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

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

Данная ошибка срабатывает на открытие карточки редактирования существующей записи реестра?
Есть подозрение, что Вы случайно не выключили какой-то фильтр в основном SelectQuery данного реестра.

Возможно у Вас постоянно включен фильтр использующийся в GetDatasetIDByFieldValue?

Большое спасибо всем! Всё заработало.

Вот ещё одна проблема возникла: При первом изменении функция отрабатывает. Но при первом совпадении номера при добавленнии или копировании изменение уже тоже не работает??

Приведите, пожалуйста, полный текст Вашей функции.

Если она наподобие того, что писал Олег, не могли бы Вы поставить точку останова в отладчике перед позицией:

var NumberID = GetDatasetIDByFieldValue('имя Dataset-а реестра', 'имя фильтра в соответствующем sq', Number);

Если переменная NumberID не принимает определенного значения, то значит данный номер уникальный.

Еще вариант, что не проходит какую-то из проверок:

if ((Dataset.State == dstInsert) || ((Dataset.State == dstEdit) && (!GetFieldsValuesAreChanged(Dataset,PhoneNumber)))) {

Если так, то тоже сообщите - будет проще локализовать ошибку.

Показать все комментарии