Добрый день.
В БП по сигналу мне бы хотелось, чтобы открывалась страница реестра Взаимосвязей.
Каким образом мне правильно сделать, чтобы туда передавался контакт в ContactAId и я могла создавать там новые записи при нажатии на кнопку "Добавить"?
Нравится
Здравствуйте!
Для решения необходимо использовать элемент "Преднастроенная страница". Элемент описан по ссылке:
http://www.community.terrasoft.ru/img/video/lms/28/story.html
Также данная тема обсуждалась в других ветках:
http://www.community.terrasoft.ru/forum/topic/25237
Здравствуйте.
Элемент бизнес-процесса "Преднастроенная страница" есть в 7ке, у нас же 5ка и такого элемента для работы с БП нет. Нужна другая реализация данной задачи.
Антонина, в 5.Х есть возможность добавить в процесс элемент-действие, в действии указать «Открыть страницу». Нужные значения передать в параметрах, а их обработку написать в процессе самой страницы.
Я так и пытаюсь сделать. Меня интересует в каком именно параметре нужно передавать значение ContactAId.
вот пример кода:
var ReportSchemaUId = "56a4f892-df6b-4dac-99ad-762f56553035";//Базовая страница реестра взаимосвязей var EntitySchemaUId = "8409eced-ba37-4a6a-a031-671fcb7be3e2"; Guid ContactId = ReadDataUserTask2.ResultEntity.GetTypedColumnValue<Guid>("ContactId"); RelationUserTask.OpenerInstanceId = InstanceUId; RelationUserTask.PageUId = new Guid("56a4f892-df6b-4dac-99ad-762f56553035"); var parameters = new Dictionary<string, string> { {"ContactAId", ContactId.ToString()}, {"DataSourceUId", EntitySchemaUId.ToString()}, {"TreeGridId", EntitySchemaUId.ToString()}//, }; RelationUserTask.PageParameters = parameters; RelationUserTask.Centered = true; RelationUserTask.CloseOpenerOnLoad = false; var SelectedActiveRows = new List<Guid>(); SelectedActiveRows.Add(new Guid(DocumentId.ToString())); var selectedRows = new Dictionary<string, object>(); selectedRows.Add("Item1", "Contact"); selectedRows.Add("Item2", "Id"); selectedRows.Add("Item3", SelectedActiveRows); UserConnection.SessionData[EntitySchemaUId.ToString() + "_SelectedActiveRows"] = selectedRows;
В каком угодно, это зависит от реализации.
Главное, внутри его потом вычитать и использовать в логике страницы.
Для примера посмотрите, как из AccountEditPage в DuplicatesSearchResultModulePage передаются DuplicateSchemaId и ещё несколько параметров.
OpenDuplicatesSearchResultsUserTask.OpenerInstanceId = Page.Process.InstanceUId; OpenDuplicatesSearchResultsUserTask.PageUId = duplicateSearchResultsPageUId; OpenDuplicatesSearchResultsUserTask.UseCurrentActivePage = true; OpenDuplicatesSearchResultsUserTask.PageParameters = new Dictionary<string, string>() { {"SchemaId", SearchForDuplicatesUserTask.SchemaId.ToString()}, {"DuplicateSchemaId", SearchForDuplicatesUserTask.DuplicateSchemaId.ToString()}, {"EditPageId", SearchForDuplicatesUserTask.EditPageId.ToString()}, {"RecordId", SearchForDuplicatesUserTask.RecordId.ToString()}, {"DataKey", DataKey} }; OpenDuplicatesSearchResultsUserTask.CloseMessage = "DuplicateResultsPageClosed";
public virtual bool ChildInitScriptTaskExecute(ProcessExecutingContext context) { if (!Ext.IsAjaxRequest) { (Page.AspPage as UI.Core.Page).InitializeProfile(new ProfileKeyEventArgs()); SchemaId = Guid.Parse(Page.GetParameterValue("SchemaId").ToString()); DuplicateSchemaId = Guid.Parse(Page.GetParameterValue("DuplicateSchemaId").ToString()); EditPageId = Guid.Parse(Page.GetParameterValue("EditPageId").ToString()); RecordId = Guid.Parse(Page.GetParameterValue("RecordId").ToString()); DataKey = Page.GetParameterValue("DataKey").ToString(); Page.Grid.PageInstance.Process.SetPropertyValue("SchemaId", SchemaId); Page.Grid.PageInstance.Process.SetPropertyValue("DuplicateSchemaId", DuplicateSchemaId); Page.Grid.PageInstance.Process.SetPropertyValue("EditPageUId", EditPageId); Page.Grid.PageInstance.Process.SetPropertyValue("DataKey", DataKey); Page.Grid.PageInstance.Process.SetPropertyValue("RecordId", RecordId); } return true; }
Александр, добрый день.
При нажатии на кнопку запускаю БП.
В БП написала такой код и открываю страницу:
var ReportSchemaUId = "56a4f892-df6b-4dac-99ad-762f56553035";//Базовая страница реестра взаимосвязей var EntitySchemaUId = "533e9db5-b10c-44a9-bbef-168af653d2d5";//Взаимосвязь var openerInstanceId = "8409eced-ba37-4a6a-a031-671fcb7be3e2";//Взаимосвязь (представление) var EntitySchema = UserConnection.EntitySchemaManager.GetInstanceByName("Relationship"); Guid ContactId = ReadDataUserTask2.ResultEntity.GetTypedColumnValue<Guid>("ContactId"); var parameters = new Dictionary<string, string> { {"openerInstanceId", EntitySchemaUId}, {"contactAId", ContactId.ToString()} }; RelationUserTask.PageParameters = parameters; Guid clientDocumentGridPageUId = new Guid("56a4f892-df6b-4dac-99ad-762f56553035"); RelationUserTask.PageUId = clientDocumentGridPageUId; RelationUserTask.Centered = true; RelationUserTask.CloseOpenerOnLoad = false;
Далее на Базовой странице реестра взаимосвязей добавила код на событие PageLoadComplete:
Page.TreeGrid.Clear(); try { Guid contactAId = Guid.Parse(Page.Request.QueryString["contactAId"]); Guid sysSchemaEntity = Guid.Parse(Page.Request.QueryString["openerInstanceId"]); Page.Label1.Caption=contactAId.ToString(); var opportunityFilter = Page.DataSource.CurrentStructure.CreateIsNullFilter(Page.DataSource.Schema, "ContactA"); Page.DataSource.CurrentStructure.Filters.Add(opportunityFilter); var applicationFilter = Page.DataSource.CurrentStructure.CreateFilterWithParameters(Page.DataSource.Schema, FilterComparisonType.Equal, "ContactA", contactAId); Page.DataSource.CurrentStructure.Filters.Add(applicationFilter); } catch { } Page.DataSource.LoadRows(); Page.TreeGrid.RefreshData();
Что получилось:
При нажатии на кнопку открывается страница реестра взаимосвязей.
Далее нажимаю на ней на кнопку Добавить - Контакт и тут происходит свал системы.
Exception Message: Object reference not set to an instance of an object. Exception Type: System.NullReferenceException Exception Source: TSBpm Exception Stack Trace: at Terrasoft.WebApp.BaseRelationshipEditPageEventsProcess`1.ScriptTask1Execute(ProcessExecutingContext context) at Terrasoft.Core.Process.ProcessScriptTask.InternalExecute(ProcessExecutingContext context) at Terrasoft.Core.Process.ProcessFlowElement.Execute(ProcessExecutingContext context)
Что я не доделала или сделала не так? Как исправить?
Где-то внутри ScriptTask1Execute в функцию вместо объекта попадает null. Нужно отлаживаться, чтобы понять, где именно.
Я посмотрела не хватает для полноценной работы параметров:
var ParentEntityId = Guid.Parse(Page.Request.QueryString["ParentEntityId"]); var MainEntitySchemaId = Guid.Parse(Page.Request.QueryString["MainEntitySchemaId"]); var ParentEntitySchemaId = Guid.Parse(Page.Request.QueryString["ParentEntitySchemaId"]);
В БП я их определила и передаю, на странице реестра взаимосвязей они тоже подхватываются.
А как передать их на страницу редактирования взаимосвязи?
Тоже через параметры. При стандартной логике кнопки «Добавить» и «Изменить» на странице реестра открывают окна-карточки при помощи JS, формируемого в функции GetRegisterAddPageScript и ей подобных.