Добрый день!
Нужно обновить значение Ответственного OwnerID, если отмечен чекбокс edtVacantClient.

 var Dataset2 = Services.GetItemByUSI('ds_Account');
  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' не открыт

Помогите, пожалуйста.

Нравится

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

Не совсем понятно, зачем вы получаете новый датасет, если вы работаете в скрипте карточки.
Для вашего случая измените строку 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()
А где следует?

"Москаленко Евгения Аркадьевна" написал: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, хотя будет работать и так.

еще можно отключать события:

Dataset.DisableEvents();
Dataset('OwnerID') = '{}';
Dataset.EnableEvents();

Ошибка источник данных 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

Спасибо за ответы, проблема решена.

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