Автоизменение состояния инцидента

Добрый день.
Когда закрывается задача, открывается окно инцидента.
Необходимо сделать так, чтобы если результат задачи "Исполнена", статус инцидента становился "Завершен".

Добавил проверку в обработчик события SelfOnDatasetAfterPost:

   if (Dataset.Values('ResultID')== '{CD0955F7-D53A-4302-97DA-2BD0E53DFD13}')
   {
         var DatasetIncident = Services.GetSingleItemByUSI('ds_Incident');
         DatasetIncident.Open();
         DatasetIncident.Edit();
         DatasetIncident.Values('StatusID')='{83DFF6F7-10CE-41B4-B390-40D532751E13}';
   }

Я как понимаю необходимо наложить еще фильтр. Помогите пожалуйста

Нравится

41 комментарий

Олег, сделайте так:

if (Dataset('ResultID')== '{CD0955F7-D53A-4302-97DA-2BD0E53DFD13}')
   {
         var DatasetIncident = GetSingleItemByCode('ds_Incident', 'UniqCode');
         ApplyDatasetIDFilter(DatasetIncident , IncidentID, true);
         RefreshDataset(DatasetIncident);
         DatasetIncident.Edit();
         DatasetIncident('StatusID')='{83DFF6F7-10CE-41B4-B390-40D532751E13}';
         DatasetIncident.Post();
   }

Функции ApplyDatasetIDFilter и RefreshDataset находятся в скрипте scr_DB

Ругается на IncidentID

   if (Dataset.Values('ResultID')== '{CD0955F7-D53A-4302-97DA-2BD0E53DFD13}')
   {
         var DatasetIncident = GetSingleItemByCode('ds_Incident', 'UniqCode');
         DatasetIncident.Open();
         var IncidentID = DatasetIncident.Values('ID');
         ApplyDatasetIDFilter(DatasetIncident , IncidentID, true);
         RefreshDataset(DatasetIncident);
         DatasetIncident.Edit();
         DatasetIncident('StatusID')='{83DFF6F7-10CE-41B4-B390-40D532751E13}';
         DatasetIncident.Post();
   }

так не работает

   if (Dataset.Values('ResultID')== '{CD0955F7-D53A-4302-97DA-2BD0E53DFD13}')
   {
         var DatasetIncident = GetSingleItemByCode('ds_Incident', 'UniqCode');
         var IncidentID = Dataset.Values('IncidentID');
         ApplyDatasetIDFilter(Dataset, IncidentID, true);
         RefreshDataset(Dataset);
         DatasetIncident.Edit();
         DatasetIncident('StatusID')='{83DFF6F7-10CE-41B4-B390-40D532751E13}';
         DatasetIncident.Post();
   }

И так тоже

Подключили скрипт sc_DB?

 if (Dataset('ResultID')== '{CD0955F7-D53A-4302-97DA-2BD0E53DFD13}')
   {
         var DatasetIncident = GetSingleItemByCode('ds_Incident', 'UniqCode');
         var IncidentID = Dataset('IncidentID');
         ApplyDatasetIDFilter(DatasetIncident , IncidentID, true);
         RefreshDataset(DatasetIncident);
         DatasetIncident.Edit();
         DatasetIncident('StatusID')='{83DFF6F7-10CE-41B4-B390-40D532751E13}';
         DatasetIncident.Post();
   }

Подключите скрипт scr_Utils

Подключен. Ошибок не возникает, но состояние не меняется.
Оно ругалось, что не найден IncidentID
Я его объявил. Может не то имелось ввиду?

 if((Dataset.Values('ResultID') == '{CD0955F7-D53A-4302-97DA-2BD0E53DFD13}')&&
        (Dataset.Values('TypeID') == '{7A9B16B3-216B-4125-BD0B-FF826B022841}')&&
              (!Dataset.ValIsNull('IncidentID'))
                                                                )
        {
                      var Attributes = GetNewDictionary();
                      Attributes('RecordID') = Dataset.Values('IncidentID') ;
                      ShowEditWindowEx('wnd_IncidentEdit', Attributes);
                      ..надо назначение статуса StatusID
        }

Есть еще такой вариант, открываем окно инцидента и меняем статус на нужный, но так тоже не получается.

Попробуйте на событие SelfOnDatasetBeforePost вставить скрипт

if (Dataset('ResultID')== '{CD0955F7-D53A-4302-97DA-2BD0E53DFD13}')
   {
         var IncidentID = Dataset('IncidentID');
         var DatasetIncident = GetSingleItemByCode('ds_Incident', 'UniqCode');
         ApplyDatasetIDFilter(DatasetIncident, IncidentID, true);
         RefreshDataset(DatasetIncident);
         DatasetIncident.Edit();
         DatasetIncident('StatusID') = '{83DFF6F7-10CE-41B4-B390-40D532751E13}';
         DatasetIncident.Post();
   }

