Скажите пожалуйста в чем может быть проблема: плагин работает(как видно из темы) на создании Продукта для Заказа. Изначально плагин обсуждался в
этой теме.
Я его тестировал на 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;
}
}
}