|
|
#1 |
|
Участник
|
Простой вопрос по плагину
Пишу плагин первый раз. Задача следующая: при создании 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);
}
}
}Там выбираю соответственно: productid, pricelevelid, defaultuomscheduleid, price. В таком виде плагин не работает, возможно проблема в decimal price... Подскажите, если ошибка очевидна, пожалуйста. PluginsConfig.xml: Код: <config> <server>crm</server> <organization>Company</organization> </config> Последний раз редактировалось Krom; 15.03.2010 в 19:16. |
|
|
|
|
#2 |
|
Чайный пьяница
|
Попробуйте строки
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;
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
|
|
|
#3 |
|
Участник
|
Krom, у вас вообще не правильный подход к написанию плагина. Посмотрите вот эту статью SDK http://technet.microsoft.com/en-us/l.../cc151102.aspx, особенно обратите внимание на то, как создается экземпляр CrmService. Ваш код значительно уменьшится и проще будет найти ошибку.
|
|
|
|
|
#4 |
|
Участник
|
Кстати, строка
X++: bePriceUpdate.amount.Value = price; |
|
|
|
|
#5 |
|
Участник
|
Krom, хорошо, что вы сразу предупредили, что пишете плагин впервые. Ваш код только это и оправдывает.
![]() Разберем: Код: XmlDocument xmlConfig = new XmlDocument();
xmlConfig.Load(@"C:\WIN2003\system32\inetsrv\PluginsConfig.xml");
XmlNode rootConfig = xmlConfig.FirstChild;Но в данном случае вам конфиг не нужен вообще, поскольку вы пытаетесь извлечь оттуда имя сервера и имя организации для создании CrmService, тогда так в плагине CrmService нужно создавать из контекста, на что уже справедливо обратил внимание ZooY. Затем: Код: Lookup lookupPrice = new Lookup();
lookupPrice.Value = ((SDK::Lookup)currentPrice.Properties["pricelevelid"]).ValueИ вот: Код: bePriceUpdate.amount.Value = price; В данном случае надо было сначала написать: Код: bePriceUpdate.amount = new CrmMoney(); |
|
|