Добрый день.
Когда закрывается задача, открывается окно инцидента.
Необходимо сделать так, чтобы если результат задачи "Исполнена", статус инцидента становился "Завершен".
Добавил проверку в обработчик события SelfOnDatasetAfterPost:
{
var DatasetIncident = Services.GetSingleItemByUSI('ds_Incident');
DatasetIncident.Open();
DatasetIncident.Edit();
DatasetIncident.Values('StatusID')='{83DFF6F7-10CE-41B4-B390-40D532751E13}';
}
Я как понимаю необходимо наложить еще фильтр. Помогите пожалуйста
Нравится
Олег, сделайте так:
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
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(); }
И так тоже
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}'; }
Конечный вариант, работает отлично