0

見積もりを保存する前に検証するプラグインを作成しています。見積製品ラインが必要であることを強制したい

見積もりがアクティブ化、落札、または紛失する前の見積もり上のアイテム。ドラフト モードには、この要件はありません。

次のコードを書きましたが、リボンの [見積もりを閉じる] ボタンを押してWon理由として選択すると、ビジネス プロセス エラー ボックスにエラー メッセージが表示されます。

ただし、エラー メッセージを閉じてページを更新すると、見積はクローズ済みに設定されます。例外がスローされたにもかかわらず、見積もりが閉じられるのはなぜですか?

参考までに、プラグインの段階は操作前に設定されています。

これが私のソースコードです(2017年10月2日更新):

using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Query;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ValbrunaPlugins
{
    public class QuoteValidation : IPlugin
    {
        private ITracingService tracingService;

        public void Execute(IServiceProvider serviceProvider)
        {

            // retrieve the context, factory, and service
            IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
            IOrganizationServiceFactory factory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
            IOrganizationService service = factory.CreateOrganizationService(context.UserId);

            bool isCorrectEvent = context.MessageName == "SetStateDynamicEntity" || context.MessageName == "SetState" || context.MessageName == "Win" || context.MessageName == "Close";
            bool hasEnityMoniker = context.InputParameters.Contains("EntityMoniker");

            // ensure we are handling the correct event and we were passed an entity from the context
            if (!isCorrectEvent || !hasEnityMoniker) return;
            // get the reference to the quote entity
            EntityReference quoteEntityReference = (EntityReference)context.InputParameters["EntityMoniker"];

            Entity quoteEntity = null;
            try
            {
                // get the quote entity from the entity reference
                quoteEntity = ActualEntity.GetActualEntity(quoteEntityReference, service);
            } catch (Exception ex)
            {
                throw new InvalidPluginExecutionException("Quote with id " + quoteEntityReference.Id + " not found.");
            }

            // ensure that we have the correct entity
            if (quoteEntity.LogicalName != "quote") return;

            // write query to retrieve all the details for this quote
            QueryExpression retrieveQuoteDetailsQuery = new QueryExpression
            {
                EntityName = "quotedetail",
                ColumnSet = new ColumnSet(),
                Criteria = new FilterExpression
                {
                    Conditions =
                        {
                            new ConditionExpression
                            {
                            AttributeName = "quoteid",
                            Operator = ConditionOperator.Equal,
                            Values = { (Guid)quoteEntity.Id }
                            }
                        }
                }
            };

            // execute the query to retrieve the details for this quote
            EntityCollection quoteDetails = service.RetrieveMultiple(retrieveQuoteDetailsQuery);

            // retrieve the current status of the quote
            // 0 - Draft
            // 1 - Active
            // 2 - Won
            // 3 - Closed
            int quoteStatus = ((OptionSetValue)(quoteEntity.Attributes["statecode"])).Value;

            // if not in draft mode
            if (quoteStatus != 0)
            {
                // if the amount of details for the quote is less than 1
                if (quoteDetails.Entities.Count < 1)
                {
                    throw new InvalidPluginExecutionException("There must be a quote product line item on a quote before a quote can be activated, won, or lost while not in draft mode.");
                }
            }
        }

    }
}

2017 年 10 月 2 日更新:

SetState の別のステップを作成し、ソース コードを更新しました。

SetState

しかし、私はまだ同じ問題を抱えています。見積もりを閉じるとエラーが表示されますが、ページを更新すると、見積もりがクローズに設定されています。

見積もりを閉じる

注意: 見積もりはアクティブですが、見積もりの​​詳細がないため、見積もりを獲得することはできません。

例外は正常に表示されます。

本来あるべきビジネス プロセス エラーが表示されます。しかし、ページを更新すると、見積もりの​​ステータスが「クローズ」に設定されています。例外がスローされた場合、なぜこれを行ったのですか?

見積もりは終了しました。

4

1 に答える 1

1

SetStateとメッセージの両方のプラグイン ステップを登録する必要がありSetStateDynamicEntityます。

参照

SetState と SetStateDynamicEntity を別々に登録する必要があるのはなぜですか?
前述したように、CRM には同じアクションを実行する複数のメッセージがあります。そのような例の 1 つが SetStateRequest と SetStateDyanmicEntityRequest です。SetState でプラグインを作成する場合は、両方のメッセージに登録する必要があります。

続きを読む

于 2017-09-27T22:52:54.067 に答える