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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 15.11.2010, 14:53   #1  
CCNP|Leonid is offline
CCNP|Leonid
sys*#**#**#**#**#*
 
9 / 10 (1) +
Регистрация: 15.11.2010
Адрес: Екатеринбург
? Создание связи N:N при преобразовании интереса.
Добрый день всем.

У интереса есть связь N:1 к кастомному обьекту "Проект".

У объектов Контакт и бизнес партнер настроил связь N:N к этому же обьекту, так как клиент может участвовать в нескольких проектах, ну и соответственно у проекта должно быть N контактов и бизнес партнеров.

Хотелось бы сделать чтобы при преобразовании интереса у контакта и бизнес партнера устанавливалась связь N:N с проектом связанным с интересом.

Дайте пожалуйста пинок куда копать хотя бы. Понимаю что легче будет реализовать плагином, сижу ковыряю студию.
Старый 15.11.2010, 15:03   #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
Подобная задача реализовывалась мной - http://a33ik.blogspot.com/2009/07/pl...notes-and.html

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

Подписывайтесь на мой блог, twitter и YouTube канал.
Пользуйтесь моим Ultimate Workflow Toolkit
За это сообщение автора поблагодарили: CCNP|Leonid (1).
Старый 15.11.2010, 22:06   #3  
CCNP|Leonid is offline
CCNP|Leonid
sys*#**#**#**#**#*
 
9 / 10 (1) +
Регистрация: 15.11.2010
Адрес: Екатеринбург
А можете еще подсказать в какой табличке хряняться данные о связях?

Как я понимаю мне фактически нужно взять из таблицы отношение "проекта" к интересу", конкретно GUID проекта и подставить его в таблицу где хранятся отношения N:N поменяв GUID контакта либо бизнес партнера на тот который генерируется при преобразовании интереса?
Старый 15.11.2010, 22:35   #4  
slivka_83 is offline
slivka_83
Консультант-джедай
Аватар для slivka_83
MCBMSS
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
1,683 / 374 (16) ++++++
Регистрация: 18.12.2008
Адрес: default city
При создании связи N:N Вы указываете имя связи, вот так же и будет называться новая табличка в ней и будут указаны сопоставления GUID'ов записей участвующих в связи N:N.
__________________
Крокодил, крокожу и буду крокодить.
Человек человеку - волк , а зомби зомби - зомби.
Экстремал и буду экстремать!
Блога
За это сообщение автора поблагодарили: CCNP|Leonid (1).
Старый 16.11.2010, 22:50   #5  
CCNP|Leonid is offline
CCNP|Leonid
sys*#**#**#**#**#*
 
9 / 10 (1) +
Регистрация: 15.11.2010
Адрес: Екатеринбург
Что то не получается, толи я туплю, то ли неясно. я вот думаю, при квалификации интереса создается возможная сделка, может в sql триггер повесить на таблицу возможных сделок, если мол у нее значение [OriginatingLeadId] не равняется нулю брать GUID проекта и создавать запись в таблице отношений N_N для контакта привязанного к возможной сделке. Насколько я понял при курении SDK мне нужно использовать ManyToManyMetadata класс?
Старый 16.11.2010, 23:41   #6  
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
Цитата:
Сообщение от CCNP|Leonid Посмотреть сообщение
Что то не получается, толи я туплю, то ли неясно. я вот думаю, при квалификации интереса создается возможная сделка, может в sql триггер повесить на таблицу возможных сделок, если мол у нее значение [OriginatingLeadId] не равняется нулю брать GUID проекта и создавать запись в таблице отношений N_N для контакта привязанного к возможной сделке. Насколько я понял при курении SDK мне нужно использовать ManyToManyMetadata класс?
Триггерами ничего хорошего не добъётесь. Поверьте мне, как человеку, который немного в этом понимает.

1. Для получения связанных записей необходимо использовать QueryExpression и LinkEntity. Примеров в интернете благо море - можно найти подобное.

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

Подписывайтесь на мой блог, twitter и YouTube канал.
Пользуйтесь моим Ultimate Workflow Toolkit
Старый 18.11.2010, 10:05   #7  
CCNP|Leonid is offline
CCNP|Leonid
sys*#**#**#**#**#*
 
9 / 10 (1) +
Регистрация: 15.11.2010
Адрес: Екатеринбург
Thumbs down
Добрый день, уже 2 день не получается.

Вот что получилось. Ткните носом в ошибки плз.

X++:
using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.Crm.Sdk;
using Microsoft.Crm.SdkTypeProxy;
using Microsoft.Crm.Sdk.Query;

namespace LeadConversionPlugin
{
    public class ContactCreationHandler : IPlugin
    {
        #region IPlugin Members

