Привязка к выделенной записи в детали

Добрый день,

Есть новая детать Функции, где есть колонка Актуальность (перечисление), нужно прописать кнопку, которая б меняла значение выделенной функции на "Усталело".
Не могу никак заставить кнопку менять запись именно в выделенной функции

Нравится

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

Елена, здравствуйте!
скажите, а что именно не работает? Возможно, нужно обновить реестр детали после нажатия кнопки?
код примерно следующий:

var SelectedIDs = grdData.SelectedIDs;
var SelectedIDsCount = SelectedIDs.Count;
if (!SelectedIDsCount) {
  return;
}
var Dataset = GetOpenedDatasetByUSIWithFilter('ds_functions','ID',SelectedIDs([0]));
Dataset.DisableEvents()
Dataset.Edit();
Dataset('DataFieldName') = DataFieldValue;
Dataset.Post();
Dataset.Close();
Dataset.EnableEvents();

где:
ds_functions -- датасет нужной детали
DataFieldName -- поле, которое Вы хотите изменить
DataFieldValue -- значение, которое Вы хотите присвоить этому полю. если это перечисление, то возможны 2 варианта -- либо Вы указываете ИД значения перечисления, либо само название элемента (но тогда нужно подключить сервис перечисления к Вашему скрипту, где Вы пишете этот код)

Постоянно выдает ошибку:

Cannot insert the value NULL into column 'ProceduresID', table 'xrm.dbo.tbl_Functions'; column does not allow nulls. INSERT fails

код кнопки:

function ButtonOnClick(Control) {
    var SelectedIDs = grdData.SelectedIDs;
var SelectedIDsCount = SelectedIDs.Count;
if (!SelectedIDsCount) {
  return;
}
var Dataset = GetOpenedDatasetByUSIWithFilter('ds_Functions','ID',SelectedIDs[0]);
Dataset.DisableEvents()
Dataset.Edit();
Dataset('ActiveID')={C18D6552-C6EF-45BB-BBDA-BAD002359227};
Dataset.Post();
Dataset.Close();
Dataset.EnableEvents();
 
 
}

"Перепечай Лена" написал:Dataset('ActiveID')={C18D6552-C6EF-45BB-BBDA-BAD002359227};

а на эту строчку оно не ругается? просто значение, по идее, должно быть в кавычках...

"Перепечай Лена" написал:Cannot insert the value NULL into column 'ProceduresID', table 'xrm.dbo.tbl_Functions'; column does not allow nulls. INSERT fails

еще вопрос -- кнопка у Вас на детали или в основном реестре? и поле ProceduresID -- случайно не основное отображаемое в датасете детали?
такая ошибка говорит о том, что Вы хотите записать пустое значение в поле, где не может быть нулей. поскольку мы редактируем запись, то это поле должно быть заполнено. если только такая запись есть (то есть строчка var Dataset = GetOpenedDatasetByUSIWithFilter('ds_Functions','ID',SelectedIDs[0]); вернула непустой датасет). попробуйте поставить отладчик и посмотреть, есть ли записи в датасете (значение Dataset.RecordsCount)
если Вы в основном реестре делаете кнопку, то код будет немного другой (потому что нам нужно "достучаться" до записи на детали, тогда как мы в основном реестре и переменная SelectedIDs -- выделенные записи в этом реестре, а не на детали)

Кнопка на детали, ProceduresID - привязка к основному отображению (Раздел Процедуры, основное отображение ds_Procedures). Там записано ID процедуры к коротой подвязана деталь

В базе видно, что при нажатие этой кнопки создается новая запись с полем
ActiveID={C18D6552-C6EF-45BB-BBDA-BAD002359227}, а остальными null.
Мне же нужно редактировать уже существующую запись

странно...
попробуйте немного иначе:

var SelectedIDs = grdData.SelectedIDs;
var SelectedIDsCount = SelectedIDs.Count;
if (!SelectedIDsCount) {
  return;
}
var Dataset = grdData.DatasetLink.Dataset;
Dataset.DisableEvents();
if (Dataset.Locate('ID',SelectedIDs[0])) {
  Dataset.Edit();
  Dataset('DataFieldName') = DataFieldValue;
  Dataset.Post();
}
Dataset.EnableEvents();

Ничего не происходит, возможно if =false

var SelectedIDs = grdData.SelectedIDs;
var SelectedIDsCount = SelectedIDs.Count;
if (!SelectedIDsCount) {
  return;
}
var Dataset = grdData.DatasetLink.Dataset;
Dataset.DisableEvents();
if (Dataset.Locate('ID',SelectedIDs[0])) {
  Dataset.Edit();
  Dataset('ActiveID') = "{C18D6552-C6EF-45BB-BBDA-BAD002359227}";
  Dataset.Post();
}
Dataset.EnableEvents();

посмотрите в отладчике, чему равно значение SelectedIDs[0] -- это должно быть ИД выделенной записи.

SelectedIDs[0]= null, поэтому ничего не происходит

вопрос на засыпку -- грид у Вас точно называется grdData? если нет, то вместо этого напишите название Вашего грида.
Проследите ход скрипта от начала -- может, ошибка какая-то мелкая, в названии или свойстве... Хотя все должно работать.
Еще можете проверить вариант без Locate (закомментируйте его), напишите просто:

var SelectedIDs = grdData.SelectedIDs;
var SelectedIDsCount = SelectedIDs.Count;
if (!SelectedIDsCount) {
  return;
}
var Dataset = grdData.DatasetLink.Dataset;
Dataset.DisableEvents();
//if (Dataset.Locate('ID',SelectedIDs[0])) {
  Dataset.Edit();
  Dataset('ActiveID') = "{C18D6552-C6EF-45BB-BBDA-BAD002359227}";
  Dataset.Post();
//}
Dataset.EnableEvents();

закомментировала Locate, кнопка начала работать!!! Но вот что происходит:

В детали есть запись, ActiveID = Активно, нажимаю кнопку, меняю значение ActiveID, перезапускаю террасофт - запись пропадает.

Проверила базу - запись в таблице детали есть и поле ProceduresID заполнено правильно,

код:

var SelectedIDs = grdData.SelectedIDs;
debugger;
var SelectedIDsCount = SelectedIDs.Count;
if (!SelectedIDsCount) {
  return;
}
var Dataset = grdData.DatasetLink.Dataset;
Dataset.DisableEvents();
 
  Dataset.Edit();
  Dataset('ActiveID') = "{C18D6552-C6EF-45BB-BBDA-BAD002359227}";
  Dataset('DueDate')=GetLocalDateTime()
  Dataset.Post();
 
Dataset.EnableEvents();

Если дописать после Post() строку Dataset.Close(); - изменная запись исчезает сразу

"Перепечай Лена" написал:Если дописать после Post() строку Dataset.Close(); - изменная запись исчезает сразу

тут понятно -- Вы ведь закрыли датасет, вот запись и "пропала".

А вот почему при перезапуске ТС у Вас не отображается эта запись... Вот это уже вопрос. Или какие-то лишние фильтры включаются, или, наоборот, не включаются... Вы говорите, что ProceduresID у Вас не меняется? насколько понимаю, эта переменная -- элемент "соответствия" с основным реестром, то есть в Воркспейсе при обновлении этой детали у Вас идет по ней фильтрация. так?
и еще -- поместите ИД в одинарные кавычки... может, дело вовсе не в них, но так правильней.

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