Скрипты
Разработка

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

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

Добавил проверку в обработчик события 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 комментарий

Олег, сделайте так:
[javascript]
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();
}
[/javascript]
Функции ApplyDatasetIDFilter и RefreshDataset находятся в скрипте scr_DB

Ругается на IncidentID

[javascript]
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();
}
[/javascript]

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

[javascript]
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();
}
[/javascript]
И так тоже

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

[javascript]
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();
}

[/javascript]

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

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

[javascript]
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
}
[/javascript]

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

Попробуйте на событие SelfOnDatasetBeforePost вставить скрипт
[javascript]
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();
}
[/javascript]

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

[javascript]
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);
}
[/javascript]

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

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

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

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

StatusID поле из ds_Incident

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

В обработчик события SelfOnDatasetAfterPost:
[javascript]
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();
}
[/javascript]

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

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

[javascript]
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);
}
[/javascript]

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

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

Олег, проверьте выполняется ли условие
[javascript]
if ((Dataset('ResultID') == '{CD0955F7-D53A-4302-97DA-2BD0E53DFD13}') && (!IsEmptyGUID(Dataset('IncidentID'))))
[/javascript]

Условие работает.
Если вставить
[javascript]
{
ShowInformationDialog('Help');
}
[/javascript]
То сообщение выводит

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

[javascript]
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();
}
}
[/javascript]

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

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

Попробуйте, так:
[javascript]
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');
}
[/javascript]
Срабатывает ли у Вас debugger? проставляется ли необходимое значение статуса?

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

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

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

[javascript]
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);
}
[/javascript]

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

[javascript]
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}';
}
[/javascript]

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

[javascript]
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}';
}
[/javascript]

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

Попробуйте так:
[javascript]
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);
}
[/javascript]

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

[javascript]
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}');
[/javascript]
Либо такое что-то

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

[javascript]
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);
}
[/javascript]
На OnPrepare окна wnd_IncidentEdit добавить строки:
[javascript]
if (GetAttribute(Window, 'EditStatus')) {
dlData.Dataset('StatusID') = '{83DFF6F7-10CE-41B4-B390-40D532751E13}';
}
[/javascript]

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

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

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

[javascript]
dlData.Dataset.Open();
dlData.Dataset.Edit();
if (GetAttribute(Window, 'EditStatus')) {
dlData.Dataset.Values('StatusID') = '{83DFF6F7-10CE-41B4-B390-40D532751E13}';
}
[/javascript]
Но все равно не меняет

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

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

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

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

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

Покажите код

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

[javascript]
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}';
[/javascript]

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

[javascript]
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}';
}
[/javascript]
Конечный вариант, работает отлично

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