Sunday, May 17, 2020

Dynamics 365 JavaScript Reusable Codes

Microsoft Dynamics 365 syntax for common Javascript Codes.

Below is some sample client-side scripting code which will help you to achieve your requirement with few manipulations. 

Dynamics 365 JavaScript sample code for reuse: 

1.  Get the GUID value of a lookup field:

Note: this example reads and pops the GUID of the primary contact on the Account form

function AlertGUID(executionContext) {
    var primaryContactGUID = executionContext.data.entity.attributes.get("primarycontactid").getValue()[0].id;
    alert(primaryContactGUID);
}
2.  Get the Text value of a lookup field:

Note: this example reads and pops the name of the primary contact on the Account form

function AlertText(executionContext) {
    var primaryContactName = executionContext.data.entity.attributes.get("primarycontactid").getValue()[0].name;
    alert(primaryContactName);
}
3.  Get the value of a text field:

Note: this example reads and pops the value of the Main Phone (telephone1) field on the Account form

function AlertTextField(executionContext) {
    var MainPhone = executionContext.data.entity.attributes.get("telephone1").getValue();
    alert(MainPhone);
}
4.  Get the database value of an Option Set field:

Note: this example reads and pops the value of the Address Type (address1_addresstypecode) field on the Account form

function AlertOptionSetDatabaseValue(executionContext) {
    var AddressTypeDBValue = executionContext.data.entity.attributes.get("address1_addresstypecode").getValue();
    if (AddressTypeDBValue != null) {
        alert(AddressTypeDBValue);
    }
}
5.  Get the text value of an Option Set field:

Note: this example reads and pops the value of the Address Type (address1_addresstypecode) field on the Account form

function AlertOptionSetDisplayValue(executionContext) {
   var AddressTypeDisplayValue = executionContext.data.entity.attributes.get("address1_addresstypecode").getText();
    if (AddressTypeDisplayValue != null) {
        alert(AddressTypeDisplayValue);
    }
}
6.  Get the database value of a Bit field:

// example GetBitValue("telephone1");
function GetBitValue(executionContext, fieldname) {
    return executionContext.data.entity.attributes.get(fieldname).getValue();
}
7.  Get the value of a Date field:

returns a value like: Wed Nov 30 17:04:06 UTC+0800 2011

and reflects the users time zone set under personal options

// example GetDate("createdon");
function GetDate(executionContext, fieldname) {
    return executionContext.data.entity.attributes.get(fieldname).getValue();
}
8.  Get the day, month and year parts from a Date field:

// This function takes the fieldname of a date field as input and returns a DD-MM-YYYY value
// Note: the day, month and year variables are numbers
function FormatDate(executionContext, fieldname) {
    var d = executionContext.data.entity.attributes.get(fieldname).getValue();
    if (d != null) {
        var curr_date = d.getDate();
        var curr_month = d.getMonth();
        curr_month++;  // getMonth() considers Jan month 0, need to add 1
        var curr_year = d.getFullYear();
        return curr_date + "-" + curr_month + "-" + curr_year;
    }
    else return null;
}
 
// An example where the above function is called
alert(FormatDate("new_date2"));
9.  Set the value of a string field:

Note: this example sets the Account Name field on the Account Form to “ABC”

function SetStringField(executionContext) {
    var Name = executionContext.data.entity.attributes.get("name");
    Name.setValue("ABC");
}
10.  Set the value of an Option Set (pick list) field:

Note: this example sets the Address Type field on the Account Form to “Bill To”, which corresponds to a database value of “1”

function SetOptionSetField(executionContext) {
    var AddressType = executionContext.data.entity.attributes.get("address1_addresstypecode");
    AddressType.setValue(1);
}
11.  Set a Date field / Default a Date field to Today:

//set date field to now (works on date and date time fields)
executionContext.data.entity.attributes.get("new_date1").setValue(new Date());
12.  Set a Date field to 7 days from now:

function SetDateField(executionContext) {
    var today = new Date();
    var futureDate = new Date(today.setDate(today.getDate() + 7));
    executionContext.data.entity.attributes.get("new_date2").setValue(futureDate);
    executionContext.data.entity.attributes.get("new_date2").setSubmitMode("always"); // Save the Disabled Field
}
13.  Set the Time portion of a Date Field:

// This is a function you can call to set the time portion of a date field
function SetTime(executionContext, attributeName, hour, minute) {
        var attribute = executionContext.getAttribute(attributeName);
        if (attribute.getValue() == null) {
            attribute.setValue(new Date());
        }
        attribute.setValue(attribute.getValue().setHours(hour, minute, 0));
}
 
// Here's an example where I use the function to default the time to 8:30am
SetTime('new_date2', 8, 30);
14.  Set the value of a Lookup field:

Note: here I am providing a reusable function…

// Set the value of a lookup field
function SetLookupValue(executionContext, fieldName, id, name, entityType) {
    if (fieldName != null) {
        var lookupValue = new Array();
        lookupValue[0] = new Object();
        lookupValue[0].id = id;
        lookupValue[0].name = name;
        lookupValue[0].entityType = entityType;
        executionContext.getAttribute(fieldName).setValue(lookupValue);
    }
}
Here’s an example of how to call the function (I retrieve the details of one lookup field and then call the above function to populate another lookup field):

var ExistingCase = executionContext.data.entity.attributes.get("new_existingcase");
if (ExistingCase.getValue() != null) {
    var ExistingCaseGUID = ExistingCase.getValue()[0].id;
    var ExistingCaseName = ExistingCase.getValue()[0].name;
    SetLookupValue("regardingobjectid", ExistingCaseGUID, ExistingCaseName, "incident");
}
15.  Split a Full Name into First Name and Last Name fields:

function PopulateNameFields(executionContext) {
    var ContactName = executionContext.data.entity.attributes.get("customerid").getValue()[0].name;
    var mySplitResult = ContactName.split(" ");
    var fName = mySplitResult[0];
    var lName = mySplitResult[1];
    executionContext.data.entity.attributes.get("firstname").setValue(fName);
    executionContext.data.entity.attributes.get("lastname").setValue(lName);
}
16.  Set the Requirement Level of a Field:

Note: this example sets the requirement level of the Address Type field on the Account form to Required. 

Note: setRequiredLevel(“none”) would make the field optional again.

function SetRequirementLevel(executionContext) {
    var AddressType = executionContext.data.entity.attributes.get("address1_addresstypecode");
    AddressType.setRequiredLevel("required");
}
17.  Disable a field:

function SetEnabledState(executionContext) {
    var AddressType = executionContext.ui.controls.get("address1_addresstypecode");
    AddressType.setDisabled(true);
}
18.  Force Submit the Save of a Disabled Field:

// Save the Disabled Field
executionContext.data.entity.attributes.get("new_date1").setSubmitMode("always");
19.  Show/Hide a field:

function hideName(executionContext) {
    var name = executionContext.ui.controls.get("name");
    name.setVisible(false);
}
20.  Show/Hide a field based on a Bit field

function DisableExistingCustomerLookup(executionContext) {
   var ExistingCustomerBit = executionContext.data.entity.attributes.get("new_existingcustomer").getValue();
    if (ExistingCustomerBit == false) {
       executionContext.ui.controls.get("customerid").setVisible(false);
    }
    else {
       executionContext.ui.controls.get("customerid").setVisible(true);
    }
}
21.  Show/Hide a nav item:

Note: you need to refer to the nav id of the link, use F12 developer tools in IE to determine this

function hideContacts(executionContext) {
    var objNavItem = executionContext.ui.navigation.items.get("navContacts");
    objNavItem.setVisible(false);
}
22.  Show/Hide a Section:

Note: Here I provide a function you can use.  Below the function is a sample.

function HideShowSection(executionContext,, tabName, sectionName, visible) {
    try {
        executionContext.ui.tabs.get(tabName).sections.get(sectionName).setVisible(visible);
    }
    catch (err) { }
}
 
HideShowSection("general", "address", false);   // "false" = invisible
23.  Show/Hide a Tab:

Note: Here I provide a function you can use. Below the function is a sample.

function HideShowTab(executionContext, tabName, visible) {
    try {
        executionContext.ui.tabs.get(tabName).setVisible(visible);
    }
    catch (err) { }
}
 
HideShowTab("general", false);   // "false" = invisible
24.  Save the form:

function SaveAndClose(executionContext) {
    executionContext.data.entity.save();
}
25.  Save and close the form:

