CRM 2013更新报价产品部分

时间:2014-11-27 13:58:33

标签: dynamics-crm-2013

是否有人试图创建一个插件来更新报价产品表单中的记录值?我创建了一个,因为我需要一个计算扩展金额字段的自定义公式,但CRM中有自动计算来填充这些字段。这根本不允许我更新计算公式。

我的插件的作用是:

  1. 从每单位价格,数量和折扣%(自定义字段)字段中获取值;
  2. 计算我需要的值;
  3. 将其设置为扩展金额字段。
  4. 但是,这一切都不起作用,因为我得到了一个"业务流程错误&#34 ;; 基本上这个错误告诉我,我不能使用记录的guid来访问它。

    这是我的代码:

    protected void ExecutePostQuoteProductUpdate(LocalPluginContext localContext)
        {
            if (localContext == null)
            {
                throw new ArgumentNullException("localContext");
            }
    
            IPluginExecutionContext context = localContext.PluginExecutionContext;
            IOrganizationService service = localContext.OrganizationService;
    
            Guid quoteProductID = (Guid)((Entity)context.InputParameters["Target"]).Id;
            ColumnSet set = new ColumnSet();
            set.AllColumns = true;
    
            var quote = service.Retrieve("quotedetail", quoteProductID, set);
            var priceperunit = quote.Attributes["priceperunit"];
            var teamleader = quote.Attributes["new_disc"];
            var manualdiscountamount = quote.Attributes["manualdiscountamount"];
            var volumediscountamount = quote.Attributes["volumediscountamount"];
            var VAT = (int)quote.Attributes["new_vat"];
    
            var discountamount = (double)priceperunit * (double)teamleader / 100;
            var baseamount = (double)priceperunit - discountamount;
            var tax = baseamount * VAT / 100;
            var extendedamount = baseamount + tax;
            quote.Attributes["new_discountamount"] = discountamount;
            quote.Attributes["baseamount"] = baseamount;
            quote.Attributes["tax"] = tax;
            quote["description"] = priceperunit;
            quote.Attributes["extendedamount"] = extendedamount;
            service.Update(quote);
    
    
        }
    

    请告诉我是否有办法访问这些字段并使用/设置它们。

    提前致谢! :/

1 个答案:

答案 0 :(得分:0)

您无法直接更新extendedamount - 相反,如果您使用自动计算的内置字段,则CRM会为您处理此问题。

这些字段为:baseamountquantitydiscountamounttax。这些是Money字段,因此您需要将它们存储为:

quote.Attributes["baseamount"] = new Money(baseamount); // Money and decimal numbers use the "decimal" datatype and not double.

对于您的自定义计算,您只需将自定义字段中存储的百分比转换为实际数量,并将其分配给discountamount属性。类似的东西:

var discountamount = (decimal)priceperunit * (decimal)teamleader / 100;
// Assigning the actual discount amount will automatically recalculate the extended amount on the line.
// No need to recalculate all fields. 
quote.Attributes["discountamount"] = new Money(discountamount);

请注意,可能需要重新计算tax以反映折扣,但该过程应该完全相同。