Using Mail Merge for other entities in CRM 4


Suppose we need to make use of Mail Merge functionality for the SalesOrder entity.

So one thing we could do is create custom button or menu items using isv.config for SalesOrder’s form as well as grid. Then we could use the same function used by CRM for other entities like Lead, Contact, Opportunity etc. as their JavaScript attribute.

Something like this

For SalesOrder Form

JavaScript="onActionMenuClick(‘webmailmerge’, 1088)”

For SalesOrder Grid

JavaScript="WebMailMerge(‘crmGrid’, 1088);"

1088- entity type code for sales order

Still trying to find out how to add mail merge template for sales order or other system entity.

Found this post

http://blog.sonomapartners.com/2008/01/enabling-mail-m.html

Unfortunately that didn’t work for sales order entity.

One more thing, all these methods are unsupported one!!

Bye..

Few more JavaScript for CRM


Hi,

While searching for “how to hide new button” from related entity’s grid, these are certain things i found out

Suppose if we want to hide few things from the top bar of the CRM, where we could see New Activity, New Record etc.., we need to write  JavaScript in the following page

bar_Top.aspx within _root.

For e.g. if we want to hide ‘New Activity’ button than

<script type="text/javascript">
    function window.onload() {
        document.getElementById(‘mnu_new_activity’).style.display = ‘none’;
          }
</script>

 

From entity’s grid, if we want to hide say assign button than we need to write JavaScript on the following page

HomePage.aspx

<script language="JavaScript">

    function window.onload() {
       document.getElementById(‘_MBdoActioncrmGrid4assign’).style.display = ‘none’;
            }
</script>

And for entity’s form it would

edit.aspx page for that entity.

for lead it would be

SFA\leads\edit.aspx

for invoice it would be

\SFA\invoice\edit.aspx etc..

However this way of using JavaScript is unsupported.

And lastly for hiding add existing button or new button from related entity’s grid, check this site

http://blog.davehawes.com/post/2008/04/23/MSCRM-4-Remove-Add-Existing-xxxxx-button.aspx

Bye..

One or more of the option values for this picklist are not in the range of allowed values in CRM 4


Hi,

I started getting this issue on one of our entities while saving it.

This wasn’t the issue in CRM 3.0, this issue came up only after upgrading to CRM 4.0.

I was sure that the issue is because of some picklist getting filled up with dynamic options. But what was surprising was it was working perfectly fine in CRM 3.0.

After looking for it , i realized that the above error only comes in CRM 4.0, in CRM 3.0, it doesn’t throw error and we are also able to save the form.

So i thought of trying out these two options for correcting the error in CRM 4.0,

1) Dynamically disabled the field using JavaScript on the onSave and enabling it on onLoad. Disabled field’s value wouldn’t be passed to the CRM Platform so i thought this would resolve my issue. For update it worked, however it didn’t work for new form.

2) Than i thought of writing a plugin that on pre create or pre update event would remove the picklist field from being passed as an inputparameter to the CRM Platform. However the error showed up before we could even reach the pre-create plugin.

So finally added few options through customization section and on the onload removed that option using DeleteOption for the picklist. And than i was able to work with that picklist properly and was also able to solve the form

bye.

Understanding workflowContext.MessageName of IWorkflowContext interface in CRM workflow activity.


Hi,

Today i was trying to find out what could be the different values for it.

So i had my custom workflow activity registered against all the triggering conditions.

i.e. Record is created, record status changes, record is assigned, record attribute change and record is deleted.

Well these were my findings

for record is created the message name was “Create”

for record status changes, record is assigned, record attribute change it was “Update”.

for record is deleted it was “Delete”.

And one more thing if we have selected both the conditions i.e. record attribute change and record is assigned,  owner field within record attribute change gets auto selected.

bye.

Calling form’s JavaScript functions in ISV.CONFIG


Hi,

We had a requirement to check for user’s role on click of one of the isv.config button. So we thought of using JavaScript attribute of the button.

This is one of the very good article about how to use javascript for checking the roles

http://jianwang.blogspot.com/2008/01/crm-40-check-current-users-security.html

However using JavaScript within ISV.Config has its own share of trouble as it is an xml file, so we need to replace so many characters within it and moreover this has to be done very carefully.

