Monday, February 23, 2015

How to update the Parent data when child record is created/Updated/Deleted



function DisplayTotal() {


 if (Xrm.Page.ui.getFormType() == 2) 
 {
 var OpportunityId = Xrm.Page.data.entity.getId();
 var Total=0;
    if (OpportunityId != null) 
{
        var Opportunity = GetTotalLineItemValue(OpportunityId);
  if (Opportunity != null && Opportunity.length>0 && Opportunity[0].results != null && Opportunity[0].results.length>0) 
  {
for (var count = 0; count < Opportunity[0].results.length; count++) {
// alert(Opportunity[0].results[count].ExtendedAmount.Value);
Total= parseFloat(Total) + parseFloat(Opportunity[0].results[count].ExtendedAmount.Value);
          //alert(Opportunity[0].results[count].LastName);
 
}  

Xrm.Page.getAttribute("new_totalmyamt").setValue(Total);

  } 
 } 
 }
}

function GetTotalLineItemValue(OpportunityId) {
    var serverUrl = Xrm.Page.context.getServerUrl();
    
var oDataUri = serverUrl + "/xrmservices/2011/OrganizationData.svc/OpportunityProductSet?$select=ExtendedAmount&$filter=OpportunityId/Id eq guid'" + OpportunityId + "'";

    var jSonArray = new Array();

    jQuery.ajax({
        type: "GET",
        contentType: "application/json; charset=utf-8",
        datatype: "json",
        url: oDataUri,
        async: false,
        beforeSend: function (XMLHttpRequest) {
            //Specifying this header ensures that the results will be returned as JSON.            
            XMLHttpRequest.setRequestHeader("Accept", "application/json");
        },
        success: function (data, textStatus, XmlHttpRequest) {
            if (data && data.d != null) {
                jSonArray.push(data.d);
            }
        },
        error: function (XmlHttpRequest, textStatus, errorThrown) {
            alert("Error :  has occured during retrieval of the Account details");
        }
    });

    return jSonArray;
}

Thursday, February 19, 2015

How to Return Multiple Value from method





====================================================================


        private static decimal[] FetchResult(Guid OpportunityID, IOrganizationService service)
        {
            Entity postImageEntity = new Entity();
            string FetchOpportunityProduct = @" <fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false' aggregate='true'>
                        <entity name='opportunityproduct'>                        
                       <attribute name='ti_extendedenhancement' alias='totalservicecostamount_sum' aggregate='sum' />
                                <attribute name='ti_extendedserviceamount' alias='totalamount_sum' aggregate='sum'/>                        
                        <link-entity name='opportunity' from='opportunityid' to='opportunityid' alias='ab'>
                        <filter type='and'>
                       <condition attribute='opportunityid' operator='eq' value='{0}' />
                       </filter>
                       </link-entity>
                       </entity>
                        </fetch>";

            decimal TotalValue = 0; // Enhancement Amount
            decimal toatlamt = 0; // Service Amount

            FetchOpportunityProduct = string.Format(FetchOpportunityProduct, OpportunityID);
            EntityCollection result = (EntityCollection)service.RetrieveMultiple(new FetchExpression(FetchOpportunityProduct));

            if (result.Entities.Count > 0)
            {
                foreach (Entity c in result.Entities)
                {

                    if (c.Attributes.Contains("totalservicecostamount_sum"))
                    {
                        decimal aggregate2 = ((Money)((AliasedValue)c.Attributes["totalservicecostamount_sum"]).Value).Value;
                        TotalValue = aggregate2;
                    }
                    else
                    {
                        TotalValue = 0;
                    }

                    if (c.Attributes.Contains("totalamount_sum"))
                    {
                        decimal aggregate1 = ((Money)((AliasedValue)c.Attributes["totalamount_sum"]).Value).Value;
                        toatlamt = aggregate1;
                    }
                    else
                    {
                        toatlamt = 0;
                    }
                }
            }
            return new decimal[] { TotalValue, toatlamt };

        }