function SaveAndClose(executionContext) {
    executionContext.data.entity.save("saveandclose");
}
26.  Close the form:

Note: the user will be prompted for confirmation if unsaved changes exist

function Close(executionContext) {
    executionContext.ui.close();
}
27.  Determine which fields on the form are dirty:

var attributes = executionContext.data.entity.attributes.get()
 for (var i in attributes)
 {
    var attribute = attributes[i];
    if (attribute.getIsDirty())
    {
      alert("attribute dirty: " + attribute.getName());
    }
 }
28.  Determine the Form Type:

Note: Form type codes: Create (1), Update (2), Read Only (3), Disabled (4), Bulk Edit (6)

function AlertFormType(executionContext) {
    var FormType = executionContext.ui.getFormType();
     if (FormType != null) {
        alert(FormType);
    }
}
29.  Get the GUID of the current record:

function AlertGUID(executionContext) {
    var GUIDvalue = executionContext.data.entity.getId();
    if (GUIDvalue != null) {
        alert(GUIDvalue);
    }
}
30.  Get the GUID of the current user:

function AlertGUIDofCurrentUser(executionContext) {
    var UserGUID = executionContext.context.getUserId();
     if (UserGUID != null) {
        alert(UserGUID);
    }
}
31.  Get the Security Roles of the current user:

(returns an array of GUIDs, note: my example reveals the first value in the array only)

function AlertRoles(executionContext) {
    alert(executionContext.context.getUserRoles());
}
32.  Determine the CRM server URL:

// Get the CRM URL
var serverUrl = executionContext.context.getServerUrl();
 
// Cater for URL differences between on premise and online
if (serverUrl.match(/\/$/)) {
    serverUrl = serverUrl.substring(0, serverUrl.length - 1);
}
33.  Refresh a Sub-Grid:

var targetgird = executionContext.ui.controls.get("target_grid");
targetgird.refresh();
34.  Change the default entity in the lookup window of a Customer or Regarding field:

Note: I am setting the customerid field’s lookup window to offer Contacts (entityid 2) by default (rather than Accounts). I have also hardcoded the GUID of the default view I wish displayed in the lookup window.

function ChangeLookup(executionContext) {
    document.getElementById("customerid").setAttribute("defaulttype", "2");
    var ViewGUID= "A2D479C5-53E3-4C69-ADDD-802327E67A0D";
    executionContext.getControl("customerid").setDefaultView(ViewGUID);
}
35.  Pop an existing CRM record (new approach):

function PopContact(executionContext) {
    //get PrimaryContact GUID
    var primaryContactGUID = executionContext.data.entity.attributes.get("primarycontactid").getValue()[0].id;
    if (primaryContactGUID != null) {
        //open Contact form
        Xrm.Utility.openEntityForm("contact", primaryContactGUID)
    }
}
36.  Pop an existing CRM record (old approach):

Note: this example pops an existing Case record.  The GUID of the record has already been established and is stored in the variable IncidentId.

//Set features for how the window will appear
var features = "location=no,menubar=no,status=no,toolbar=no";
 
// Get the CRM URL
var serverUrl = executionContext.context.getServerUrl();
 
// Cater for URL differences between on premise and online
if (serverUrl.match(/\/$/)) {
    serverUrl = serverUrl.substring(0, serverUrl.length - 1);
}
 
window.open(serverUrl + "/main.aspx?etn=incident&pagetype=entityrecord&id=" + encodeURIComponent(IncidentId), "_blank", features, false);
37.  Pop a blank CRM form (new approach):

function PopNewCase(executionContext) {
    Xrm.Utility.openEntityForm("incident")
}
38.  Pop a new CRM record with default values (new approach):

function CreateIncident(executionContext) {
    //get Account GUID and Name
    var AccountGUID = executionContext.data.entity.getId();
    var AccountName = executionContext.data.entity.attributes.get("name").getValue();
    //define default values for new Incident record
    var parameters = {};
    parameters["title"] = "New customer support request";
    parameters["casetypecode"] = "3";
    parameters["customerid"] = AccountGUID;
    parameters["customeridname"] = AccountName;
    parameters["customeridtype"] = "account";
    //pop incident form with default values
    Xrm.Utility.openEntityForm("incident", null, parameters);
}
39.  Pop a new CRM record with default values (old approach):

