Tuesday, September 17, 2013

CRM 2013 – Custom Actions

Custom Actions are a feature shipped with CRM 2013. The easiest way to explain the feature (for developers) is:

You are able to create your own OrganizationRequest”

It is possible to use the CRM UI for creating an “Action” or you can write Code that creates a custom Action.

action_category

Key Points (SDK)

  • Is defined using a Workflow entity record, similar to a real-time workflow.
  • Can be associated with a single entity or be global, meaning not associated with any particular entity.
  • Is executed in the core operation stage 30 of the event execution pipeline.
  • Supports the invocation of plug-ins and real-time workflows registered in the pre-operation and post-operation stages of the event execution pipeline.
  • Can have plug-ins or real-time workflows registered in the pre-operation or post-operation stages while the action status is Draft.
  • Is available through the organization.svc and organization.svc/web endpoints, but not the organizationdata.svc (OData) endpoint.
  • Always runs under the security context of the calling user.
  • Record cannot be deleted while there are plug-in steps and other real-time workflows registered on the action.
  • Can be invoked only by a web service method call, not directly from a workflow. However, the workaround is to write a custom workflow activity that invokes the action and add that to a workflow.
  • Can optionally participate in the current database transaction.
  • Does not support a scope where the execution is restricted to a user, business unit, or organization.
  • Supports input and output parameters.
  • Supports auditing of data changes.
  • Is not supported with offline clients.

This feature will reduce plugin code in the future, because it is possible to encapsulate a sequence of operations in one request.

cheers

Monday, September 16, 2013

CRM 2013 – Business Rules

One of the new pretty interesting Features of Microsoft Dynamics 2013 are Business Rules. The purpose of them is to allow non Developers to customize basic rules like

  • Show and hide fields
  • Set and reset “Business Required” for fields
  • Show Error-Message
  • Set specific Field Value
  • Lock or unlock fields

on specific triggers/conditions. Also Basic-Formulas (+, –, *, /) are possible.

formula

The UI looks nice and clean (a bit like IFTTT).

Example

Set “Approved by Manager” Field as Business Required when Budget Amount of Opportunity is more than 50000,00€.

Before:

business_rule_before

Business Rule:

business_rule

After:

business_rule_after

Hint:

The Value for “Business Required” is not resetting automatically when Budget Amount is decreased to < 50000. An additional rule is required.

less_rule

This feature will reduce the lines of JavaScript code in the future enormously.

cheers

Thursday, September 12, 2013

CRM 2011 – ErrorCode=0x80041102 The entity with ObjectTypeCode –1 was not found in the MetadataCache

I ran into this problem on my last project. This issue only occurs on the productive system when someone is opening the solution (delivered by us). QA, Dev and so on worked fine.

We were able to solve this doing a good old IISReset.

There are a lot of other reasons for this (or nearly the same) error.

cheers

Simple reading of CSV Files - CsvHelper

In my last project we had to retrieve a huge amount of data from an existing CSV-File. I found a nice, fast, little library on GitHub called CsvHelper.


The easiest approach is to create a target class for this if the columns of the CSV-File does not match to the properties of your default business object.

   1: using System;
   2: using System.Collections.Generic;
   3: using System.IO;
   4: using System.Linq;
   5: using System.Text;
   6:  
   7: using CsvHelper;
   8:  
   9: namespace MK.CsvExample
  10: {
  11:     class Program
  12:     {
  13:         static void Main(string[] args)
  14:         {
  15:             using (TextReader reader = File.OpenText(@"C:\tmp\Users.csv"))
  16:             {
  17:                 var csv = new CsvReader(reader);
  18:                 csv.Configuration.Delimiter = ";";
  19:  
  20:                 var usersFromCsv = csv.GetRecords<User>();
  21:  
  22:                 foreach (var user in usersFromCsv)
  23:                 {
  24:                     Console.WriteLine("{0} {1}, {2}, {3}, {4}",
  25:                         user.Firstname,
  26:                         user.Lastname,
  27:                         user.Street,
  28:                         user.City,
  29:                         user.Country);
  30:                 }
  31:             }
  32:             Console.ReadKey();
  33:         }
  34:     }
  35:  
  36:     /// <summary>
  37:     /// BusinessObject for getting CSV-Informations
  38:     /// Names needs to be the same as in the CSV-File
  39:     /// </summary>
  40:     public class User
  41:     {
  42:         public string Lastname { get; set; }
  43:         public string Firstname { get; set; }
  44:         public string Country { get; set; }
  45:         public string City { get; set; }
  46:         public string Street { get; set; }
  47:     }
  48: }

For usage of CSV-Files created in Excel, you have to change de Delimiter to a semicolon (see line 18).

csv-save

A NuGet package is also available: “PM> Install-Package CsvHelper”

cheers