Tuesday, 27 February 2018

Display CRM Records & perform CRUD Operations Using Web Template in Portal CRM

Today I am going to share, how we can display crm records in portal crm.
Here i am using Kendo Grid, we can use any client side script grid over here.

Below methods I have tried :
1. Create a Web Template with following code: But before that Download KendoJs.js file & KendoCss.css file, keep in web files & Create Entity List with Odata Feed as enabled & give ur Entity Type Name,Entity Set Name & view So that you can use for odataUri in template.

<!DOCTYPE html>
<html>
<head>
    <title></title>
   <script src="/KendoJs.js"></script>
   <link rel="stylesheet" href="/KendoCss.css" />
</head>
<body>
<div id="tableDiv">
    <div id="grid"></div>
    <script>
    </script>
</div>
<script>
$(document).ready(function() {
    var odataUri = "https://kitiportal38.microsoftcrmportals.com/_odata/Cricos";
    var list;
    $.ajax({
        type: 'GET',
        contentType: 'application/json; charset=utf-8',
        datatype: 'json',
        url: odataUri,
        beforeSend: function(XMLHttpRequest) {
            XMLHttpRequest.setRequestHeader('Accept', 'application/json');
        },
        async: false,
        success: function(data, textStatus, xhr) {
            // Getting the company (Account) name that he belongs to
            var myData = data.value;     
         
       alert(myData);
        debugger;
            $("#grid").kendoGrid({
                dataSource: {
                    type: "json",
                    data:myData                 
                },
                height: 550,
                selectable: "multiple, row",
                groupable: true,
                sortable: true,
                pageable: {
                    refresh: true,
                    pageSizes: true,
                    buttonCount: 2
                },
                columns: [{               
                    field: "ags_name",
                    title: "Name",
                    width: 240,
                   template: "<a href='/CricosRedirectPage/?id=#= ags_cricosid #'>#= ags_name #</a>"
                }, {
                    field: "ags_fullname",
                    title: "FullName",
                    //template: "<a href='/CricosRedirectPage/?id=#= ags_fullname #'>#= ags_fullname #</a>"
                }, {
                    field: "ags_address",
                    title: "Address"
                }, {
                    field: "ags_dob",
                    title: "DOB"
                },  {
                    field: "createdon",
                    title: "Created On"
                },
                {
                command: ["edit", "destroy"], title: "&nbsp;", width: "250px"
               }
                ],
                editable: {
            update: true,
            destroy: true,
            confirmation: false,
            mode: "inline"
        },
            });
     
        },
        error: function(xhr, textStatus, errorThrown) {
            alert(textStatus + ' ' + errorThrown);
        }
    });
});
</script>
</body>
</html>

2. Create Page Template & take here your web template file,then create web page along with Page template.












3. Create a Entity Form for edit & delete purpose & create another Web Page for redirect to different page for update & delete records & here what Partial Url we are giving it should be mention in your above Web Template.

























4. So Final Grid will be something like this in below :











I hope it will help to someone !!

Tuesday, 13 February 2018

Display Power BI Reports in Dynamics CRM Online Dashboards

Hello All Today I am going to tell how we can display database table records in CRM Dashboard using Power BI Desktop.

1. Install Power BI Desktop for designing the reports & Sign Up with your CRM Credentials.

2. Get the data from Sql DB & design the reports in Power BI Desktop then Publish it .



3. Now configure the Power BI on CRM.



4. Create New Dashboard in CRM & add a Power BI tile to the dashboard.



5. Below reports added in CRM Dashboard , if you want to do any modification, then we can do by open in Power BI.







Hope it will helps!!

Friday, 19 January 2018

Clone Opportunity Record Using Action in CRM Online 365

I came up with a task of cloning opportunity records on click of a button in Opportunity Form.
Below procedures I have followed :
1. Added button in Opportunity form using Ribbon Workbench.
2.Create an action in CRM with input parameter & output parameter like below:
2. Below Scripts, I kept on the button :

