Tuesday, June 2, 2015

Auto Number: Record Locking in MSCRM Plugin

    We came across the scenario where custom Auto Numbering plugin generates the duplicate numbers for an entity when two users create the records simultaneously. The reason behind this is because dynamics only locks a record inside a transaction if we update it. However what we are doing here is retrieving the record and then updating it. So effectively the record will be locked just at the end of the plugin execution which is not very helpful indeed.
Below are the steps to illustrate this:

1.   First we are retrieving the config record which contains the prefix, last generated number and other details

2.   Then we are reading the last updated number value and other config details

3.   Then we are applying the logic to build the number

4.   Finally, we are updating both the config(to maintain the last generated number) and the entity record in context with the required values.

So it is possible that two plugins is being executed and both those plugins performed step 1 above (so they both retrieved a config record). So they both will have the same value for the “Last Number” field. Then they will both apply the logic in step 2 and 3. Finally the first plugin will execute step 4 and update the config record (this will lock the config record)  but it will finish execution immediately which will unlock the config record. So now the second plugin is executing step 4 but since it already has retrieved the old value so the update logic will be the same and it will override the config record with the same number instead of incrementing it.

So, we should update the logic in the plugin above to the following:

1.   First, do a fake update to the required config record. We don’t have to change  any values and we can just do
      service.update(configRecord);


2.   Then we apply step 1, 2, 3 and 4 from the above logic.

Below is the sample code to show how to lock  the configuration record:

// Get the record for which Auto Number to be generated
Entity  targetEntityRecord = (Entity)context.InputParameters["Target"];

// Fetch the configuration record
Entity configRecord = GetConfigurationRecord(service);

// If configuration record found, then do a fake update
if (configRecord.Id != Guid.Empty)
  service.Update(configRecord);
else
  throw new 
InvalidPluginExecutionException("Config record not found.");

// Get the last generated number from configuration record
int  lastNumber =  Int32.Parse(configRecord.Attributes["new_lastnumber"].ToString());

// Increment the last generated number
lastNumber++;

// Build a number with your own logic
string autoNumber = string.Format("{0}-{1}""PREFIX" , lastNumber);

// Set new generated number to both target entity and Configuration record
targetEntityRecord.Attributes.Add("new_name", autoNumber);
configRecord.Attributes["new_lastnumber"] = lastNumber;

// Update the Configuration record
service.Update(configRecord);


I would like to thank my friend Shakarchi Ethra for describing this Dynamics behaviour.


Friday, July 11, 2014

Integrate Twitter widget with MS CRM

You can see all the tweets of your twitter account in MS CRM. Below are the steps to be followed to integrate Twitter widget in MSCRM.

- Log on to your Twitter account.
- Click on Settings symbol (1) in twitter and select Settings.
- Select 'Widgets' in left panel.
- Click on 'Create new' button.
- Select 'User timeline' under 'Choose a timeline source' option.



A) Setting Widget properties in Twitter.

- Leave Username(2) as auto populated with your twitter user name, select 'Options'(3), 'Height'(4), 'Theme'(5) and 'Link color'(6) as your wish.
- Any changes you made in these properties are reflecting under Preview(8) in right side.
- Click on 'Create widget'
- Copy an HTML code(7) generated just below the Preview.
- Log on to MS CRM organization.
- Create one HTML webresource by adding the copied HTML code inside <body> tag.
- Create/Edit a dashboard to add newly created HTML webresource as a component in that dashboard.
- Save, Close and publish the dashborad.

- Go to that dashboard in CRM and you should be able to see all your tweets on CRM dashboard as in below image.


B) Twitter widget integrated with MS CRM dashboard

Thursday, June 19, 2014

Export a CSV without headers in SSRS

        In SSRS report we have an option to export report to many formats like Excel, CSV, PDF, Word and so on. In case of CSV export, we will get all the column headers in exported file. Some time we need CSV without column header. Below is the solution to get this done.

à Open rsreportserver.config file under C:\Program Files\Microsoft SQL Server\{INSTANCE}\Reporting Services\ReportServer in reporting server.
à Add below mentioned XML tags after <Extension Name="CSV"... />
<Extension Name="CSV (No Header)" Type="Microsoft.ReportingServices.Rendering.DataRenderer.CsvReport,Microsoft.ReportingServices.DataRendering">
<OverrideNames>
   <Name Language="en-us"> CSV No Header</Name>
</OverrideNames>
<Configuration>
   <DeviceInfo>
      <NoHeader>true</NoHeader>
   </DeviceInfo>
</Configuration>
</Extension>

à Save the file.

 After this changes, run one report. Under export option in that report, you must be able to see the option 'CSV No Header' as in below image(a). And exported data will not contains any headers.


CSV No Header
a) Export to CSV with no header

Tuesday, December 24, 2013

Commands

        Below are the useful commands used in Microsoft related products like .Net, CRM,...

Click on the item below to go through the description about that.

Assembly Registration:

The Assembly Registration tool reads the metadata within an assembly and adds the necessary entries to the registry, which allows COM clients to create .NET Framework classes transparently.

If you’re running Visual Studio on Windows 7: Choose Start, and then choose All Programs, Microsoft Visual Studio, Visual Studio Tools, Visual Studio Command Prompt.
                    
regasm <DLLFilePath> /codebase /tlb

Ex: regasm C:\Testing.dll /codebase /tlb
                    
                

ILMerge:

ILMerge is a utility that can be used to merge multiple .NET assemblies into a single assembly.

- Download ILMerge software from here and install in your machine.
- Goto Start, Run, cmd, OK.
- Goto C:\Program Files (x86)\Microsoft\ILMerge folder path and run below command.
                    
ilmerge /lib:<AssembliesFolderPath> <DLL1> <DLL2> <DLL3> <DLL4> /out:<OutputDLL>

Ex: ilmerge /lib:"C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\PublicAssemblies" C:\FirstDLL.dll C:\SecondDLL.dll C:\ThirdDLL.dll /out:C:\FinalDLL.dll
                    
                

Create Early Bound Classes:

CrmSvcUtil.exe is a command-line code generation tool for use with Microsoft Dynamics CRM 2011. This tool generates early-bound .NET Framework classes that represent the entity data model used by Microsoft Dynamics CRM. This tool is in the SDK download package in the SDK\Bin folder.

- Goto Start, Run, cmd, OK.
- Goto SDK\bin folder path and run below command.
                    
CrmSvcUtil.exe /codeCustomization:"Microsoft.Xrm.Client.CodeGeneration.CodeCustomization, Microsoft.Xrm.Client.CodeGeneration" /out:<OutputFile> /url:<OrganizationURL> /domain:<Domain> /username:<UserName> /password:<Password> /namespace:<Namespace> /serviceContextName:<serviceContext>
Ex: CrmSvcUtil.exe /codeCustomization:"Microsoft.Xrm.Client.CodeGeneration.CodeCustomization, Microsoft.Xrm.Client.CodeGeneration" /out:Xrm\Xrm.cs /url:http://MyCRM/MyOrg/XRMServices/2011/Organization.svc /domain:mscrm /username:administrator /password:mypassword123 /namespace:Xrm /serviceContextName:XrmServiceContext
For Online instance, you need to register your device as here.
                    
                    
CrmSvcUtil.exe /url:<OrgnizationURL> /out:<OutputFile> /username:<UserName> /password:<Password> /deviceid:<DeviceID> /devicepassword:<DevicePassword>
Ex: CrmSvcUtil.exe /url:https://myorg.crm.dynamics.com/XRMServices/2011/Organization.svc /out:GeneratedCode.cs /username:"myname@live.com" /password:"mypassword123" /deviceid:"9eqd9qip4meckbxhyi838gn3" /devicepassword:"543opae9itRWKO+U7fe+I3MRVANUyFFPcfDJYP5ItZo="
                    
                

Device Registration:

CRM SDK has provided a tool to register your device. Goto Command Prompt then to the folder path SDK\tools\deviceregistration\bin\Debug. Run below command. This will register you device and give Device Username and Device Password.
                    
deviceregistration.exe /operation:Register
                    
                

Monday, November 25, 2013

JQuery

        Below are the few useful statement, commands in JQuery.

Click on the item below to go through the description about that.

Disable the Control:

Disable the HTML controls like button, checkbox, textbox.
                    
$('#btn_submit').attr("disabled", true);
                    
                

Define the click event action:

Define the set of statements to be executed on click of control.
                    
$(document).ready(function () {
    $("#btn_submit").click(function () {
      // Click event action
    });
});
                    
                

Slide Taggle:

Slide taggle the content.
                    
$(".OnlineTable").slideToggle("slow");
                    
                

Get is checkbox checked:

Get the checkbox value. True, if checked. False, if unchecked.
                    
if($("#tdCheckBox").checked) {
    alert("Checked.");
}
else {
    alert("Unchecked.");
}
                    
                

Append the HTML tags:

Append the HTML tags inside another tag. In below example, <tr> tag is inserting into the <table> tag.
                    
$("#detail_table").append(
    "<tr>" +
    "<td class='thCheckbox' style='text-align:center;'>" +
    "<input type='checkbox' class='tdCheckBox' checked disabled /></<td>" +
    "<td><a class='anchor'>Full Name</a></td>" +
    "<td>E-Mail Id</td>" +
    "<td style='display:none;'>SSN</td>" +
    "</tr>"
);