Search This Blog

Wednesday, January 30, 2013

Some new contents for the XrmToolBox

I received some improvement requests from some users of my XrmToolBox and, as you know, it is so easy to develop tools for the XrmToolBox that I did what was asked, which is:

Converting the CRM 4.0 tool Access Checker for CRM 2011: So, this is a new tool. It allows you to check what access have a specific user for a specific record. You can define an entity, search for a specific record and a specific user and see what access rights are available.

image

Working with user views in View Layout Replicator: Yes, you can now propagate a user view layout to a system view and vice versa. Of course, you need read and write access to these user views since CRM security can’t be bypassed regarding userview. If the user view has not been shared with you with read and write access, the tool won’t work.

image

As usual, you can find everything on CodePlex

Tuesday, January 29, 2013

Stats time

Today, I receive a really generous donation from mister C. (he will recognized himself, thanks again) and I thought it was time to see some facts and numbers about my “work” for the CRM community.

Tools

As you might know, my contributions to the CRM community is mainly made of tools. So here is the download statistics from CodePlex (numbers since February 20th 2011, I don’t have statistics for my CRM 4.0 tools).

Tool Download count

SiteMap Editor

17452

Ribbon Editor

9006

CrmDiagTool 2011

8065

View Layout Replicator

4745

JavaScript WebResource Manager

4705

Metadata Document Generator

4620

Ribbon Browser

2249

Attribute Bulk Updater

2027

Role Updater

1714

WebResource Manager

1245

Connection Controls

1120

Solution Import

997

Iconator

703

XrmToolBox

562

TOTAL

58648

Numbers of downloads will obviously decrease since I have one tool instead of many. But I’m not participating to a competition and the ToolBox is so much better than having multiple applications.

Awards

I also received awards for my “work” for the community:

  • Microsoft MVP since 3 years
  • Microsoft Community Contributor (MCC) since 3 months (I’m almost the only one to answer to questions on the French technet forum dedicated to Microsoft Dynamics CRM, that helps)

What I win?

Being an MVP does not give you money but many advantages:

  • MSDN/Technet subscription
  • Invitation to MVP Summit each year (sadly, I will miss this year summit)
  • Some software companies offer NFR (not for resale) licenses of their products: that is really cool
  • Participating on the great community (and family) of CRM MVP’s

Being a MCC just gives a virtual badge and recognition

The only “real” money I receive, for this community “work”,  is from donation made from this blog or my tools. In the last two years and half, I received 8 donations (I thank again people for their generosity), that didn't allow me yet to buy a Microsoft Surface so other peoples who are using my tools know have to do now Sourire

PS: I quoted the word “work” in this article but it is not really a work, I really enjoy to develop tools and  help people on Microsoft Dynamics CRM topics

Thursday, January 17, 2013

How to follow updates of XrmToolBox on CodePlex

Do you know this great feature of CodePlex? You can subscribe to project releases and each time a new version is available, you receive an email. As I won’t blog each time there is a new version, the best way to be notified of a new version is to follow the project and subscribe to notifications of the release page.

It is really simple, you just need a CodePlex account (which can be linked to your Microsoft account), go to the XrmToolBox downloads page, and click on the link “get email notifications”

image

Then, when a new release is available, you receive an email like the following for today’s update:

image

XrmToolBox updated : 1.2012.1.17

Hi guys, no, I won’t talk about my HTML/JS grid in this post even if you expect it ! Wait couple of days, I’m in the process of improving performance…

I just wanted to notice a new version of the XrmToolBox which has minor improvements, but has a new tool: the Fetch Xml tester. It was a personnal tool I was using when writing my fetchXml queries and as I needed it for my HTML/JS grid, I transformed it in a XrmToolBox plugin (see screenshot below).

image

image

To see others improvements or download the new version, go to the Download Page

Monday, January 14, 2013

Full featured CRM grid in HTML/JS

In last December, I was asked to write a web resource to display a grid with CRM records. I was quite frustrated because I didn’t succeed to manage some grid features easily like fixed header with horizontal scrolling among others. I delivered a fixed table which was not so bad but absolutely not something that look like the application grid views.

So I decided to work harder to find a way to do this CRM style grid view. After some works (almost two full days), I have succeeded to create a full featured CRM grid view by using only JavaScript.

Here is a screenshot:

image

And this is how I can create a grid view from only a div in a HTML page

<html>
<
head>
<
title>Page de test</title>
<
script src="json2.js"></script>
<
script src="jquery.js"></script>
<
script src="XrmServiceToolKit.js"></script>
<
script src="sdk.metadata.js"></script>
<
script src="table.js"></script>
<
script src="scripts.js"></script>
<
script src="../../ClientGlobalContext.js.aspx"></script>
<
link href="style.css" type="text/css" rel="stylesheet"/>
</
head>
<
body onload="LoadPage();">
<
input type="button" onclick="display();" value="Afficher"/>
<
div id="baseDiv">