"Зголич Олег Александрович" написал:Есть еще такой вариант, открываем окно инцидента и меняем статус на нужный, но так тоже не получается.

 if((Dataset('ResultID') == '{CD0955F7-D53A-4302-97DA-2BD0E53DFD13}') &&
        (Dataset('TypeID') == '{7A9B16B3-216B-4125-BD0B-FF826B022841}') &&
              (!Dataset.ValIsNull('IncidentID'))
                                                                )
        {
                      var Attributes = GetNewDictionary();
                      var DefaultValues = GetNewDictionary();
                      Attributes('RecordID') = Dataset.Values('IncidentID') ;
                      DefaultValues.Add('StatusID') = '{83DFF6F7-10CE-41B4-B390-40D532751E13}';
                      ShowEditWindowEx('wnd_IncidentEdit', Attributes, DefaultValues);
        }

Не меняет все равно

Объект не поддерживает это свойство или метод

DefaultValues.Add('StatusID') = '{83DFF6F7-10CE-41B4-B390-40D532751E13}';

вот что дебагеру не нравится

StatusID поле из ds_Incident

Олег, система выдает ошибку при этом коде:

В обработчик события SelfOnDatasetAfterPost:

if ((Dataset('ResultID') == '{CD0955F7-D53A-4302-97DA-2BD0E53DFD13}') && (!IsEmptyGUID(Dataset('IncidentID'))))
   {
         var DatasetIncident = GetSingleItemByCode('ds_Incident', 'UniqCode');
         ApplyDatasetIDFilter(DatasetIncident, Dataset('IncidentID'), true);
         RefreshDataset(DatasetIncident);
         DatasetIncident.DisableEvents();
         DatasetIncident.Edit();
         DatasetIncident('StatusID') = '{83DFF6F7-10CE-41B4-B390-40D532751E13}';
         DatasetIncident.Post();
         DatasetIncident.EnableEvents();
         DatasetIncident.Close();
   }

Что за ошибка? Проверьте debugger-ом где возникает проблема.

Ошибку не получаю, но состояние не меняется.

if((BaseDBEdit.Dataset.Values('ResultID') == '{CD0955F7-D53A-4302-97DA-2BD0E53DFD13}')&&
	           		 (BaseDBEdit.Dataset.Values('TypeID') == '{7A9B16B3-216B-4125-BD0B-FF826B022841}')&&
							(!BaseDBEdit.Dataset.ValIsNull('IncidentID')))
	{
                 var Attributes = GetNewDictionary();
                 var DefaultValues = GetNewDictionary();
                 Attributes('RecordID') = BaseDBEdit.Dataset.Values('IncidentID') ;
                 var DatasetIncident = Services.GetSingleItemByUSI('ds_Incident');
                 DatasetIncident.Open();
                 DatasetIncident.Edit();
                 DatasetIncident.Values('StatusID') = '{83DFF6F7-10CE-41B4-B390-40D532751E13}';
                 DefaultValues.Add('StatusID',DatasetIncident.Values('StatusID'));
                 ShowEditWindowEx('wnd_IncidentEdit', Attributes, DefaultValues);
	}

Думал так прокатит, все равно не меняет.

"Зголич Олег Александрович" написал:Ошибку не получаю, но состояние не меняется.

Олег, проверьте выполняется ли условие

if ((Dataset('ResultID') == '{CD0955F7-D53A-4302-97DA-2BD0E53DFD13}') && (!IsEmptyGUID(Dataset('IncidentID'))))

Условие работает.
Если вставить

	{
	     ShowInformationDialog('Help');
   	}

То сообщение выводит

Олег, сбросьте сервис, в котором происходит обработка SelfOnDatasetAfterPost

function SelfOnDatasetAfterPost(Dataset) {
	TaskDatasetAfterPost(Dataset);
	DeleteRemindingByTask(Dataset);
	LogVars(Dataset, 'ds_TaskLog', 'TaskLog'); 
 
 
if ((Dataset('ResultID') == '{CD0955F7-D53A-4302-97DA-2BD0E53DFD13}') && (!IsEmptyGUID(Dataset('IncidentID'))))
   {
         var DatasetIncident = GetSingleItemByCode('ds_Incident', 'UniqCode');
         ApplyDatasetIDFilter(DatasetIncident, Dataset('IncidentID'), true);
         RefreshDataset(DatasetIncident);
         DatasetIncident.DisableEvents();
         DatasetIncident.Edit();
         DatasetIncident('StatusID') = '{83DFF6F7-10CE-41B4-B390-40D532751E13}';
         DatasetIncident.Post();
         DatasetIncident.EnableEvents();
         DatasetIncident.Close();
   }
}

