AXForum  
Вернуться   AXForum > Microsoft Dynamics CRM > Dynamics CRM: Разработка
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 09.04.2014, 16:48   #1  
Lavdislav is offline
Lavdislav
Участник
 
34 / 10 (1) +
Регистрация: 28.02.2014
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);
        }
    }   
}
Так же прикрепляю картинку (там внутри 5 survey question'ов, надо чтобы в копии они тоже были)
Миниатюры
Нажмите на изображение для увеличения
Название: questions.jpg
Просмотров: 551
Размер:	146.9 Кб
ID:	8826  
Старый 10.04.2014, 12:07   #2  
a33ik is offline
a33ik
Чайный пьяница
Аватар для a33ik
MCP
MCBMSS
Злыдни
Соотечественники
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,243 / 896 (36) +++++++
Регистрация: 02.07.2008
Адрес: Greenville, SC
Строка

Код:
_orgService.Create(survey);
Возвращает вам идентификатор записи.

Дальше необходимо циклом пройтись по полученным вопросам, заполнить лукап связи между вопросом опроса и опросом и вызывайте создание записи.
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством.

Подписывайтесь на мой блог, twitter и YouTube канал.
Пользуйтесь моим Ultimate Workflow Toolkit
Старый 10.04.2014, 12:19   #3  
Lavdislav is offline
Lavdislav
Участник
 
34 / 10 (1) +
Регистрация: 28.02.2014
Цитата:
Сообщение от a33ik Посмотреть сообщение
Строка

Код:
_orgService.Create(survey);
Возвращает вам идентификатор записи.

Дальше необходимо циклом пройтись по полученным вопросам, заполнить лукап связи между вопросом опроса и опросом и вызывайте создание записи.
Хех, ещё не связывался с таким, но ладно, буду думать как этот цикл реализовать, может есть примеры какие нибудь?
Старый 10.04.2014, 12:28   #4  
a33ik is offline
a33ik
Чайный пьяница
Аватар для a33ik
MCP
MCBMSS
Злыдни
Соотечественники
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,243 / 896 (36) +++++++
Регистрация: 02.07.2008
Адрес: Greenville, SC
Например так:

Код:
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  
Lavdislav is offline
Lavdislav
Участник
 
34 / 10 (1) +
Регистрация: 28.02.2014
Цитата:
Сообщение от a33ik Посмотреть сообщение
Например так:

Код:
List<Entity> questions = _orgService.RetrieveMultiple(qry).Entities.ToList();

foreach ( Entity question in questions)
{
//create question here
}
Код:
_orgService.Create(survey);
Получается должно быть после цикла?
Старый 10.04.2014, 15:54   #6  
Lavdislav is offline
Lavdislav
Участник
 
34 / 10 (1) +
Регистрация: 28.02.2014
Нде, что-то совсем никак...
Старый 11.04.2014, 11:36   #7  
Lavdislav is offline
Lavdislav
Участник
 
34 / 10 (1) +
Регистрация: 28.02.2014
На данный момент как-то так, но опять же, копию делает, но без 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  
maksii is offline
maksii
Участник
 
15 / 16 (1) ++
Регистрация: 02.04.2014
Адрес: Харьков
Cool
Я что-то запутался вот тут вот.

Код:
qry.Criteria.AddCondition("bf_surveyquestion_survey", ConditionOperator.Equal, survey.Id);
survey.Id - это же гуид новой записи, мало того, он перед этим:
survey.Id = Guid.Empty;

Разве тебе ну нужно брать вопросы со старой записи для переноса? вместо survey.Id нужно подставить context.PrimaryEntityId.

Если я не пропустил ничего, то после этой замены должно работать. А сейчас твоя квери просто не находит вопросы, что бы их перенести.


Да? Нет?
За это сообщение автора поблагодарили: Lavdislav (1).
Старый 14.04.2014, 09:43   #9  
Lavdislav is offline
Lavdislav
Участник
 
34 / 10 (1) +
Регистрация: 28.02.2014
Цитата:
Сообщение от maksii Посмотреть сообщение
Я что-то запутался вот тут вот.

Код:
qry.Criteria.AddCondition("bf_surveyquestion_survey", ConditionOperator.Equal, survey.Id);
survey.Id - это же гуид новой записи, мало того, он перед этим:
survey.Id = Guid.Empty;

Разве тебе ну нужно брать вопросы со старой записи для переноса? вместо survey.Id нужно подставить context.PrimaryEntityId.

Если я не пропустил ничего, то после этой замены должно работать. А сейчас твоя квери просто не находит вопросы, что бы их перенести.


Да? Нет?
Спасибо, ты всё верно сказал, всё работает!
Старый 14.04.2014, 14:26   #10  
Lavdislav is offline
Lavdislav
Участник
 
34 / 10 (1) +
Регистрация: 28.02.2014
?
Апдейт: в этих 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);
        }
    }
}
Но опять же question.Id, это ид новой записи, но мне как-то надо сравнить с той где есть эти объекты, брр
Старый 14.04.2014, 14:38   #11  
maksii is offline
maksii
Участник
 
15 / 16 (1) ++
Регистрация: 02.04.2014
Адрес: Харьков
Что-то ты намудрил.

Зачем ты делаешь это?
Код:
question.Id = Guid.NewGuid()
До этого момента question.Id содержал гуид оригинала
Старый 14.04.2014, 14:43   #12  
Lavdislav is offline
Lavdislav
Участник
 
34 / 10 (1) +
Регистрация: 28.02.2014
Цитата:
Сообщение от maksii Посмотреть сообщение
Что-то ты намудрил.

Зачем ты делаешь это?
Код:
question.Id = Guid.NewGuid()
До этого момента question.Id содержал гуид оригинала
Спасибо в очередной раз, поменял последовательность и заработало.

Последний раз редактировалось Lavdislav; 14.04.2014 в 15:15.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Gareth Tucker: CRM 2013 New Features: Using Real-time Workflow for Validation Rules Blog bot Dynamics CRM: Blogs 0 07.12.2013 08:31
crminthefield: Watch out for this CRM 2011 Workflow upgrade gotcha! Blog bot Dynamics CRM: Blogs 0 07.01.2013 22:11
Удаленная работа с CRM и расширеный поиск ASheff Dynamics CRM: Разработка 64 04.06.2010 17:44
Muhammad Ali Khan: Auto Refresh Marketing List In MS CRM 4 Using Workflow Blog bot Dynamics CRM: Blogs 0 22.02.2010 03:24
Microsoft Dynamics CRM Team Blog: Workflow E-mail Utilities Blog bot Dynamics CRM: Blogs 0 16.12.2008 23:05

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 20:12.