Wednesday, February 18, 2015

Plugin Trigger

·    Create or Update of Quote Product record

Plugin logic
When a Quote Product record is created or updated, override the default price with the following formula.

Formula: IF(Discount is null, ProductPrice, ProductPrice – (ProductPrice*(Discount/100)))
ProductPrice = PriceListItem.Amount
Discount = Account.sts_discount

Set ispriceoverridden to 1 and populate the amount field with the formula above


Code:


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


namespace Car_O_Liner_QuoteDiscount
{
    public class QuoteDiscount : IPlugin
    {
        public void Execute(IServiceProvider serviceProvider)
        {
            IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
            IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
            IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);
            ITracingService tracingService = (ITracingService)serviceProvider.GetService(typeof(ITracingService));

            #region Declare Variables
            Entity preImageEntity = new Entity();
            Guid QuoteID = Guid.Empty;
            Guid AccountID = Guid.Empty;
            Guid PricelistObjID = Guid.Empty;
            decimal PerDiscount = 0;
            Guid ProductID = Guid.Empty;
            decimal ProductAmt = 0;
            Boolean ispriceoverridden;
            //decimal priceperunit = 0;
            Guid QuoteProductID = Guid.Empty;
            Money sumafterDiscount = new Money();
            #endregion

            try
            {
                // Create of New Quote Product
                if (context.Depth == 1)
                {
                    string messageName = context.MessageName.ToUpper();

                    if (messageName == "CREATE")
                    {
                        if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is Entity)
                        {
                            Entity entity = (Entity)context.InputParameters["Target"];

                            QuoteProductID = entity.Id;

                            if (entity.LogicalName != "quotedetail")
                                return;

                            if (entity.Attributes.Contains("quoteid"))
                            {
                                QuoteID = ((EntityReference)entity.Attributes["quoteid"]).Id;
                                ProductID = ((EntityReference)entity.Attributes["productid"]).Id;
                                ispriceoverridden = (Boolean)entity.Attributes["ispriceoverridden"];
                            }
                        }
                    }
                    // Update of  Quote Detail
                    if (messageName == "UPDATE")
                    {
                        if (context.PreEntityImages.Contains("Image") && context.PreEntityImages["Image"] is Entity)
                        {
                            preImageEntity = context.PreEntityImages["Image"];
                            QuoteProductID = preImageEntity.Id;
                            if (preImageEntity.Attributes.Contains("quoteid"))
                            {
                                QuoteID = preImageEntity.GetAttributeValue<EntityReference>("quoteid").Id;
                                ProductID = ((EntityReference)preImageEntity.Attributes["productid"]).Id;
                            }
                        }
                    }
                }

                // Get Potential Customer & Price List ID
                QueryExpression query = new QueryExpression
                {
                    EntityName = "quote",
                    ColumnSet = new ColumnSet("customerid", "pricelevelid")
                };

                query.Criteria.AddCondition("quoteid", ConditionOperator.Equal, QuoteID);

                EntityCollection result = service.RetrieveMultiple(query);

                if (result.Entities.Count > 0)
                {
                    foreach (Entity ent in result.Entities)
                    {
                        if (ent.Attributes.Contains("customerid"))
                        {
                            // get a reference to the customer
                            EntityReference customerId = ent.GetAttributeValue<EntityReference>("customerid");
                            AccountID = customerId.Id;
                        }
                        if (ent.Attributes.Contains("pricelevelid"))
                        {
                            //get a ref to the price list
                            EntityReference PriceListId = ent.GetAttributeValue<EntityReference>("pricelevelid");
                            PricelistObjID = PriceListId.Id;
                        }

                    }
                }
                // Fetch Xml to Get % Discount form account
                string FetchAccount = @"<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'>
                                                                  <entity name='account'>
                                                                    <attribute name='name' />                                                    
                                                                    <attribute name='sts_discount' />
                                                                    <order attribute='name' descending='false' />
                                                                    <filter type='and'>
                                                                      <condition attribute='accountid' operator='eq'  value='{0}' />
                                                                    </filter>
                                                                  </entity>
                                                                </fetch>";

