Проблема при обновлении поля в ds_Account
Добрый день!
Нужно обновить значение Ответственного OwnerID, если отмечен чекбокс edtVacantClient.
if ( edtVacantClient.DataField.Value == 1 ) {
Dataset2.Open();
Dataset2.DisableEvents();
Dataset2.Edit();
Dataset2.Values('OwnerID') = '{...}';
Dataset2.Post();
Dataset2.EnableEvents();
Dataset2.Close();
}
TSObjectLibrary.StringDataField: Источник данных'Accounts\General\Main Grid\ds_Account' не открыт
Помогите, пожалуйста.
Нравится
Не совсем понятно, зачем вы получаете новый датасет, если вы работаете в скрипте карточки.
Для вашего случая измените строку var Dataset2 = Services.GetNewItemByUSI('ds_Account');
Так же необходимо сделать цикл (хочу отметить, чтобы не использовать оператор условия if можно отфильтровать записи при помощи фун-ции ApplyDatasetFilter(Dataset, FilterName, FilterValue, true)):
while(!Dataset2.IsEOF){
if (Dataset2('FieldName')) {
Dataset2.Open();
Dataset2.Edit();
Dataset2.Values('OwnerID') = '{...}';
Dataset2.Post();
Dataset2.Close();
}
Dataset2.GoToNext();
}
Возможно, я не совсем правильно понял, что именно требуется сделать...
Если вам необходимо поменять ответственного у текущей записи, то:
var Dataset = dlData.Dataset;
if (Dataset('FieldName')){
Dataset('OwnerID') = '{...}';
}
Это, к сожалению, не работает со сменой ответственного.
С другими полями ds_Account - да, значения сохраняются. Из-за чего это может быть?
Опишу подробнее то, что необходимо сделать.
В wnd_AccountEdit есть edtVacantClient (BoolDataControl от поля VacantClient) - признак свободного клиента.
Если признак установлен в 1, то поменять ответственного за контрагента на SYSDBA.
Уточните, пожалуйста, на каком событии карточки вы пишете данный скрипт?
"Москаленко Евгения Аркадьевна" написал:btnOKOnClick()
теперь понятно, почему у Вас писало:
"Москаленко Евгения Аркадьевна" написал:TSObjectLibrary.StringDataField: Источник данных'Accounts\General\Main Grid\ds_Account' не открыт
при нажатии на Ок карточки датасет сохраняется и закрывается.
Вы либо пропишите изменение ответственного ДО базового кода scr_BaseDBEdit.btnOnClick(), где-нибудь выше, либо напишите на событии OnDatasetDataChange(), код примерно такой, как написал Павел (второй вариант), т.е. при нажатии на галочку -- менять ответственного.
Ольга, спасибо, перенесла в OnDatasetDataChange().
Сейчас при смене недостаточно памяти для завершения операции.
function dlDataOnDatasetDataChange(DataField) { //смена ответственного var Dataset = dlData.Dataset; if ( edtVacantClient.DataField.Value == 1 ){ Dataset('OwnerID') = '{EAB3D8EC-5400-4A26-8634-ACA9203EEB8E}'; } }
Что можно сделать?
Циклится процесс. Выглядеть должно примерно так:
switch(FieldName){
case 'Здесь название вашего буллевского поля, что-то вроде 'VacantClient'':
if (Dataset('VacantClient')){
Dataset('OwnerID') = '{EAB3D8EC-5400-4A26-8634-ACA9203EEB8E}';
}
break;
}
Это работает так: "В момент изменения поля "VacantClient" и если поле == true, тогда меняется ответственный". Но я не рекомендовал бы это делать на DataChange, хотя будет работать и так.
Ошибка источник данных ds_Account не открыт.
Привожу всё содержимое функции
function dlDataOnDatasetDataChange(DataField) { var Dataset = dlData.Dataset; Dataset.DisableEvents(); switch(edtVacantClient.DataField.Value){ case edtVacantClient.DataField.Value : if (edtVacantClient.DataField.Value==1){ Dataset.Open(); Dataset.Edit(); Dataset('OwnerID') = '{EAB3D8EC-5400-4A26-8634-ACA9203EEB8E}'; Dataset.Post(); Dataset.Close(); } break; } Dataset.EnableEvents(); }
Почему, подскажите, пожалуйста.
function dlDataOnDatasetDataChange(DataField) { var Dataset = dlData.Dataset; var DataFieldName = DataField.Name switch (DataFieldName){ case ('VacantClient'): if (edtVacantClient.DataField.Value){ Dataset('OwnerID') = '{EAB3D8EC-5400-4A26-8634-ACA9203EEB8E}'; } break; } }
dlDataOnDatasetDataChange работает только при изменении данных. Если "галочка" у вас не сохраняется в БД, то работать не будет.
Для информации конструкция switch: http://javascript.ru/switch