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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 27.03.2012, 17:56   #1  
mistah is offline
mistah
Участник
 
169 / 13 (1) ++
Регистрация: 11.11.2011
Адрес: Коньково
CRM 2011, вопрос по плагину
товарищи, добрый день!

подскажите, пожалуйста, по плагину.. он делает следующее - обновляет сущность new_zayavka, создает Заказ, прописывает в Заказ название, прайслист, валюту, клиента и заблокированы ли цены.
Эта часть отрабатывает как надо. Но я захотел добавить еще и продукт в этот Заказ, вот тут-то мне Плагин и выдал ошибку "the parent id is missing".

Плагин повешен на Update сущности new_zayavka, на Pre-validation.

спасибо!

X++:
Unhandled Exception: System.ServiceModel.FaultException`1[[Microsoft.Xrm.Sdk.OrganizationServiceFault, Microsoft.Xrm.Sdk, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35]]: The parent id is missing.Detail: 
<OrganizationServiceFault xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/xrm/2011/Contracts">
  <ErrorCode>-2147220970</ErrorCode>
  <ErrorDetails xmlns:d2p1="http://schemas.datacontract.org/2004/07/System.Collections.Generic" />
  <Message>The parent id is missing.</Message>
  <Timestamp>2012-03-27T13:26:50.6738765Z</Timestamp>
  <InnerFault i:nil="true" />
  <TraceText>
[ClassLibrary7: CreateSalesOrder.Order]
[64e3abde-0978-e111-af6d-000c29c05d09: CreateSalesOrder.Order: Update of new_zayavka]
Order: System.ServiceModel.FaultException`1[Microsoft.Xrm.Sdk.OrganizationServiceFault]: The parent id is missing. (     Microsoft.Xrm.Sdk.OrganizationServiceFault).
</TraceText>
</OrganizationServiceFault>

X++:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Client;
using Microsoft.Xrm.Sdk.Query;
using System.ServiceModel;
using System.ServiceModel.Description;

namespace CreateSalesOrder
{
    public class Order : IPlugin
    {
          public void Execute(IServiceProvider serviceProvider)
        {
            ITracingService tracingService =
               (ITracingService)serviceProvider.GetService(typeof(ITracingService));
            try
            {
                IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
                Entity record = (Entity)context.InputParameters["Target"];

                if (record.LogicalName == "new_zayavka")
                {
                    record["new_inn"] = "sdf";
                    record["new_name_nai"] = record["new_inn"];

                   Entity pricelevel = new Entity("pricelevel");
                   Entity currency = new Entity("transactioncurrency");
                   Entity account = new Entity("account");

                   bool vispricelocked = false;

                   Entity salesorder = new Entity("salesorder");
                   salesorder["name"] = "TEST";
                   salesorder["pricelevelid"] = new EntityReference(pricelevel.LogicalName, new Guid("156ABFBD-3704-DF11-9297-005056C00008"));
                   salesorder["transactioncurrencyid"] = new EntityReference(currency.LogicalName, new Guid("9E79B15D-1937-E111-A8B6-08002739EA86"));
                   salesorder["customerid"] = new EntityReference(account.LogicalName, new Guid("46053320-E952-E111-81DB-000C29C05D09"));
           
                   salesorder["ispricelocked"] = vispricelocked;
             
                    
           // Obtain the organization service reference.
                    IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
                    IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);
                    service.Create(salesorder);

                                           
                    Guid id_1 = new Guid(salesorder["salesorderid"].ToString());
                                        
                    Entity salesorderdetail = new Entity("salesorderdetail");
                  
                    salesorderdetail["new_orda"] = new EntityReference("salesorder", id_1);
                    Entity product = new Entity("product");
                    Entity uom = new Entity("uom");
                    salesorderdetail["productid"] = new EntityReference(product.LogicalName, new Guid("AC341411-4347-E111-9250-000C29C05D09"));
                    salesorderdetail["uomid"] = new EntityReference(uom.LogicalName, new Guid("5D15C954-A08E-DB11-934C-000E0C6AB271"));

                    IOrganizationServiceFactory serviceFactory1 = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
                    IOrganizationService service1 = serviceFactory1.CreateOrganizationService(context.UserId);
                    service1.Create(salesorderdetail);
                  
                }
            }
            catch (Exception ex)
            {
                tracingService.Trace("Order: {0}", ex.ToString());
                throw;
            }
        }
    }
}
Старый 27.03.2012, 18:12   #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
Это потому что при создании salesorderdetail вы не заполнили поле salesorderid детали.
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством.