                FetchAccount = string.Format(FetchAccount, AccountID);
                EntityCollection FetchAccountResult = (EntityCollection)service.RetrieveMultiple(new FetchExpression(FetchAccount));

                if (FetchAccountResult.Entities.Count > 0)
                {
                    foreach (Entity ent in FetchAccountResult.Entities)
                    {
                        if (ent.Attributes.Contains("sts_discount"))
                        {
                            PerDiscount = (decimal)ent.Attributes["sts_discount"];
                        }
                    }
                }
                else
                {
                    // FetchXml to Get % Discount form Contact-account if User select contact in potential customer lookup
                    string FetchContactAccount = @"<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='true'>
                              <entity name='account'>
                                <attribute name='name' />                                
                                <attribute name='sts_discount' />
                                <order attribute='name' descending='false' />
                                <link-entity name='contact' from='parentcustomerid' to='accountid' alias='ah'>
                                  <filter type='and'>
                                    <condition attribute='contactid' operator='eq' value='{0}' />
                                  </filter>
                                </link-entity>
                              </entity>
                            </fetch>";

                    FetchContactAccount = string.Format(FetchContactAccount, AccountID);
                    EntityCollection FetchContactAccountResult = (EntityCollection)service.RetrieveMultiple(new FetchExpression(FetchContactAccount));

                    if (FetchContactAccountResult.Entities.Count > 0)
                    {
                        foreach (Entity ent in FetchContactAccountResult.Entities)
                        {
                            if (ent.Attributes.Contains("sts_discount"))
                            {
                                PerDiscount = (decimal)ent.Attributes["sts_discount"];
                            }
                            else
                            {
                                PerDiscount = 0;
                            }
                        }
                    }
                }

                // Get Amt From Price List Item
                string FetchPriceListAmt = @"<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='true'>
                                  <entity name='pricelevel'>
                                    <attribute name='name' />                                    
                                    <attribute name='pricelevelid' />
                                    <order attribute='name' descending='false' />
                                    <filter type='and'>
                                      <condition attribute='pricelevelid' operator='eq' value='{0}' />
                                    </filter>
                                    <link-entity name='productpricelevel' from='pricelevelid' to='pricelevelid' alias='as'>
                                    <attribute name='amount' alias='ProductAmt' />
                                      <filter type='and'>
                                        <condition attribute='productid' operator='eq' value='{1}' />
                                      </filter>
                                    </link-entity>
                                  </entity>
                                </fetch>";

                FetchPriceListAmt = string.Format(FetchPriceListAmt, PricelistObjID, ProductID);
                EntityCollection FetchPriceListAmtResult = (EntityCollection)service.RetrieveMultiple(new FetchExpression(FetchPriceListAmt));

                if (FetchPriceListAmtResult.Entities.Count > 0)
                {
                    foreach (Entity ent in FetchPriceListAmtResult.Entities)
                    {
                        if (ent.Attributes.Contains("ProductAmt"))
                        {
                            ProductAmt = ((Money)((AliasedValue)ent.Attributes["ProductAmt"]).Value).Value;
                        }
                    }
                }

                if (PerDiscount == 0)
                {
                    sumafterDiscount = new Money(ProductAmt);
                }
                else
                {
                    sumafterDiscount = new Money(ProductAmt - ((ProductAmt) * (PerDiscount / 100)));
                }              

                // Update the Quote Prodcuct 
                Boolean IsUpdated = false;
                Entity quotedetailObj = new Entity("quotedetail");
                quotedetailObj.Attributes.Add("quotedetailid", QuoteProductID);
                quotedetailObj.Attributes.Add("ispriceoverridden", true);
                quotedetailObj.Attributes.Add("priceperunit", sumafterDiscount);

