locked
Semi-new to CRM. Need to develop a plug-in to stop a business process and stop from saving. RRS feed

  • Question

  • I have written a few scripts for CRM and I have experience with C#.

    I am trying to write a plugin in the SDK. I have to conditions that I need to check in an Order entity. If neither of those conditions are met, the next step is to check a Product status in the Order Product entity, alert the user to the problem and not the let the user save until the issue is resolved. I feel like I am close, but I am missing something. Any help iis appreciated. Thank you in advance.

    // <copyright file="PreOrderUpdate.cs" company="">
    // Copyright (c) 2014 All Rights Reserved
    // </copyright>
    // <author></author>
    // <date>5/9/2014 11:39:16 AM</date>
    // <summary>Implements the PreOrderUpdate Plugin.</summary>
    // <auto-generated>
    //     This code was generated by a tool.
    //     Runtime Version:4.0.30319.1
    // </auto-generated>
    
    using System.Windows.Forms;
    using System.ServiceModel;
    using Microsoft.Xrm.Sdk;
    
    namespace NABC_CRM_Plugins
    {
        
    
        /// <summary>
        /// PreOrderUpdate Plugin.
        /// Fires when the following attributes are updated:
        /// xrm_orderstagecode,xrm_ordertype
        /// </summary>    
        public class PreOrderUpdate : Plugin
        {
            /// <summary>
            /// Alias of the image registered for the snapshot of the 
            /// primary entity's attributes before the core platform operation executes.
            /// The image contains the following attributes:
            /// xrm_orderstagecode,xrm_ordertype
            /// </summary>
            private const string PreImageAlias = "preorder";
    
            /// <summary>
            /// Initializes a new instance of the <see cref="PreOrderUpdate"/> class.
            /// </summary>
            public PreOrderUpdate()
                : base(typeof (PreOrderUpdate))
            {
                base.RegisteredEvents.Add(new Tuple<int, string, string, Action<LocalPluginContext>>(20, "Update",
                    "salesorder", new Action<LocalPluginContext>(ExecutePreOrderUpdate)));
    
                // Note : you can register for more events here if this plugin is not specific to an individual entity and message combination.
                // You may also need to update your RegisterFile.crmregister plug-in registration file to reflect any change.
            }
    
            /// <summary>
            /// Executes the plug-in.
            /// </summary>
            /// <param name="localContext">The <see cref="Plugin.LocalPluginContext"/> which contains the
            /// <see cref="IPluginExecutionContext"/>,
            /// <see cref="IOrganizationService"/>
            /// and <see cref="ITracingService"/>
            /// </param>
            /// <remarks>
            /// For improved performance, Microsoft Dynamics CRM caches plug-in instances.
            /// The plug-in's Execute method should be written to be stateless as the constructor
            /// is not called for every invocation of the plug-in. Also, multiple system threads
            /// could execute the plug-in at the same time. All per invocation state information
            /// is stored in the context. This means that you should not use global variables in plug-ins.
            /// </remarks>
            protected void ExecutePreOrderUpdate(LocalPluginContext localContext)
            {
                if (localContext == null)
                {
                    throw new ArgumentNullException("localContext");
                }
    
                IPluginExecutionContext context = localContext.PluginExecutionContext;
    
                Entity preImageEntity = (context.PreEntityImages != null &&
                                         context.PreEntityImages.Contains(PreImageAlias))
                    ? context.PreEntityImages[PreImageAlias]
                    : null;
    
                var orderType = Xrm.Page.getAttribute("xrm_ordertype").getValue();
                var orderStateCode = Xrm.Page.getAttribute("statecode").getValue();
    
                
                 int totalCount;
                    
                
                string fetchXml = null;
    
                if (orderType == "Fundraising" || orderStateCode == "Fufilled") return;
    
               
                try
                {
                    {
                        strDebug = "101";
    
                        Entity orderEntity = service.Retrieve("salesorderdetail", orderId,
                            new ColumnSet(new string[] {"salesorderid", "New_Status"}));
    
    
                        EntityCollection unresolvedProductCount = service.RetrieveMultiple(new FetchExpression(fetchXml));
    
    
                        if (unresolvedProductCount.Entities.Count > 0)
                        {
                            totalCount = ((AliasedValue) unresolvedProductCount.Entities[0]["product_count"]).Value;
                        }
    
                        fetchXml = "<fetch version='1.0' output-format='xml-platform' mapping='logical'distinct='false'>";
                        fetchXml += "<entity name='salesorderdetail'>";
                        fetchXml += "<attribute name='productid'/>";
                        fetchXml += "<attribute name='productdescription'/>";
                        fetchXml += "<attribute name='priceperunit'/>";
                        fetchXml += "<attribute name='quantity'/>";
                        fetchXml += "<attribute name='extendedamount'/>";
                        fetchXml += "<attribute name='alesorderdetailid'/>";
                        fetchXml += "<order attribute='productid' descending='false'/>";
                        fetchXml += "<filter type=and>";
    
                        fetchXml += "<condition attribute='new_status' operator='in'>";
                        fetchXml += "<value>1</value>";
                        fetchXml += "<value>163650000</value>";
                        fetchXml += "</condition>";
                        fetchXml += "</filter>";
                        fetchXml += "</entity>";
                        fetchXml += "</fetch>";
    
                        unresolvedProductCount = service.RetrieveMultiple(new FetchExpression(fetchXml));
    
    
                        if (unresolvedProductCount.Entities.Count > 0)
                            MessageBox.Show(string.Format("Please up date all product status before continuing"));
    
                        throw new InvalidPluginExecutionException("Total: ");
                    }
                }
                catch (e)
                {
                    consoleLog("Error in " + e.message);
                }
            }
        }
    }

    Sunday, May 11, 2014 8:00 PM

All replies

  • Hi,

    var orderType = Xrm.Page.getAttribute("xrm_ordertype").getValue();
                var orderStateCode = Xrm.Page.getAttribute("statecode").getValue();

    Above code is JS code you need to write, so you need to convert it like below

    //assuming it will be an optionset

    var orderType=preImageEntity.GetAttributeValue<OptionSetValue>("yourfieldname").Value;

    var orderStateCode=preImageEntity.GetAttributeValue<OptionSetValue>("statecode").Value;

    Remember both above line will return value, not string so if you want to get text for this value you need to write another function check this post for sample code

    Our Website | Our Blog | Follow US | My Facebook Page | Microsoft Dynamics CRM 2011 Application Design
    Make sure to "Vote as Helpful" and "Mark As Answer",if you get answer of your question.

    Monday, May 12, 2014 4:05 AM
    Moderator