Note: this example pops the Case form from the Phone Call form, defaulting the Case’s CustomerID based on the Phone Call’s SenderID and defaulting the Case Title to “New Case”

//Collect values from the existing CRM form that you want to default onto the new record
var CallerGUID = executionContext.data.entity.attributes.get("from").getValue()[0].id;
var CallerName = executionContext.data.entity.attributes.get("from").getValue()[0].name;
 
//Set the parameter values
var extraqs = "&title=New Case";
extraqs += "&customerid=" + CallerGUID;
extraqs += "&customeridname=" + CallerName;
extraqs += "&customeridtype=contact";
 
//Set features for how the window will appear
var features = "location=no,menubar=no,status=no,toolbar=no";
 
// Get the CRM URL
var serverUrl = executionContext.context.getServerUrl();
 
// Cater for URL differences between on premise and online
if (serverUrl.match(/\/$/)) {
    serverUrl = serverUrl.substring(0, serverUrl.length - 1);
}
 
//Pop the window
window.open(serverUrl + "/main.aspx?etn=incident&pagetype=entityrecord&extraqs=" + encodeURIComponent(extraqs), "_blank", features, false);
40.  Pop a Dialog from a ribbon button

Note: this example has the Dialog GUID and CRM Server URL hardcoded, which you should avoid.  A simple function is included which centres the Dialog when launched.

function LaunchDialog(sLeadID) {
    var DialogGUID = "128CEEDC-2763-4FA9-AB89-35BBB7D5517D";
    var serverUrl = "https://avanademarchdemo.crm5.dynamics.com/";
    serverUrl = serverUrl + "cs/dialog/rundialog.aspx?DialogId=" + "{" + DialogGUID + "}" + "&EntityName=lead&ObjectId=" + sLeadID;
    PopupCenter(serverUrl, "mywindow", 400, 400);
    window.location.reload(true);
}
 
function PopupCenter(pageURL, title, w, h) {
    var left = (screen.width / 2) - (w / 2);
    var top = (screen.height / 2) - (h / 2);
    var targetWin = window.showModalDialog(pageURL, title, 'toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=no, resizable=no, copyhistory=no, width=' + w + ', height=' + h + ', top=' + top + ', left=' + left);
}
41.  Pop a URL from a ribbon button

Great info on the window parameters you can set here:  http://javascript-array.com/scripts/window_open/

function LaunchSite(executionContext) {
    // read URL from CRM field
    var SiteURL = executionContext.data.entity.attributes.get("new_sharepointurl").getValue();
    // execute function to launch the URL
    LaunchFullScreen(SiteURL);
}
 
function LaunchFullScreen(url) {
 // set the window parameters
 params  = 'width='+screen.width;
 params += ', height='+screen.height;
 params += ', top=0, left=0';
 params += ', fullscreen=yes';
 params += ', resizable=yes';
 params += ', scrollbars=yes';
 params += ', location=yes';
 
 newwin=window.open(url,'windowname4', params);
 if (window.focus) {
     newwin.focus()
 }
 return false;
}
42.  Pop the lookup window associated to a Lookup field:

window.document.getElementById('new_existingcase').click();
43.  Pop a Web Resource (new approach):

function PopWebResource(executionContext) {
    Xrm.Utility.openWebResource("new_Hello");
}
44. Using a SWITCH statement

function GetFormType(executionContext) {
    var FormType = executionContext.ui.getFormType();
    if (FormType != null) {
        switch (FormType) {
            case 1:
                return "create";
                break;
            case 2:
                return "update";
                break;
            case 3:
                return "readonly";
                break;
            case 4:
                return "disabled";
                break;
            case 6:
                return "bulkedit";
                break;
            default:
                return null;
        }
    }
}
45.  Pop an Ok/Cancel Dialog

function SetApproval(executionContext) {
    if (confirm("Are you sure?")) {
        // Actions to perform when 'Ok' is selected:
        var Approval = executionContext.data.entity.attributes.get("new_phaseapproval");
        Approval.setValue(1);
        alert("Approval has been granted - click Ok to update CRM");
        executionContext.data.entity.save();
    }
    else {
        // Actions to perform when 'Cancel' is selected:
        alert("Action cancelled");
    }
}


References:



No comments:

Post a Comment