                if (!IsUpdated)
                {
                    IsUpdated = true;
                }
                if (IsUpdated)
                {
                    try
                    {
                        service.Update(quotedetailObj);
                    }
                    catch (Exception ex)
                    {
                        tracingService.Trace("Exception generated :" + ex.Message);
                    }
                }
            }
            catch (Exception ex)
            {
                tracingService.Trace(ex.Message);
            }

        }
    }

}

Auto-copy field on save/recalculate.  


#region References
using System;
using System.ServiceModel;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm;
using Microsoft.Xrm.Sdk.Query;
#endregion

namespace AutoCopyOpportunityQuote
{
    public class AutoCopytoQuote:IPlugin
    {
        public void Execute(IServiceProvider serviceProvider)
        {
            IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
            IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
            IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);
            ITracingService tracingService = (ITracingService)serviceProvider.GetService(typeof(ITracingService));

            Guid OpportunityID = Guid.Empty;
            try
            {
                if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is Entity)
                {
                    Entity entity = (Entity)context.InputParameters["Target"];

                    if (entity.LogicalName != "opportunity")
                        return;

                    if (entity.Attributes.Contains("opportunityid"))
                    {
                        OpportunityID = ((Guid)entity.Attributes["opportunityid"]);
                    }

                    string FetchOpportunity = @" <fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'>
                            <entity name='opportunity'>
                           <attribute name='ti_totalamtlessfreight' />
                           <attribute name='ti_quoteamount' />                          
                            <filter type='and'>
                           <condition attribute='opportunityid' operator='eq' value='{0}' />
                           </filter>
                           </entity>
                            </fetch>";

                    decimal TotalAmtlessfreight = 0; // Total Amt Less freight
                    //decimal Quoteamt = 0; // Quote Amt

                    FetchOpportunity = string.Format(FetchOpportunity, OpportunityID);
                    EntityCollection result = (EntityCollection)service.RetrieveMultiple(new FetchExpression(FetchOpportunity));

                    if (result.Entities.Count > 0)
                    {
                        foreach (Entity c in result.Entities)
                        {
                            if (c.Attributes.Contains("ti_totalamtlessfreight"))
                            {
                                TotalAmtlessfreight = ((Money)c.Attributes["ti_totalamtlessfreight"]).Value;
                            }                        
                        }
                    }

                    Boolean IsUpdated = false;
                    Entity opportunityobj = new Entity("opportunity");
                    opportunityobj.Attributes.Add("opportunityid", OpportunityID);
                    opportunityobj.Attributes.Add("ti_quoteamount", new Money(TotalAmtlessfreight));
                    if (!IsUpdated)
                    {
                        IsUpdated = true;
                    }
                    if (IsUpdated)
                    {
                        try
                        {
                            service.Update(opportunityobj);
                        }
                        catch (Exception ex)
                        {
                            tracingService.Trace("Exception generated :" + ex.Message);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                tracingService.Trace("Exception generated :" + ex.Message);
            }
        }
     
    }

}

Sunday, February 8, 2015

How to update the parent record when child record is created/updated/Delete

The scenario is that I want to display the sum of total of “Service Cost” of the opportunity Product on the parent opportunity record.


#region References
using System;
using System.ServiceModel;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm;
using Microsoft.Xrm.Sdk.Query;
#endregion

namespace OpportunityCost
{
    public class OpportunityCost : IPlugin
    {
        public void Execute(IServiceProvider serviceProvider)
        {
            IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
            IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
            IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);

            ITracingService tracingService = (ITracingService)serviceProvider.GetService(typeof(ITracingService));