"Кулак Олег" написал:Олег, сбросьте сервис, в котором происходит обработка SelfOnDatasetAfterPost

Выгрузите сервис в xml

Попробуйте, так:

function SelfOnDatasetAfterPost(Dataset)  {
	debugger;
	if ((Dataset('ResultID') == '{CD0955F7-D53A-4302-97DA-2BD0E53DFD13}') &&
		(!IsEmptyGUID(Dataset('IncidentID')))) {
         var DatasetIncident = Services.GetNewItemByUSI('ds_Incident');
         ApplyDatasetIDFilter(DatasetIncident, Dataset('IncidentID'), true);
         RefreshDataset(DatasetIncident);
         DatasetIncident.DisableEvents();
         DatasetIncident.Edit();
         DatasetIncident('StatusID') = '{83DFF6F7-10CE-41B4-B390-40D532751E13}';
         DatasetIncident.Post();
         DatasetIncident.EnableEvents();
         DatasetIncident.Close();
   	}
 
	TaskDatasetAfterPost(Dataset);
	DeleteRemindingByTask(Dataset);
	LogVars(Dataset, 'ds_TaskLog', 'TaskLog');
}

Срабатывает ли у Вас debugger? проставляется ли необходимое значение статуса?

Ошибок нету, статус не меняется.

При debugger; дебагет срабатывает

Состояние меняется. В гриде в инцидентах все норм. Просто окно открывается быстрее чем меняется состояние. Может подскажете, как поменять значение непосредственно в открытом окне, а не в датасете?

if((BaseDBEdit.Dataset.Values('ResultID') == '{CD0955F7-D53A-4302-97DA-2BD0E53DFD13}')&&
	           		 (BaseDBEdit.Dataset.Values('TypeID') == '{7A9B16B3-216B-4125-BD0B-FF826B022841}')&&
							(!BaseDBEdit.Dataset.ValIsNull('IncidentID')))
	{
                var Attributes = GetNewDictionary();
                Attributes('RecordID') = BaseDBEdit.Dataset.Values('IncidentID') ;
                ShowEditWindowEx('wnd_IncidentEdit', Attributes);
	}

Вот я окно нужного инцидента открыл, а как мне определить параметр именно этого окна, а не какого другого?

if((BaseDBEdit.Dataset.Values('ResultID') == '{CB0F1B79-006C-43DB-91B7-5EE05A1ADB4D}')&&
	           		 (BaseDBEdit.Dataset.Values('TypeID') == '{7A9B16B3-216B-4125-BD0B-FF826B022841}')&&(!BaseDBEdit.Dataset.ValIsNull('IncidentID')))
	{
      		var Attributes = GetNewDictionary();
                Attributes('RecordID') = BaseDBEdit.Dataset.Values('IncidentID') ;
                var EditWindow = ShowEditWindowEx('wnd_IncidentEdit', Attributes);
                EditWindow.ComponentsByName('StatusID') = '{83DFF6F7-10CE-41B4-B390-40D532751E13}';
	}

Думал может так, но ошибки на EditWindow.ComponentsByName('StatusID') = '{83DFF6F7-10CE-41B4-B390-40D532751E13}'; кидает

 if((BaseDBEdit.Dataset.Values('ResultID') == '{CB0F1B79-006C-43DB-91B7-5EE05A1ADB4D}')&&
	           		 (BaseDBEdit.Dataset.Values('TypeID') == '{7A9B16B3-216B-4125-BD0B-FF826B022841}')&&
							(!BaseDBEdit.Dataset.ValIsNull('IncidentID')))
	{
      			var Attributes = GetNewDictionary();
                Attributes('RecordID') = BaseDBEdit.Dataset.Values('IncidentID') ;
                var Window = ShowEditWindowEx('wnd_IncidentEdit', Attributes);
                Window.ComponentsByName('edtStatus')='{83DFF6F7-10CE-41B4-B390-40D532751E13}';
	}

Остановился на таком, но ='{83DFF6F7-10CE-41B4-B390-40D532751E13}'; не прокатывает. Необходимо указывать значение, а не ID, но это справочник и мне нужно вариант по ID выбрать каким то образом