Подписывайтесь на мой блог, twitter и YouTube канал.
Пользуйтесь моим Ultimate Workflow Toolkit
Старый 28.03.2012, 09:30   #3  
mistah is offline
mistah
Участник
 
169 / 13 (1) ++
Регистрация: 11.11.2011
Адрес: Коньково
a33ik, спасибо, исправил, но теперь он пишет, что это значение Null:
его надо отделить в другой плагин на post-operation? при выполнении плагина Заказ создается, но после этого CRM говорит, что salesorderdetail думает, что salesorderid из этой сущности Null

X++:
Unhandled Exception: System.ServiceModel.FaultException`1[[Microsoft.Xrm.Sdk.OrganizationServiceFault, Microsoft.Xrm.Sdk, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35]]: Attribute: salesorderid cannot be set to NULLDetail: 
<OrganizationServiceFault xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/xrm/2011/Contracts">
  <ErrorCode>-2147220989</ErrorCode>
  <ErrorDetails xmlns:d2p1="http://schemas.datacontract.org/2004/07/System.Collections.Generic" />
  <Message>Attribute: salesorderid cannot be set to NULL</Message>
  <Timestamp>2012-03-28T05:19:56.3402878Z</Timestamp>
  <InnerFault i:nil="true" />
  <TraceText>
[ClassLibrary7: CreateSalesOrder.Order]
[64e3abde-0978-e111-af6d-000c29c05d09: CreateSalesOrder.Order: Update of new_zayavka]
Order: System.ServiceModel.FaultException`1[Microsoft.Xrm.Sdk.OrganizationServiceFault]: Attribute: salesorderid cannot be set to NULL (     Microsoft.Xrm.Sdk.OrganizationServiceFault).
</TraceText>
</OrganizationServiceFault>
X++:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Client;
using Microsoft.Xrm.Sdk.Query;
using System.ServiceModel;
using System.ServiceModel.Description;

namespace CreateSalesOrder
{
    public class Order : IPlugin
    {
          public void Execute(IServiceProvider serviceProvider)
        {
            ITracingService tracingService =
               (ITracingService)serviceProvider.GetService(typeof(ITracingService));
            try
            {
                IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
                Entity record = (Entity)context.InputParameters["Target"];

                if (record.LogicalName == "new_zayavka")
                {
                    record["new_inn"] = "sdf";
                    record["new_name_nai"] = record["new_inn"];

                   Entity pricelevel = new Entity("pricelevel");
                   Entity currency = new Entity("transactioncurrency");
                   Entity account = new Entity("account");

                   bool vispricelocked = false;

                   Entity salesorder = new Entity("salesorder");
                   salesorder["name"] = "TEST";
                   salesorder["pricelevelid"] = new EntityReference(pricelevel.LogicalName, new Guid("156ABFBD-3704-DF11-9297-005056C00008"));
                   salesorder["transactioncurrencyid"] = new EntityReference(currency.LogicalName, new Guid("9E79B15D-1937-E111-A8B6-08002739EA86"));
                   salesorder["customerid"] = new EntityReference(account.LogicalName, new Guid("46053320-E952-E111-81DB-000C29C05D09"));
           
                   salesorder["ispricelocked"] = vispricelocked;
             
                    
           // Obtain the organization service reference.
                    IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
                    IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);
                    service.Create(salesorder);

                                           
                    Guid id_1 = new Guid(salesorder["salesorderid"].ToString());
                                        
                    Entity salesorderdetail = new Entity("salesorderdetail");
                  
                    salesorderdetail["new_orda"] = new EntityReference("salesorder", id_1);
                    salesorderdetail["salesorderid"] = salesorder["salesorderid"];
                    Entity product = new Entity("product");
                    Entity uom = new Entity("uom");
                    salesorderdetail["productid"] = new EntityReference(product.LogicalName, new Guid("AC341411-4347-E111-9250-000C29C05D09"));
                    salesorderdetail["uomid"] = new EntityReference(uom.LogicalName, new Guid("5D15C954-A08E-DB11-934C-000E0C6AB271"));

                    IOrganizationServiceFactory serviceFactory1 = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
                    IOrganizationService service1 = serviceFactory1.CreateOrganizationService(context.UserId);
                    service1.Create(salesorderdetail);
                  
                }
            }
            catch (Exception ex)
            {
                tracingService.Trace("Order: {0}", ex.ToString());
                throw;
            }
        }
    }
}
Старый 28.03.2012, 10:24   #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
Есть небольшая проблема - вы не оттуда получаете идентификатор salesorder. Попробуйте так:

Guid id_1 = service.Create(salesorder);
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством.

Подписывайтесь на мой блог, twitter и YouTube канал.
Пользуйтесь моим Ultimate Workflow Toolkit
За это сообщение автора поблагодарили: mistah (1).
Старый 28.03.2012, 11:28   #5  
mistah is offline
mistah
Участник
 
169 / 13 (1) ++
Регистрация: 11.11.2011
Адрес: Коньково
a33ik, он, видимо, теперь считает, что я пытаюсь создать еще один Заказ:

X++:
Unhandled Exception: System.ServiceModel.FaultException`1[[Microsoft.Xrm.Sdk.OrganizationServiceFault, Microsoft.Xrm.Sdk, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35]]: Cannot insert duplicate key.Detail: 
<OrganizationServiceFault xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/xrm/2011/Contracts">
  <ErrorCode>-2147220937</ErrorCode>
  <ErrorDetails xmlns:d2p1="http://schemas.datacontract.org/2004/07/System.Collections.Generic" />
  <Message>Cannot insert duplicate key.</Message>
  <Timestamp>2012-03-28T07:23:18.3667022Z</Timestamp>
  <InnerFault i:nil="true" />
  <TraceText>
[ClassLibrary7: CreateSalesOrder.Order]
[64e3abde-0978-e111-af6d-000c29c05d09: CreateSalesOrder.Order: Update of new_zayavka]
Order: System.ServiceModel.FaultException`1[Microsoft.Xrm.Sdk.OrganizationServiceFault]: Cannot insert duplicate key. (     Microsoft.Xrm.Sdk.OrganizationServiceFault).
</TraceText>
</OrganizationServiceFault>
X++:
                    IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
                    IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);
                    service.Create(salesorder);

                                           
                    Guid id_1 = service.Create(salesorder);
                                        
                    Entity salesorderdetail = new Entity("salesorderdetail");
                  
                    salesorderdetail["new_orda"] = new EntityReference("salesorder", id_1);
                    salesorderdetail["salesorderid"] = id_1;
                    Entity product = new Entity("product");
                    Entity uom = new Entity("uom");
                    salesorderdetail["productid"] = new EntityReference(product.LogicalName, new Guid("AC341411-4347-E111-9250-000C29C05D09"));
                    salesorderdetail["uomid"] = new EntityReference(uom.LogicalName, new Guid("5D15C954-A08E-DB11-934C-000E0C6AB271"));

                    IOrganizationServiceFactory serviceFactory1 = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
                    IOrganizationService service1 = serviceFactory1.CreateOrganizationService(context.UserId);
                    service1.Create(salesorderdetail);
Изображения
 
Старый 28.03.2012, 12:34   #6  
spirius is offline
spirius
Участник
 