        public void Execute(IPluginExecutionContext context)
        {
            if (context.MessageName == MessageName.Create &&
                context.InputParameters.Contains("Target") &&
                context.InputParameters["Target"] is DynamicEntity)
            {
                DynamicEntity entity = (DynamicEntity)context.InputParameters["Target"];

                //Проверяем является ли значение контактом
                if (entity.Name != EntityName.contact.ToString())
                    return;
                // Проверяем есть ли у контакта связь с интересом
                if (!entity.Properties.Contains("originatingleadid"))
                    return;

                //Получаем Guid интереса
                Guid leadid = ((Lookup)entity["originatingleadid"]).Value;

                //получаем Guid контакта
                Guid contactid = (Guid)context.OutputParameters["Id"];

                ICrmService crmservice = context.CreateCrmService(true);

                //Just build the query which will be used to retrieve
                //all child annotations (notes and attachements)
                //QueryByAttribute query = new QueryByAttribute();
                //query.ColumnSet = new AllColumns();
                //query.EntityName = EntityName.annotation.ToString();

                //query.Attributes = new string[] { "objectid" };
                //query.Values = new object[] { leadid };

                QueryExpression relationshipCheckQuery = new QueryExpression();
                relationshipCheckQuery.EntityName = "new_project";
                relationshipCheckQuery.ColumnSet = new ColumnSet(new string[] { "new_projectid" });

                //
                //
                // Code Create Moniker for first Entity: Contact

                Moniker Moniker1 = new Moniker();
                Moniker1.Id = contactid;
                Moniker1.Name = EntityName.contact.ToString();

                // Code Create Moniker for second Entity: New_CustomEntity
                Moniker Moniker2 = new Moniker();
                Moniker2.Id = leadid;
                Moniker2.Name = EntityName.new_project.ToString();

                string strManyToManyRelationshipName = "new_new_project_contactId"; 

                RetrieveMultipleRequest request = new RetrieveMultipleRequest();
                request.Query = query;
                request.ReturnDynamicEntities = false;

                RetrieveMultipleResponse response = (RetrieveMultipleResponse)crmservice.Execute(request);}}


  public bool AssociateManyToManyEntityRecords(Moniker Moniker1, Moniker Moniker2, string strEntityRelationshipName){
    try
    {
        // Create an AssociateEntities request.
        AssociateEntitiesRequest request = new AssociateEntitiesRequest();


        // Set the ID of Moniker1 to the ID of the lead.
        request.Moniker1 = Moniker1;  


        // Set the ID of Moniker2 to the ID of the contact.
        request.Moniker2 = Moniker2; 


        // Set the relationship name to associate on.
        request.RelationshipName = strEntityRelationshipName;


        // Execute the request.
        service.Execute(request); 


        return true;
    }  


    catch (SoapException ex)
    {
        return false;
    }

}
    }
        #endregion IPlugin Members
}
ps. Программист из меня фиговый, работаю системным администратором, нашего прогера, к моему большому горю и сожалению сократили, теперь его адцкую работу приходится делать мне, сейчас активно курю маны по шарпу, в дальнейшем научусь я думаю, просто этот функционал надо срочно, а я тока 3 дня назад приступил к обязанностям программиста.
Старый 18.11.2010, 10:53   #8  
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
Цитата:
Сообщение от CCNP|Leonid Посмотреть сообщение
Добрый день, уже 2 день не получается.

Вот что получилось. Ткните носом в ошибки плз.

X++:
using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.Crm.Sdk;
using Microsoft.Crm.SdkTypeProxy;
using Microsoft.Crm.Sdk.Query;

namespace LeadConversionPlugin
{
    public class ContactCreationHandler : IPlugin
    {
        #region IPlugin Members

        public void Execute(IPluginExecutionContext context)
        {
            if (context.MessageName == MessageName.Create &&
                context.InputParameters.Contains("Target") &&
                context.InputParameters["Target"] is DynamicEntity)
            {
                DynamicEntity entity = (DynamicEntity)context.InputParameters["Target"];

                //Проверяем является ли значение контактом
                if (entity.Name != EntityName.contact.ToString())
                    return;
                // Проверяем есть ли у контакта связь с интересом
                if (!entity.Properties.Contains("originatingleadid"))
                    return;

                //Получаем Guid интереса
                Guid leadid = ((Lookup)entity["originatingleadid"]).Value;

                //получаем Guid контакта
                Guid contactid = (Guid)context.OutputParameters["Id"];

                ICrmService crmservice = context.CreateCrmService(true);

                //Just build the query which will be used to retrieve
                //all child annotations (notes and attachements)
                //QueryByAttribute query = new QueryByAttribute();
                //query.ColumnSet = new AllColumns();
                //query.EntityName = EntityName.annotation.ToString();

                //query.Attributes = new string[] { "objectid" };
                //query.Values = new object[] { leadid };

                QueryExpression relationshipCheckQuery = new QueryExpression();
                relationshipCheckQuery.EntityName = "new_project";
                relationshipCheckQuery.ColumnSet = new ColumnSet(new string[] { "new_projectid" });

                //
                //
                // Code Create Moniker for first Entity: Contact

                Moniker Moniker1 = new Moniker();
                Moniker1.Id = contactid;
                Moniker1.Name = EntityName.contact.ToString();

                // Code Create Moniker for second Entity: New_CustomEntity
                Moniker Moniker2 = new Moniker();
                Moniker2.Id = leadid;
                Moniker2.Name = EntityName.new_project.ToString();

                string strManyToManyRelationshipName = "new_new_project_contactId"; 

                RetrieveMultipleRequest request = new RetrieveMultipleRequest();
                request.Query = query;
                request.ReturnDynamicEntities = false;

                RetrieveMultipleResponse response = (RetrieveMultipleResponse)crmservice.Execute(request);}}