Попробуйте так:

 if((BaseDBEdit.Dataset.Values('ResultID') == '{CB0F1B79-006C-43DB-91B7-5EE05A1ADB4D}')&&
                                 (BaseDBEdit.Dataset.Values('TypeID') == '{7A9B16B3-216B-4125-BD0B-FF826B022841}')&&
                                                        (!BaseDBEdit.Dataset.ValIsNull('IncidentID')))
        {
                var Attributes = GetNewDictionary();
                var DefaultValues = GetNewDictionary();
                Attributes('RecordID') = BaseDBEdit.Dataset.Values('IncidentID') ;
                DefaultValues('StatusID') = '{83DFF6F7-10CE-41B4-B390-40D532751E13}';
                var Window = ShowEditWindowEx('wnd_IncidentEdit', Attributes, DefaultValues);
        }

Не меняет, дело в том, что надо менять значение непосредственно в открытом окошке.

                var Attributes = GetNewDictionary();
                Attributes('RecordID') = BaseDBEdit.Dataset.Values('IncidentID') ;
                var Window = ShowEditWindowEx('wnd_IncidentEdit', Attributes);
                edtStatus.Enum = CreateEnumByDictionaryUSI();
                edtStatus.Value = edtStatus.Enum.ItemsByCode('{83DFF6F7-10CE-41B4-B390-40D532751E13}');

Либо такое что-то

А в террасофт нет ничего похожего на Thread.Sleep() ?

if ((BaseDBEdit.Dataset.Values('ResultID') == '{CB0F1B79-006C-43DB-91B7-5EE05A1ADB4D}') &&
   (BaseDBEdit.Dataset.Values('TypeID') == '{7A9B16B3-216B-4125-BD0B-FF826B022841}') &&
   (!BaseDBEdit.Dataset.ValIsNull('IncidentID'))) {
                var Attributes = GetNewDictionary();
                Attributes('RecordID') = BaseDBEdit.Dataset.Values('IncidentID') ;
                Attributes('EditStatus') = true;
                var Window = ShowEditWindowEx('wnd_IncidentEdit', Attributes);
}

На OnPrepare окна wnd_IncidentEdit добавить строки:

if (GetAttribute(Window, 'EditStatus')) {
   dlData.Dataset('StatusID') = '{83DFF6F7-10CE-41B4-B390-40D532751E13}';
}

dlData.Dataset('StatusID') = '{83DFF6F7-10CE-41B4-B390-40D532751E13}';

не нравится эта строка

Наверн слова Values не хватает, ща проверю

dlData.Dataset.Open();
    dlData.Dataset.Edit();
	if (GetAttribute(Window, 'EditStatus')) {
   		dlData.Dataset.Values('StatusID') = '{83DFF6F7-10CE-41B4-B390-40D532751E13}';
	}

Но все равно не меняет

Да тут дело получается в том, что походу надо менять не StatusID, а непосредственно ComponentsByName('edtStatus')

Я отталкиваюсь от того, что вот я нашел окно var Window = ShowEditWindowEx('wnd_IncidentEdit', Attributes); и уже в нем меняю ComponentsByName('edtStatus') но как правильно сделать не знаю, пробовал разные вариации не получается

Олег, в какой момент вы открываете окно инцидента?

При нажатии на кнопку Ок

"Зголич Олег Александрович" написал:При нажатии на кнопку Ок

Покажите код

Прикрепляю сервис

var Attributes = GetNewDictionary();
var DefaultValues = GetNewDictionary();
Attributes('RecordID') = BaseDBEdit.Dataset.Values('IncidentID') ;
DefaultValues('StatusID') = '{83DFF6F7-10CE-41B4-B390-40D532751E13}';
var Window = ShowEditWindowEx('wnd_IncidentEdit', Attributes, DefaultValues);
var Dataset=Window.NonVisualComponents.ItemsByName('dlData').Dataset;
Dataset.Values('StatusID')= '{83DFF6F7-10CE-41B4-B390-40D532751E13}';

Решил так, щас только лишнее подчищу

if((BaseDBEdit.Dataset.Values('ResultID') == '{CD0955F7-D53A-4302-97DA-2BD0E53DFD13}')&&
	  (BaseDBEdit.Dataset.Values('TypeID') == '{7A9B16B3-216B-4125-BD0B-FF826B022841}')&&                                                             (!BaseDBEdit.Dataset.ValIsNull('IncidentID')))
	{
                var Attributes = GetNewDictionary();
                Attributes('RecordID') = BaseDBEdit.Dataset.Values('IncidentID') ;
                var Window = ShowEditWindowEx('wnd_IncidentEdit', Attributes);
                var Dataset=Window.NonVisualComponents.ItemsByName('dlData').Dataset;
		Dataset.Values('StatusID')= '{83DFF6F7-10CE-41B4-B390-40D532751E13}';
	}

Конечный вариант, работает отлично

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