Добрый день,
Есть новая детать Функции, где есть колонка Актуальность (перечисление), нужно прописать кнопку, которая б меняла значение выделенной функции на "Усталело".
Не могу никак заставить кнопку менять запись именно в выделенной функции
Нравится
Елена, здравствуйте!
скажите, а что именно не работает? Возможно, нужно обновить реестр детали после нажатия кнопки?
код примерно следующий:
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();
вопрос на засыпку -- грид у Вас точно называется 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 у Вас не меняется? насколько понимаю, эта переменная -- элемент "соответствия" с основным реестром, то есть в Воркспейсе при обновлении этой детали у Вас идет по ней фильтрация. так?
и еще -- поместите ИД в одинарные кавычки... может, дело вовсе не в них, но так правильней.