function executeCustomActionSynchronous(entityId, entityCollectionName, actionName, parameters, isGlobalAction) {
    debugger;
    var query = "";
    var req = "";
    var response = {};
    stringParameterCheck(actionName, "XrmUtilities.webAPI.executeCustomActionSynchronous requires the actionName parameter is a string.");
    if (!isNullOrUndefined(isGlobalAction) && isGlobalAction !== true) {
        entityId = entityId.replace("{", "").replace("}", "");
        stringParameterCheck(entityId, "XrmUtilities.webAPI.executeCustomAction requires the e entityId parameter is a string.");
        stringParameterCheck(entityCollectionName, "XrmUtilities.webAPI.executeCustomAction requires the entityCollectionName parameter is a string.");
        query = entityCollectionName + "(" + entityId + ")/Microsoft.Dynamics.CRM." + actionName;
    }
    else {
        query = actionName;
    }
    req = new XMLHttpRequest();
    req.open("POST", getWebAPIPath() + query, false);
    setRequestHeaders(req, false);
    req.onreadystatechange = function () {
        if (this.readyState === 4) {
            req.onreadystatechange = null;
            switch (this.status) {
                case 200:
                    response.status = true;
                    response.results = JSON.parse(this.response);
                    break;
                case 204:
                    response.status = true;
                    break;
                case 1223:
                    response.status = true;
                    break;
                default:
                    response.status = false;
                    response.error = JSON.parse(this.response).error;
            }
        }
    };
    req.send((!isNullOrUndefined(parameters)) ? JSON.stringify(parameters) : null);
    return response;
};
function isNullOrUndefined(value) {
    return (typeof (value) === "undefined" || value === null);
};
function getWebAPIPath() {
    return getClientUrl() + "/api/data/v8.1/";
};
function getClientUrl() {
    var clientUrl = context().getClientUrl();
    return clientUrl;
};
function context() {
    ///<summary>
    /// Private function to the context object.
    ///</summary>
    ///<returns>Context</returns>
    var oContext = null;
    if (!isNullOrUndefined(window.parent.Xrm)) {
        oContext = window.parent.Xrm.Page.context;
    }
    else if (!isNullOrUndefined(window.GetGlobalContext)) {
        oContext = window.GetGlobalContext();
    }
    else if (!isNullOrUndefined(Xrm)) {
        oContext = Xrm.Page.context;
    }
    else {
        throw new Error("Context is not available.");
    }
    return oContext;
};
function stringParameterCheck(parameter, message) {
    if (typeof parameter !== "string") {
        throw new Error(message);
    }
};
function setRequestHeaders(req, includeFormattedValues, customHeaders) {
    req.setRequestHeader("Accept", "application/json");
    req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
    req.setRequestHeader("OData-MaxVersion", "4.0");
    req.setRequestHeader("OData-Version", "4.0");
    if (!(!isNullOrUndefined(includeFormattedValues) && includeFormattedValues === false)) {
        req.setRequestHeader("Prefer", "odata.include-annotations=\"OData.Community.Display.V1.FormattedValue\"");
    }
    var arrayName = [];
    if (!(customHeaders && customHeaders.constructor === arrayName.constructor)) {
        customHeaders = [];
    }
    customHeaders.forEach(function (h) {
        switch (h.key) {
            case "Accept":
            case "Content-Type":
            case "OData-MaxVersion":
            case "OData-Version":
            case "Prefer":
                break;
            default:
                req.setRequestHeader(h.key, h.value);
        }
    });
};
function copyOpportunityRecord() {
    debugger;
    var opportunityId = Xrm.Page.data.entity.getId();
    var parameters =
    {
        ActionType: opportunityId.toString()
    };
    var Result = executeCustomActionSynchronous(opportunityId, "opportunities", "ags_CopyOpportunityAction", parameters, false)
    var id = Result.results.OppId;
    var options = { openInNewWindow: true };
    Xrm.Utility.openEntityForm("opportunity", id,null,options);
}

3. Below plugin code, I wrote 

public void Execute(IServiceProvider serviceProvider)
      {
            ITracingService tracingService = (ITracingService)serviceProvider.GetService(typeof(ITracingService));
            IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
            IOrganizationServiceFactory factory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
            IOrganizationService service = factory.CreateOrganizationService(context.UserId);
            try
            {
                tracingService.Trace("Checking plugin");
                if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is EntityReference)
                {
                    EntityReference opportunity = (EntityReference)context.InputParameters["Target"];
                    string opportunityId = context.InputParameters["ActionType"].ToString();
                    tracingService.Trace("Check Action Parameter" + opportunityId);
                    Guid id = Guid.Parse(opportunityId);
                    Guid newOpportunityId = CreateOpportunityRecord(service, id);
                    //tracingService.Trace(id);
                    context.OutputParameters["OppId"] = newOpportunityId.ToString();
                    tracingService.Trace("Successfully Created");
                }
            }
            catch (Exception ex)
            {
                throw new InvalidPluginExecutionException("An Error occurred in plugin.", ex);
            }
        }
          /// <summary>
          /// Create Opportunity Record
          /// </summary>
          /// <param name="service"></param>
          /// <param name="id"></param>
          /// <returns></returns>
        private Guid CreateOpportunityRecord (IOrganizationService service, Guid id)
        {
            Entity oppEntity = service.Retrieve("opportunity", id, new ColumnSet(true));
            oppEntity.Attributes.Remove("opportunityid");
            oppEntity.Attributes.Remove("createdon");
            oppEntity.Attributes.Remove("modifiedon");
            oppEntity.Attributes.Remove("modifiedby");
            Entity opportunity = new Entity("opportunity");
            opportunity.Attributes = oppEntity.Attributes;
            return service.Create(opportunity);
        }
4. Registered the dll file in plugin registration tool & here I took message as my action which i have created on opportunity.

Hope it will helps !!