So what we decided that we’d put the JavaScript code in the entity’s form’s onload event and would simply call that function within isv.config, than we wouldn’t have to replace characters within JavaScript for making them xml specific.

So suppose this is the JavaScript function

function UserHasRole(roleName)
{
 //get Current User Roles, oXml is an object
 var oXml = GetCurrentUserRoles();
 if(oXml != null)
 {
  //select the node text
  var roles = oXml.selectNodes("//BusinessEntity/q1:name");
  if(roles != null)
  {
   for( i = 0; i < roles.length; i++)
   {
    if(roles[i].text == roleName)
    {
     //return true if user has this role
     return true;
    }
   }
  }
 }
 //otherwise return false
 return false;
}

 

Now to make it reusable, so that we could call it within isv.config we just need to change its declaration

from

function UserHasRole(roleName)

{

// function body

}

to

UserHasRole=function(roleName)

{

// function body

}

and put it in the form’s onload event javascript.

And to call it within Button’s JavaScript –>

UserHasRole(‘System Administrator’)

Just like a normal function !!

 

Bye…

Set ActivityParty for DynamicEntity


Hi,

To set activityparty property in case of DynamicEntity we need to make use DynamicEntityArrayProperty.

Below is the sample code for creating an appointment programmatically using DynamicEntity and setting requiredattendees which is an ActivityParty property.

CrmSdk.CrmAuthenticationToken myToken = new CrmAuthenticationToken();

        myToken.OrganizationName = "orgname";

        myToken.AuthenticationType = 0;

        CrmSdk.CrmService myService = new CrmService();

        myService.CrmAuthenticationTokenValue = myToken;

        myService.Credentials = System.Net.CredentialCache.DefaultCredentials;

        DynamicEntity myAppointment = new DynamicEntity();

        myAppointment.Name = EntityName.appointment.ToString();

        StringProperty subject = new StringProperty();

        subject.Name = "subject";

        subject.Value = "Test Subject";

        // Set a contact for party

        DynamicEntity requiredAtt1 = new DynamicEntity();

        requiredAtt1.Name = "activityparty";

        // create a contact property

        LookupProperty contactProp = new LookupProperty();

        contactProp.Name = "partyid";

        Lookup contactLookup = new Lookup();

        contactLookup.type = "contact";

        contactLookup.Value = new Guid("{2DE7671B-987D-DE11-8AB8-0003FFD21C1C}");

        contactProp.Value = contactLookup;

        // add contact property

        requiredAtt1.Properties = new Property[] { contactProp };

        // Set an account for party

        DynamicEntity requiredAtt2 = new DynamicEntity();

        requiredAtt2.Name = "activityparty";

        // create an account property

        LookupProperty accountProp = new LookupProperty();

        accountProp.Name = "partyid";

        Lookup accountLookup = new Lookup();

        accountLookup.type = "contact";

        accountLookup.Value = new Guid("{A4BB3561-748D-DE11-8CD4-0003FFD21C1C}");

        accountProp.Value = accountLookup;

        // add account property

        requiredAtt2.Properties = new Property[] { accountProp };

        // create to property. it is an dynamic entity array

        DynamicEntityArrayProperty raProp= new DynamicEntityArrayProperty();

        raProp.Name = "requiredattendees";

        // add contact and account activity parties

        raProp.Value = new DynamicEntity[] { requiredAtt1, requiredAtt2 };

        // set scheduledStart date

        CrmDateTimeProperty scheduledStart = new CrmDateTimeProperty();

        scheduledStart.Name = "scheduledstart";

        CrmDateTime ss = new CrmDateTime();

        ss.Value = DateTime.Now.ToString();

        scheduledStart.Value = ss;

        // set scheduledend date

        CrmDateTimeProperty scheduledEnd = new CrmDateTimeProperty();

        scheduledEnd.Name = "scheduledend";

        CrmDateTime se = new CrmDateTime();

        se.Value = DateTime.Now.AddHours(1).ToString();

        scheduledEnd.Value = se;        

        myAppointment.Properties = new Property[] { subject,raProp, scheduledStart,scheduledEnd };

        Guid mycontactGuid = new Guid();

        try

        {

            mycontactGuid = myService.Create(myAppointment);

        }

        catch (SoapException ex)

        {

         //   handle exception

        }

Bye..