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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 15.03.2010, 19:11   #1  
Krom is offline
Krom
Участник
 
28 / 10 (1) +
Регистрация: 10.02.2010
Простой вопрос по плагину
Пишу плагин первый раз. Задача следующая: при создании product создавать и прикреплять productpricelevel
Код такой
Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml;
using System.Text;
using SDK = Microsoft.Crm.Sdk;
using SDKType = Microsoft.Crm.SdkTypeProxy;
using Prodd.CrmSdk;

namespace Prodd
{
    public class Class1 : SDK::IPlugin
    {
        public void Execute(SDK::IPluginExecutionContext context)
        {
            XmlDocument xmlConfig = new XmlDocument();
            xmlConfig.Load(@"C:\WIN2003\system32\inetsrv\PluginsConfig.xml");
            XmlNode rootConfig = xmlConfig.FirstChild;

            string serverName = rootConfig["server"].InnerText;
            string orgName = rootConfig["organization"].InnerText;

            CrmAuthenticationToken token = new CrmAuthenticationToken();
            token.AuthenticationType = 0;
            token.OrganizationName = orgName;
            CrmService service = new CrmService();
            service.Url = "http://" + serverName + "/mscrmservices/2007/CrmService.asmx";
            service.CrmAuthenticationTokenValue = token;
            service.Credentials = System.Net.CredentialCache.DefaultCredentials;
            //-----------------------------------------------------------------------------------------

            SDK::DynamicEntity currentPrice = context.PostEntityImages["Prod"] as SDK::DynamicEntity;
            // Продукт
            Lookup lookupProduct = new Lookup();
            lookupProduct.Value = ((SDK::Lookup)currentPrice.Properties["productid"]).Value;
            // Прайс-лист
            Lookup lookupPrice = new Lookup();
            lookupPrice.Value = ((SDK::Lookup)currentPrice.Properties["pricelevelid"]).Value;           
            // Единица измерения
            Lookup lookupUom = new Lookup();
            lookupUom.Value = ((SDK::Lookup)currentPrice.Properties["defaultuomscheduleid"]).Value;

            decimal price = ((SDK::CrmMoney)currentPrice.Properties["price"]).Value;
            if (((SDK::CrmMoney)currentPrice.Properties["price"]) == null)
                price = 0;
            //создаем прайс-лист
            productpricelevel bePriceUpdate = new productpricelevel();
            bePriceUpdate.amount.Value = price;
            bePriceUpdate.productid = lookupProduct;
            bePriceUpdate.pricelevelid = lookupPrice;
            bePriceUpdate.uomid = lookupUom;
            service.Create((BusinessEntity)bePriceUpdate);
        }
    }
}
PostEntityImages["Prod"] слепок данных в plugin registration tool.
Там выбираю соответственно: productid, pricelevelid, defaultuomscheduleid, price.
В таком виде плагин не работает, возможно проблема в decimal price...
Подскажите, если ошибка очевидна, пожалуйста.

PluginsConfig.xml:
Код:
<config>
 <server>crm</server>
 <organization>Company</organization>  
</config>

Последний раз редактировалось Krom; 15.03.2010 в 19:16.
Старый 15.03.2010, 19:31   #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
Попробуйте строки

X++:
decimal price = ((SDK::CrmMoney)currentPrice.Properties["price"]).Value;
if (((SDK::CrmMoney)currentPrice.Properties["price"]) == null)
     price = 0;
поменять на

X++:
decimal price = 0;
if (currentPrice.Properties->Contains("price"))
      price = ((SDK::CrmMoney)currentPrice.Properties["price"]).Value;
По поводу вызова метода - Contains если ошибся с синтаксисом - поправьте. Всё таки на C# пишу.
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством.

Подписывайтесь на мой блог, twitter и YouTube канал.
Пользуйтесь моим Ultimate Workflow Toolkit
Старый 15.03.2010, 21:31   #3  
ZooY is offline
ZooY
Участник
Аватар для ZooY
 
379 / 46 (2) +++
Регистрация: 24.06.2008
Адрес: Россия, Москва
Krom, у вас вообще не правильный подход к написанию плагина. Посмотрите вот эту статью SDK http://technet.microsoft.com/en-us/l.../cc151102.aspx, особенно обратите внимание на то, как создается экземпляр CrmService. Ваш код значительно уменьшится и проще будет найти ошибку.
Старый 15.03.2010, 21:40   #4  
ZooY is offline
ZooY
Участник
Аватар для ZooY
 
379 / 46 (2) +++
Регистрация: 24.06.2008
Адрес: Россия, Москва
Кстати, строка
X++:
bePriceUpdate.amount.Value = price;
наверняка вернет ошибку, потому что присваивается значение объекту, экземпляр которого еще не создан.
Старый 16.03.2010, 11:32   #5  
Гуревич Денис is offline
Гуревич Денис
Участник
Лучший по профессии 2009
 
228 / 67 (3) ++++
Регистрация: 04.08.2008
Адрес: Москва
Krom, хорошо, что вы сразу предупредили, что пишете плагин впервые. Ваш код только это и оправдывает.
Разберем:
Код:
            XmlDocument xmlConfig = new XmlDocument();
            xmlConfig.Load(@"C:\WIN2003\system32\inetsrv\PluginsConfig.xml");
            XmlNode rootConfig = xmlConfig.FirstChild;
Какую-либо конфигурацию плагина лучше хранить в Unsecure или Secure Configuration, которая указывается при регистрации step'а плагина и при выполнении передается параметром в конструктор плагина.
Но в данном случае вам конфиг не нужен вообще, поскольку вы пытаетесь извлечь оттуда имя сервера и имя организации для создании CrmService, тогда так в плагине CrmService нужно создавать из контекста, на что уже справедливо обратил внимание ZooY.

Затем:
Код:
            Lookup lookupPrice = new Lookup();
            lookupPrice.Value = ((SDK::Lookup)currentPrice.Properties["pricelevelid"]).Value
При создании лукапов надо еще указывать type.

И вот:
Код:
bePriceUpdate.amount.Value = price;
Это, конечно, ошибка, т.к. таким простым способом можно присваивать значения только атрибутам с типом string.
В данном случае надо было сначала написать:
Код:
bePriceUpdate.amount = new CrmMoney();
И зачем нужна мешанина из нэймспейсов, я вообще не понял.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Простой и глупый вопрос по бизнес-процессу miraj Dynamics CRM: Администрирование 27 05.03.2010 16:42
Казалось бы простой вопрос a__ Dynamics CRM: Разработка 6 29.01.2010 12:02
Вопрос от новичка, вопрос про оповещение по электронной почте при создание любого события. echo_igor Dynamics CRM: Прочие вопросы 2 15.06.2009 11:07
Простой вопрос Apossum Dynamics CRM: Администрирование 1 19.08.2008 19:00

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

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

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