Добрый день! У меня следующая проблема. Мне нужно скриптом обновить поля "Вид деятельности" и "Отрасль" контрагента. Делаю Следуюшим образом:
var AccountDS = Services.GetNewItemByUSI('ds_Account');// или
//GetSingleItemByCode('ds_Account', 'ContactIntegration');
ApplyDatasetIDFilter(AccountDS, AccountID, true);
AccountDS.Open();
var NewActivityID = GetAccountActivityID(ActivityName);
var NewFieldID = GetAccountFieldID(FieldName);
AccountDS.Edit();
if (AccountDS('ActivityID') != NewActivityID) {
var Message = FormatStr(ConfirmActivityChangeMessage, AccountDS.ValAsStr('ActivityName'), ActivityName, AccountDS('Name'));
if (ShowConfirmationDialog(Message) == wmrYes) {
AccountDS('ActivityID') = NewActivityID;
}
}
if (AccountDS('FieldID') != NewFieldID) {
var Message = FormatStr(ConfirmFieldChangeMessage, AccountDS.ValAsStr('FieldName'), FieldName, AccountDS('Name'));
if (ShowConfirmationDialog(Message) == wmrYes) {
AccountDS('FieldID') = NewFieldID;
}
}
AccountDS.Post();
AccountDS.Close();
}
На строке
AccountDS.Post()
У меня следующая ошибка:Ошибка сохранения записи. Оригинальное сообщение об ошибке: The statement has been terminated.
Cannot insert the value NULL into column 'Name', table 'CRM.dbo.tbl_Account'; column does not allow nulls. UPDATE fails.
Посмотрел в профайлере, и, действительно, на сервер посылается запрос на обновление почему то всех полей таблици tbl_Account, а параметры заданы только двух полей, это FieldID и ActivityID.
В чем может быть проблема?
Нравится
Михаил, у Вас переменная AccountID содержит значение? После открытия датасет AccountDS содержит записи, или он пустой? Хорошо бы эти вещи проверять перед выполнением. Можете выложить тексты функций GetAccountActivityID и GetAccountFieldID?
Если AccountID пуст, то эта функция даже не выполняется (стоит проверка IsEmptyGUID(AccountID)). Датасет содержит одну запись, как и должно быть (проверял).
Вот тексты функций:
function GetAccountActivityID(ActivityName) { if (IsEmptyValue(ActivityName)) { return null; } var ActivityID = GetDatasetIDByFieldValue('ds_Activity', 'Name', ActivityName); if (IsEmptyGUID(ActivityID)) { var ActivityDS = GetSingleItemByCode('ds_Activity', 'ContactIntegration'); ActivityDS.Append(); ActivityID = Connector.GenGUID(); ActivityDS('ID') = ActivityID; ActivityDS('Name') = ActivityName; ActivityDS.Post(); } return ActivityID; }
function GetAccountFieldID(FieldName) { if (IsEmptyValue(FieldName)) { return null; } var FieldID = GetDatasetIDByFieldValue('ds_Field', 'Name', FieldName); if (IsEmptyGUID(FieldID)) { var FieldDS = GetSingleItemByCode('ds_Field', 'ContactIntegration'); FieldDS.Append(); FieldID = Connector.GenGUID(); FieldDS('ID') = FieldID; FieldDS('Name') = FieldName; FieldDS.Post(); } return ActivityID; }
Они выполняются нормально и возвращают значения.
Уточните, пожалуйста, версию конфигурации (с точностью до сборки).
P.S. Я так понимаю, в последней функции должно быть return FieldID?
Михаил, протестировал на Вашей версии. Видимо, Вы вызываете данную функцию в Terrasoft Administrator. Попробуйте выполнять её по какому-то действию из клиентского приложения, должно работать корректно. Данная проблема связана с тем, что во время сохранения сервис датасета находится в режиме редактирования, и в этом состоянии ведёт себя не так, как в рабочем режиме.
Если Вам необходимо обновлять записи именно через Terrasoft Administrator, используйте сервис UpdateQuery.
Да, именно так, я тестирую в Terrasoft Administrator. Спасибо за помощь. Сейчас попробую.
Вот такие неудобные вещи порой приводят в ступор. :confused: И думаешь, ты ли дурак или программа.
Бились два дня пока не нашли этот пост. :smile:
Спасибо участникам в этом посте. :wink: