Advertisements

Archive

Archive for October, 2019

D365 Integration – Handling concurrent transactions

October 26, 2019 Leave a comment

In one of our integration requirements, we got to make sure that there wont be any concurrent updates/deletion to the records, to avoid data loss.

As an example, lets assume a Record 1 was retrieved by users U1 and U2 and both want to update ‘Name’ field same time, in this scenario it could end up with either U1 or U2 overriding each others data.

In such scenarios we can prevent the data loss using Optimistic Concurrency.

Whats an ‘Optimistic Concurrency’?

  • This feature provides the ability for your applications to detect whether an entity record has changed on the server in the time between when your application retrieved the record and when it tries to update or delete that record.
  • If you notice, every entity will have an OOB field ‘VersionNumber’ of type ‘Time Stamp’.
  • ‘VersionNumber’ value gets updated by system, every time when the record updates.

Concurrency_4

  • In below screen, my record ‘Transaction’ has the ‘Name’ set to ‘Payment to UBER‘.

Concurrency_5

  • Let me retrieve the record and before triggering update, let me update the ‘Name’ field to ‘Payment to UBER_Updated‘.
  • Now the Update fails with error code.

Concurrency_3

  • The update would go through, if there wont be any updates post retrieve.

C# Code snippet:

var queryTransaction = new QueryExpression(“raj_transaction”){
ColumnSet = new ColumnSet(“versionnumber”, “raj_name”)
};

var transactions = _service.RetrieveMultiple(queryTransaction);

foreach (var transaction in transactions.Entities){
// transaction.RowVersion

// Update Name
transaction[“raj_name”] = DateTime.Now.ToString();

//Update the account
var request = new UpdateRequest()
{
Target = transaction,
ConcurrencyBehavior = ConcurrencyBehavior.IfRowVersionMatches
};

try{
_service.Execute(request);
}
catch (FaultException<OrganizationServiceFault> ex){
switch (ex.Detail.ErrorCode){
case -2147088254: // ConcurrencyVersionMismatch
case -2147088253: // OptimisticConcurrencyNotEnabled
throw new InvalidOperationException(ex.Detail.Message);
case -2147088243: // ConcurrencyVersionNotProvided
throw new ArgumentNullException(ex.Detail.Message);
default:
throw ex;
}
}
}

Notes:

  • Optimistic concurrency is supported on all out-of-box entities enabled for offline sync and all custom entities.
  • You can determine if an entity supports optimistic concurrency by retrieving the entity’s metadata using code or by viewing the metadata using the Metadata Browser IsOptimisticConcurrencyEnabled is set to true.
  • Refer my older article on Optimistic concurrency using WEB API in client script.
  • Refer article for more details.

🙂

Advertisements
Categories: CRM Tags:

D365/CRM – Document Template – Missing entity relationship

Other day, I was configuring a ‘Document Template’ for a custom entity (Acknowledgement) which has a 1:N Relationship with Contact entity.

DocTemp_1

For some reason, the Relationship was not showing up in the ‘1:N Relationship’ grid of the ‘Document Template’ configuration screen.

DocTemp_2

Reason & Fix:

  • The relationship ‘Searchable’ field was set to ‘No’ and hence it was not showing in the list.
  • Set the ‘Searchable’ field to ‘Yes’ and publish.

DocTemp_3

  • Refresh the Document Template’s ‘1:N Relationship’ grid and you should see the relationship now.

DocTemp_4

🙂

Categories: CRM Tags: ,

CRM (on-prem) – Entity reference cannot have Id and Key Attributes empty error

We encountered below exception from a custom workflow activity in our Dynamics CRM on-prem 8.2.3 application.

WF_Error1

Reason and Fix:

  • Error message states that the ‘Output’ argument defined in custom workflow activity was returning ‘Null’.
  • I have below output argument of type ‘Lookup’ defined in my custom workflow activity but it always having value.