34 / 12 (1) ++
Регистрация: 27.02.2012
Цитата:
Сообщение от a33ik Посмотреть сообщение
Есть небольшая проблема - вы не оттуда получаете идентификатор salesorder. Попробуйте так:

Guid id_1 = service.Create(salesorder);
А существует ли возможность сделать создание этих двух сущностей одновременно? (напирмер с использованием CrmServiceContext.SaveChanges() )
т.е. для создания salesorderDetail нам необходимо id salesOrder, который появиться только после создания salesOrder.
есть ли возможность как-либо связать эти две сущности, для передачи в контекст?
Старый 28.03.2012, 15:19   #7  
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
Цитата:
Сообщение от spirius Посмотреть сообщение
А существует ли возможность сделать создание этих двух сущностей одновременно? (напирмер с использованием CrmServiceContext.SaveChanges() )
т.е. для создания salesorderDetail нам необходимо id salesOrder, который появиться только после создания salesOrder.
есть ли возможность как-либо связать эти две сущности, для передачи в контекст?
Для создания чайлодовой сущности вам необходим идентивикатор парентовой. Я не пробовал, но может получиться следующий трюк (для 4.0 работал, для 2011 - не пробовал) - задайте идентификатор создаваемого SalesOrder и используйте тот же идентификатор при заполнении EntityReference salesorderid для SalesOrderDetail.
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством.

Подписывайтесь на мой блог, twitter и YouTube канал.
Пользуйтесь моим Ultimate Workflow Toolkit
Старый 28.03.2012, 11:33   #8  
g.Naukovych is offline
g.Naukovych
Участник
MCBMSS
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
405 / 130 (5) +++++
Регистрация: 23.03.2011
Может у Вас проверка на дубликаты включена?

А почему Вы пишете вот так?

salesorderdetail["new_orda"] = new EntityReference("salesorder", id_1);
salesorderdetail["salesorderid"] = id_1;

У Вас 2 ссылки на заказ должны быть из одной строки?
и разве не нужно указывать для salesorderdetail["salesorderid"] EntityReference?
__________________
Мой блог https://procrm.tv

Последний раз редактировалось g.Naukovych; 28.03.2012 в 11:35.
За это сообщение автора поблагодарили: mistah (1).
Старый 28.03.2012, 11:44   #9  
mistah is offline
mistah
Участник
 
169 / 13 (1) ++
Регистрация: 11.11.2011
Адрес: Коньково
g.Naukovych, да, спасибо, разобрался, все ок)
Старый 28.03.2012, 11:48   #10  
g.Naukovych is offline
g.Naukovych
Участник
MCBMSS
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
405 / 130 (5) +++++
Регистрация: 23.03.2011
Так что собственно было? Проверка на дубликаты или неверный код?
__________________
Мой блог https://procrm.tv
Старый 28.03.2012, 11:56   #11  
mistah is offline
mistah
Участник
 
169 / 13 (1) ++
Регистрация: 11.11.2011
Адрес: Коньково
код неправильный:
этой строкой -
service.Create(salesorder); - тут я один раз создал сущность, а потом строкой Guid id_1 = service.Create(salesorder); создаю еще одну такую же

и надо было так salesorderdetail["salesorderid"] = new EntityReference("salesorder", id_1), да
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Leon's CRM Musings: Book Review: Microsoft Dynamics CRM 2011 Administration Bible Blog bot Dynamics CRM: Blogs 0 19.12.2011 12:11
crminthefield: Overview: Microsoft Dynamics CRM 4.0 Update Rollup 19 Blog bot Dynamics CRM: Blogs 0 26.08.2011 01:13
Danny Varghese: Dynamics CRM 2011 Licensing Blog bot Dynamics CRM: Blogs 0 18.05.2011 03:15
ukcrm: CRM 4.0 Client Upgrade To CRM 2011 Blog bot Dynamics CRM: Blogs 0 23.04.2011 07:11
dynamics-community.at: Linksammlung CRM 2011 Blog bot Dynamics CRM: Blogs 0 19.01.2011 21:11

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

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

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