10.08.2010, 15:25 | #1 |
Участник
|
Create of salesorderdetail in ChildPipeline
Скажите пожалуйста в чем может быть проблема: плагин работает(как видно из темы) на создании Продукта для Заказа. Изначально плагин обсуждался в этой теме.
Я его тестировал на Update salesorderdetail все нормально. Но при создании Заказа из КП выдает ошибку sql server. Если поставить parent Pipeline, то ошибок не будет, но и плагин не отработает. На всякий случай вот код: Код: using System; using System.Collections.Generic; using Microsoft.Win32; using System.Linq; using System.Text; using SDK = Microsoft.Crm.Sdk; using UpdateSalesOrderDetail.CrmSdk; namespace UpdateSalesOrderDetail { public class onSalesOrderDetailCreate : SDK::IPlugin { public void Execute(SDK.IPluginExecutionContext context) { CrmService service = CreateCrmService(context, true); SDK::DynamicEntity currentSo = context.PostEntityImages["SoDe"] as SDK::DynamicEntity; try { #region вытаскиваем salesorder, BusinessEntity[] bussQ ColumnSet colsQ = new ColumnSet() { Attributes = new string[] { "quoteid" } }; ConditionExpression condQ = new ConditionExpression() { AttributeName = "salesorderid", Operator = ConditionOperator.Equal, Values = new object[] { ((SDK::Lookup)currentSo.Properties["salesorderid"]).Value.ToString() } }; FilterExpression filtQ = new FilterExpression() { Conditions = new ConditionExpression[] { condQ } }; QueryExpression queryQ = new QueryExpression() { ColumnSet = colsQ, EntityName = EntityName.salesorder.ToString(), Criteria = filtQ }; BusinessEntity[] bussQ = service.RetrieveMultiple(queryQ).BusinessEntities; #endregion #region вытаскиваем все quotedetail, BusinessEntity[] buss ColumnSet cols = new ColumnSet() { Attributes = new string[] { "new_display", "new_wholeamount", "productid", "priceperunit", "new_namerus", "new_koef", "new_sum_koef" } }; ConditionExpression cond = new ConditionExpression() { AttributeName = "quoteid", Operator = ConditionOperator.Equal, Values = new object[] { ((salesorder)bussQ[0]).quoteid.Value } }; FilterExpression filt = new FilterExpression() { Conditions = new ConditionExpression[] { cond } }; OrderExpression order = new OrderExpression() { AttributeName = "productid", OrderType = OrderType.Descending }; QueryExpression query = new QueryExpression() { ColumnSet = cols, EntityName = EntityName.quotedetail.ToString(), Criteria = filt, Orders = new OrderExpression[] { order } }; BusinessEntity[] buss = service.RetrieveMultiple(query).BusinessEntities; #endregion //-----------------------------------------------------------------------------// #region вытаскиваем все salesorderdetail, BusinessEntity[] bussSp ColumnSet colsSp = new ColumnSet() { Attributes = new string[] { "productid", "quantity" } }; ConditionExpression condSp = new ConditionExpression() { AttributeName = "salesorderid", Operator = ConditionOperator.Equal, Values = new object[] { ((SDK::Lookup)currentSo.Properties["salesorderid"]).Value } }; FilterExpression filtSp = new FilterExpression() { Conditions = new ConditionExpression[] { condSp } }; OrderExpression orderSp = new OrderExpression() { AttributeName = "productid", OrderType = OrderType.Descending }; QueryExpression querySp = new QueryExpression() { ColumnSet = colsSp, EntityName = EntityName.salesorderdetail.ToString(), Criteria = filtSp, Orders = new OrderExpression[] { orderSp } }; BusinessEntity[] bussSp = service.RetrieveMultiple(querySp).BusinessEntities; #endregion //----------------------------------------------------------------------------// #region вытаскиваем курс пересчета из quote, BusinessEntity[] bussKp comment// ColumnSet colsKp = new ColumnSet() { Attributes = new string[] { "new_kursperesheta" } }; ConditionExpression condKp = new ConditionExpression() { AttributeName = "quoteid", Operator = ConditionOperator.Equal, Values = new object[] { ((salesorder)bussQ[0]).quoteid.Value } }; FilterExpression filtKp = new FilterExpression() { Conditions = new ConditionExpression[] { condKp } }; QueryExpression queryKp = new QueryExpression() { ColumnSet = colsKp, EntityName = EntityName.quote.ToString(), Criteria = filtKp, }; BusinessEntity[] bussKp = service.RetrieveMultiple(queryKp).BusinessEntities; #endregion var quoteKP = bussKp[0]; //=====================================================================// #region обновляем salesorderdetail int numberSalesOrder = bussSp.Length - 1; salesorderdetail salesOrderNew = new salesorderdetail(); salesOrderNew.salesorderdetailid = new Key(); salesOrderNew.salesorderdetailid.Value = ((SDK::Key)currentSo.Properties["salesorderdetailid"]).Value; salesOrderNew.new_display = new CrmNumber() { Value = ((quotedetail)buss[numberSalesOrder]).new_display.Value, }; salesOrderNew.new_priceperunit = new CrmMoney() { Value = ((quotedetail)buss[numberSalesOrder]).priceperunit.Value * Convert.ToDecimal(((quote)quoteKP).new_kursperesheta.Value) }; salesOrderNew.new_namerus = ((quotedetail)buss[numberSalesOrder]).new_namerus; salesOrderNew.new_koef = new CrmFloat() { Value = ((quotedetail)buss[numberSalesOrder]).new_koef.Value }; salesOrderNew.new_sum_koef = new CrmMoney() { Value = salesOrderNew.new_priceperunit.Value * Convert.ToDecimal(salesOrderNew.new_koef.Value) }; salesOrderNew.new_wholeamount = new CrmMoney() { Value = salesOrderNew.new_sum_koef.Value * ((SDK::CrmDecimal)currentSo.Properties["quantity"]).Value }; service.Update(salesOrderNew); #endregion } catch (System.Web.Services.Protocols.SoapException ex) { throw new SDK::InvalidPluginExecutionException( String.Format("An error occurred in the {0} plug-in.", this.GetType().ToString()), ex); } } private CrmService CreateCrmService(SDK.IPluginExecutionContext context, Boolean flag) { CrmAuthenticationToken authToken = new CrmAuthenticationToken(); authToken.AuthenticationType = 0; authToken.OrganizationName = context.OrganizationName; if (flag) authToken.CallerId = context.UserId; else authToken.CallerId = context.InitiatingUserId; CrmService service = new CrmService(); service.CrmAuthenticationTokenValue = authToken; service.UseDefaultCredentials = true; RegistryKey regkey = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\MSCRM"); service.Url = String.Concat(regkey.GetValue("ServerUrl").ToString(), "/2007/crmservice.asmx"); return service; } } } |
|
10.08.2010, 15:31 | #2 |
Чайный пьяница
|
Сталкивался с такой проблемой. Зарегистрируйте шаг плагина на Child Pipeline + Async.
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
|
За это сообщение автора поблагодарили: Krom (1). |
10.08.2010, 16:02 | #3 |
Участник
|
Спасибо большое!
Помогло |
|
|
|