  public bool AssociateManyToManyEntityRecords(Moniker Moniker1, Moniker Moniker2, string strEntityRelationshipName){
    try
    {
        // Create an AssociateEntities request.
        AssociateEntitiesRequest request = new AssociateEntitiesRequest();


        // Set the ID of Moniker1 to the ID of the lead.
        request.Moniker1 = Moniker1;  


        // Set the ID of Moniker2 to the ID of the contact.
        request.Moniker2 = Moniker2; 


        // Set the relationship name to associate on.
        request.RelationshipName = strEntityRelationshipName;


        // Execute the request.
        service.Execute(request); 


        return true;
    }  


    catch (SoapException ex)
    {
        return false;
    }

}
    }
        #endregion IPlugin Members
}
ps. Программист из меня фиговый, работаю системным администратором, нашего прогера, к моему большому горю и сожалению сократили, теперь его адцкую работу приходится делать мне, сейчас активно курю маны по шарпу, в дальнейшем научусь я думаю, просто этот функционал надо срочно, а я тока 3 дня назад приступил к обязанностям программиста.
У вас нет кода, который позволит вычитывать из базы проекты, связанные с лидом. Код должен быть примерно такой:

Код:
using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.Crm.Sdk;
using Microsoft.Crm.SdkTypeProxy;
using Microsoft.Crm.Sdk.Query;
using System.Web.Services.Protocols;

namespace LeadConversionPlugin
{
    public class ContactCreationHandler : IPlugin
    {
        #region IPlugin Members

        public void Execute(IPluginExecutionContext context)
        {
            if (context.MessageName == MessageName.Create &&
                context.InputParameters.Contains("Target") &&
                context.InputParameters["Target"] is DynamicEntity)
            {
                DynamicEntity entity = (DynamicEntity)context.InputParameters["Target"];

                //Проверяем является ли значение контактом
                if (entity.Name != EntityName.contact.ToString())
                    return;
                // Проверяем есть ли у контакта связь с интересом
                if (!entity.Properties.Contains("originatingleadid"))
                    return;

                //Получаем Guid интереса
                Guid leadid = ((Lookup)entity["originatingleadid"]).Value;

                //получаем Guid контакта
                Guid contactid = (Guid)context.OutputParameters["Id"];

                ICrmService crmservice = context.CreateCrmService(true);


                QueryExpression relationshipCheckQuery = new QueryExpression();
                relationshipCheckQuery.EntityName = "new_project";
                relationshipCheckQuery.ColumnSet = new ColumnSet(new string[] { "new_projectid" });

                LinkEntity link = relationshipCheckQuery.AddLink("<название связи N:N между проектом и лидом>", "new_projectid", "new_projectid");
                link.LinkCriteria.AddCondition("leadid", ConditionOperator.Equal, leadid);

                RetrieveMultipleRequest request = new RetrieveMultipleRequest();
                request.Query = relationshipCheckQuery;
                request.ReturnDynamicEntities = true;

                List<BusinessEntity> list = ((RetrieveMultipleResponse)crmservice.Execute(request)).BusinessEntityCollection.BusinessEntities;

                foreach (DynamicEntity de in list)
                {
                    AssociateEntitiesRequest assrequest = new AssociateEntitiesRequest();
                    assrequest.Moniker1 = new Moniker("contact", contactid);
                    assrequest.Moniker2 = new Moniker("new_project", ((Key)de["new_projectid"]).Value);
                    assrequest.RelationshipName = "<название связи N:N между проектом и контактом>";
                    crmservice.Execute(assrequest);
                }
            }
        }

    }
        #endregion IPlugin Members
}
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством.

Подписывайтесь на мой блог, twitter и YouTube канал.
Пользуйтесь моим Ultimate Workflow Toolkit
Теги
бизнес-партнер, интересы, контакт, связанные сущности, связь n:n, связи

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Создание контактов при дисквалификации интереса Dekan Dynamics CRM: Разработка 17 02.10.2014 18:44
Неизвестная ошибка при преобразовании интереса в сделку Dicora Dynamics CRM: Администрирование 5 13.07.2010 16:59
Преобразование интереса и пользовательские объекты Mycroft Dynamics CRM: Разработка 2 13.04.2010 08:04
Изменение владельца "Интереса" CRM 3.0 Gogus Dynamics CRM: Функционал 3 20.08.2008 19:32
создание интереса SKYNET! Dynamics CRM: Разработка 8 16.08.2008 14:40

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 03:35.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.