0

我有一个自定义工作流活动,它在删除作为父子关系中的子实体的实体时执行。

删除父实体时,会出现数据库错误。

我尝试在运行工作流之前检查父实体不为空,但删除子实体时它不为空;CRM 必须先删除子项。

我已经实现了自己的机会产品实体(称为机会线)。
当创建、更改或删除机会线时,将执行同步的自定义工作流活动。
工作流在商机产品(原始实体)中创建一个隐藏写入,其收入等于所有商机线的总和;这样做是为了让系统计算估算收入。我尝试直接更新 est.收入字段,但在将机会设置为系统计算时遇到问题。

/* Deletes all Opportunity Products for this Opportunity and adds a single write in product
 * with the amount equal to the sum of all Opportunity lines
 * If the current message is delete then do not include the current record in the calculation
 * */
private void UpdateOpportunity(WorkflowContext context) // WorkflowContext contains everything retrieved from the CodeActivityContext
{
    if (context.TargetReference != null || context.Target.Contains("wl_revenue")) // this is a delete or revenue update (or new record)
    {                
        var linq = context.Linq;
        var service = context.Service;
        var lineId = (context.Target != null) ? context.Target.Id : context.TargetReference.Id; // context contains Target and TargetReference, Target is an entity and TargetReference is an Entity Reference, one is always not null
        var opp = linq.wl_opportunitylineSet
            .Where(line => line.Id == lineId)
            .Select(line => line.wl_Opportunity)
            .FirstOrDefault();
        if (opp != null)
        {
            var oppId = opp.Id;
            if (oppId != null)
            {
                var lineAmounts = from line in linq.wl_opportunitylineSet
                                    where line.wl_Opportunity.Equals(oppId)
                                    where line.Id != lineId // The current line cannot be retrieved as it is the record in the transaction
                                    select line.wl_Revenue;
                decimal revenue = (context.Target != null && context.Target.Contains("wl_revenue"))
                    ? context.Target.GetAttributeValue<Money>("wl_revenue").Value : 0; // add the amount for this line if it just changed or was created
                foreach (var amount in lineAmounts)
                    revenue += (amount != null) ? amount.Value : 0;
                var oppProducts = from line in linq.OpportunityProductSet
                                    where line.OpportunityId.Equals(oppId)
                                    select line.Id;
                foreach (var line in oppProducts) // there should be 0 or 1
                    service.Delete(OpportunityProduct.EntityLogicalName, line);
                service.Create(new OpportunityProduct
                {
                    IsPriceOverridden = true,
                    IsProductOverridden = true,
                    ProductDescription = "Income",
                    OpportunityId = opp,
                    PricePerUnit = new Money(revenue),
                    Quantity = 1
                });
            }
        }
    }
}

这适用于所有情况,除非父商机本身被删除。是否应该以另一种方式完成,或者如果它是被删除的机会,工作流是否有可能不执行,作为对单个行的姿势?

我必须有一个自定义的机会线,主要是因为机会产品不能用于任何自定义的 1:N 关系。

4

1 回答 1

0

首先,尝试检查工作流的执行深度:

if(context.Depth > 1)
    return;

我认为如果工作流是由 Opportunity 删除事件触发的,那么你的工作流深度应该大于 1。

如果不行,可以在 Opportunity 中创建一个检查字段,说is_deleted(是/否,默认为 no),然后在 Opportunity 操作前删除中创建一个插件将该字段更新为 yes。之后,在您的工作流代码中,您应该检索并检查此字段,如果 Opportunityis_deleted为 yes 则返回,无需更新收入。

关于东部时间。机会中的收入,我认为如果您使用手动计算而不是系统计算,它会更好,更容易。您可以更新 Est。收入直接在您的代码中,不需要使机会产品(原始)实体复杂化。

于 2014-11-10T04:09:21.807 回答