            Entity preImageEntity = new Entity();
            Guid OpportunityID = Guid.Empty;
            //The InputParameters collection contains all the data passed in the message request.
            try
            {
                if (context.Depth == 1)
                {
                    string messageName = context.MessageName.ToUpper();

                    if (messageName == "CREATE")
                    {
                        if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is Entity)
                        {
                            Entity entity = (Entity)context.InputParameters["Target"];

                            if (entity.LogicalName != "opportunityproduct")
                                return;

                            if (entity.Attributes.Contains("opportunityid"))
                            {
                                OpportunityID = ((EntityReference)entity.Attributes["opportunityid"]).Id;
                            }
                        }
                    }
                    if (messageName == "UPDATE")
                    {
                        if (context.PreEntityImages.Contains("Image") && context.PreEntityImages["Image"] is Entity)
                        {
                            preImageEntity = context.PreEntityImages["Image"];

                            if (preImageEntity.Attributes.Contains("opportunityid"))
                            {
                                OpportunityID = preImageEntity.GetAttributeValue<EntityReference>("opportunityid").Id;
                            }
                        }
                    }
                    if (messageName == "DELETE")
                    {
                        if (context.PreEntityImages.Contains("Image") && context.PreEntityImages["Image"] is Entity)
                        {
                            preImageEntity = context.PreEntityImages["Image"];

                            if (preImageEntity.Attributes.Contains("opportunityid"))
                            {
                                OpportunityID = preImageEntity.GetAttributeValue<EntityReference>("opportunityid").Id;
                            }
                        }
                    }

                }
                //if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is Entity)
                //{
                // Obtain the target entity from the input parmameters
                //Entity entity = (Entity)context.InputParameters["Target"];
                //if (entity.Attributes.Contains("opportunityid"))
                //{
                //    OpportunityID = ((EntityReference)entity.Attributes["opportunityid"]).Id;
                //}
                //else
                //{
                //    if (context.PreEntityImages.Contains("Image") && context.PreEntityImages["Image"] is Entity)
                //    {
                //        preImageEntity = context.PreEntityImages["Image"];
                //        OpportunityID = preImageEntity.GetAttributeValue<EntityReference>("opportunityid").Id;
                //    }
                //}

                decimal TotalServiceCost = 0;
                TotalServiceCost = FetchResult(OpportunityID, service);
                // Updating Parent Entity
                Entity opportunityobj = new Entity("opportunity");
                opportunityobj.Id = OpportunityID;
                opportunityobj["new_totalservicecost"] = new Money(TotalServiceCost);
                service.Update(opportunityobj);
                //}
            }
            catch (Exception ex)
            {
                tracingService.Trace(ex.Message);
            }
        }

        private static decimal FetchResult(Guid OpportunityID, IOrganizationService service)
        {
            string FetchOpportunityProduct = @" <fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false' aggregate='true'>
                        <entity name='opportunityproduct'>                        
                       <attribute name='new_servicecost' alias='totalservicecostamount_sum' aggregate='sum' />                        
                        <link-entity name='opportunity' from='opportunityid' to='opportunityid' alias='ab'>
                        <filter type='and'>
                       <condition attribute='opportunityid' operator='eq' value='{0}' />
                       </filter>
                       </link-entity>
                       </entity>
                        </fetch>";

            decimal TotalValue = 0;

            FetchOpportunityProduct = string.Format(FetchOpportunityProduct, OpportunityID);
            EntityCollection result = (EntityCollection)service.RetrieveMultiple(new FetchExpression(FetchOpportunityProduct));

            if (result.Entities.Count > 0)
            {
                foreach (var c in result.Entities)
                {
                    decimal aggregate2 = ((Money)((AliasedValue)c.Attributes["totalservicecostamount_sum"]).Value).Value;
                    TotalValue = aggregate2;
                }
            }

            return TotalValue;
        }
    }

}

Register this plugin on postcreate, postupdate , postDelete   events of opportunity Product entity. 

Get files of last hour in Azure Data Factory

  Case I have a Data Factory pipeline that should run each hour and collect all new files added to the data lake since the last run. What is...