AXForum  
Go Back   AXForum > Microsoft Dynamics CRM > Dynamics CRM: Разработка
All
Forgotten Your Password?
Register Forum Rules FAQ Members List Today's Posts Search

 
 
Thread Tools Search this Thread Display Modes
Old 09.04.2014, 16:48   #1  
Lavdislav is offline
Lavdislav
Участник
 
34 / 10 (1) +
Join Date: 28.02.2014
Workflow делает копию записи
Добрый день!

Ситуация такая, workflow делает копию записи, всё отлично, но нужно чтобы так же копировались survey questions которые там есть.
Вот пока что вот такой код:
Code:
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'ов, надо чтобы в копии они тоже были)
Attached Thumbnails
Click image for larger version

Name:	questions.jpg
Views:	566
Size:	146.9 KB
ID:	8826  
Old 10.04.2014, 12:07   #2  
a33ik is offline
a33ik
Чайный пьяница
a33ik's Avatar
MCP
MCBMSS
Злыдни
Соотечественники
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,243 / 896 (36) +++++++
Join Date: 02.07.2008
Location: Greenville, SC
Строка

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

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

Подписывайтесь на мой блог, twitter и YouTube канал.
Пользуйтесь моим Ultimate Workflow Toolkit
Old 10.04.2014, 12:19   #3  
Lavdislav is offline
Lavdislav
Участник
 
34 / 10 (1) +
Join Date: 28.02.2014
Quote:
Originally Posted by a33ik View Post
Строка

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

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

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

foreach ( Entity question in questions)
{
//create question here
}
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством.

Подписывайтесь на мой блог, twitter и YouTube канал.
Пользуйтесь моим Ultimate Workflow Toolkit
Old 10.04.2014, 12:34   #5  
Lavdislav is offline
Lavdislav
Участник
 
34 / 10 (1) +
Join Date: 28.02.2014
Quote:
Originally Posted by a33ik View Post
Например так:

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

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

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

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

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


Да? Нет?
This post has been rated by: Lavdislav (1).
Old 14.04.2014, 09:43   #9  
Lavdislav is offline
Lavdislav
Участник
 
34 / 10 (1) +
Join Date: 28.02.2014
Quote:
Originally Posted by maksii View Post
Я что-то запутался вот тут вот.

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

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

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


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

Зачем ты делаешь это?
Code:
question.Id = Guid.NewGuid()
До этого момента question.Id содержал гуид оригинала
Old 14.04.2014, 14:43   #12  
Lavdislav is offline
Lavdislav
Участник
 
34 / 10 (1) +
Join Date: 28.02.2014
Quote:
Originally Posted by maksii View Post
Что-то ты намудрил.

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

Last edited by Lavdislav; 14.04.2014 at 15:15.
 

Similar Threads
Thread Thread Starter Forum Replies Last Post
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

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Forum Jump

Рейтинг@Mail.ru
All times are GMT +3. The time now is 01:49.
Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Contacts E-mail, Advertising.