</
div>
</
body>
</
html>

And using this script

function LoadPage() {
MscrmTools.Table.Height = $(window.document).height() - 200;
MscrmTools.Table.Width = $(window.document).width() - 50;
MscrmTools.Table._minWidth = 500;
MscrmTools.Table._minHeight = 300;

MscrmTools.Table.CurrentEntity =
"account";
var layout = '<layoutxml>';
layout +=
'<grid name="resultset" object="1" jump="name" select="1" icon="1" preview="1">';
layout +=
'<row name="result" id="accountid">';
layout +=
'<cell name="name" width="300" />';
layout +=
'<cell name="accountnumber" width="100" />';
layout +=
'<cell name="primarycontactid" width="150" />';
layout +=
'<cell name="address1_city" width="100" />';
layout +=
'<cell name="telephone1" width="100" />';
layout +=
'<cell name="emailaddress1" width="200" />';
layout +=
'</row>';
layout +=
'</grid>';
layout +=
'</layoutxml>';

MscrmTools.Table.SetLayoutXml(layout);
MscrmTools.Table.CreateTable(window.document.getElementById(
"baseDiv"));

window.document.body.onresize = MscrmTools.Table.Resize;
}

function display() {
var fetch = '<fetch mapping="logical">';
fetch +=
'<entity name="account">';
fetch +=
'<attribute name="name"/>';
fetch +=
'<attribute name="accountnumber"/>';
fetch +=
'<attribute name="primarycontactid"/>';
fetch +=
'<attribute name="address1_city"/>';
fetch +=
'<attribute name="telephone1"/>';
fetch +=
'<attribute name="emailaddress1"/>';
fetch +=
'</entity>';
fetch +=
'</fetch>';

MscrmTools.Table.SetFetchXml(fetch);
MscrmTools.Table.BuildLines();
}

I won’t show the table.js as I’m still considering options to deliver this script to the community, but for information, it’s a 800 lines script of 38KB.


As I said before, it’s a full feature grid:



  • Define fetchXml and layoutXml
  • Fixed header with horizontal and vertical scrolling
  • Paging (the script allows to define Records per page)
  • Records selection count (with total items count)
  • Grid refresh
  • Column behavior:

    • order (by clicking on the column header)
    • resize (drag and drop column separator or double click on it)

  • row selection (single or multiple using Ctrl or Shift hotkeys, by row selection or checkbox ticking)
  • Lookup allows referenced record to be opened
  • Double click open selected row
  • Click and Double Click handler to allow developer to add its own behavior

And you? What do you think about this grid? How do you deal with this need to create CRM grid views?


[UPDATE]


With this post comments, I noticed that I wasn’t managing link entities attributes. It is done now! And also, I won’t manage column filtering, which seems a little bit too complicated for me.

Wednesday, January 9, 2013

XrmToolbox: Develop your own tools

If you visit the XrmToolbox CodePlex download page, you will notice two new files:

  • A Visual Studio 2012 project template to help you create your own tool
  • A development guide (based on the project template) that explains how to write it to be sure it fits correctly with the XrmToolbox.

If you develop your own tool and would like to share it with the community, I will be glad to make some noise about it on my blog or even on the XrmToolbox CodePlex page.

Happy coding!

Tuesday, January 8, 2013

SDK 5.0.13 : Yes! you can get only metadata you want!

Today, I want to share a really nice feature that was shipped with the latest version of the SDK: the possibility to query metadata (entity, attribute, relationships,…). Before this update, we have to get so many data just to have an entity object type code or icon url.

Now, you can query just what you want (filter) and select what data will be returned: so cool!

Here is a quick sample that returns only custom entities logical name and object type code

var filter = new MetadataFilterExpression(LogicalOperator.And);
filter.Conditions.Add(
new MetadataConditionExpression("IsCustomEntity", MetadataConditionOperator.Equals, true));

var properties = new MetadataPropertiesExpression();
properties.PropertyNames.AddRange(
"LogicalName", "ObjectTypeCode");

//An entity query expression to combine the filter expressions and property expressions for the query.
var entityQueryExpression = new EntityQueryExpression { Criteria = filter, Properties = properties };

//Retrieve the metadata for the query without a ClientVersionStamp
var retrieveMetadataChangesRequest = new RetrieveMetadataChangesRequest
{
Query = entityQueryExpression,
ClientVersionStamp =
null,
DeletedMetadataFilters =
DeletedMetadataFilters.OptionSet
};

var response = (RetrieveMetadataChangesResponse) service.Execute(retrieveMetadataChangesRequest);