Добрый день,
Стоит такая задача:
При создании и сохранении нового Договора появляется запрос "Вы желаете создать Проект по этому договору", при положительном ответе открывается карточка редактирования Проекта с перенесенными некоторыми данными (название договора, дата)
Возможно есть какие-то примеры подобных решений?
Нравится
Здравствуйте, Елена!
Решить Вашу задачу можно настроив простой бизнес-процесс следующего вида:
1) Открытие карточки редактирования договора;
2) Вопрос пользователю;
3) Открытие карточки редактирования проекта.
Подробно о создании БП можно прочитать в Руководстве администратора
(раздел "Автоматизация бизнес-процессов").
Возможно Вам так-же будет полезен видеоурок по созданию БП.
Касательно автоматического запуска БП по событию, то данная тема обсуждалась в следующих темах:
http://www.community.terrasoft.ru/forum/topic/2390
http://www.community.terrasoft.ru/forum/topic/7109
С уважением,
Шипко Илья
Специалист службы поддержки II линии
Группа компаний Terrasoft
Здравствуйте, Елена!
Рекомендуется передавать информацию в атрибуты открываемой карточки, если она Вами вызывается функцией ShowEditWindowEx.
Пример можно посмотреть в функции CreateContract() в скрипте wnd_OpportunitiesWorkspaceScript
Спасибо за помощь!
Создала бизнес процесс, но есть 2 вопроса:
1) Когда и куда прописывать код для переноса значений из одной карточки в другую?
2) После закрытия договора, поставила действие "вопрос пользователю", который адекватно работает только в таком виде
Можно ли убрать radiobox, оставить только вопрос и кнопки ОК, Отмена и, при этом, в бизнес процессе следующий шаг прописать только на результат ОК?
Здравствуйте, Елена!
1) Передача парматеров между элементами БП обсуждалась в следующих темах:
http://www.community.terrasoft.ru/blogs/7310
http://www.community.terrasoft.ru/forum/topic/8647
http://www.community.terrasoft.ru/forum/topic/8608
http://www.community.terrasoft.ru/forum/topic/8631
2) К сожалению в базовой конфигурации такой вид вопроса пользователю не реализован.
С уважением,
Шипко Илья
Специалист службы поддержки II линии
Группа компаний Terrasoft
Спасибо, Илья
Прочитала все темы по передачи параметров, но мне все равно не яснен механизм передачи значений от одного действия к другому. Например, как получить данные из поля Клиент в карточке договора и поместить ее в новую карточку проекта при открытии?
Так же сталкнулась с такой проблемой:
Вот часть моей диаграммы
В Атрибутах окна для договора (действие открытие нового договора) прописано пока 2 параметра, название договора и ответственный
Хочу в атрибутах окна для проекта (действие открытие нового проекта) прописать, что поле Ответственный равен параметру OwnerID, при нажатии на кнопку Добавить выдает ошибку
"Ошибка выполнения метода 'wnd_ShowCustomWindowFieldEditOnPrepare'. Дублируется значение свойства 'Caption'. Значение 'PercentIncome' уже существует"
Что я не так делаю?
Здравствуйте, Елена!
Передача параметров происходит следующим образом:
В первой карточке "Открытие окна" необходимо добавить параметр в раздел "Соответствие поля диаграммы полям данных окна" параметр "ContactID" и отметить пункт "Сохранить введённое значение после закрытия карточки"
Во втором "Открытии Окна" необходимо получить этот параметр из ранее сохраннёного значения.
Это должно решить обе Ваши проблемы.
С уважением,
Шипко Илья
Специалист службы поддержки II линии
Группа компаний Terrasoft
Илья,
возможно я что-то не так делаю, но у меня в принципе таких окон редактирования нет. При нажатии на действие Открытие окна появляется какая форма:
И если в первом открытие я могу ставить соответствия полей и атрибутов, то для окна проекты возникает ошибка (описано выше),
Так же вопрос, как в бизнес процессе указать шаг : перейти в раздел Проекты и активировать деталь Команда?
Как по мне, то создавать бизнес-процесс для двух-трех действий -- это не очень правильно. Возможно, я ошибаюсь -- но такую задачу я решила бы следующим образом.
Для примера рассмотрим процесс создания счета из меню действия--создать счет в разделе Продажи.
Сначала там вызывается функция CreateInvoice(), в которой через атрибуты и значения по умолчанию мы передаем необходимые величины (дату, клиента, продажу) в счет:
function CreateInvoice() { var EditWindowUSI = 'wnd_InvoiceEdit'; var Attributes = GetNewDictionary(); var OpportunityID = BaseWorkspace.GridDataset.Values('ID'); var CurrentDate = new Date(System.Now()); Attributes.Add('RecordID', GUID_NULL); Attributes.Add('NotifyObject', Self); var DefaultValues = GetNewDictionary(); DefaultValues.Add('OpportunityID', OpportunityID); var Dataset = BaseWorkspace.GridDataset; var CustomerID = GetFieldValueFromDisabledField(Dataset, 'CustomerID'); DefaultValues.Add('CustomerID', CustomerID); var ContactID = GetFieldValueFromDisabledField(Dataset, 'ContactID'); DefaultValues.Add('ContactID', ContactID); DefaultValues.Add('OwnerID', Connector.CurrentUser.ContactID); var CampaignID = GetFieldValueFromDisabledField(Dataset, 'CampaignID'); DefaultValues.Add('CampaignID', CampaignID); Attributes('IsCreatedByOpportunityID') = OpportunityID; var ProjectID = GetFieldValueFromDisabledField(Dataset, 'ProjectID'); DefaultValues.Add('ProjectID', ProjectID); ShowEditWindowEx(EditWindowUSI, Attributes, DefaultValues); }
Потом, при закрытии карточки счета, в функции btnOKOnClick(Control) идет проверка, не создан ли этот документ из Продаж (атрибут IsCreatedByOpportunityID) -- и если да, то предлагает перейти к созданному счету:
var IsCreatedByOpportunityID= Self.Attributes('IsCreatedByOpportunityID'); if (IsCreatedByOpportunityID) { if (ShowConfirmationDialog("Перейти к созданному счету?") == wmrYes) { GotoWorkspace('wnd_InvoicesWorkspace', BaseDBEdit.RecordID); } }
Если нужно открыть нужную деталь при этом, то следует добавить, после функции GotoWorkspace, следующие строчки:
var MainWindow = Connector.Attributes('MainWindow'); var WorkspaceWindow = MainWindow.ScriptControl.Run('GetWorkspaceByUSI', 'wnd_InvoicesWorkspace'); var pcDetails = WorkspaceWindow.ComponentsByName('pcDetails'); pcDetails.ActivePage = WorkspaceWindow.ComponentsByName('pgDetail'); //название нужной детали
К чему я веду. Все, что нужно для Вашей задачи -- это добавить вопрос "Создать проект по договору?" при закрытии карточки договора, т.е. в функцию btnOKOnClick Договора, причем сделать еще доп.проверку, чтобы запись была новая, например, так:
if (dlData.Dataset.State == dstInsert) { if (ShowConfirmationDialog("Создать проект по договору?") == wmrYes) { CreateProject(); } }
,
а дальше -- по аналогии, как я расписала создание счета: создать проект, передать туда нужные значения, а при его закрытии -- проверить, не создавался ли он из договора, и если да --то перейти в нужный раздел.
Желаю удачи!
С уважением, Ольга Прилипко
Спасибо, Ольга
прописала на функцию btnOKOnClick Договор скрипт, проверка if (dlData.Dataset.State == dstInsert) не работает в принципе
Создала функцию CreateProject() в скрипте wnd_ContractsWorkspaceScript (по аналогии), как его подвязать к скрипту btnOKOnClick договора? Так
if (ShowConfirmationDialog("Создать проект по договору?") == wmrYes) { CreateProject(); }
Выдает ошибку "Предполагается наличие объекта"
функцию CreateProject() нужно создать в этом же скрипте, т.е. в wnd_ContractEditScript.
проверка (dlData.Dataset.State == dstInsert) может не работать, если Вы написали код после базового scr_BaseDBEdit.btnOKOnClick(Control) -- потому что уже датасет сохранился и определить, в каком он был режиме (вставка или редактирование) уже нельзя.
Ну что-то у меня получилось=)
После создания нового договора, идет вопрос пользователю, после чего открывается проект с занесенными значениями из договора, но окно редактирования проекта не активировано, т.е. на первом плане общее окно Террасофта и приходится переключатся на карточку редактирования
1) Как сделать карточку проекта активной?
Далее в проекте. Значения с договора то оно перенесло, а вот значения полей, Состояние,Тип, которые должны браться из справочника, пустуют, хотя если создавать проект напрямую из раздела, там все подтягивается
2) как добавить значения из справочников назад к полям?
На btnOKOnClick проекта добавила код
... var IsCreatedByProjectID= Self.Attributes('IsCreatedByProjectID'); if (IsCreatedByProjectID) { if (ShowConfirmationDialog("Перейти к созданному проекту?") == wmrYes) { GotoWorkspace('wnd_ProjectWorkspace', BaseDBEdit.RecordID); var MainWindow = Connector.Attributes('MainWindow'); var WorkspaceWindow = MainWindow.ScriptControl.Run('GetWorkspaceByUSI','wnd_ProjectWorkspace'); var pcDetails = WorkspaceWindow.ComponentsByName('pgProjectTeamDetail'); pcDetails.ActivePage = WorkspaceWindow.ComponentsByName('pgProjectTeamDetail'); } } return Result; }
Не происходит вообще ничего, т.е. при нажатии ОК даже карточка редактирования не закрывается.
3) как это исправить?
"Перепечай Елена" написал:1) Как сделать карточку проекта активной?
где именно Вы написали код создания проекта? До базовой scr_BaseDBEdit.btnOKOnClick(Control) или после? я бы в конце прописала бы, т.е. после всего "базового", либо вообще на афтерпост датасета перенесла бы.
потому что если написать "до", то что происходит: сначала открывается карточка счета, потом идет сохранение договора. А по логике вещей нужно сначала одно закончить (договор), потом начинать другое (проект). даже странно, что оно у Вас на ИДшник договора не ругалось, ведь если договор новый и еще не сохранился в базу -- то его ИДшки еще нет "в природе" -- а Вы создаете проект, где указываете эту ИД...
"Перепечай Елена" написал:2) как добавить значения из справочников назад к полям?
Все должно нормально подтягиваться. Напишите, на всякий случай, Вашу функцию создания проекта -- может, что-то там недописано...
А насчет того, что у Вас не закрывается проект -- опять-таки, нужно смотреть, где Вы написали код и правильно ли передали атрибут. Насколько я вижу, Вы прописали это перед строчкой
return Result;
Попробуйте написать в блоке
if (Result){
, т.е. выше. или даже перед этим блоком. И, я еще заметила, Вы исправили строчку
var pcDetails = WorkspaceWindow.ComponentsByName('pgProjectTeamDetail');
как раз тут нужно было оставить исходный вариант
var pcDetails = WorkspaceWindow.ComponentsByName('pcDetails');
, а название своей детали писать позже.
В общем, Елена, что сделайте:
1) проверьте, чтобы функция создания проекта вызывалась ПОСЛЕ сохранения Договора (если в бтнОкОнКлик -- то после вызова базового метода, если не в этой функции -- то на афтерпосте датасета: окно -- невизуальные компоненты -- длДата -- методы -- АфтерПост)
2) посмотрите, чтобы название атрибута IsCreatedByProjectID и в ф-ции создания проекта, и при проверке в самом проекте (на кнопке Ок) были одинаковые, я имею ввиду их имена. Вообще, по идее, атрибут должен называться IsCreatedByContractID, а не IsCreatedByProjectID -- но это уже Ваше дело, как его называть..
3) перепроверьте, где Вы размещаете проверку, что окно создано из договора (как я написала выше). Я бы посоветовала еще отладчик, поставить дебаггер на начало кнопки Ок и смотреть, как оно "идет" и какие значения получаются.
Если сами не разберетесь -- напишите сюда, что у Вас получилось/не получилось. И тело функции CreateProject() тоже выложите.
Желаю удачи!:smile:
С уважением, Ольга Прилипко
Ольга,
Если я прописываю код создания проекта после базового scr_BaseDBEdit.btnOKOnClick(Control или в функции афтерпост, то вообще ничего не происходит, проверка if (dlData.Dataset.State == dstInsert) дает false.
Создание проекта:
function CreateProject() { var EditWindowUSI = 'wnd_ProjectEdit'; var Attributes = GetNewDictionary(); var CurrentDate = new Date(System.Now()); Attributes.Add('RecordID', GUID_NULL); // Attributes.Add('NotifyObject', Self); var DefaultValues = GetNewDictionary(); var Dataset = dlData.Dataset;//BaseWorkspace.GridDataset; var CustomerID = GetFieldValueFromDisabledField(Dataset, 'CustomerID'); DefaultValues.Add('ClientID', CustomerID); var ContactID = GetFieldValueFromDisabledField(Dataset, 'ContactID'); DefaultValues.Add('ContactID', ContactID); DefaultValues.Add('OwnerID', Connector.CurrentUser.ContactID); var OpportunityID = GetFieldValueFromDisabledField(Dataset, 'OpportunityID'); DefaultValues.Add('OpportunityID', OpportunityID); var CompaingID = GetFieldValueFromDisabledField(Dataset, 'CompaingID'); DefaultValues.Add('CompaingID', OpportunityID); ShowEditWindowEx(EditWindowUSI, Attributes, DefaultValues); }
То что я дописала после создания проекта на кнопку ОК:
if (Result){ var IsCreatedByContractID= Self.Attributes('IsCreatedByContractID'); if (IsCreatedByContractID) { if (ShowConfirmationDialog("Перейти к созданному проекту?") == wmrYes) { GotoWorkspace('wnd_ProjectWorkspace', BaseDBEdit.RecordID); var MainWindow = Connector.Attributes('MainWindow'); var WorkspaceWindow = MainWindow.ScriptControl.Run('GetWorkspaceByUSI', 'wnd_ProjectWorkspace'); var pcDetails = WorkspaceWindow.ComponentsByName('pcDetail'); pcDetails.ActivePage = WorkspaceWindow.ComponentsByName('pgProjectTeamDetail');
Больше никаких изменений в код не вносила, но проблемы остались те же
"Перепечай Елена" написал:Если я прописываю код создания проекта после базового scr_BaseDBEdit.btnOKOnClick(Control или в функции афтерпост, то вообще ничего не происходит, проверка if (dlData.Dataset.State == dstInsert) дает false.
Я уже писала, почему так происходит:
"Ольга Прилипко" написал:проверка (dlData.Dataset.State == dstInsert) может не работать, если Вы написали код после базового scr_BaseDBEdit.btnOKOnClick(Control) -- потому что уже датасет сохранился и определить, в каком он был режиме (вставка или редактирование) уже нельзя.
можно поступить следующим образом: сохранить значение состояния датасета в переменную IsNew ДО базового сохранения, а потом уже его проверять:
... var IsNew = (dlData.Dataset.State == dstInsert); ... scr_BaseDBEdit.btnOKOnClick(Control) ... if (IsNew) { ...
насчет атрибута IsCreatedByContractID -- Вы же его не передали при создании этого проекта:
function CreateProject() { var Dataset = dlData.Dataset; // var EditWindowUSI = 'wnd_ProjectEdit'; var Attributes = GetNewDictionary(); var CurrentDate = new Date(System.Now()); Attributes.Add('RecordID', GUID_NULL); Attributes.Add('IsCreatedByContractID', dlData.Dataset('ID')); //вот здесь идет передача атрибутов. этому атрибуту мы даем значение=ИД записи договора var DefaultValues = GetNewDictionary(); var CustomerID = GetFieldValueFromDisabledField(Dataset, 'CustomerID'); DefaultValues.Add('ClientID', CustomerID); var ContactID = GetFieldValueFromDisabledField(Dataset, 'ContactID'); DefaultValues.Add('ContactID', ContactID); DefaultValues.Add('OwnerID', Connector.CurrentUser.ContactID); ShowEditWindowEx(EditWindowUSI, Attributes, DefaultValues); }
теперь должно срабатывать.
Карточка редактирования стала активной, спасибо!
А вот с данными по умолчанию та же беда
Мой код CreateProject
function CreateProject(NewContractID) { var EditWindowUSI = 'wnd_ProjectEdit'; var Attributes = GetNewDictionary(); var Dataset = dlData.Dataset; var CurrentDate = new Date(System.Now()); Attributes.Add('RecordID', GUID_NULL); Attributes.Add('IsCreatedByContractID', NewContractID); var DefaultValues = GetNewDictionary(); var CustomerID = GetFieldValueFromDisabledField(Dataset, 'CustomerID'); DefaultValues.Add('ClientID', CustomerID); var ContactID = GetFieldValueFromDisabledField(Dataset, 'ContactID'); DefaultValues.Add('ContactID', ContactID); DefaultValues.Add('OwnerID', Connector.CurrentUser.ContactID); var OpportunityID = GetFieldValueFromDisabledField(Dataset, 'OpportunityID'); DefaultValues.Add('OpportunityID', OpportunityID); var CompaingID = GetFieldValueFromDisabledField(Dataset, 'CompaingID'); DefaultValues.Add('CompaingID', OpportunityID); ShowEditWindowEx(EditWindowUSI, Attributes, DefaultValues); }
Параметр NewContractID передают из btnOKOnClick
var NewContractID = dlData.Dataset('ID')
Функция на ОК карточки проекта
function btnOKOnClick(Control) { if (!WindowWasPrepared(Self)) { return; } var Dataset = dlData.Dataset; var IsAppend = (Dataset.State == dstInsert); var ProjectID = Dataset.Values('ID'); var PlanningType = Dataset.Values('PlanningType'); var EssenceType = Dataset.Values('EssenceType'); if (EssenceType != petProject) { var ParentProjectID = Dataset.Values('ParentProjectID'); if (!IsActionAcceptedByProjectLock(new Array(ParentProjectID))) { return; } } var ActionsObject = GetActionsObjectByChangedDataFields(Dataset); var NearestParentID = Dataset.Values('NearestParentID'); var Result = SaveChangesWithCheck(Self, BaseDBEdit, ActionsObject.ElementInMemoryNeedToBeUpdated); if (Result){ if ((ActionsObject.NearestParentIDNeedToBeUpdated) && !IsAppend) { SetNearestParentIDToChilds(ProjectID, PlanningType, NearestParentID); } if (ActionsObject.ParentActualDatesNeedToBeUpdated) { SetParentProjectElementsActualDates(Dataset.Values('ID'), Dataset.Values('ActualStartDate'), Dataset.Values('ActualDueDate')); } if (ActionsObject.ElementInMemoryNeedToBeUpdated) { SendMessageToParentWindows(Self, 'MSG_EDIT_ELEMENT_IN_COLLECTION', Dataset); } if (ActionsObject.ManhourDetailButtonsNeedToBeUpdated) { SendMessageToParentWindows(Self, 'MSG_UPDATE_MANHOUR_DETAIL_BUTTONS', Dataset); } Self.IsVisible = false; System.ProcessMessages(); Self.Close(); var NotifyObject = Self.Attributes('NotifyObject'); if (Assigned(NotifyObject)) { NotifyObject.Notify(Self, MSG_AFTERCLOSE, null); } var IsCreatedByContractID= Self.Attributes('IsCreatedByContractID'); if (IsCreatedByContractID) { if (ShowConfirmationDialog("Перейти к созданному проекту?") == wmrYes) { GotoWorkspace('wnd_ProjectWorkspace', BaseDBEdit.RecordID); var MainWindow = Connector.Attributes('MainWindow'); var WorkspaceWindow = MainWindow.ScriptControl.Run('GetWorkspaceByUSI', 'wnd_ProjectWorkspace'); var pcDetails = WorkspaceWindow.ComponentsByName('pcDetail'); pcDetails.ActivePage = WorkspaceWindow.ComponentsByName('pgProjectTeamDetail'); //название нужной детали } } } return Result; }
функции beforeOpen, AfterOpen для проекта не меняла.
Нужные параметры из карточки договора передаются, а вот те, что должны ставится по умолчанию из справочников, например Состояние, Тип не передаются
"Перепечай Елена" написал:Нужные параметры из карточки договора передаются, а вот те, что должны ставится по умолчанию из справочников, например Состояние, Тип не передаются
Елена, только что посмотрела, почему так. Дело в том, что в Проекте эти значения прописаны не на датасете или окне, а при нажатии на кнопку "создать (проект/стадию/работу)" в гриде Проектов.
Просмотрите функцию AddProjectRecord и SetDefaultValuesForProjectEssence в скрипте scr_ProjectCommonUtils -- и разберитесь, какие значения там передаются (тип, состояние, календарь и т.п.). Потом допишите их в свою функцию CreateProject.
Желаю удачи!
С уважением, Ольга Прилипко.
Пробовала 2 варианта:
1) Добавила содержимое функции SetDefaultValuesForProjectEssence в CreateProject
DefaultValues('EssenceType') = petProject; DefaultValues('StateID') = GetProjectStateIDByFlags(petProject, true, false); DefaultValues('TypeID') = GetDefaultProjectTypeID(petProject); DefaultValues('PlanningType') = pptByChildElements;
2) просто вызвала функцию SetDefaultValuesForProjectEssence в CreateProject.
Результат один и тот же. Теперь значения по умолчанию переносятся, а вот те что из карточки договора нет(((
+При нажатии ОК карты редактирования проекта появляется ошибка
"Ошибка выполнения метода 'btnOKOnClick'. 'Name' - есть null или не является объектом "
Никакое поле Nаme найти не могу, код кнопки выставляла в предидущем ответе
Елена, сделайте проще: добавьте в функцию CreateProject заполнение значений "Тип элемента", "Тип планирования" и др. после определения DefaultValues:
function CreateProject(NewContractID) { .......... var DefaultValues = GetNewDictionary(); DefaultValues.Add('EssenceType', 'Project'); DefaultValues.Add('PlanningType', '{5D576142-CE74-4A8D-A4D6-BE52D5C8952E}'); ...........