Tuesday, October 19, 2010

Trigger N:N Association event and Dassiciation event in CRM Plugin

-- ===================================================================================================
-- Enable Associate and Disassociate Plug-in Events
-- execute the following query to CRM database, it will add two entries in SdkMessageFilterBase
-- 'DisassociateEntities' and 'AssociateEntities' from SdkMessageBase which is not listed
-- --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
USE CrmDev_MSCRM
GO

-- Find the deployments SDK Filter ID for the
-- Associate and Disassociate Entity SDK Messages
DECLARE @DisassociateEntitiesFilterId uniqueidentifier
DECLARE @AssociateEntitiesFilterId uniqueidentifier
SET @DisassociateEntitiesFilterId = (SELECT SdkMessageId FROM SdkMessageBase WHERE [Name] = 'DisassociateEntities')
SET @AssociateEntitiesFilterId = (SELECT SdkMessageId FROM SdkMessageBase WHERE [Name] = 'AssociateEntities')

-- Enable the Associate and Disassociate Filters to be valid for custom processing
-- Custom Processing means "you register plug-ins against it"
-- Note: We only do this for the "generic" (OTC == 0) case, just to be safer
UPDATE SdkMessageFilterBase SET IsCustomProcessingStepAllowed = 1 WHERE SdkMessageId = @DisassociateEntitiesFilterId AND PrimaryObjectTypeCode = 0
UPDATE SdkMessageFilterBase SET IsCustomProcessingStepAllowed = 1 WHERE SdkMessageId = @AssociateEntitiesFilterId AND PrimaryObjectTypeCode = 0
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
The above query will enable the 'DisassociateEntities' and 'AssociateEntities' message in the plug-in registration tool. While registering the plug-in select the entity name as ‘none’

While executing the plug-in you will be getting four parameter as input parameters from the plug in context along with the other properties :

1. Related Entity1 GUID and entity name
2. Related Entity2 GUID and entity name
3. Relation hsip name (nothing but intersect hidden N:N entity name)
4. Optional parameter.

Using these value you can implement you logic.

Sample Code for N:N relationship with a custom entity and System User:

public void Execute(IPluginExecutionContext context)
{
try
{
crmservice = context.CreateCrmService(true);

if (context.MessageName == "AssociateEntities")
{

if (context.InputParameters.Properties["RelationshipName"].ToString() == "new_new_customentity_systemuser")
{
string oId = string.Empty;
string SharedUserId = string.Empty;

oId = (context.InputParameters.Properties["Moniker1"] as Moniker).Id.ToString();

SharedUserId = (context.InputParameters.Properties["Moniker2"] as Moniker).Id.ToString();

// write you logic here

}
}

}
catch (System.Web.Services.Protocols.SoapException ex)
{
LogWriter.LogInfo(ex.ToString());
}

catch (Exception ex)
{
LogWriter.LogInfo(ex.ToString());
}
}

Note : As we have defined 'none' as the entity name while registering the plug-in, so this plug-in will get triggered when ever user will do add existing or remove existing, for any entity. So while writing the logic relationship name is required to identify from where plug-in has been triggered.

References: http://consulting.ascentium.com/blog/crm/Post533.aspx
http://mscrm-chandan.blogspot.com/2010/03/trigger-nn-association-event-and.html

Wednesday, September 2, 2009

Some usefull links about CRM Custmization

CRM Form Types

Is the user creating a new record?
crmForm.FormType == 1

Is the user updating an existing record
crmForm.FormType ==2

Is the user unable to update this record?
crmForm.FormType == 3

Is this record deactivated?
crmForm.FormType == 4

Is the user using the Quick Create form?
crmForm.FormType == 5

Is the user using the Bulk Edit form?
crmForm.FormType == 6

What is the unique ID for this record?
= crmForm.ObjectId

What type of record is this?
= crmForm.ObjectTypeCode

What type of record is this (Entity Name)?
= crmForm.ObjectTypeName

Is the user using the Outlook Client?
crmForm.IsForOutlookClient==true

Is the user using the Outlook Light Client?
crmForm.IsForOutlookLightClient == true

Is the user working On line?
crmForm.IsOnline==true

Have any fields in this form been changed?
crmForm.IsDirty==true

Reference:
http://mscrm-developer.blogspot.com/2008/09/crm-form-types.html

=======================================
Use full JavaScripts

http://ronaldlemmen.blogspot.com/

=========================================
Hide menu bar in Iframe

http://crm.atechnisch.nl/2008/03/hiding-bars-in-iframes/

=============================================
Tricks and Tips from Users of Microsoft Dynamics CRM
http://crm.atechnisch.nl/2008/03/hiding-bars-in-iframes/

Tuesday, July 28, 2009

Find login user of CRM using JavaScript

var xml = "" +
"" +
"< soap:envelope chema-instance="" chema="" envelope="" http:="" schemas.xmlsoap.org="" soap="" www.w3.org="" xmlns:soap="\ " xmlns:xsd="\ " xmlns:xsi="\ " >" +

GenerateAuthenticationHeader() +

" < soap:body >" +

" < retrievemultiple crm="" ebservices="" http:="" schemas.microsoft.com="" xmlns="\" >" +

" < query crm="" http:="" q1:queryexpression="" schemas.microsoft.com="" uery="" xmlns:q1="\" xsi:type="\" >" +

" < q1:entityname>systemuser< / q1:entityname >" +

" < q1:columnset q1:columnset="" xsi:type="\" >" +

" < q1:attributes >" +

" < q1:attribute>businessunitid < / q1:attribute >" +

" < q1:attribute>firstname< / q1:attribute >" +

" < q1:attribute>fullname" +

" < q1:attribute>lastname" +

" < q1:attribute>organizationid " +

" < q1:attribute>systemuserid" +

" < /q1:attributes >" +

" < /q1:columnset >" +

" < q1:distinct>false" +

" < q1:criteria >" +

" < q1:filteroperator>And" +

" < q1:conditions >" +

" < q1:condition >" +

" < q1:attributename>systemuserid" +

" < q1:operator>EqualUserId" +

" < / q1:condition >" +

" < / q1:conditions >" +

" < / q1:criteria >" +

" < / query >" +

" < / retrievemultiple >" +

" < / soap:body >" +

"< / soap:envelope >" +

"";



var xmlHttpRequest = new ActiveXObject("Msxml2.XMLHTTP");



xmlHttpRequest.Open("POST", "/mscrmservices/2007/CrmService.asmx", false);

xmlHttpRequest.setRequestHeader("SOAPAction", "http://schemas.microsoft.com/crm/2007/WebServices/RetrieveMultiple");

xmlHttpRequest.setRequestHeader("Content-Type", "text/xml; charset=utf-8");

xmlHttpRequest.setRequestHeader("Content-Length", xml.length);

xmlHttpRequest.send(xml);



var resultXml = xmlHttpRequest.responseXML;

var entityNode = resultXml.selectSingleNode("//RetrieveMultipleResult/BusinessEntities/BusinessEntity");



var firstNameNode = entityNode.selectSingleNode("q1:firstname").nodeTypedValue;

var lastNameNode = entityNode.selectSingleNode("q1:lastname").nodeTypedValue;

var fullNameNode = entityNode.selectSingleNode("q1:fullname").nodeTypedValue;

var systemUserIdNode = entityNode.selectSingleNode("q1:systemuserid").nodeTypedValue;

var businessUnitIdNode = entityNode.selectSingleNode("q1:businessunitid").nodeTypedValue;

var organizationIdNode = entityNode.selectSingleNode("q1:organizationid").nodeTypedValue;


alert(systemUserIdNode );