WF_Error3

  • Error was misleading in our case, as our debug concluded that the Output argument was always having value.
  • After spending considerable time, we figured out that the issue was due to a change at CRM website level.
  • Our IT team enabled SSL and added https binding to our dynamics website which caused this issue.
  • We had to set the custom workflow assemblies Isolation mode to ‘Sandbox’ to get the workflow running.

WF_Error2

Note:

  • This issue occurred only on UAT server but not on DEV instance, which also had SSL enabled same time.
  • Issue could be due to security policies enabled between the CRM application server and platform server on UAT.

🙂

Categories: CRM Tags: ,

Web Development – Useful jQuery Syntax’s

In this article, I am compiling the useful jQuery syntax’s which comes handy during your Dynmaics/ADX portal development or any other web development.

Prerequisite

  • Add jQuery library to your web page using <script> tag.
  • You can get the jQuery CDN here

Get Operations:

  • Get HTML element by Id

$(“#HTMLelementId“)

  • Get element by Class name

$(“.ClassName“)

  • Get element by ‘partial’ Id name.
    • As an example, if you want to get a Checkbox control which has ID ‘myChkBox‘, you can either get the element using full id with $(“#myChkBox”) or use partial id $(“[id$=’ChkBox‘]”).

$(“[id$=’PartialId‘]”)

  • Get Value

$(“#HTMLelementId“).val()

  • Get selected drop down text

$(“#DropdownId option:selected”).text()

Set Operations:

  • Set Text box

$(“#HTMLelementId“).val(“Hello World”);

  • Set Checkbox

$(“#checkboxId“).prop(“checked”, true); //true is checked; false is unchecked.

Add or Remove Class

  • $(“#HTMLelementId“).addClass(“YourClassName“); // Add Class
  • $(“#HTMLelementId“).removeClass(“YourClassName“); // Remove Class

Hide/Show Element

  • Hide element

$(“#HTMLelementId“).hide();

  • To hide Parent
    • This is useful to hide a control along with Label.

$(“#HTMLelementId“).parent().hide()

  • Show element

$(“#HTMLelementId“).show();

Check if elements exists

if ($(“#HTMLelementId“).length > 0){}

Iteration syntax

  • Loop through all Radio boxes which set to False.

$(“input[id][type=’radio’][value=’0′]”).each(function () {
var radioBox = this;
});

Attach events to HTML elements

  • To add ‘keypress’ event to Text box

$(“#HTMLelementId“).on(“keypress”, keyPressHandler);

function keyPressHandler(){
// Read the textbox value
var controlValue = this.val();
}

Remove event handler

  • To remove ‘onChange’ event from a control use ‘unbind’ method.

$(“#dropDownID“).unbind(“change”);

Trigger event

  • To trigger button ‘Click’ event

$(“#ButtonId“).click();

Remove option from Drop down:

  • Below script, removes ‘Mango’ from the Drop down control.

jQuery(“#dropdownId option:contains(‘Mango’)”).remove();

Read Query String Parameter

  • To read ‘country’ param value from current URL http://helloworld?country=India, call getParamValue(‘country’)
  • Function will return false, if no matching param found.

function getParamValue(paramName) {
var results = new RegExp(‘[\?&]’ + paramName + ‘=([^&#]*)’)
.exec(window.location.search);

return (results !== null) ? results[1] || 0 : false;
}

Get/Set elements in IFrame

  • To Get or Set the values of elements in IFrame, below is the syntax.

$(“#YourIframeID“).contents().find(‘#txtBoxId‘).val(); // Get the value

$(“#YourIframeID“).contents().find(‘#txtBoxId‘).val(“Hello World”); // Set the value

  • To access IFrame with in another IFrame

$(“#Iframe1ID“).contents().find(“#Iframe2ID“).contents().find(‘#txtBoxId‘).val(“Hello World”);

Create a new element:

  • Below is the snippet to create HTML button and add that next to an existing HTML element.

$(‘<input type=”button” id=”newBtn” class=”Your class name” value=”My New Button”/>’).insertAfter($(“#existingHTMLElementId“));
$(“#newBtn”).click(function () {

// Write your onclick script here
});

Categories: ADX, CRM Tags: , ,