09.04.2014, 16:48 | #1 |
Участник
|
Workflow делает копию записи
Добрый день!
Ситуация такая, workflow делает копию записи, всё отлично, но нужно чтобы так же копировались survey questions которые там есть. Вот пока что вот такой код: Код: using System; using System.Collections.Generic; using System.Linq; using System.Text; using Microsoft.Xrm.Sdk; using Microsoft.Xrm.Sdk.Query; using Microsoft.Xrm.Sdk.Workflow; using System.Activities; namespace Bum.Survey.CRM.WorkflowActivity { public class CopySurvey : CodeActivity { [RequiredArgument] [Input("Survey status")] [AttributeTarget("bf_survey", "bf_survey_sts")] public InArgument<OptionSetValue> SurveyStatus { get; set; } [RequiredArgument] [Input("Name")] public InArgument<string> SurveyName { get; set; } [RequiredArgument] [Input("Startup")] public InArgument<DateTime> SurveyStartup { get; set; } [RequiredArgument] [Input("Finish")] public InArgument<DateTime> SurveyFinish { get; set; } [Input("Evaluating object")] [ReferenceTarget("bf_survey")] public InArgument<EntityReference> EvalObject { get; set; } protected override void Execute(CodeActivityContext activityContext) { IExecutionContext context = activityContext.GetExtension<IExecutionContext>(); IOrganizationServiceFactory serviceFactory = activityContext.GetExtension<IOrganizationServiceFactory>(); IOrganizationService _orgService = serviceFactory.CreateOrganizationService(context.UserId); ITracingService tracingService = activityContext.GetExtension<ITracingService>(); Entity survey = _orgService.Retrieve(context.PrimaryEntityName, context.PrimaryEntityId, new ColumnSet(true)); survey.Id = Guid.Empty; survey.Attributes.Remove("bf_surveyid"); QueryExpression qry = new QueryExpression() { EntityName = "bf_surveyquestion", ColumnSet = new ColumnSet(true) }; qry.Criteria.AddCondition("bf_surveyquestion_survey", ConditionOperator.Equal, survey.Id); List<Entity> questions = _orgService.RetrieveMultiple(qry).Entities.ToList(); if (questions.Count >= 0) { } _orgService.Create(survey); } } } |
|
10.04.2014, 12:07 | #2 |
Чайный пьяница
|
Строка
Код: _orgService.Create(survey); Дальше необходимо циклом пройтись по полученным вопросам, заполнить лукап связи между вопросом опроса и опросом и вызывайте создание записи.
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
10.04.2014, 12:19 | #3 |
Участник
|
Хех, ещё не связывался с таким, но ладно, буду думать как этот цикл реализовать, может есть примеры какие нибудь?
|
|
10.04.2014, 12:28 | #4 |
Чайный пьяница
|
Например так:
Код: List<Entity> questions = _orgService.RetrieveMultiple(qry).Entities.ToList(); foreach ( Entity question in questions) { //create question here }
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
10.04.2014, 12:34 | #5 |
Участник
|
|
|
10.04.2014, 15:54 | #6 |
Участник
|
Нде, что-то совсем никак...
|
|
11.04.2014, 11:36 | #7 |
Участник
|
На данный момент как-то так, но опять же, копию делает, но без questions..
Код: protected override void Execute(CodeActivityContext activityContext) { IExecutionContext context = activityContext.GetExtension<IExecutionContext>(); IOrganizationServiceFactory serviceFactory = activityContext.GetExtension<IOrganizationServiceFactory>(); IOrganizationService _orgService = serviceFactory.CreateOrganizationService(context.UserId); ITracingService tracingService = activityContext.GetExtension<ITracingService>(); Entity survey = _orgService.Retrieve(context.PrimaryEntityName, context.PrimaryEntityId, new ColumnSet(true)); if (survey.LogicalName == "bf_survey") { survey.Id = Guid.Empty; survey.Attributes.Remove("bf_surveyid"); Guid Lid = _orgService.Create(survey); QueryExpression qry = new QueryExpression() { EntityName = "bf_surveyquestion", ColumnSet = new ColumnSet(true) }; qry.Criteria.AddCondition("bf_surveyquestion_survey", ConditionOperator.Equal, survey.Id); List<Entity> questions = _orgService.RetrieveMultiple(qry).Entities.ToList(); foreach (var question in questions) { question.Attributes.Remove("bf_surveyquestionid"); question.Id = Guid.NewGuid(); string regardingaccountype = "bf_survey"; question["bf_surveyquestion"] = new EntityReference(regardingaccountype, Lid); _orgService.Create(question); } } } |
|
14.04.2014, 00:08 | #8 |
Участник
|
Я что-то запутался вот тут вот.
Код: qry.Criteria.AddCondition("bf_surveyquestion_survey", ConditionOperator.Equal, survey.Id); survey.Id = Guid.Empty; Разве тебе ну нужно брать вопросы со старой записи для переноса? вместо survey.Id нужно подставить context.PrimaryEntityId. Если я не пропустил ничего, то после этой замены должно работать. А сейчас твоя квери просто не находит вопросы, что бы их перенести. Да? Нет? |
|
|
За это сообщение автора поблагодарили: Lavdislav (1). |
14.04.2014, 09:43 | #9 |
Участник
|
Цитата:
Сообщение от maksii
Я что-то запутался вот тут вот.
Код: qry.Criteria.AddCondition("bf_surveyquestion_survey", ConditionOperator.Equal, survey.Id); survey.Id = Guid.Empty; Разве тебе ну нужно брать вопросы со старой записи для переноса? вместо survey.Id нужно подставить context.PrimaryEntityId. Если я не пропустил ничего, то после этой замены должно работать. А сейчас твоя квери просто не находит вопросы, что бы их перенести. Да? Нет? |
|
14.04.2014, 14:26 | #10 |
Участник
|
Апдейт: в этих questions есть ещё объекты (прикрепляю картинку, в красной рамке), попытался сделать как-то так (красным цветом):
Код: if (survey.LogicalName == "bf_survey") { survey.Id = Guid.Empty; survey.Attributes.Remove("bf_surveyid"); survey["bf_survey_name"] = "[COPY] " + survey["bf_survey_name"]; Guid Lid = _orgService.Create(survey); QueryExpression qry = new QueryExpression() { EntityName = "bf_surveyquestion", ColumnSet = new ColumnSet(true) }; qry.Criteria.AddCondition("bf_surveyquestion_survey", ConditionOperator.Equal, context.PrimaryEntityId); var questions = _orgService.RetrieveMultiple(qry).Entities; foreach (var question in questions) { question.Attributes.Remove("bf_surveyquestionid"); question.Id = Guid.NewGuid(); string regardingaccountype = "bf_survey"; question["bf_surveyquestion_survey"] = new EntityReference(regardingaccountype, Lid); Guid quest = _orgService.Create(question); QueryExpression evalobj = new QueryExpression() { EntityName = "bf_surveyqevalobject", ColumnSet = new ColumnSet(true) }; evalobj.Criteria.AddCondition("bf_surveyqevalobject_squ", ConditionOperator.Equal, question.Id); var evobjects = _orgService.RetrieveMultiple(evalobj).Entities; foreach (var evobject in evobjects) { evobject.Attributes.Remove("bf_surveyquestiongroupid"); evobject.Id = Guid.NewGuid(); string objects = "bf_surveyqevalobject"; evobject["bf_surveyqevalobject_squ"] = new EntityReference(objects, quest); _orgService.Create(evobject); } } } |
|
14.04.2014, 14:38 | #11 |
Участник
|
Что-то ты намудрил.
Зачем ты делаешь это? Код: question.Id = Guid.NewGuid() |
|
14.04.2014, 14:43 | #12 |
Участник
|
Спасибо в очередной раз, поменял последовательность и заработало.
Последний раз редактировалось Lavdislav; 14.04.2014 в 15:15. |
|
|
|