<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-4058165759694816344</id><updated>2011-11-28T01:29:32.755+02:00</updated><category term='xml'/><category term='jscript'/><category term='attribute names'/><category term='Microsoft'/><category term='installation'/><category term='CRM'/><category term='deploy changes'/><category term='development'/><category term='views'/><category term='isv'/><category term='synchronization'/><category term='iframes'/><category term='tooltips'/><category term='multiple crm servers'/><category term='crm 3.0'/><category term='website'/><category term='editing navigation'/><category term='MSCRM'/><category term='sql server'/><category term='2005'/><category term='crm 4.0'/><category term='crm tooltips'/><category term='customizations'/><category term='entities'/><category term='Dynamics CRM Client'/><category term='forms'/><category term='toolbar button'/><category term='link'/><category term='Outlook Performance'/><category term='publishing customizations'/><category term='2008'/><category term='sitemap'/><title type='text'>CRM DE LA CREME!</title><subtitle type='html'>The Emergency Room Support for Microsoft Dynamic CRM profesionals and users!</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://crmdelacreme.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://crmdelacreme.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Tiaan van Niekerk</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Ky8MLSxenl8/S86MPSGeVPI/AAAAAAAAAO0/Ln5Gkx7EP5I/S220/Snapshot+of+me+4.png'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>52</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4058165759694816344.post-6155188667655702785</id><published>2010-05-21T06:49:00.002+02:00</published><updated>2010-05-21T06:52:01.839+02:00</updated><title type='text'>CRM Installation Tips</title><content type='html'>&lt;span style="font-family:arial;"&gt;&lt;strong&gt;All Installations&lt;/strong&gt;&lt;br /&gt;Whether you are upgrading an existing CRM 3 installation or installing a fresh new CRM 4 installation, you will have to pay close attention to all of the system requirements prior to starting your installation or upgrade process. The CRM installation program has a fairly good pre-requisites test that will assess your infrastructure and give you a report of your readiness prior to actually performing the installation.&lt;br /&gt;Some of the things that you should be aware of before you start. Install the latest version of .Net framework on the CRM server, and be aware that CRM 4 requires both SQL Server 2005 and SQL Server Reporting Services 2005, both with Service Pack 2. I recommend that you take care of these prerequisited before starting the CRM 4 installation program, otherwise your prerequisites will fail and the installation program will not let you continue with the installation. &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;&lt;strong&gt;Upgrading from CRM3&lt;/strong&gt;&lt;br /&gt;Backup everything - including your existing CRM 3 operating system. Backup your databases as well. If your CRM 4 upgrade fails, you will be left with having to reinstall CRM 3 from scratch. So backup everything. Consider yourself forewarned!&lt;br /&gt;Many CRM 3 installations are still running on a SQL 2000 / SQL 2000 Reporting Services Infrastructure. The initial installation guides do not cover the topic of upgrading your SQL infrastructure before you start the CRM 4 upgrade process, but it is an absolute requirement. I highly recommend that to prepare for a CRM 4 upgrade, you upgrade your existing CRM 3 installation to SQL 2005 and ensure that it is all working before you start an upgrade to CRM 4. I would even recommend that you upgrade to SQL 2005 and take a new backup so that your restore point is not so far back. You may even wish to split your upgrade process into a couple of weekends, upgrading your SQL infrastructure on the first weekend, then the CRM system on the next weekend.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="color:#ff0000;"&gt;*IMPORTANT NOTE*&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;If you upgrade your database to SQL 2005, you *MUST* ensure that full-text indexing is enabled on your SQL 2005 database prior to running the installation progam. The CRM 4 installation does not test for this, and if full text indexing is not enabled, you will encounter an installation error and be left with the only option of reinstalling CRM 3 and restarting the entire process. You may even have to reinstall your operating system or restore the OS from backups as you may have difficulties with the CRM 3 installation process as well after a botched CRM 4 installation. Full text indexing should be on for SQL 2005 databases, but if you mount a SQL 2000 database in SQL 2005, it might not be enabled. You can enable full text indexing by issuing the following SQL command on that database:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#000066;"&gt;sp_fulltext_database @action='enable'&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;em&gt;Installing Reporting Services SP2&lt;/em&gt;&lt;/strong&gt;&lt;br /&gt;You may have a problem trying to patch Reporting Services with Service Pack 2. The upgrade program creates bad SQL that it runs in the process, and that results in the installation failing. The solution is to locate the upgrade log, then strip out the SQL, make the required changes, then run it manually. For example, if your reporting server database is CRM_ReportingServices, the SQL commands will include a USE statement of: USE CRM_[CRM_ReportingServices], which is not valid. I have not found any other way to fix this problem. That said, CRM 4 will require Reporting Services 2005 Service Pack 2, so I recommend you ensure that your reporting services is properly patched prior to installing and configuring CRM 4.&lt;br /&gt;Before you start the CRM 4 upgrade/installation process, be sure to test your Reporting Services url.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;404.1 Error Accessing Reporting Services from the CRM Server&lt;br /&gt;&lt;/strong&gt;You may encounter an issue where the reporting services url does not work from the server that you are installing CRM from. When you browse the reporting services url, you are challenged for credentials 3 times and then given a generic 401.1 error. The fix is to either disable the LSA loopback check, or add the url to the list of valid host names on the reporting services server. See &lt;em&gt;&lt;span style="color:#000066;"&gt;http://support.microsoft.com/?id=896861&lt;/span&gt;&lt;/em&gt; for more information.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Email Router Configuration&lt;/strong&gt;&lt;br /&gt;The email router can be installed and configured seperately. When you install an instance of CRM 4, you will have to provide a friendly name and a convenient name for your CRM organization. This short name for the organization is used as part of the url (keep in mind that CRM 4 is multi-tenant capable). The url is normally not case sensitive, EXCEPT for the email router configuraiton. If you do not get the case properly, it will fail to load the users and will give you false instructions on how to determine your url. Do not follow those instructions - open the deployment manager and use the exact organization name from that program instead. Once you get the exact url, with case proper, you should be able to configure the email gateway.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Access Denied and SPNs&lt;/strong&gt;&lt;br /&gt;On one of my installations, the CRM web interface would prompt me for credentials, then give me a 401.1 access denied error. I had installed CRM 4 on a website that had custom host headers (custom urls). When I used the custom url (that was not the domain name of the machine), the integrated security would fail. During the installation program, it raised a warning that the website did not resolve to the machine name, so the CRM installation program did tell me about the problem. I noticed that if I used localhost for the url, the website would work fine, but it would not work using the custom url for the site. The solution to the problem was to download the &lt;span style="color:#000066;"&gt;&lt;em&gt;SETSPN.EXE&lt;/em&gt;&lt;/span&gt; program from the Microsoft website and issue a &lt;em&gt;&lt;span style="color:#000066;"&gt;SETSPN -A HOST/[url] [machine-name]&lt;/span&gt;&lt;/em&gt; command. Once I ran this, everything worked properly. Welcome to the world of SPNs.&lt;br /&gt;Note that this can also cause an issue with Reporting services. If you are using a custom url for reporting services, integrated security might also fail. Unfortunately, the fix that is promoted is to change the NTAuthenticationProviders IIS metabase property to "NTLM". This will make Reporting Services work, but is incompatible with CRM, as CRM needs "Negotiate, NTLM". That said, the better way to fix reporting services is to register the SPN for that url too, without making modifications to the NTAuthenticationProviders metabase attribute. This will ensure that both Reporting Services and CRM will function on the same machine.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4058165759694816344-6155188667655702785?l=crmdelacreme.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/6155188667655702785'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/6155188667655702785'/><link rel='alternate' type='text/html' href='http://crmdelacreme.blogspot.com/2010/05/crm-installation-tips.html' title='CRM Installation Tips'/><author><name>Tiaan van Niekerk</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Ky8MLSxenl8/S86MPSGeVPI/AAAAAAAAAO0/Ln5Gkx7EP5I/S220/Snapshot+of+me+4.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-4058165759694816344.post-3545066031125332640</id><published>2010-05-18T06:10:00.004+02:00</published><updated>2010-05-20T06:02:54.043+02:00</updated><title type='text'>Point a IFrame to a external website</title><content type='html'>&lt;span style="font-family:arial;"&gt;Microsoft Dynamics CRM allows you to access external web sites from within forms using IFRAMES (Inline Frames). You can configure the IFRAME to take information from the parent record. A pretty standard use of this is a Web tab on the Account form where the Account’s web site URL is passed to the IFRAME and the web site is available from a Web tab.&lt;br /&gt;&lt;br /&gt;To do this, one sets up a little code for the form On Load event that puts the Accounts web site URL into the IFRAME’s URL. It’s actually pretty simple. Here is the code (assumes you already know how to set up an IFRAME). IFRAME_WebSite is the name of the IFRAME and .src references the URL it uses.&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#000066;"&gt;&lt;em&gt;// Load web site URL&lt;br /&gt;{&lt;br /&gt;var AccountURL = crmForm.all.websiteurl.DataValue;&lt;br /&gt;if (AccountURL != null)&lt;br /&gt;{&lt;br /&gt;crmForm.all.IFRAME_WebSite.src = AccountURL;&lt;br /&gt;}&lt;br /&gt;}&lt;/em&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;color:#000066;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;color:#ff0000;"&gt;&lt;strong&gt;Note:&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;color:#000000;"&gt;When working with iframes in Microsoft Dynamics CRM, you may find that you need to set the source of the iframe to a blank page (often I set the source to a blank page in the form configuration – I almost always have javascript dynamically build the url for the source during the page load). Traditionally, CRM developers and consultants (myself included in this bunch) have always been setting the iframe source to about:blank. While this has been adequate for many situations, I’ve started to notice there can be issues when viewing the iframe in a browser that has Enhanced Security Configuration installed. &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;color:#000000;"&gt;The issue that crops up is that about:blank will trigger warning notifications in Internet Explorer – if you’re pulling the pages up from the server (which is how I’m usually doing config work – since I’m an outside consultant), this can be a bit of a nuisance. But I’ve also been in a situation at a client who had a very tightly controlled and locked-down Active Directory environment and about:blank was throwing security warning on the client XP machines. Needless to say, this was not acceptable.&lt;br /&gt;Fortunately, there is a CRM url you may use to display a blank page. Instead of setting the iframe source to about:blank, I’ve gotten into the habit of setting it to &lt;strong&gt;&lt;em&gt;/_root/Blank.aspx&lt;/em&gt;&lt;/strong&gt;. This gives you a valid url to set the iframe source to while also providing a blank space within the iframe. This method works in any iframe situation without throwing the security warnings, so I’ve made it a standard practice to always use &lt;em&gt;&lt;strong&gt;/_root/blank.aspx&lt;/strong&gt;&lt;/em&gt; when I need a blank page.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4058165759694816344-3545066031125332640?l=crmdelacreme.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://social.microsoft.com/Forums/en-US/crm/thread/60efc5a8-df09-41a5-b43a-f92cde1eca1f' title='Point a IFrame to a external website'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/3545066031125332640'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/3545066031125332640'/><link rel='alternate' type='text/html' href='http://crmdelacreme.blogspot.com/2010/05/point-iframe-to-external-website_18.html' title='Point a IFrame to a external website'/><author><name>Tiaan van Niekerk</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Ky8MLSxenl8/S86MPSGeVPI/AAAAAAAAAO0/Ln5Gkx7EP5I/S220/Snapshot+of+me+4.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-4058165759694816344.post-2870104148253443835</id><published>2010-05-17T11:22:00.004+02:00</published><updated>2010-05-18T06:13:22.178+02:00</updated><title type='text'>Making a field required based on picklist value</title><content type='html'>&lt;em&gt;&lt;span style="font-family:arial;color:#000066;"&gt;if (crmForm.all."PickListAttributeName".SelectedText == "Other")&lt;br /&gt;//or use to .SelectedIndex or .DataValue&lt;br /&gt;{&lt;br /&gt;crmForm.SetFieldReqLevel("theOtherField".id, 1);&lt;br /&gt;//set it to required&lt;br /&gt;}&lt;br /&gt;else&lt;br /&gt;{&lt;br /&gt;crmForm.SetFieldReqLevel("theOtherField".id, 0);&lt;br /&gt;//set it to not required&lt;br /&gt;}&lt;/span&gt;&lt;/em&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4058165759694816344-2870104148253443835?l=crmdelacreme.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/2870104148253443835'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/2870104148253443835'/><link rel='alternate' type='text/html' href='http://crmdelacreme.blogspot.com/2010/05/blog-post.html' title='Making a field required based on picklist value'/><author><name>Tiaan van Niekerk</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Ky8MLSxenl8/S86MPSGeVPI/AAAAAAAAAO0/Ln5Gkx7EP5I/S220/Snapshot+of+me+4.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-4058165759694816344.post-2098089284164972236</id><published>2010-05-17T10:21:00.001+02:00</published><updated>2010-05-18T06:13:55.704+02:00</updated><title type='text'>Enabled and disable fields based on a user role</title><content type='html'>&lt;span style="font-family:arial;"&gt;All had a question to see if this could be done and this is the code that was used to enabled and disable fields based on a user role when a value is changed in a list box change event.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#000066;"&gt;function UserHasRole(roleName)&lt;br /&gt;{&lt;br /&gt;//get Current User Roles, oXml is an object&lt;br /&gt;var oXml = GetCurrentUserRoles();&lt;br /&gt;if(oXml != null)&lt;br /&gt;{&lt;br /&gt;//select the node text&lt;br /&gt;var roles = oXml.selectNodes("//BusinessEntity/q1:name");&lt;br /&gt;if(roles != null)&lt;br /&gt;{&lt;br /&gt;for( i = 0; i &amp;lt; roles.length; i++)&lt;br /&gt;{&lt;br /&gt;if(roles[i].text == roleName)&lt;br /&gt;{&lt;br /&gt;//return true if user has this role&lt;br /&gt;return true;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;//otherwise return false&lt;br /&gt;return false;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function GetCurrentUserRoles()&lt;br /&gt;{&lt;br /&gt;var xml = "" +&lt;br /&gt;"&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;" +&lt;br /&gt;"&amp;lt;soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"&amp;gt;" +&lt;br /&gt;GenerateAuthenticationHeader() +&lt;br /&gt;" &amp;lt;soap:Body&amp;gt;" +&lt;br /&gt;" &amp;lt;RetrieveMultiple xmlns="http://schemas.microsoft.com/crm/2007/WebServices"&amp;gt;" +&lt;br /&gt;" &amp;lt;query xmlns:q1="http://schemas.microsoft.com/crm/2006/Query" xsi:type="q1:QueryExpression"&amp;gt;" +&lt;br /&gt;" &amp;lt;q1:EntityName&amp;gt;role&amp;lt;/q1:EntityName&amp;gt;" +&lt;br /&gt;" &amp;lt;q1:ColumnSet xsi:type="q1:ColumnSet"&amp;gt;" +&lt;br /&gt;" &amp;lt;q1:Attributes&amp;gt;" +&lt;br /&gt;" &amp;lt;q1:Attribute&amp;gt;name&amp;lt;/q1:Attribute&amp;gt;" +&lt;br /&gt;" &amp;lt;/q1:Attributes&amp;gt;" +&lt;br /&gt;" &amp;lt;/q1:ColumnSet&amp;gt;" +&lt;br /&gt;" &amp;lt;q1:Distinct&amp;gt;false&amp;lt;/q1:Distinct&amp;gt;" +&lt;br /&gt;" &amp;lt;q1:LinkEntities&amp;gt;" +&lt;br /&gt;" &amp;lt;q1:LinkEntity&amp;gt;" +&lt;br /&gt;" &amp;lt;q1:LinkFromAttributeName&amp;gt;roleid&amp;lt;/q1:LinkFromAttributeName&amp;gt;" +&lt;br /&gt;" &amp;lt;q1:LinkFromEntityName&amp;gt;role&amp;lt;/q1:LinkFromEntityName&amp;gt;" +&lt;br /&gt;" &amp;lt;q1:LinkToEntityName&amp;gt;systemuserroles&amp;lt;/q1:LinkToEntityName&amp;gt;" +&lt;br /&gt;" &amp;lt;q1:LinkToAttributeName&amp;gt;roleid&amp;lt;/q1:LinkToAttributeName&amp;gt;" +&lt;br /&gt;" &amp;lt;q1:JoinOperator&amp;gt;Inner&amp;lt;/q1:JoinOperator&amp;gt;" +&lt;br /&gt;" &amp;lt;q1:LinkEntities&amp;gt;" +&lt;br /&gt;" &amp;lt;q1:LinkEntity&amp;gt;" +&lt;br /&gt;" &amp;lt;q1:LinkFromAttributeName&amp;gt;systemuserid&amp;lt;/q1:LinkFromAttributeName&amp;gt;" +&lt;br /&gt;" &amp;lt;q1:LinkFromEntityName&amp;gt;systemuserroles&amp;lt;/q1:LinkFromEntityName&amp;gt;" +&lt;br /&gt;" &amp;lt;q1:LinkToEntityName&amp;gt;systemuser&amp;lt;/q1:LinkToEntityName&amp;gt;" +&lt;br /&gt;" &amp;lt;q1:LinkToAttributeName&amp;gt;systemuserid&amp;lt;/q1:LinkToAttributeName&amp;gt;" +&lt;br /&gt;" &amp;lt;q1:JoinOperator&amp;gt;Inner&amp;lt;/q1:JoinOperator&amp;gt;" +&lt;br /&gt;" &amp;lt;q1:LinkCriteria&amp;gt;" +&lt;br /&gt;" &amp;lt;q1:FilterOperator&amp;gt;And&amp;lt;/q1:FilterOperator&amp;gt;" +&lt;br /&gt;" &amp;lt;q1:Conditions&amp;gt;" +&lt;br /&gt;" &amp;lt;q1:Condition&amp;gt;" +&lt;br /&gt;" &amp;lt;q1:AttributeName&amp;gt;systemuserid&amp;lt;/q1:AttributeName&amp;gt;" +&lt;br /&gt;" &amp;lt;q1:Operator&amp;gt;EqualUserId&amp;lt;/q1:Operator&amp;gt;" +&lt;br /&gt;" &amp;lt;/q1:Condition&amp;gt;" +&lt;br /&gt;" &amp;lt;/q1:Conditions&amp;gt;" +&lt;br /&gt;" &amp;lt;/q1:LinkCriteria&amp;gt;" +&lt;br /&gt;" &amp;lt;/q1:LinkEntity&amp;gt;" +&lt;br /&gt;" &amp;lt;/q1:LinkEntities&amp;gt;" +&lt;br /&gt;" &amp;lt;/q1:LinkEntity&amp;gt;" +&lt;br /&gt;" &amp;lt;/q1:LinkEntities&amp;gt;" +&lt;br /&gt;" &amp;lt;/query&amp;gt;" +&lt;br /&gt;" &amp;lt;/RetrieveMultiple&amp;gt;" +&lt;br /&gt;" &amp;lt;/soap:Body&amp;gt;" +&lt;br /&gt;"&amp;lt;/soap:Envelope&amp;gt;" +&lt;br /&gt;"";&lt;br /&gt;&lt;br /&gt;var xmlHttpRequest = new ActiveXObject("Msxml2.XMLHTTP");&lt;br /&gt;&lt;br /&gt;xmlHttpRequest.Open("POST", "/mscrmservices/2007/CrmService.asmx", false);&lt;br /&gt;xmlHttpRequest.setRequestHeader("SOAPAction"," http://schemas.microsoft.com/crm/2007/WebServices/RetrieveMultiple");&lt;br /&gt;xmlHttpRequest.setRequestHeader("Content-Type", "text/xml; charset=utf-8");&lt;br /&gt;xmlHttpRequest.setRequestHeader("Content-Length", xml.length);&lt;br /&gt;xmlHttpRequest.send(xml);&lt;br /&gt;&lt;br /&gt;var resultXml = xmlHttpRequest.responseXML;&lt;br /&gt;return(resultXml);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;//This is the code used to enable or disable the fields in CRM 4.&lt;br /&gt;&lt;br /&gt;try&lt;br /&gt;{&lt;br /&gt;if(crmForm.all.isp_goodwill.DataValue == '1') //List box selected = yes&lt;br /&gt;{&lt;br /&gt;if(UserHasRole("Goodwill Manager")) //Role to look for&lt;br /&gt;{&lt;br /&gt;//Fields to enable.&lt;br /&gt;crmForm.all.isp_goodwillrequestedbyid.Disabled = false;&lt;br /&gt;crmForm.all.isp_goodwillapprovedbyid.Disabled = false;&lt;br /&gt;crmForm.all.isp_goodwillvalueapproved.Disabled = false;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;catch(e)&lt;br /&gt;{&lt;br /&gt;alert(this.gErrorMessage("Authorisation Form",e.description ));&lt;br /&gt;}&lt;/span&gt;&lt;/em&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4058165759694816344-2098089284164972236?l=crmdelacreme.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/2098089284164972236'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/2098089284164972236'/><link rel='alternate' type='text/html' href='http://crmdelacreme.blogspot.com/2010/05/enabled-and-disable-fields-based-on.html' title='Enabled and disable fields based on a user role'/><author><name>Tiaan van Niekerk</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Ky8MLSxenl8/S86MPSGeVPI/AAAAAAAAAO0/Ln5Gkx7EP5I/S220/Snapshot+of+me+4.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-4058165759694816344.post-955456579423237793</id><published>2010-05-05T13:55:00.002+02:00</published><updated>2010-05-05T14:05:09.207+02:00</updated><title type='text'>Getting a quick introduction into CRM 4</title><content type='html'>Hi&lt;br /&gt;I used this website to quickly get a overview of how MS CRM works.&lt;br /&gt;This helped me alot.&lt;br /&gt;&lt;br /&gt;Enjoy!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4058165759694816344-955456579423237793?l=crmdelacreme.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.democrmonline.com/' title='Getting a quick introduction into CRM 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/955456579423237793'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/955456579423237793'/><link rel='alternate' type='text/html' href='http://crmdelacreme.blogspot.com/2010/05/getting-quick-introduction-into-crm-4.html' title='Getting a quick introduction into CRM 4'/><author><name>Tiaan van Niekerk</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Ky8MLSxenl8/S86MPSGeVPI/AAAAAAAAAO0/Ln5Gkx7EP5I/S220/Snapshot+of+me+4.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-4058165759694816344.post-7322857657371219896</id><published>2010-05-04T07:49:00.004+02:00</published><updated>2010-05-18T06:14:37.673+02:00</updated><title type='text'>Some more useful javascripts for MS CRM</title><content type='html'>&lt;span style="font-family:arial;"&gt;&lt;strong&gt;HI,Like I mentioned I found some more useful scripts on the internet&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-family:Arial;"&gt;Enjoy!&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-family:Arial;"&gt;&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;strong&gt;Replacing the content of an IFRAME&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;If you really want to do some funny things in your CRM form, you can create an IFRAME serving as a placeholder for your real HTML code. Create an IFRAME in an entity and name it "IFRAME_TEST". In the Onload event put the following code:&lt;br /&gt;crmForm.all.IFRAME_TEST_d.innerHTML ="&amp;lt;b&amp;gt;Some HTML text&amp;lt;/b&amp;gt;";&lt;br /&gt;Note the "_d" at the end of IFRAME_TEST. &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;This single line replaces the whole IFRAME element with your own HTML.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Adding additional values to duration fields&lt;/strong&gt;&lt;br /&gt;The following script adds the new option "42 Minutes" to the actualdurationminutes field in a task:&lt;br /&gt;&lt;br /&gt;var duration = crmForm.all.actualdurationminutesSelect;&lt;br /&gt;var tables = duration.getElementsByTagName("table");&lt;br /&gt;var table = tables[1];var row = table.insertRow();&lt;br /&gt;var newOption = row.insertCell(-1);&lt;br /&gt;var newValue = "42 Minutes";&lt;br /&gt;newOption.setAttribute("val", newValue);&lt;br /&gt;newOption.innerText = newValue;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Changing the title of a CRM form&lt;/strong&gt;&lt;br /&gt;document.title = "Hello World!";&lt;br /&gt;Changing the Link of a Ticker Symbol from MSN Money to Yahoo Finances&lt;br /&gt;This is an unsupported solution as it requires modifications to server files!&lt;br /&gt;Open the following directory on your CRM server: C:Inetpubwwwroot_formscontrols (may vary depending on your installation)Open the following file: INPUT.text.ticker.htcSearch the following function:&lt;br /&gt;&lt;br /&gt;function Launch()&lt;br /&gt;{&lt;br /&gt;if(value.length &amp;gt; 0)&lt;br /&gt;{&lt;br /&gt;Parse();&lt;br /&gt;window.open("http://go.microsoft.com/fwlink?linkid=8506&amp;amp;Symbol=" + encodeURIComponent(value), "", "height=" + (screen.availHeight * .75) + ",width=" + (screen.availWidth * .75) + ,scrollbars=1,resizable=1,status=1,toolbar=1,menubar=1,location=1"); }}&lt;br /&gt;Replace it with the following:&lt;br /&gt;function Launch()&lt;br /&gt;{&lt;br /&gt;if(value.length &amp;gt; 0)&lt;br /&gt;{&lt;br /&gt;Parse();&lt;br /&gt;//window.open("http://go.microsoft.com/fwlink?linkid=8506&amp;amp;Symbol=" + encodeURIComponent(value), "", "height=" + (screen.availHeight * .75) + ",width=" + (screen.availWidth * .75) + ,scrollbars=1,resizable=1,status=1,toolbar=1,menubar=1,location=1");&lt;br /&gt;window.open("http://finance.yahoo.com/q?s=" + encodeURIComponent(value), "", "height=" + (screen.availHeight * .75) + ",width=" + (screen.availWidth * .75) + ",scrollbars=1,resizable=1,status=1,toolbar=1,menubar=1,location=1");&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Save the file.On your client machine: Open Internet Explorer and remove all temporary internet files, so that the new htc source is retrieved. Navigate to any ticker symbol, enter a valid value and double click it.&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;strong&gt;Counting the number of backslashes in a string&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;Of course you can use the two code snippets with any character you like.&lt;br /&gt;&lt;strong&gt;Solution 1&lt;br /&gt;&lt;/strong&gt;var text = "hardware\printers\Epson";var paths = text.split("\");alert(paths.length -1);&lt;br /&gt;&lt;strong&gt;Solution 2&lt;br /&gt;&lt;/strong&gt;var text = "hardware\printers\Epson";var numBs = 0;&lt;br /&gt;var index = 0;while(index != -1) { index = text.indexOf("\", index); if (index != -1) { numBs++; index++; }}alert(numBs);&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Changing the label of a field at runtime&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;Lets say you want to change the label of the revenue field, then you simply write&lt;br /&gt;&lt;br /&gt;crmForm.all.revenue_c.innerText = "Amount Euro";&lt;br /&gt;Simply append the "_c" to the field name. This should work for most labels. &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;&lt;strong&gt;Changing the colour of a single option in a picklist&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;You can change the colour and background colour of an option element using the following syntax://TODO: Replace &amp;lt;name of your picklist field&amp;gt; with the schema name of the picklist in question.var list = crmForm.all.&amp;lt;name of your picklist field&amp;gt;;&lt;br /&gt;//using the first option here, you need to find the one you need.var option = list.options[0];&lt;br /&gt;//Set the background colour to red.option.style.backgroundColor = "#FF0000";&lt;br /&gt;//Set the text colour to white.option.style.color = "#FFFFFF";&lt;br /&gt;Opening a new window without the IE menu and status bars&lt;br /&gt;&lt;br /&gt;The following is a sample HTML page that you can use to test. Replace the link with the URL of your web page.&lt;br /&gt;&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;head/&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&amp;lt;p&amp;gt;&amp;lt;a href="javascript:;" onClick="window.open('http://www.domain.com/crm','domain','toolbar=no,status=no,menubar=no,scrollbars=yes,resizable=yes'); return false"&amp;gt;Domain&amp;lt;/a&amp;gt;&lt;br /&gt;&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Retrieving the text of a lookup control&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;var lookup = crmForm.all.&amp;lt;lookupfield&amp;gt;.DataValue;if (lookup[0] != null) { var theText = lookup[0].name;}&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;Disabling a form at runtime&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;document.body.disabled = true;&lt;br /&gt;&lt;br /&gt;This will disable all controls except the Notes tab, where you still can enter new notes.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Automatically changing the value of a text field to capitals&lt;/strong&gt;&lt;br /&gt;Put the following script in the OnChange event of the text field:&lt;br /&gt;&lt;br /&gt;crmForm.all.&amp;lt;name of text field&amp;gt;.DataValue = crmForm.all.&amp;lt;name of text field&amp;gt;.DataValue.toUpperCase();&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Getting notified when the user selects a another tab on a form&lt;/strong&gt;&lt;br /&gt;Put the following in the OnLoad event of your form:&lt;br /&gt;&lt;br /&gt;crmForm.all.tab0Tab.onclick = function()&lt;br /&gt;{&lt;br /&gt;alert("Tab 0 clicked");&lt;br /&gt;}&lt;br /&gt;crmForm.all.tab1Tab.onclick = function()&lt;br /&gt;{&lt;br /&gt;alert("Tab 1 clicked");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;It seems that the tab pages are always named "tabxTab", where x is a number starting from 0 (first tab) to (n-1), where n is the total number of tabs. Maybe you find better events that handle the activation instead of a click, but that's the general way it should work.&lt;br /&gt;The current record id&lt;br /&gt;The primary key is always available in&lt;br /&gt;crmForm.ObjectId&lt;br /&gt;It is set to null, if the record hasn't been saved yet. There are some other useful properties. Look at the "Form Object Model" in the SDK docs for more information.&lt;br /&gt;The current object type code&lt;br /&gt;The type code of the entity being displayed in a CRM form is available through&lt;br /&gt;&lt;br /&gt;crmForm.ObjectTypeCode&lt;br /&gt;&lt;br /&gt;There are some other useful properties. Look at the "Form Object Model" in the SDK docs for more information.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;amp;#8195;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Initializing a date field with the current date&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;crmForm.all.&amp;lt;attribute&amp;gt;.DataValue = new Date();&lt;br /&gt;Changing the URL of an IFRAME at runtime&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Set the initial URL of the IFRAME to about:blank and execute the following line:&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;document.all.IFRAME_&amp;lt;name of iframe&amp;gt;.src = http://domain/file;&lt;br /&gt;&lt;strong&gt;Displaying a picture in a CRM form, using a text field to store the data source&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Let's say you have a custom field storing the image name called new_pictureName. Then in the OnLoad event do the following:&lt;br /&gt;&lt;br /&gt;if ((crmForm.all.new_pictureName != null) &amp;amp;&amp;amp; (crmForm.all.new_pictureName.DataValue != null))&lt;br /&gt;{&lt;br /&gt;document.all.IFRAME_&amp;lt;name of iframe&amp;gt;.src = http://server/dir/images/ + crmForm.all.new_pictureName.DataValue;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;In the OnChange event of the new_pictureName place the following:&lt;br /&gt;&lt;br /&gt;if (crmForm.all.new_pictureName.DataValue != null)&lt;br /&gt;{&lt;br /&gt;document.all.IFRAME_&amp;lt;name of iframe&amp;gt;.src = http://server/dir/images/ + crmForm.all.new_pictureName.DataValue;&lt;br /&gt;}&lt;br /&gt;else&lt;br /&gt;{&lt;br /&gt;document.all.IFRAME_&amp;lt;name of iframe&amp;gt;.src = "about:blank"}&lt;br /&gt;&lt;br /&gt;Checking crmForm.all.new_pictureName for null in the OnLoad event is a sanity check. Bulk edit forms will not display all fields and if it is not contained in the form, it will be null. This check is not required in the OnChange event, as this event will never fire if the field does not exist.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Changing the default lookup type&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;When opening a lookup that can select from multiple entity types, you may want to use a different default entity in the lookup dialog. The following script changes the default entity of the regardingobjectid field in an activity to contacts:&lt;br /&gt;if (crmForm.all.regardingobjectid != null)&lt;br /&gt;{&lt;br /&gt;crmForm.all.regardingobjectid.setAttribute("defaulttype", "2");&lt;br /&gt;}&lt;br /&gt;Checking if a field is present in a form&lt;br /&gt;if (crmForm.all.&amp;lt;name of field&amp;gt; != null)&lt;br /&gt;{&lt;br /&gt;//do your JavaScript processing here}&lt;br /&gt;&lt;br /&gt;You should always check if a field is present before accessing it, because your script may throw an exception if it is not included in a form (like in quick create forms if your field is not required or recommended).&lt;br /&gt;Calculating a date field based upon the selection of a picklist&lt;br /&gt;The following script assumes that you have a picklist with three values: "1 year", "2 years" and "3 years".&lt;br /&gt;&lt;br /&gt;var years = 0;&lt;br /&gt;switch(crmForm.all.&amp;lt;name of picklist field&amp;gt;.DataValue)&lt;br /&gt;{&lt;br /&gt;//You need to check the picklist values if they have the values 1, 2 and 3. Look at the attribute in the entity customization and note the option values.&lt;br /&gt;case "1": years = 1;&lt;br /&gt;break;&lt;br /&gt;case "2": years = 2;&lt;br /&gt;break;&lt;br /&gt;case "3": years = 3;&lt;br /&gt;break;&lt;br /&gt;}&lt;br /&gt;if (years != 0)&lt;br /&gt;{&lt;br /&gt;var date = new Date();&lt;br /&gt;date.setYear(date.getYear() + years);&lt;br /&gt;crmForm.all.&amp;lt;name of date field&amp;gt;.DataValue = date;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Creating a new email when double-clicking a standard text field&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;if (crmForm.all.&amp;lt;name of text field&amp;gt; != null)&lt;br /&gt;{&lt;br /&gt;crmForm.all.&amp;lt;name of text field&amp;gt;.ondblclick = function()&lt;br /&gt;{&lt;br /&gt;var email = crmForm.all.&amp;lt;name of text field&amp;gt;.DataValue;&lt;br /&gt;if ((email != null) &amp;amp;&amp;amp; (email.length &amp;gt; 0))&lt;br /&gt;{&lt;br /&gt;window.navigate("mailto:" + email);&lt;br /&gt;}&lt;br /&gt;}}&lt;br /&gt;Resetting a field value if validation fails&lt;br /&gt;In the OnLoad event, place the following code:&lt;br /&gt;&lt;br /&gt;crmForm.all.&amp;lt;field to check&amp;gt;.setAttribute("lastKnownGood", crmForm.all.&amp;lt;field to check&amp;gt;.DataValue);&lt;br /&gt;&lt;br /&gt;This adds a new attribute to field for later access. In the OnChange event put the following:&lt;br /&gt;&lt;br /&gt;//checkFailed contains either true or false and must be set to the result of your validation routineif (checkFailed)&lt;br /&gt;{&lt;br /&gt;crmForm.all.&amp;lt;field to check&amp;gt;.DataValue = crmForm.all.fieldToCheck.getAttribute("lastKnownGood");&lt;br /&gt;else&lt;br /&gt;{&lt;br /&gt;crmForm.all.&amp;lt;field to check&amp;gt;.setAttribute("lastKnownGood", crmForm.all.fieldToCheck.DataValue);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Inserting line breaks in a text area control&lt;/strong&gt;&lt;br /&gt;Put the following in the OnLoad event:&lt;br /&gt;&lt;br /&gt;crmForm.all.&amp;lt;your text field&amp;gt;.style.whiteSpace = "pre";&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;Hiding an entire row of a CRM form&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;//the field you want to hidevar field = crmForm.all.name;//search the enclosing table rowwhile ((field.parentNode != null) &amp;amp;&amp;amp; (field.tagName.toLowerCase() != "tr"))&lt;br /&gt;{&lt;br /&gt;field = field.parentNode;&lt;br /&gt;}&lt;br /&gt;//if we found a row, disable itif (field.tagName.toLowerCase() == "tr")&lt;br /&gt;{&lt;br /&gt;field.style.display = "none";&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Disabling the time selection of a date/time field&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;You can dynamically enable or disable the time selection box of a date/time field using the following syntax:&lt;br /&gt;var dateField = crmForm.all.&amp;lt;name of datetime field&amp;gt;;&lt;br /&gt;//Check the existence of the time field. It is null if the control is setup to only display the date.&lt;br /&gt;if (dateField.all.time != null)&lt;br /&gt;{&lt;br /&gt;//Disable the time field&lt;br /&gt;dateField.all.time.disable();&lt;br /&gt;//Enable the time field&lt;br /&gt;dateField.all.time.enable();&lt;br /&gt;}&lt;br /&gt;CRM automatically enables the time selection box if the date value changes to a non-null value, so in order to always disable the time selection box, you need to add the following OnChange event script to the datetime field:&lt;br /&gt;var dateField = crmForm.all.&amp;lt;name of datetime field&amp;gt;;&lt;br /&gt;//Check the existence of the time field. It is null if the control is setup to only display the date.&lt;br /&gt;if (dateField.all.time != null)&lt;br /&gt;{&lt;br /&gt;//Disable the time field&lt;br /&gt;dateField.all.time.disable();&lt;br /&gt;}&lt;br /&gt;To initially disable the time field, put the following into the form OnLoad event:&lt;br /&gt;var dateField = crmForm.all.&amp;lt;name of datetime field&amp;gt;;&lt;br /&gt;//Check the existence of the datetime field. It may not be included in a quick create form!&lt;br /&gt;if (dateField != null)&lt;br /&gt;{&lt;br /&gt;//Call the OnChange event handler&lt;br /&gt;dateField.FireOnChange();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Changing the time interval in date/time fields&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;The time selection box of a date/time field uses a 30 minute interval. You can change it to a different interval using the following code in an OnLoad event:&lt;br /&gt;&lt;br /&gt;var dateField = crmForm.all.&amp;lt;name of datetime field&amp;gt;;&lt;br /&gt;//Check the existence of the datetime field. It may not be included in a quick create form!&lt;br /&gt;if (dateField != null)&lt;br /&gt;{&lt;br /&gt;var timeField = dateField.all.time;&lt;br /&gt;//Check the existence of the time field. It is null if the control is setup to only display the date.&lt;br /&gt;if (timeField != null)&lt;br /&gt;{&lt;br /&gt;//The new interval in minutes.&lt;br /&gt;var interval = 15;&lt;br /&gt;var tables = timeField.getElementsByTagName("table");&lt;br /&gt;if ((tables != null) &amp;amp;&amp;amp; (tables.length &amp;gt; 0))&lt;br /&gt;{&lt;br /&gt;var table = tables[1];&lt;br /&gt;//Remove all existing values from the selection box while (table.firstChild != null)&lt;br /&gt;{&lt;br /&gt;table.removeChild(table.firstChild);&lt;br /&gt;}&lt;br /&gt;//Add the new values for (hour = 0; hour &amp;lt; 24; hour++)&lt;br /&gt;{&lt;br /&gt;for (min = 0; min &amp;lt; 60; min += interval)&lt;br /&gt;{&lt;br /&gt;var row = table.insertRow();&lt;br /&gt;var cell = row.insertCell();&lt;br /&gt;var time = ((hour &amp;lt; 10) ? "0" : "") + hour + ":" + ((min &amp;lt; 10) ? "0" : "") + min;&lt;br /&gt;cell.setAttribute("val", time);&lt;br /&gt;cell.innerText = time;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Getting the quote id inside a quotedetail form&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;There's a hidden field in the quotedetail form storing the quote id. You can access it using&lt;br /&gt;alert("Quote ID = " + crmForm.all.quoteid.DataValue);&lt;br /&gt;How to know which button triggered the OnSave event&lt;br /&gt;You can use the event.Mode property in the OnSave event. It will tell you which button was used to save an entity. Not all values are documented in the SDK, e.g the "Save as completed" in a phone call has a value of 58. As it's not documented, this number may change in future releases.&lt;br /&gt;To get started enter the following into your OnSave script:&lt;br /&gt;alert ("event.Mode = " + event.Mode);&lt;br /&gt;event.returnValue = false;&lt;br /&gt;return false;&lt;br /&gt;This codes makes it impossible to save the entity, but allows you to write down all of the values passed to OnSave. You will see 1 for a normal save operation and 2 for Save and Close. Most but not all constants are defined in /_common/scripts/formevt.js.&lt;br /&gt;Accessing the CRM database from JavaScript&lt;br /&gt;To access the CRM database from JavaScript, use the following as a template:&lt;br /&gt;var connection = new ActiveXObject("ADODB.Connection");&lt;br /&gt;var connectionString = "Provider=SQLOLEDB;Server=xxxxx;Database=xxxx_mscrm;Integrated Security=sspi";&lt;br /&gt;connection.Open(connectionString);&lt;br /&gt;var query = "SELECT name FROM FilteredAccount";&lt;br /&gt;var rs = new ActiveXObject("ADODB.Recordset");&lt;br /&gt;rs.Open(query, connection, /*adOpenKeyset*/1, /*adLockPessimistic*/2);&lt;br /&gt;rs.moveFirst();&lt;br /&gt;var values = "";&lt;br /&gt;while (!rs.eof)&lt;br /&gt;{&lt;br /&gt;values += rs.Fields(0).Value.toString() + " ";&lt;br /&gt;rs.moveNext();&lt;br /&gt;}&lt;br /&gt;connection.Close();&lt;br /&gt;alert(values);&lt;br /&gt;You may need to adjust your security settings in IE in order to run this code.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Modifying the Quick Create Form&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Allthough the quick create form isn't listed in the forms and views dialog, it uses the same scripts entered in the main application form. You can use the following in the OnLoad script to run code when inside of a quick create form:&lt;br /&gt;&lt;br /&gt;if (crmForm.FormType == 5 /* Quick Create Form */)&lt;br /&gt;{&lt;br /&gt;//modify the form using DHTML&lt;br /&gt;}&lt;br /&gt;Forcing the selection of an account in the potential customer field of an opportunity&lt;br /&gt;Put the following into the opportunity's OnLoad event:&lt;br /&gt;crmForm.all.customerid.setAttribute("lookuptypes", "1");&lt;br /&gt;This tells the customer lookup to only include the account (object type code 1). A value of 2 forces the lookup to only display contacts.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Hiding and showing fields dynamically based on other field values&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;You can do this in client-side JavaScript. Let's say you have a picklist named "new_category" and you have assigned the following options to it:&lt;br /&gt;1 – Business&lt;br /&gt;2 – Private&lt;br /&gt;3 - Unspecified&lt;br /&gt;Let's further assume that you want to hide the fields "new_a" and "new_b" whenever a user selects "Private", but they should be visible if a different option is selected in the picklist. Your OnChange event script of the new_category field will be:&lt;br /&gt;&lt;br /&gt;var hideValues = (crmForm.all.new_category != null) &amp;amp;&amp;amp; (crmForm.all.new_category.DataValue == "2");&lt;br /&gt;var displayStyle = hideValues ? "none" : "";&lt;br /&gt;crmForm.all.new_a.style.display = displayStyle;&lt;br /&gt;crmForm.all.new_b.style.display = displayStyle;&lt;br /&gt;&lt;br /&gt;To run the code when the form is initially loaded, put the following into the OnLoad event:&lt;br /&gt;&lt;br /&gt;if (crmForm.all.new_category != null)&lt;br /&gt;{&lt;br /&gt;crmForm.all.new_category.FireOnChange();&lt;br /&gt;}&lt;br /&gt;The test for a null value of crmForm.all.new_category is included to avoid errors if the field is not available on a form. This is true for quick create forms if the field required level is not set to business required or business recommended.&lt;br /&gt;Removing the value from a lookup field&lt;br /&gt;crmForm.all.&amp;lt;lookupField&amp;gt;.DataValue = null;&lt;br /&gt;Hiding tabs at runtime&lt;br /&gt;You can hide and show entire tabs dynamically using the following code:&lt;br /&gt;//Add your condition here, usually a field comparison in an OnChange event&lt;br /&gt;if (condition == true)&lt;br /&gt;{&lt;br /&gt;//hide the second tab&lt;br /&gt;crmForm.all.tab1Tab.style.display = "none";&lt;br /&gt;}&lt;br /&gt;else&lt;br /&gt;{&lt;br /&gt;//show the second tab&lt;br /&gt;crmForm.all.tab1Tab.style.display = "";&lt;br /&gt;}&lt;br /&gt;The tabs are named "tab0Tab", "tab1Tab", "tab2Tab" and so on.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Setting the active tab&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;From the SDK docs:SetFocus: Sets the focus, changes tabs, and scrolls the window as necessary to show the specified field. Example:&lt;br /&gt;// Set focus to the field.&lt;br /&gt;crmForm.all.SOME_FIELD_ID.SetFocus();&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Displaying related entities instead of the form when opening a record&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;To open a related entity view of the left navigation bar (like contacts in an account entity), you can use the following:&lt;br /&gt;loadArea("areaContacts");&lt;br /&gt;Each entry in the navigation bar has a unique area name (areaContacts is just a sample). If you haven't already done it, download and install the Internet Explorer Developer Toolbar to find the name of the entry you're after. Some instructions on how to use it are in http://www.stunnware.com/crm2/topic.aspx?id=CrmLookAndFeel1; though it is a different topic, I included some screenshots using the developer toolbar in CRM.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Modifying the color of disabled form fields&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Disabled form fields are sometimes hard to read. Making the color a little bit darker greatly helps to read all of the content without loosing the information that a field is read-only.&lt;br /&gt;Open the following file in your CRM web: /_forms/controls/controls.css. Then find the following style:&lt;br /&gt;INPUT.ro,TEXTAREA.ro,DIV.ro,SPAN.ro&lt;br /&gt;{&lt;br /&gt;background-color: #ffffff;&lt;br /&gt;color: #808080;&lt;br /&gt;border-color: #808080;&lt;br /&gt;}&lt;br /&gt;The color attribute is the light gray you're seeing by default. You may change it to #404040 to get a slightly darker gray. If you don't see the new colors in IE, hit CTRL-F5 to reload the source files, including the updated css file.&lt;br /&gt;Removing a navigation bar entry at runtime&lt;br /&gt;To remove a navigation bar entry dynamically, you can use the following code:&lt;br /&gt;var navigationBarEntry = document.getElementById("navProds");&lt;br /&gt;if (navigationBarEntry != null)&lt;br /&gt;{&lt;br /&gt;var lbArea = navigationBarEntry.parentNode;&lt;br /&gt;if (lbArea != null)&lt;br /&gt;{&lt;br /&gt;lbArea.removeChild(navigationBarEntry);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;If you haven't already done it, download and install the Internet Explorer Developer Toolbar to find the name of the navigation bar entry.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Changing the colour of a label&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;var label = crmForm.all.&amp;lt;field name&amp;gt;_c;&lt;br /&gt;label.innerHTML = "&amp;lt;font colour='#FF0000'&amp;gt;" + label.innerText + "&amp;lt;/font&amp;gt;";&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:arial;"&gt;&lt;/span&gt;&lt;span style="font-family:arial;"&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;Hide a section on a form&lt;/strong&gt;&lt;br /&gt;crmForm.all.new_attribute_c.parentElement.parentElement.parentElement.style.display = 'none' &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;To show the section again:&lt;/strong&gt;&lt;br /&gt;crmForm.all.new_attribute_c.parentElement.parentElement.parentElement.style.display = 'block'&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;AJAX - CRM 3 only&lt;/strong&gt;&lt;br /&gt;checkResult = function()&lt;br /&gt;{&lt;br /&gt;var oXmlDoc = new ActiveXObject("Microsoft.XMLDOM");&lt;br /&gt;oXmlDoc.async = false;&lt;br /&gt;var s;&lt;br /&gt;s = "http://localhost:5555/adv_postback.aspx?fundid=" + crmForm.all.adv_fundid.DataValue[0].id;&lt;br /&gt;oXmlDoc.load(s);&lt;br /&gt;var oNode = oXmlDoc.selectSingleNode("results/fundcode");&lt;br /&gt;if (oNode != null)&lt;br /&gt;{&lt;br /&gt;res = oNode.text;&lt;br /&gt;crmForm.all.adv_adminno.DataValue = res&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;Maximise Screen&lt;br /&gt;if (window.screen)&lt;br /&gt;{&lt;br /&gt;var aw = screen.availWidth;&lt;br /&gt;var ah = screen.availHeight;&lt;br /&gt;window.moveTo(0, 0);&lt;br /&gt;window.resizeTo(aw, ah);&lt;br /&gt;}&lt;br /&gt;&lt;strong&gt;Date Functions&lt;/strong&gt;&lt;br /&gt;var currentTime = new Date()&lt;br /&gt;var month = currentTime.getMonth() + 1&lt;br /&gt;var day = currentTime.getDate()&lt;br /&gt;var year = currentTime.getFullYear()&lt;br /&gt;document.write(month + "/" + day + "/" + year)&lt;br /&gt;var currentTime = new Date()&lt;br /&gt;var hours = currentTime.getHours()&lt;br /&gt;var minutes = currentTime.getMinutes()&lt;br /&gt;if (minutes &amp;lt; 10)&lt;br /&gt;minutes = "0" + minutes&lt;br /&gt;document.write(hours + ":" + minutes + " ")&lt;br /&gt;if(hours &amp;gt; 11)&lt;br /&gt;{&lt;br /&gt;document.write("PM")&lt;br /&gt;}&lt;br /&gt;else&lt;br /&gt;{&lt;br /&gt;document.write("AM")&lt;br /&gt;}&lt;br /&gt;getTime() - Number of milliseconds since 1/1/1970 @ 12:00 AM&lt;br /&gt;getSeconds() - Number of seconds (0-59)&lt;br /&gt;getMinutes() - Number of minutes (0-59)&lt;br /&gt;getHours() - Number of hours (0-23)&lt;br /&gt;getDay() - Day of the week(0-6). 0 = Sunday, ... , 6 = Saturday&lt;br /&gt;getDate() - Day of the month (0-31)&lt;br /&gt;getMonth() - Number of month (0-11)&lt;br /&gt;getFullYear() - The four digit year (1970-9999)&lt;br /&gt;MAKE THE RECIPIENT BLANK FOR NEW EMAILS&lt;br /&gt;var CRM_CREATE_FORM = 1;&lt;br /&gt;var formType = crmForm.FormType;&lt;br /&gt;if(formType == CRM_CREATE_FORM)&lt;br /&gt;{&lt;br /&gt;crmForm.all.to.DataValue = null;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;FORMAT PHONE NUMBER&lt;/strong&gt; &lt;/p&gt;&lt;p&gt;&lt;br /&gt;// Attempt to auto-format basic US phone numbers. This method supports&lt;br /&gt;// 7 and 10 digit numbers. Example: (410) 555-1212&lt;br /&gt;// Get the field that fired the event&lt;br /&gt;var oField = event.srcElement;&lt;br /&gt;// If we have the field and all is well&lt;br /&gt;if (typeof(oField) != "undefined" &amp;amp;&amp;amp; oField != null)&lt;br /&gt;{&lt;br /&gt;// Remove any non-numeric characters&lt;br /&gt;var sTmp = oField.DataValue.replace(/[^0-9]/g, "");&lt;br /&gt;// If the number is a length we expect and support, format the number&lt;br /&gt;switch (sTmp.length)&lt;br /&gt;{&lt;br /&gt;case "4105551212".length:&lt;br /&gt;oField.DataValue = "(" + sTmp.substr(0, 3) + ") " + sTmp.substr(3, 3) + "-" + sTmp.substr(6, 4);&lt;br /&gt;break;&lt;br /&gt;case "5551212".length:&lt;br /&gt;oField.DataValue = sTmp.substr(0, 3) + "-" + sTmp.substr(3, 4);&lt;br /&gt;break;&lt;br /&gt;}&lt;br /&gt;} &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;CONFIRM SAVE&lt;/strong&gt; &lt;/p&gt;&lt;p&gt;&lt;br /&gt;if (confirm("Are you sure you want to save this Stakeholder Contact?"))&lt;br /&gt;{&lt;br /&gt;//save the form.&lt;br /&gt;}&lt;br /&gt;else&lt;br /&gt;{&lt;br /&gt;event.returnValue = false;&lt;br /&gt;validationErrors = true;&lt;br /&gt;}&lt;br /&gt;&amp;amp;#8195; &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;HIDE CONVERT BUTTON ON LEAD &lt;/strong&gt;&lt;/p&gt;&lt;strong&gt;&lt;p&gt;&lt;br /&gt;&lt;/strong&gt;var myField = crmForm.all.leadqualitycode.DataValue;&lt;br /&gt;switch(crmForm.FormType)&lt;br /&gt;{&lt;br /&gt;case 1:&lt;br /&gt;case 2:&lt;br /&gt;case 3:&lt;br /&gt;case 4:&lt;br /&gt;case 5:&lt;br /&gt;case 6:&lt;br /&gt;break;&lt;br /&gt;case 2:&lt;br /&gt;if(myField == [ValueThatEqualsYes])&lt;br /&gt;{&lt;br /&gt;var btConvert = "_MBconvertLead";&lt;br /&gt;var menuButton = document.getElementById(btConvert);&lt;br /&gt;if (menuButton != null)&lt;br /&gt;{&lt;br /&gt;menuButton.style.display='';&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;else&lt;br /&gt;{&lt;br /&gt;var btConvert = "_MBconvertLead";&lt;br /&gt;var menuButton = document.getElementById(btConvert);&lt;br /&gt;if (menuButton != null)&lt;br /&gt;{&lt;br /&gt;menuButton.style.display='none';&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;break;&lt;br /&gt;} &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;MAKE THE TAB TITLE BLUE&lt;/strong&gt; &lt;/p&gt;&lt;p&gt;crmForm.all.tab0Tab.style.backgroundColor="blue"; &lt;/p&gt;&lt;p&gt;&lt;strong&gt;SHOW NUMBER OF NOTES ON THE NOTES TAB (CRM 3)&lt;/strong&gt;&lt;br /&gt;This is in the form load event of the aspx page:&lt;br /&gt;Dim NoteCount As Integer, ID As String, SQL As String, _ con As SqlConnection, com As SqlCommand, ds As New DataSet&lt;br /&gt;ID = Request("ID")&lt;br /&gt;SQL = "Select count(*) from annotation where ObjectID='" + ID + "'"&lt;br /&gt;con = New SqlConnection&lt;br /&gt;con.ConnectionString = "server=galatea;database=IOM_MSCRM;User Id=crmcustom;Password=crm@custom;"&lt;br /&gt;con.Open()&lt;br /&gt;com = New SqlCommand&lt;br /&gt;com.CommandText = SQL&lt;br /&gt;com.Connection = con&lt;br /&gt;Dim da As New SqlDataAdapter(com)&lt;br /&gt;da.Fill(ds)&lt;br /&gt;For Each dr As DataRow In ds.Tables(0).Rows&lt;br /&gt;NoteCount = dr.Item(0)&lt;br /&gt;Next&lt;br /&gt;con.Close()&lt;br /&gt;Response.Clear()&lt;br /&gt;Response.ContentType = "textXML"&lt;br /&gt;Response.Write("&amp;lt;results&amp;gt;&amp;lt;result&amp;gt;" &amp;amp; NoteCount &amp;amp; "&amp;lt;/result&amp;gt;&amp;lt;/results&amp;gt;")&lt;br /&gt;Response.End()&lt;br /&gt;This is in the form load event of the CMR form:&lt;br /&gt;DISPLAY NUMBER OF NOTES&lt;br /&gt;var oXmlDoc = new ActiveXObject("Microsoft.XMLDOM");&lt;br /&gt;oXmlDoc.async = false; // We want to wait for a response&lt;br /&gt;var site;&lt;br /&gt;site = window.location.protocol + "//" + window.location.host + "/ISP_IOM/CountNotes.aspx?id=" + crmForm.ObjectId&lt;br /&gt;oXmlDoc.load(site);&lt;br /&gt;var oNode = oXmlDoc.selectSingleNode("results/result");&lt;br /&gt;if (oNode != null)&lt;br /&gt;{&lt;br /&gt;res = oNode.text;&lt;br /&gt;crmForm.all.tab3Tab.innerText = "Notes (" + res + ")";&lt;br /&gt;} &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;CHECK FOR . IN STRING&lt;/strong&gt; &lt;/p&gt;&lt;p&gt;&lt;br /&gt;if (myString.indexOf(".")&amp;gt;=0)&lt;br /&gt;{&lt;br /&gt;alert("yes!");&lt;br /&gt;}&lt;br /&gt;else&lt;br /&gt;{&lt;br /&gt;alert("no!");&lt;br /&gt;}&lt;br /&gt;window.alert('demoalert');&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Buttons&lt;/strong&gt;&lt;br /&gt;This is an example on how to create a button on the form, using java script. First of all we need to create a nvarchar attribute and put it on the form where we want our button. I assume that everybody knows how to create an attribute and put in on the form, so i won't talk about this.&lt;br /&gt;In this example my attribute's schema name is new_button. Here is the code:&lt;br /&gt;// This is how we call the button, what we see&lt;br /&gt;crmForm.all.new_button.DataValue = "Ok";&lt;br /&gt;// We could align it a bit&lt;br /&gt;crmForm.all.new_button.style.textAlign = "center";&lt;br /&gt;crmForm.all.new_button.vAlign = "middle";&lt;br /&gt;//we make the mouse look as a hand when we're moving over&lt;br /&gt;crmForm.all.new_button.style.cursor = "hand";&lt;br /&gt;crmForm.all.new_button.style.backgroundColor = "#CADFFC";&lt;br /&gt;crmForm.all.new_button.style.color = "#FF0000";&lt;br /&gt;crmForm.all.new_button.style.borderColor = "#330066";&lt;br /&gt;crmForm.all.new_button.style.fontWeight = "bold";&lt;br /&gt;crmForm.all.new_button.contentEditable = false;&lt;br /&gt;//we attach some events in order to make it look nice :)&lt;br /&gt;crmForm.all.new_button.attachEvent("onmousedown",color1);&lt;br /&gt;crmForm.all.new_button.attachEvent("onmouseup",color2);&lt;br /&gt;crmForm.all.new_button.attachEvent("onmouseover",color3);&lt;br /&gt;crmForm.all.new_button.attachEvent("onmouseleave",color4);&lt;br /&gt;function color3()&lt;br /&gt;{&lt;br /&gt;crmForm.all.new_button.style.backgroundColor = "#6699FF";&lt;br /&gt;}&lt;br /&gt;function color4()&lt;br /&gt;{&lt;br /&gt;crmForm.all.new_button.style.backgroundColor = "CADFFC";&lt;br /&gt;}&lt;br /&gt;function color1()&lt;br /&gt;{&lt;br /&gt;crmForm.all.new_button.style.color = "000099";&lt;br /&gt;}&lt;br /&gt;function color2()&lt;br /&gt;{&lt;br /&gt;crmForm.all.new_button.style.color = "FF0000";&lt;br /&gt;}&lt;br /&gt;//here we attach what we want our button do&lt;br /&gt;crmForm.all.new_button.attachEvent("onclick",someFunction);&lt;br /&gt;&amp;amp;#8195; &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;Integer Validation&lt;/strong&gt;&lt;br /&gt;This script Validates weather an entry is an integer field or not using the isNAN function&lt;br /&gt;var my_string= crmForm.all.new_accountnumber.DataValue&lt;br /&gt;if(isNaN(my_string))&lt;br /&gt;{&lt;br /&gt;alert ("Please do not enter text into the account number field");&lt;br /&gt;event.returnValue = false;&lt;br /&gt;}&lt;br /&gt;else&lt;br /&gt;{alert("Account Number Accepted ");&lt;br /&gt;if (crmForm.all.new_accountnumber.DataValue.length != 11)&lt;br /&gt;{&lt;br /&gt;alert ("Please enter in a numeric account number that is 11 digits long");&lt;br /&gt;event.returnValue = false;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Replacing the content of an IFRAME&lt;/strong&gt;&lt;br /&gt;If you really want to do some funny things in your CRM form, you can create an IFRAME serving as a placeholder for your real HTML code. Create an IFRAME in an entity and name it "IFRAME_TEST". In the Onload event put the following code:&lt;br /&gt;crmForm.all.IFRAME_TEST_d.innerHTML ="&amp;lt;b&amp;gt;Some HTML text&amp;lt;/b&amp;gt;";&lt;br /&gt;Note the "_d" at the end of IFRAME_TEST. This single line replaces the whole IFRAME element with your own HTML.&lt;br /&gt;&lt;strong&gt;Adding additional values to duration fields&lt;/strong&gt;&lt;br /&gt;The following script adds the new option "42 Minutes" to the actualdurationminutes field in a task:&lt;br /&gt;var duration = crmForm.all.actualdurationminutesSelect;&lt;br /&gt;&lt;br /&gt;var tables = duration.getElementsByTagName("table");&lt;br /&gt;var table = tables[1];&lt;br /&gt;&lt;br /&gt;var row = table.insertRow();&lt;br /&gt;var newOption = row.insertCell(-1);&lt;br /&gt;&lt;br /&gt;var newValue = "42 Minutes";&lt;br /&gt;newOption.setAttribute("val", newValue);&lt;br /&gt;newOption.innerText = newValue; &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;Changing the title of a CRM form&lt;/strong&gt;&lt;br /&gt;document.title = "Hello World!"; &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;Changing the Link of a Ticker Symbol from MSN Money to Yahoo Finances&lt;/strong&gt;&lt;br /&gt;This is an unsupported solution as it requires modifications to server files!&lt;br /&gt;Open the following directory on your CRM server: C:Inetpubwwwroot_formscontrols (may vary depending on your installation)&lt;br /&gt;Open the following file: INPUT.text.ticker.htc&lt;br /&gt;&lt;br /&gt;Search the following function:&lt;br /&gt;function Launch()&lt;br /&gt;{&lt;br /&gt;if(value.length &amp;gt; 0)&lt;br /&gt;{&lt;br /&gt;Parse();&lt;br /&gt;&lt;br /&gt;window.open("http://go.microsoft.com/fwlink?linkid=8506&amp;amp;Symbol=" +&lt;br /&gt;encodeURIComponent(value), "", "height=" + (screen.availHeight * .75) +&lt;br /&gt;",width=" + (screen.availWidth * .75) +&lt;br /&gt;,scrollbars=1,resizable=1,status=1,toolbar=1,menubar=1,location=1");&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;Replace it with the following:&lt;br /&gt;function Launch()&lt;br /&gt;{&lt;br /&gt;if(value.length &amp;gt; 0)&lt;br /&gt;{&lt;br /&gt;Parse();&lt;br /&gt;&lt;br /&gt;//window.open("http://go.microsoft.com/fwlink?linkid=8506&amp;amp;Symbol=" +&lt;br /&gt;encodeURIComponent(value), "", "height=" + (screen.availHeight * .75) +&lt;br /&gt;",width=" + (screen.availWidth * .75) +&lt;br /&gt;,scrollbars=1,resizable=1,status=1,toolbar=1,menubar=1,location=1");&lt;br /&gt;window.open("http://finance.yahoo.com/q?s=" +&lt;br /&gt;encodeURIComponent(value), "", "height=" + (screen.availHeight * .75) +&lt;br /&gt;",width=" + (screen.availWidth * .75) +&lt;br /&gt;",scrollbars=1,resizable=1,status=1,toolbar=1,menubar=1,location=1");&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;Save the file.&lt;br /&gt;&lt;br /&gt;On your client machine: Open Internet Explorer and remove all temporary internet files, so that the new htc source is retrieved. Navigate to any ticker symbol, enter a valid value and double click it. &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;Counting the number of backslashes in a string&lt;/strong&gt;&lt;br /&gt;Of course you can use the two code snippets with any character you like.&lt;br /&gt;&lt;strong&gt;Solution 1&lt;/strong&gt;&lt;br /&gt;var text = "hardware\printers\Epson";&lt;br /&gt;var paths = text.split("\");&lt;br /&gt;alert(paths.length -1);&lt;br /&gt;Solution 2)&lt;br /&gt;var text = "hardware\printers\Epson";&lt;br /&gt;var numBs = 0;&lt;br /&gt;var index = 0;&lt;br /&gt;&lt;br /&gt;while(index != -1) {&lt;br /&gt;index = text.indexOf("\", index);&lt;br /&gt;&lt;br /&gt;if (index != -1) {&lt;br /&gt;numBs++;&lt;br /&gt;index++;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;alert(numBs); &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;Changing the label of a field at runtime&lt;/strong&gt;&lt;br /&gt;Lets say you want to change the label of the revenue field, then you simply write&lt;br /&gt;crmForm.all.revenue_c.innerText = "Amount Euro";&lt;br /&gt;Simply append the "_c" to the field name. This should work for most labels.&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Changing the color of a single option in a picklist&lt;/strong&gt;&lt;br /&gt;You can change the color and background color of an option element using the following syntax:&lt;br /&gt;&lt;br /&gt;//TODO: Replace &amp;lt;name of your picklist field&amp;gt; with the schema name of the picklist in question.&lt;br /&gt;var list = crmForm.all.&amp;lt;name of your picklist field&amp;gt;;&lt;br /&gt;&lt;br /&gt;//using the first option here, you need to find the one you need.&lt;br /&gt;var option = list.options[0];&lt;br /&gt;&lt;br /&gt;//Set the background color to red.&lt;br /&gt;option.style.backgroundColor = "#FF0000";&lt;br /&gt;&lt;br /&gt;//Set the text color to white.&lt;br /&gt;option.style.color = "#FFFFFF";&lt;br /&gt;Opening a new window without the IE menu and status bars&lt;br /&gt;The following is a sample HTML page that you can use to test. Replace the link with the URL of your web page.&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;head/&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&amp;lt;p&amp;gt;&lt;br /&gt;&amp;lt;a href="javascript:;"&lt;br /&gt;onClick="window.open('http://www.stunnware.com/crm','stunnware','toolbar=no,status=no,menubar=no,scrollbars=yes,resizable=yes');&lt;br /&gt;return false"&amp;gt;Stunnware&amp;lt;/a&amp;gt;&lt;br /&gt;&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;Retrieving the text of a lookup control&lt;br /&gt;var lookup = crmForm.all.&amp;lt;lookupfield&amp;gt;.DataValue;&lt;br /&gt;&lt;br /&gt;if (lookup[0] != null) {&lt;br /&gt;var theText = lookup[0].name;&lt;br /&gt;} &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;Disabling a form at runtime&lt;/strong&gt;&lt;br /&gt;document.body.disabled = true;&lt;br /&gt;This will disable all controls except the Notes tab, where you still can&lt;br /&gt;enter new notes. &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;Automatically changing the value of a text field to capitals&lt;/strong&gt;&lt;br /&gt;Put the following script in the OnChange event of the text field:&lt;br /&gt;crmForm.all.&amp;lt;name of text field&amp;gt;.DataValue = crmForm.all.&amp;lt;name of text field&amp;gt;.DataValue.toUpperCase(); &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;Getting notified when the user selects a another tab on a form&lt;/strong&gt;&lt;br /&gt;Put the following in the OnLoad event of your form:&lt;br /&gt;crmForm.all.tab0Tab.onclick = function() {&lt;br /&gt;alert("Tab 0 clicked");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;crmForm.all.tab1Tab.onclick = function() {&lt;br /&gt;alert("Tab 1 clicked");&lt;br /&gt;}&lt;br /&gt;It seems that the tab pages are always named "tabxTab", where x is a number starting from 0 (first tab) to (n-1), where n is the total number of tabs. Maybe you find better events that handle the activation instead of a click, but that's the general way it should work.&lt;br /&gt;The current record id&lt;br /&gt;The primary key is always available in&lt;br /&gt;crmForm.ObjectId&lt;br /&gt;It is set to null, if the record hasn't been saved yet. There are some other useful properties. Look at the "Form Object Model" in the SDK docs for more information.&lt;br /&gt;The current object type code&lt;br /&gt;The type code of the entity being displayed in a CRM form is available through&lt;br /&gt;crmForm.ObjectTypeCode&lt;br /&gt;There are some other useful properties. Look at the "Form Object Model" in the SDK docs for more information. &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;Initializing a date field with the current date&lt;br /&gt;&lt;/strong&gt;crmForm.all.&amp;lt;attribute&amp;gt;.DataValue = new Date(); &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;Changing the URL of an IFRAME at runtime&lt;/strong&gt;&lt;br /&gt;Set the initial URL of the IFRAME to about:blank and execute the following line:&lt;br /&gt;document.all.IFRAME_&amp;lt;name of iframe&amp;gt;.src = &lt;a href="http://domain/file"&gt;http://domain/file&lt;/a&gt;; &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;Displaying a picture in a CRM form, using a text field to store the data source&lt;/strong&gt;&lt;br /&gt;Let's say you have a custom field storing the image name called new_pictureName. Then in&lt;br /&gt;the OnLoad event do the following:&lt;br /&gt;if ((crmForm.all.new_pictureName != null) &amp;amp;&amp;amp; (crmForm.all.new_pictureName.DataValue != null)) {&lt;br /&gt;document.all.IFRAME_&amp;lt;name of iframe&amp;gt;.src = http://server/dir/images/ + crmForm.all.new_pictureName.DataValue;&lt;br /&gt;}&lt;br /&gt;In the OnChange event of the new_pictureName place the following:&lt;br /&gt;if (crmForm.all.new_pictureName.DataValue != null) {&lt;br /&gt;document.all.IFRAME_&amp;lt;name of iframe&amp;gt;.src = http://server/dir/images/ +&lt;br /&gt;crmForm.all.new_pictureName.DataValue;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;else {&lt;br /&gt;document.all.IFRAME_&amp;lt;name of iframe&amp;gt;.src = "about:blank"&lt;br /&gt;}&lt;br /&gt;Checking crmForm.all.new_pictureName for null in the OnLoad event is a sanity check. Bulk edit forms will not display all fields and if it is not contained in the form, it will be null. This check is not required in the OnChange event, as this event will never fire if the field does not exist. &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;Changing the default lookup type&lt;/strong&gt;&lt;br /&gt;When opening a lookup that can select from multiple entity types, you may want to use a different default entity in the lookup dialog. The following script changes the default entity of the regardingobjectid field in an activity to contacts:&lt;br /&gt;if (crmForm.all.regardingobjectid != null) {&lt;br /&gt;crmForm.all.regardingobjectid.setAttribute("defaulttype", "2");&lt;br /&gt;}&lt;br /&gt;Checking if a field is present in a form&lt;br /&gt;if (crmForm.all.&amp;lt;name of field&amp;gt; != null) {&lt;br /&gt;//do your JavaScript processing here&lt;br /&gt;}&lt;br /&gt;You should always check if a field is present before accessing it, because your script may throw an exception if it is not included in a form (like in quick create forms if your field is not required or recommended). &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;Calculating a date field based upon the selection of a picklist&lt;/strong&gt;&lt;br /&gt;The following script assumes that you have a picklist with three values: "1 year", "2 years" and "3 years".&lt;br /&gt;var years = 0;&lt;br /&gt;&lt;br /&gt;switch(crmForm.all.&amp;lt;name of picklist field&amp;gt;.DataValue) {&lt;br /&gt;&lt;br /&gt;//You need to check the picklist values if they have the values 1, 2 and 3. Look at the attribute in the entity customization and note the option values.&lt;br /&gt;case "1":&lt;br /&gt;years = 1;&lt;br /&gt;break;&lt;br /&gt;&lt;br /&gt;case "2":&lt;br /&gt;years = 2;&lt;br /&gt;break;&lt;br /&gt;&lt;br /&gt;case "3":&lt;br /&gt;years = 3;&lt;br /&gt;break;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;if (years != 0) {&lt;br /&gt;&lt;br /&gt;var date = new Date();&lt;br /&gt;date.setYear(date.getYear() + years);&lt;br /&gt;&lt;br /&gt;crmForm.all.&amp;lt;name of date field&amp;gt;.DataValue = date;&lt;br /&gt;}&lt;br /&gt;Creating a new email when double-clicking a standard text field&lt;br /&gt;if (crmForm.all.&amp;lt;name of text field&amp;gt; != null) {&lt;br /&gt;&lt;br /&gt;crmForm.all.&amp;lt;name of text field&amp;gt;.ondblclick = function() {&lt;br /&gt;&lt;br /&gt;var email = crmForm.all.&amp;lt;name of text field&amp;gt;.DataValue;&lt;br /&gt;&lt;br /&gt;if ((email != null) &amp;amp;&amp;amp; (email.length &amp;gt; 0)) {&lt;br /&gt;window.navigate("mailto:" + email);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;} &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;Resetting a field value if validation fails&lt;/strong&gt;&lt;br /&gt;In the OnLoad event, place the following code:&lt;br /&gt;crmForm.all.&amp;lt;field to check&amp;gt;.setAttribute("lastKnownGood", crmForm.all.&amp;lt;field to check&amp;gt;.DataValue);&lt;br /&gt;This adds a new attribute to field for later access. In the OnChange event put the following:&lt;br /&gt;//checkFailed contains either true or false and must be set to the result of your validation routine&lt;br /&gt;if (checkFailed) {&lt;br /&gt;crmForm.all.&amp;lt;field to check&amp;gt;.DataValue = crmForm.all.fieldToCheck.getAttribute("lastKnownGood");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;else {&lt;br /&gt;crmForm.all.&amp;lt;field to check&amp;gt;.setAttribute("lastKnownGood", crmForm.all.fieldToCheck.DataValue);&lt;br /&gt;} &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;Inserting line breaks in a text area control&lt;/strong&gt;&lt;br /&gt;Put the following in the OnLoad event:&lt;br /&gt;crmForm.all.&amp;lt;your text field&amp;gt;.style.whiteSpace = "pre"; &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;Hiding an entire row of a CRM form&lt;/strong&gt;&lt;br /&gt;//the field you want to hide&lt;br /&gt;var field = crmForm.all.name;&lt;br /&gt;&lt;br /&gt;//search the enclosing table row&lt;br /&gt;while ((field.parentNode != null) &amp;amp;&amp;amp; (field.tagName.toLowerCase() != "tr")) {&lt;br /&gt;field = field.parentNode;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//if we found a row, disable it&lt;br /&gt;if (field.tagName.toLowerCase() == "tr") {&lt;br /&gt;field.style.display = "none";&lt;br /&gt;}&lt;br /&gt;It's been a while since I posted these small JavaScript snippets (More JavaScript Code, More JavaScript Code Part 2), so after half a year I'm adding the third part today, containing 23 new samples. Hope you find it as useful as the first two articles. &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;Setting the background color of a CRM form&lt;/strong&gt;&lt;br /&gt;If you want to make it easier for a user to note what type of entity a CRM form is displaying, you can change the background color with only one line of code:&lt;br /&gt;document.body.style.backgroundColor = 'red';&lt;br /&gt;Put it into the OnLoad event of the form you want to change and replace 'red' with the color of your choice.&lt;br /&gt;Why can't we use VBScript to write client-side code?&lt;br /&gt;As CRM is a web application, client-side code deals with DHTML objects and the supported languages in IE are JavaScript and VBScript. JavaScript is the standard used in the internet, while VBScript is IE only, so it will never work with any browser other than IE.&lt;br /&gt;One could argue that CRM is tied to IE6 and above, but allowing and supporting VBScript would make it impossible for the product team to even think about supporting other browsers. I never saw an official statement as to why VBScript is not supported though.&lt;br /&gt;Some calculated fields on the CRM form are not saved in the database&lt;br /&gt;If the field is disabled, which is a common practice for calculated fields, it is not sent to the server when the form is saved. To override this behavior, add this line to your code:&lt;br /&gt;crmForm.all.your_field.ForceSubmit = true; &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;Changing detailed tooltips when hovering over fields in a CRM form&lt;br /&gt;&lt;/strong&gt;This article explains in depth how to do it: http://blogs.msdn.com/crm/archive/2006/11/17/using-the-attachevent-method-to-show-users-context-sensitive-help.aspx&lt;br /&gt;Fixing problems with orphaned OnChange event handlers&lt;br /&gt;When changing entire field definitions in client-side script (e.g. Overcoming relationship restrictions in Microsoft CRM v3.0 or Converting the country field to a combobox) the OnChange event code may not be triggered.&lt;br /&gt;To overcome this situation, place the following in your script after you have replaced the HTML code:&lt;br /&gt;crmForm.all.your_field.onchange = function() {&lt;br /&gt;//add code here&lt;br /&gt;}&lt;br /&gt;If you need to initially call the OnChange code, use this instead:&lt;br /&gt;your_field_OnChange = function() {&lt;br /&gt;//add code here&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//attaching the event&lt;br /&gt;crmForm.all.your_field.onchange = your_field_OnChange;&lt;br /&gt;&lt;br /&gt;//calling the event (same idea as FireOnChange())&lt;br /&gt;your_field_OnChange(); &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;Setting the field required level at runtime&lt;/strong&gt;&lt;br /&gt;You can access the current required level of any field by using the RequiredLevel property:&lt;br /&gt;var reqLevel = crmForm.all.your_Field.RequiredLevel.&lt;br /&gt;However, as it is a read-only property, you cannot use it to change the required level. There is an undocumented (and therefore unsupported) method on the crmForm object allowing to make a field required or not required:&lt;br /&gt;function SetFieldReqLevel(sField, bRequired)&lt;br /&gt;If bRequired is set to 0 (false), it is not required. If bRequired is set to anything else (true), the field is required.&lt;br /&gt;Note: you cannot use this method to make a field business recommended. Here's the code to set a field to any of the possible states:&lt;br /&gt;//No Requirement&lt;br /&gt;//------------------------------&lt;br /&gt;crmForm.all.your_field.setAttribute("req", 0);&lt;br /&gt;crmForm.all.your_field_c.className = "n";&lt;br /&gt;&lt;br /&gt;//Recommended&lt;br /&gt;//------------------------------&lt;br /&gt;crmForm.all.your_field.setAttribute("req", 1);&lt;br /&gt;crmForm.all.your_field_c.className = "rec";&lt;br /&gt;&lt;br /&gt;//Required&lt;br /&gt;//------------------------------&lt;br /&gt;crmForm.all.your_field.setAttribute("req", 2);&lt;br /&gt;crmForm.all.your_field_c.className = "req";&lt;br /&gt;Replace "your_field" and "your_field_c" with the name of the field you want to set, e.g. to set the accountnumber field to business recommended, you specify&lt;br /&gt;crmForm.all.accountnumber.setAttribute("req", 1);&lt;br /&gt;crmForm.all.accountnumber_c.className = "rec";&lt;br /&gt;Setting a default time in a date field&lt;br /&gt;A date field in a CRM form always contains a date part and optionally a time part. Sometimes it is useful to set a default time, like 8:30am, but unless the user has entered a valid date, the time selection box is disabled. Here's the code to set the default time once the user has specified the date part:&lt;br /&gt;OnLoad&lt;br /&gt;----------------------------------------&lt;br /&gt;//check if the field exists on the form&lt;br /&gt;if (crmForm.all.your_DateField != null) {&lt;br /&gt;//save the value for future reference. Note that it is a global variable.&lt;br /&gt;_previousValue = crmForm.all.your_DateField.DataValue;&lt;br /&gt;}&lt;br /&gt;OnChange of your date field&lt;br /&gt;----------------------------------------&lt;br /&gt;var dateField = crmForm.all.your_DateField;&lt;br /&gt;var currentValue = dateField.DataValue;&lt;br /&gt;&lt;br /&gt;//If the user changes the date field from null to a valid date, set the&lt;br /&gt;//time portion to 8:30&lt;br /&gt;if ((currentValue != null) &amp;amp;&amp;amp; (_previousValue == null)) {&lt;br /&gt;dateField.DataValue = new Date(currentValue.getYear(), currentValue.getMonth(), currentValue.getDate(), 8, 30);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//update _previousValue&lt;br /&gt;_previousValue = currentValue;&lt;br /&gt;I tried it with the scheduledend field of a task and it worked. The time combo of the scheduledend field is disabled as long as you put a date into the date field. This triggers the OnChange event and sets the default time.&lt;br /&gt;User interaction with yes/no style message boxes&lt;br /&gt;You can use window.confirm to present the user a yes/no-style dialog. The buttons are actually named "Ok" and "Cancel", so you have to use a good explanation in the message text. The result is either true (Ok) or false (Cancel):&lt;br /&gt;var answer = window.confirm("Click Ok to proceed or Cancel to abort the operation.");&lt;br /&gt;&lt;br /&gt;if (answer) {&lt;br /&gt;//User selected OK&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;else {&lt;br /&gt;//User selected Cancel&lt;br /&gt;}&lt;br /&gt;Testing if a lookup field has a value&lt;br /&gt;It's the same as as for any other field type:&lt;br /&gt;if (crmForm.all.your_field.DataValue == null) {&lt;br /&gt;//code here&lt;br /&gt;} &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;Comparing date values&lt;/strong&gt;&lt;br /&gt;It is a common mistake to directly compare two date values like this:&lt;br /&gt;var date1 = new Date(2007, 4, 30);&lt;br /&gt;var date2 = new Date(2007, 5, 1);&lt;br /&gt;&lt;br /&gt;if (date1 &amp;gt; date2) {&lt;br /&gt;//some code here&lt;br /&gt;}&lt;br /&gt;You may expect it to work, but you have to use the valueOf method of the Date object:&lt;br /&gt;var date1 = new Date(2007, 4, 30);&lt;br /&gt;var date2 = new Date(2007, 5, 1);&lt;br /&gt;&lt;br /&gt;if (date1.valueOf() &amp;gt; date2.valueOf()) {&lt;br /&gt;//some code here&lt;br /&gt;} &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;Getting notified when the user enters a form field&lt;/strong&gt;&lt;br /&gt;The OnChange event of a form field is fired when you are leaving a field (and of course have changed the field value). If you want to perform an action when the users enters the field, use the onfocus event:&lt;br /&gt;crmForm.all.your_field.onfocusin = function() {&lt;br /&gt;alert("Received focus");&lt;br /&gt;} &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;Overriding the click event of a lookup field&lt;/strong&gt;&lt;br /&gt;If you need to run code whenever a user clicks on a lookup button, use the following code to override the standard implementation of the click event:&lt;br /&gt;//overrides the default click handler&lt;br /&gt;crmForm.all.your_lookupField.onclick = function() {&lt;br /&gt;&lt;br /&gt;alert("Lookup dialog is opening now");&lt;br /&gt;&lt;br /&gt;//open the lookup dialog&lt;br /&gt;crmForm.all.your_lookupField.Lookup(true);&lt;br /&gt;&lt;br /&gt;alert("Lookup dialog closed");&lt;br /&gt;}&lt;br /&gt;Be careful with this as some lookup fields specify additional settings in their click events.&lt;br /&gt;Formatting a date to YYYYMMDD&lt;br /&gt;There is no toString() implementation in JavaScript allowing you to format a data value, so you have to build it on your own:&lt;br /&gt;getYear returns the current year&lt;br /&gt;getMonth returns the month starting from 0 for January to 11 for December&lt;br /&gt;getDate returns the day of the month (1-31)&lt;br /&gt;A common error is to use getDay instead of getDate. getDate returns the day of the week.&lt;br /&gt;var now = new Date();&lt;br /&gt;&lt;br /&gt;var year = now.getYear().toString();&lt;br /&gt;var month = (now.getMonth() + 1).toString();&lt;br /&gt;var dayOfMonth = now.getDate().toString();&lt;br /&gt;&lt;br /&gt;if (month.length == 1) {&lt;br /&gt;month = "0" + month;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;if (dayOfMonth.length == 1) {&lt;br /&gt;dayOfMonth = "0" + dayOfMonth;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;var yyyymmdd = year + month + dayOfMonth;&lt;br /&gt;The DataValue of a picklist is a string!&lt;br /&gt;The DataValue of a picklist is a string, not an integer. You would expect it to be an integer as a picklist value is stored as an integer in the database and the Picklist class in the WSDL also specifies an integer value. Anyway when comparing the value of a picklist in client-side code, make sure to use a string value:&lt;br /&gt;if (crmForm.all.your_picklist.DataValue == "1") {&lt;br /&gt;} &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;Setting a picklist's default value in code&lt;/strong&gt;&lt;br /&gt;If a default option is specified in the attribute definition of a picklist, CRM assumes that you don't want to allow an empty value. This may not be true in all circumstances, so here's the workaround: In the attribute definition change the default value back to unassigned. This adds back the empty option in the picklist. Open the form's OnLoad event and add the following code:&lt;br /&gt;if (crmForm.ObjectId == null) {&lt;br /&gt;crmForm.all.your_picklist.DataValue = "1";&lt;br /&gt;}&lt;br /&gt;The code selects the first option in the picklist when inside a create form. It does not change the value once the form has been saved.&lt;br /&gt;Starting an application from a CRM form&lt;br /&gt;var shell = new ActiveXObject("WScript.Shell");&lt;br /&gt;&lt;br /&gt;if (shell != null) {&lt;br /&gt;shell.Run("c:\directory\application.exe " + crmForm.ObjectId);&lt;br /&gt;}&lt;br /&gt;You may face security issues preventing your code from being executed. An alternative is to use a custom .NET assembly as outlined in Using .NET assemblies in JavaScript code. &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;Changing the available entity types in a lookup dialog&lt;br /&gt;&lt;/strong&gt;Use one of the following in your OnLoad event:&lt;br /&gt;//Allow only accounts to be selected&lt;br /&gt;crmForm.all.regardingobjectid.setAttribute("lookuptypes", "1");&lt;br /&gt;&lt;br /&gt;//Allow only contacts to be selected&lt;br /&gt;crmForm.all.regardingobjectid.setAttribute("lookuptypes", "2");&lt;br /&gt;&lt;br /&gt;//Allow accounts or contacts to be selected&lt;br /&gt;crmForm.all.regardingobjectid.setAttribute("lookuptypes", "1,2");&lt;br /&gt;It does not change the behavior of the form assistant, but the lookup dialog will not display any other entity. The attribute values are entity type codes and are documented in the SDK help file. You can use the code for any field allowing multiple entity types (usually customer fields and the regarding field).&lt;br /&gt;Setting the text of the "Save As Completed" button&lt;br /&gt;To display the text "Save as completed" in the toolbar button performing this action, put this code into the OnLoad event:&lt;br /&gt;document.all._MBSaveAsCompleted.children[0].innerHTML += "Save as completed";&lt;br /&gt;This is unsupported and may not work in the future. &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;Calculating durations&lt;/strong&gt;&lt;br /&gt;The following code subtracts the current date from a date specified on a CRM form and calculates the remaining or elapsed days, hours or minutes.&lt;br /&gt;var displayField = crmForm.all.&amp;lt;name of a string field&amp;gt;;&lt;br /&gt;var formDate = crmForm.all.&amp;lt;name of a datetime field&amp;gt;.DataValue;&lt;br /&gt;var now = new Date();&lt;br /&gt;var ms = formDate.valueOf() - now.valueOf();&lt;br /&gt;var minutes = ms / 1000 / 60;&lt;br /&gt;var hours = minutes / 60;&lt;br /&gt;var days = hours / 24;&lt;br /&gt;&lt;br /&gt;if (days &amp;gt;= 1) {&lt;br /&gt;displayField.DataValue = Math.floor(days) + " day(s) left";&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;else if (hours &amp;gt;= 1) {&lt;br /&gt;displayField.DataValue = Math.floor(hours) + " hour(s) left";&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;else if (minutes &amp;gt;= 1) {&lt;br /&gt;displayField.DataValue = Math.floor(minutes) + " minute(s) left";&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;else if (days &amp;lt;= -1) {&lt;br /&gt;displayField.DataValue = Math.floor(-days) + " day(s) late";&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;else if (hours &amp;lt;= -1) {&lt;br /&gt;displayField.DataValue = Math.floor(-hours) + " hour(s) late";&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;else if (minutes &amp;lt;= -1) {&lt;br /&gt;displayField.DataValue = Math.floor(-minutes) + " minute(s) late";&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;else {&lt;br /&gt;displayField.DataValue = "NOW";&lt;br /&gt;} &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;Hiding a single field&lt;/strong&gt;&lt;br /&gt;crmForm.all.&amp;lt;fieldname&amp;gt;_c.style.display = "none"; //hides the label&lt;br /&gt;crmForm.all.&amp;lt;fieldname&amp;gt;_d.style.display = "none"; //hides the field &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;Setting a text field to the name of the entity referenced in a lookup control&lt;/strong&gt;&lt;br /&gt;if (crmForm.all.&amp;lt;lookupField&amp;gt;.DataValue == null) {&lt;br /&gt;crmForm.all.&amp;lt;textField&amp;gt;.DataValue = null;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;else {&lt;br /&gt;crmForm.all.&amp;lt;textField&amp;gt;.DataValue = crmForm.all.&amp;lt;lookupField&amp;gt;.DataValue[0].name;&lt;br /&gt;} &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;Getting notified when a user changes a checkbox value before leaving the field&lt;/strong&gt;&lt;br /&gt;The OnChange event of a bit field is fired when you leave the field. Often you want the event to be triggered as soon as the user clicks on a checkbox before tabbing out. Here's the code:&lt;br /&gt;In the OnLoad event create a new event handler like this:&lt;br /&gt;crmForm.all.your_checkboxfield.onclick = function() {&lt;br /&gt;crmForm.all.your_checkboxfield.FireOnChange();&lt;br /&gt;}&lt;br /&gt;Obviously the onclick event is raised when clicking on the checkbox. Not so obvious is the fact that it also fires when you change the value using the keyboard (space bar). The above code calls your OnChange event handler after the value changed but before the control looses focus, so OnChange will be triggered again when you tab out. If that's a problem, place the existing OnChange event handler into the onclick event:&lt;br /&gt;crmForm.all.your_checkboxfield.onclick = function() {&lt;br /&gt;//add existing OnChange implementation here&lt;br /&gt;}&lt;br /&gt;Now you can deactivate your OnChange event. &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;Preventing an OnChange event handler from executing when the form closes&lt;/strong&gt;&lt;br /&gt;To prevent an OnChange event handler from running if the form is closing, add the following code to your OnLoad event:&lt;br /&gt;//declaring a global variable&lt;br /&gt;_windowClosing = false;&lt;br /&gt;&lt;br /&gt;//onbeforeunload is called when you close the form but before the OnChange event is triggered&lt;br /&gt;window.onbeforeunload = function() {&lt;br /&gt;_windowClosing = true;&lt;br /&gt;}&lt;br /&gt;In your OnChange script, do the following:&lt;br /&gt;if (!_windowClosing) {&lt;br /&gt;//add your existing script code&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Maximizing a form&lt;/strong&gt;&lt;br /&gt;Put the following two lines of code into any OnLoad event to maximize the form:&lt;br /&gt;window.moveTo(0,0);&lt;br /&gt;window.resizeTo(screen.availWidth, screen.availHeight);&lt;br /&gt;moveTo moves the window to the specified location and resizeTo resizes it. screen is a global object and give you the available screen width and height in the corresponding properties. &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;Using a toolbar button to open a referenced entity&lt;/strong&gt;&lt;br /&gt;Let's say you have added a lookup field to a form referencing one of your custom entities and you have added a toolbar button in isv.config.xml. When clicked it should open the entity shown in the lookup field, which basically is the same as clicking the link in the lookup itself.&lt;br /&gt;Here's the code:&lt;br /&gt;var lookup = crmForm.all.your_lookup_field;&lt;br /&gt;&lt;br /&gt;if ((lookup != null) &amp;amp;&amp;amp; (lookup.DataValue != null)) {&lt;br /&gt;var objectTypeCode = lookup[0].type;&lt;br /&gt;var objectId = lookup[0].id;&lt;br /&gt;var url = '/userdefined/edit.aspx?id=" + objectId + '&amp;amp;etc=' + objectTypeCode;&lt;br /&gt;&lt;br /&gt;window.open(url);&lt;br /&gt;}&lt;br /&gt;Note that when using a system entity, you have to replace /userdefined/edit.aspx with the appropriate edit URL of the system entity. The code first checks for the availability of the lookup field. If it's not included on the form (lookup will be null) or no data value has been set then no action is performed; otherwise the complete edit URL is stored in the url variable and passed to the window.open method. &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;Calculating the sum of two or more fields&lt;/strong&gt;&lt;br /&gt;Though it seems straightforward to sum up field values in a form, you can easily run into problems with null values. Here's a sample script that sums up three fields (your_field1, your_field2, your_field3) and stores the sum in your_sum:&lt;br /&gt;//A field is accessed with crmForm.all.&amp;lt;the_field_name&amp;gt;&lt;br /&gt;//A field value is accessed through it's DataValue property&lt;br /&gt;var value1 = crmForm.all.your_field1.DataValue;&lt;br /&gt;var value2 = crmForm.all.your_field2.DataValue;&lt;br /&gt;var value3 = crmForm.all.your_field3.DataValue;&lt;br /&gt;&lt;br /&gt;//The DataValue of an empty field is null, so in order to&lt;br /&gt;//sum up the values, you have to check for null values&lt;br /&gt;value1 = (value1 == null) ? 0 : value1;&lt;br /&gt;value2 = (value2 == null) ? 0 : value2;&lt;br /&gt;value3 = (value3 == null) ? 0 : value3;&lt;br /&gt;&lt;br /&gt;//Setting a value follows the same rules used for retrieving&lt;br /&gt;crmForm.all.your_sum.DataValue = value1 + value2 + value3;&lt;br /&gt;Calculating the total charge based on actural duration, hourly rate, trip charge and tax rate&lt;br /&gt;Instead of trying to make this one generic, I'm repeating the original question:&lt;br /&gt;"I created 4 attributes under the Case entity as follows:&lt;br /&gt;• new_hourlyrate - picklist (95.00 and 125.00 for values)&lt;br /&gt;• new_taxrate - picklist (.06 and .07 for values)&lt;br /&gt;• new_tripcharge - picklist (0.00, 15.00, 30.00, 60.00 for values)&lt;br /&gt;• new_totalcharge - money&lt;br /&gt;I need to populate the totalcharge field based on the actualdurationminutes attribute with the following math equation:&lt;br /&gt;totalcharge = actualdurationminutes/60 (to get hours) multiplied by the hourly rate, add the tripcharge, multiplied by the tax rate. Take that value and add it to the hourly rate multiplied by the hours, and add the trip charge, to get total charge."&lt;br /&gt;And here's the code:&lt;br /&gt;var hourlyRateField = crmForm.all.new_hourlyrate;&lt;br /&gt;var taxRateField = crmForm.all.new_taxrate;&lt;br /&gt;var tripChargeField = crmForm.all.new_tripcharge;&lt;br /&gt;var totalChargeField = crmForm.all.new_totalcharge;&lt;br /&gt;var actualDurationMinutesField = crmForm.all.actualdurationminutes;&lt;br /&gt;&lt;br /&gt;//Sanity check: if at least one of the fields is not available on the form,&lt;br /&gt;the following condition is not met&lt;br /&gt;if (hourlyRateField &amp;amp;&amp;amp; taxRateField &amp;amp;&amp;amp; tripChargeField &amp;amp;&amp;amp; totalChargeField &amp;amp;&amp;amp; actualDurationMinutesField) {&lt;br /&gt;&lt;br /&gt;var hourlyRate = (hourlyRateField.DataValue == null) ? 0 : parseFloat(hourlyRateField.SelectedText);&lt;br /&gt;var taxRate = (taxRateField.DataValue == null) ? 0 : parseFloat(taxRateField.SelectedText);&lt;br /&gt;var tripCharge = (tripChargeField.DataValue == null) ? 0 : parseFloat(tripChargeField.SelectedText);&lt;br /&gt;var actualDurationMinutes = (actualDurationMinutesField.DataValue == null) ? 0 : parseFloat(actualDurationMinutesField.DataValue);&lt;br /&gt;&lt;br /&gt;var totalCharge = (actualDurationMinutes/60 * hourlyRate) + tripCharge;&lt;br /&gt;var totalTax = totalCharge * taxRate;&lt;br /&gt;&lt;br /&gt;totalChargeField.DataValue = totalCharge + totalTax;&lt;br /&gt;}&lt;br /&gt;Note that in the above code parseFloat uses the SelectedText of the picklists instead of the DataValue.&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Changing error messages in CRM forms&lt;/strong&gt;&lt;br /&gt;Sometimes the error messages displayed when entering an incorrect value may not be correct. An example from a Dutch system: when a user tries to input a date by hand, for example 14/05/1998 an error is displayed because the correct format is 14-05-1998. However the error message tells you to specify the date as D/M/YYYY, which isn't correct.&lt;br /&gt;You can change these error messages on the fly by simply replacing the appropriate variable in OnLoad. Note the error message and search for it in in the page source. You will find something like this:&lt;br /&gt;var LOCID_ALERT_ENTER_VALID_DATE = "De opgegeven datum is ongeldig. voer een datum in met de notatie: D/M/YYYY.";&lt;br /&gt;To change it, put the following line in your OnLoad event:&lt;br /&gt;LOCID_ALERT_ENTER_VALID_DATE = "De opgegeven datum is ongeldig. voer een datum in met de notatie: DD-MM-YYYY."; &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;Setting a custom date field to another date minus 60 days&lt;br /&gt;&lt;/strong&gt;Date calculation problems are still popping up in the newsgroups, so here's another quick example. Let's say you want to calculate a date based on the value of the effectiveto field in your crmForm minus 60 days. Here's the code:&lt;br /&gt;var effectiveTo = crmForm.all.effectiveto.DataValue;&lt;br /&gt;&lt;br /&gt;var remindOn = new Date(&lt;br /&gt;effectiveTo.getYear(),&lt;br /&gt;effectiveTo.getMonth(),&lt;br /&gt;effectiveTo.getDate() - 60);&lt;br /&gt;or&lt;br /&gt;var effectiveTo = crmForm.all.effectiveto.DataValue;&lt;br /&gt;&lt;br /&gt;var remindOn = new Date(&lt;br /&gt;effectiveTo.getYear(),&lt;br /&gt;effectiveTo.getMonth() - 2,&lt;br /&gt;effectiveTo.getDate());&lt;br /&gt;The difference between the codes is that the first subtracts exactly 60 days, whereas the second subtracts two months, which is between 58 and 62 days. &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;Changing the default height of the lookup window&lt;/strong&gt;&lt;br /&gt;This is an unsupported change, but if you want to change the initial size of a lookup window, open /_controls/lookup/lookup.js in the CRM web and search for the function BuildFeatures(lookupStyle). Inside of this function search for the following:&lt;br /&gt;switch (lookupStyle)&lt;br /&gt;{&lt;br /&gt;case "multi":&lt;br /&gt;oFeatures.height = "460px";&lt;br /&gt;oFeatures.width = "600px";&lt;br /&gt;break;&lt;br /&gt;case "single":&lt;br /&gt;oFeatures.height = "488px";&lt;br /&gt;oFeatures.width = "600px";&lt;br /&gt;break;&lt;br /&gt;oFeatures.height and oFeatures.width are the initial lookup dimensions. After changing them, clear your browser cache to reload the include files the next time a lookup is accessed, otherwise IE will still use the cached values and you don't see a difference. &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;Accessing the previous field value in OnChange&lt;/strong&gt;&lt;br /&gt;Sometimes you need to know the previous field value in an OnChange event or you need to know the initial value after the form has loaded. This information of course is lost in OnChange, as the field value already has changed. Here's a simple workaround:&lt;br /&gt;// OnLoad event&lt;br /&gt;// no var statement here to declare a global variable&lt;br /&gt;_oldDateValue = crmForm.all.the_fieldName.DataValue;&lt;br /&gt;&lt;br /&gt;// OnChange event&lt;br /&gt;if (_oldDateValue == null) {&lt;br /&gt;//no previous value&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;else {&lt;br /&gt;var currentValue = crmForm.all.the_fieldName.DataValue;&lt;br /&gt;DoStuff(currentValue, _oldValue);&lt;br /&gt;&lt;br /&gt;//update the old value with the new value, if appropriate&lt;br /&gt;_oldDateValue = currentValue;&lt;br /&gt;} &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;Automatically calculate the tax value in an invoice line (invoicedetail)&lt;/strong&gt;&lt;br /&gt;CRM does not calculate the tax amount for you and if you want to automate it you have to add custom script. Sp here's an example for the invoicedetail. In the OnLoad event of the invoicedetail form add the following:&lt;br /&gt;CalculateTax = function() {&lt;br /&gt;&lt;br /&gt;var pricePerUnit = 0;&lt;br /&gt;var quantity = 0;&lt;br /&gt;var manualDiscount = 0;&lt;br /&gt;&lt;br /&gt;if (crmForm.all.priceperunit.DataValue != null) {&lt;br /&gt;pricePerUnit = crmForm.all.priceperunit.DataValue;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;if (crmForm.all.quantity.DataValue != null) {&lt;br /&gt;quantity = crmForm.all.quantity.DataValue;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;if (crmForm.all.manualdiscountamount.DataValue != null) {&lt;br /&gt;manualDiscount = crmForm.all.manualdiscountamount.DataValue;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;crmForm.all.tax.DataValue = (pricePerUnit * quantity - manualDiscount) * 0.175;&lt;br /&gt;}&lt;br /&gt;In the OnChange events of priceperunit, quantity and manualdiscountamount add:&lt;br /&gt;CalculateTax();&lt;br /&gt;Change 0.175 (17.5%) to the tax you need to charge. You can also add a new field instead of using a fixed value in the script code.&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Performing an action when a CRM form closes&lt;/strong&gt;&lt;br /&gt;If you want to execute your script whenever the form closes, whether it is saved or not, you can subscribe to the onunload event:&lt;br /&gt;window.onunload = function() {&lt;br /&gt;//add code here&lt;br /&gt;}&lt;br /&gt;Hooking into the "Lookup Address" feature in the order form&lt;br /&gt;To get notified when a user presses the "Lookup Address" button in the order form, put this code into the order's OnLoad event:&lt;br /&gt;if (document.all._MBLookupAddress != null) {&lt;br /&gt;document.all._MBLookupAddress.onclick = function() {&lt;br /&gt;LookupAddress();&lt;br /&gt;alert("Address lookup closed");&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;The alert pops up after the address lookup dialog closes but there's no way to distinguish if the user selected an address or canceled the dialog. Of course this is an unsupported customization as it uses undocumented functions.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;Changing the form title (not the browser title)&lt;/strong&gt;&lt;br /&gt;A CRM form displays the primary field of an entity in a large bold font just below the toolbar buttons. If you want to change the displayed text, put the following code into your OnLoad event:&lt;br /&gt;var cells = document.getElementsByTagName("td");&lt;br /&gt;&lt;br /&gt;for (var i = 0; i &amp;lt; cells.length; i++) {&lt;br /&gt;if (cells[i].className == "formTitle") {&lt;br /&gt;cells[i].innerText = "Ticket: 123456";&lt;br /&gt;break;&lt;br /&gt;}&lt;br /&gt;} &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;Passing parameters from a toolbar button to a CRM form&lt;/strong&gt;&lt;br /&gt;Sometimes you add buttons to a form's toolbar that simply create a new entity. However in the created entity you need to know if it was created from your toolbar button or not. Here's an easy solution to pass an additional parameter that you can check in the OnLoad entity of the new entity form.&lt;br /&gt;First of all let's start with the toolbar button. It usually has a Url attribute like "/userdefined/edit.aspx?etc=10018". To differentiate add an additional parameter like "/userdefined/edit.aspx?etc=10018&amp;amp;template=1".&lt;br /&gt;Note: using the entity type code is dangerous, as it may break when deploying your solution to another server.&lt;br /&gt;&lt;br /&gt;In the OnLoad event of the target entity (with object type code 10018) use the following code to extract the template parameter from the query string:&lt;br /&gt;var QueryString = ParseQueryString();&lt;br /&gt;var template = QueryString["template"];&lt;br /&gt;&lt;br /&gt;alert(template);&lt;br /&gt;&lt;br /&gt;if (template == "1") {&lt;br /&gt;// "New Template" clicked&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;else {&lt;br /&gt;// "New" clicked&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function ParseQueryString() {&lt;br /&gt;&lt;br /&gt;var dict = new Object();&lt;br /&gt;&lt;br /&gt;if ((document.location.search != null) &amp;amp;&amp;amp; (document.location.search != "?")) {&lt;br /&gt;var qsParts = document.location.search.substr(1).split("&amp;amp;");&lt;br /&gt;var index;&lt;br /&gt;&lt;br /&gt;for(index in qsParts) {&lt;br /&gt;var keyValue = qsParts[index].split("=");&lt;br /&gt;dict[keyValue[0]] = unescape(decodeURIComponent(keyValue[1]));&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;return dict;&lt;br /&gt;}&lt;br /&gt;The basic idea is passing additional parameters to the form and reading them in OnLoad. As the default "New" button does not add the template parameter, you can use it as an indicator which button initiated the creation of the new entity. &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;Aborting an OnChange operation&lt;/strong&gt;&lt;br /&gt;"I populated a picklist with some values and add code to the OnChange() event. When users change the picklist value by selection in the dropdown, a message box will pop up and ask the user to confirm the change. If the user chooses No, how could I restore the original value selected in the picklist?"&lt;br /&gt;// OnLoad&lt;br /&gt;// Note that the "var" keyword is missing intentionally to declare prevPicklistValue as a global variable&lt;br /&gt;prevPicklistValue = crmForm.all.the_picklist.DataValue;&lt;br /&gt;&lt;br /&gt;// OnChange of prevPicklistValue&lt;br /&gt;var currentPicklistValue = crmForm.all.the_picklist.DataValue;&lt;br /&gt;&lt;br /&gt;if (prevPicklistValue == currentPicklistValue) {&lt;br /&gt;//Reaching this line when restoring the previous value&lt;br /&gt;return;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;var answer = window.confirm("Click Ok to proceed or Cancel to abort the operation.");&lt;br /&gt;&lt;br /&gt;if (answer) {&lt;br /&gt;//User selected OK -&amp;gt; Save the current value as the last accepted value&lt;br /&gt;prevPicklistValue = currentPicklistValue;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;else {&lt;br /&gt;//User selected Cancel -&amp;gt; Restore the previous value.&lt;br /&gt;crmForm.all.the_picklist.DataValue = prevPicklistValue&lt;br /&gt;}&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Disabling the time selection of a date/time field&lt;/strong&gt;&lt;br /&gt;You can dynamically enable or disable the time selection box of a date/time field using the following syntax:&lt;br /&gt;var dateField = crmForm.all.&amp;lt;name of datetime field&amp;gt;;&lt;br /&gt;&lt;br /&gt;//Check the existence of the time field. It is null if the control is setup to only display the date.&lt;br /&gt;if (dateField.all.time != null) {&lt;br /&gt;&lt;br /&gt;//Disable the time field&lt;br /&gt;dateField.all.time.disable();&lt;br /&gt;&lt;br /&gt;//Enable the time field&lt;br /&gt;dateField.all.time.enable();&lt;br /&gt;}&lt;br /&gt;CRM automatically enables the time selection box if the date value changes to a non-null value, so in order to always disable the time selection box, you need to add the following OnChange event script to the datetime field:&lt;br /&gt;var dateField = crmForm.all.&amp;lt;name of datetime field&amp;gt;;&lt;br /&gt;&lt;br /&gt;//Check the existence of the time field. It is null if the control is setup to only display the date.&lt;br /&gt;if (dateField.all.time != null) {&lt;br /&gt;//Disable the time field&lt;br /&gt;dateField.all.time.disable();&lt;br /&gt;}&lt;br /&gt;To initially disable the time field, put the following into the form OnLoad event:&lt;br /&gt;var dateField = crmForm.all.&amp;lt;name of datetime field&amp;gt;;&lt;br /&gt;&lt;br /&gt;//Check the existence of the datetime field. It may not be included in a quick create form!&lt;br /&gt;if (dateField != null) {&lt;br /&gt;&lt;br /&gt;//Call the OnChange event handler&lt;br /&gt;dateField.FireOnChange();&lt;br /&gt;} &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;Changing the time interval in date/time fields&lt;br /&gt;&lt;/strong&gt;The time selection box of a date/time field uses a 30 minute interval. You can change it to a different interval using the following code in an OnLoad event:&lt;br /&gt;var dateField = crmForm.all.&amp;lt;name of datetime field&amp;gt;;&lt;br /&gt;&lt;br /&gt;//Check the existence of the datetime field. It may not be included in a quick create form!&lt;br /&gt;if (dateField != null) {&lt;br /&gt;&lt;br /&gt;var timeField = dateField.all.time;&lt;br /&gt;&lt;br /&gt;//Check the existence of the time field. It is null if the control is setup to only display the date.&lt;br /&gt;if (timeField != null) {&lt;br /&gt;&lt;br /&gt;//The new interval in minutes.&lt;br /&gt;var interval = 15;&lt;br /&gt;var tables = timeField.getElementsByTagName("table");&lt;br /&gt;&lt;br /&gt;if ((tables != null) &amp;amp;&amp;amp; (tables.length &amp;gt; 0)) {&lt;br /&gt;&lt;br /&gt;var table = tables[1];&lt;br /&gt;&lt;br /&gt;//Remove all existing values from the selection box&lt;br /&gt;while (table.firstChild != null) {&lt;br /&gt;table.removeChild(table.firstChild);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//Add the new values&lt;br /&gt;for (hour = 0; hour &amp;lt; 24; hour++) {&lt;br /&gt;for (min = 0; min &amp;lt; 60; min += interval) {&lt;br /&gt;&lt;br /&gt;var row = table.insertRow();&lt;br /&gt;var cell = row.insertCell();&lt;br /&gt;var time = ((hour &amp;lt; 10) ? "0" : "") + hour + ":" + ((min &amp;lt; 10) ? "0" : "") + min;&lt;br /&gt;&lt;br /&gt;cell.setAttribute("val", time);&lt;br /&gt;cell.innerText = time;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;} &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;Getting the quote id inside a quotedetail form&lt;/strong&gt;&lt;br /&gt;There's a hidden field in the quotedetail form storing the quote id. You can access it using&lt;br /&gt;alert("Quote ID = " + crmForm.all.quoteid.DataValue); &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;How to know which button triggered the OnSave event&lt;/strong&gt;&lt;br /&gt;You can use the event.Mode property in the OnSave event. It will tell you which button was used to save an entity. Not all values are documented in the SDK, e.g the "Save as completed" in a phone call has a value of 58. As it's not documented, this number may change in future releases.&lt;br /&gt;To get started enter the following into your OnSave script:&lt;br /&gt;alert ("event.Mode = " + event.Mode);&lt;br /&gt;event.returnValue = false;&lt;br /&gt;return false;&lt;br /&gt;This codes makes it impossible to save the entity, but allows you to write down all of the values passed to OnSave. You will see 1 for a normal save operation and 2 for Save and Close. Most but not all constants are defined in /_common/scripts/formevt.js. &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;Accessing the CRM database from JavaScript&lt;/strong&gt;&lt;br /&gt;To access the CRM database from JavaScript, use the following as a template:&lt;br /&gt;var connection = new ActiveXObject("ADODB.Connection");&lt;br /&gt;var connectionString = "Provider=SQLOLEDB;Server=STUNNWARECRM;Database=stunnware_mscrm;Integrated Security=sspi";&lt;br /&gt;&lt;br /&gt;connection.Open(connectionString);&lt;br /&gt;&lt;br /&gt;var query = "SELECT name FROM FilteredAccount";&lt;br /&gt;var rs = new ActiveXObject("ADODB.Recordset");&lt;br /&gt;&lt;br /&gt;rs.Open(query, connection, /*adOpenKeyset*/1, /*adLockPessimistic*/2);&lt;br /&gt;rs.moveFirst();&lt;br /&gt;&lt;br /&gt;var values = "";&lt;br /&gt;&lt;br /&gt;while (!rs.eof) {&lt;br /&gt;values += rs.Fields(0).Value.toString() + " ";&lt;br /&gt;rs.moveNext();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;connection.Close();&lt;br /&gt;&lt;br /&gt;alert(values);&lt;br /&gt;You may need to adjust your security settings in IE in order to run this code. &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;Modifying the Quick Create Form&lt;/strong&gt;&lt;br /&gt;Allthough the quick create form isn't listed in the forms and views dialog, it uses the same scripts entered in the main application form. You can use the following in the OnLoad script to run code when inside of a quick create form:&lt;br /&gt;if (crmForm.FormType == 5 /* Quick Create Form */) {&lt;br /&gt;//modify the form using DHTML&lt;br /&gt;} &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;Forcing the selection of an account in the potential customer field of an opportunity&lt;br /&gt;&lt;/strong&gt;Put the following into the opportunity's OnLoad event:&lt;br /&gt;crmForm.all.customerid.setAttribute("lookuptypes", "1");&lt;br /&gt;This tells the customer lookup to only include the account (object type code 1). A value of 2 forces the lookup to only display contacts. &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;Hiding and showing fields dynamically based on other field values&lt;br /&gt;&lt;/strong&gt;You can do this in client-side JavaScript. Let's say you have a picklist named "new_category" and you have assigned the following options to it:&lt;br /&gt;1 - Business&lt;br /&gt;2 - Private&lt;br /&gt;3 - Unspecified&lt;br /&gt;Let's further assume that you want to hide the fields "new_a" and "new_b" whenever a user selects "Private", but they should be visible if a different option is selected in the picklist. Your OnChange event script of the new_category field will be:&lt;br /&gt;var hideValues = (crmForm.all.new_category != null) &amp;amp;&amp;amp; (crmForm.all.new_category.DataValue == "2");&lt;br /&gt;var displayStyle = hideValues ? "none" : "";&lt;br /&gt;&lt;br /&gt;crmForm.all.new_a.style.display = displayStyle;&lt;br /&gt;crmForm.all.new_b.style.display = displayStyle;&lt;br /&gt;To run the code when the form is initially loaded, put the following into the OnLoad event:&lt;br /&gt;if (crmForm.all.new_category != null) {&lt;br /&gt;crmForm.all.new_category.FireOnChange();&lt;br /&gt;}&lt;br /&gt;The test for a null value of crmForm.all.new_category is included to avoid errors if the field is not available on a form. This is true for quick create forms if the field required level is not set to business required or business recommended. &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;Removing the value from a lookup field&lt;/strong&gt;&lt;br /&gt;crmForm.all.&amp;lt;lookupField&amp;gt;.DataValue = null; &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;Hiding tabs at runtime&lt;/strong&gt;&lt;br /&gt;You can hide and show entire tabs dynamically using the following code:&lt;br /&gt;//Add your condition here, usually a field comparison in an OnChange event&lt;br /&gt;if (condition == true) {&lt;br /&gt;//hide the second tab&lt;br /&gt;crmForm.all.tab1Tab.style.display = "none";&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;else {&lt;br /&gt;//show the second tab&lt;br /&gt;crmForm.all.tab1Tab.style.display = "";&lt;br /&gt;}&lt;br /&gt;The tabs are named "tab0Tab", "tab1Tab", "tab2Tab" and so on. &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;Setting the active tab&lt;/strong&gt;&lt;br /&gt;From the SDK docs:&lt;br /&gt;SetFocus: Sets the focus, changes tabs, and scrolls the window as necessary to show the specified field. Example:&lt;br /&gt;// Set focus to the field.&lt;br /&gt;crmForm.all.SOME_FIELD_ID.SetFocus(); &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;Displaying related entities instead of the form when opening a record&lt;/strong&gt;&lt;br /&gt;To open a related entity view of the left navigation bar (like contacts in an account entity), you can use the following:&lt;br /&gt;loadArea("areaContacts");&lt;br /&gt;Each entry in the navigation bar has a unique area name (areaContacts is just a sample). If you haven't already done it, download and install the Internet Explorer Developer Toolbar to find the name of the entry you're after. Some instructions on how to use it are in http://www.stunnware.com/crm2/topic.aspx?id=CrmLookAndFeel1; though it is a different topic, I included some screenshots using the developer toolbar in CRM. &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;Modifying the color of disabled form fields&lt;/strong&gt;&lt;br /&gt;Disabled form fields are sometimes hard to read. Making the color a little bit darker greatly helps to read all of the content without loosing the information that a field is read-only.&lt;br /&gt;Open the following file in your CRM web: /_forms/controls/controls.css. Then find the following style:&lt;br /&gt;INPUT.ro,TEXTAREA.ro,DIV.ro,SPAN.ro&lt;br /&gt;{&lt;br /&gt;background-color: #ffffff;&lt;br /&gt;color: #808080;&lt;br /&gt;border-color: #808080;&lt;br /&gt;}&lt;br /&gt;The color attribute is the light gray you're seeing by default. You may change it to #404040 to get a slightly darker gray. If you don't see the new colors in IE, hit CTRL-F5 to reload the source files, including the updated css file.&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Removing a navigation bar entry at runtime&lt;/strong&gt;&lt;br /&gt;To remove a navigation bar entry dynamically, you can use the following code:&lt;br /&gt;var navigationBarEntry = document.getElementById("navProds");&lt;br /&gt;&lt;br /&gt;if (navigationBarEntry != null) {&lt;br /&gt;&lt;br /&gt;var lbArea = navigationBarEntry.parentNode;&lt;br /&gt;&lt;br /&gt;if (lbArea != null) {&lt;br /&gt;lbArea.removeChild(navigationBarEntry);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;If you haven't already done it, download and install the Internet Explorer Developer Toolbar to find the name of the navigation bar entry. &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;Changing the color of a label&lt;/strong&gt;&lt;br /&gt;var label = crmForm.all.&amp;lt;field name&amp;gt;_c;&lt;br /&gt;label.innerHTML = "&amp;lt;font color='#FF0000'&amp;gt;" + label.innerText + "&amp;lt;/font&amp;gt;";&lt;br /&gt;It's time to continue the "More JavaScript" series. Here's the fifth article containing more snippets and I hope that you find them as valuable as the four previous articles. I also updated the JavaScript Snippets Directory. &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;Formatting international phone numbers&lt;/strong&gt;&lt;br /&gt;The CRM SDK contains a sample to format US phone numbers and it works pretty well. However, there are customers outside the US and the sample doesn't work with international phone numbers. An easy formatting rule is replacing any occurrence of '(', ')' or a space with a dash. People can then enter the phone number in their preferred way, but get the same output.&lt;br /&gt;var originalPhoneNumber = "+49 (89) 12345678";&lt;br /&gt;var formattedPhoneNumber = originalPhoneNumber.replace(/[^0-9,+]/g, "-");&lt;br /&gt;formattedPhoneNumber = formattedPhoneNumber.replace(/-+/g, "-");&lt;br /&gt;alert(formattedPhoneNumber);&lt;br /&gt;The first call to the replace method changes every character in the input string that is not a digit and not the plus sign (which is used for international&lt;br /&gt;numbers) to the dash symbol. However, the output is +49--89--12345678, so the second call replaces all occurrences of multiple dashes with a single&lt;br /&gt;one, giving a final result of +49-89-12345678. &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;Rounding numerical fields&lt;/strong&gt;&lt;br /&gt;Rounding fields is done similar to any other programming language. The following method rounds a float value using a precision of two decimal places:&lt;br /&gt;function round(value) {&lt;br /&gt;return Math.round(value * 100) / 100;&lt;br /&gt;}&lt;br /&gt;The Math object defines three methods for rounding operations:&lt;br /&gt;• Math.ceil(arg): Returns an integer value equal to the smallest integer greater than or equal to its numeric argument.&lt;br /&gt;• Math.floor(arg): Returns an integer value equal to the greatest integer less than or equal to its numeric argument.&lt;br /&gt;• Math.round(arg): If the decimal portion of number is 0.5 or greater, the return value is equal to the smallest integer greater than number. Otherwise, round returns the largest integer less than or equal to number.&lt;br /&gt;Be aware of null values in Boolean fields&lt;br /&gt;When working with Boolean fields it's seems natural to compare the value to either true or false:&lt;br /&gt;var value = crmForm.all.my_bool.DataValue;&lt;br /&gt;&lt;br /&gt;if (value == true) {&lt;br /&gt;//do something&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;else {&lt;br /&gt;//do something else&lt;br /&gt;}&lt;br /&gt;However, the value may also be null and you should make sure that your code handles it correctly:&lt;br /&gt;var value = crmForm.all.my_bool.DataValue;&lt;br /&gt;&lt;br /&gt;if (value == null) {&lt;br /&gt;//do appropriate steps if there is no value&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;else if (value == true) {&lt;br /&gt;//do something&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;else {&lt;br /&gt;//do something else&lt;br /&gt;}&lt;br /&gt;If you want to execute either the "true" part or the "false" part when no value is set, then I recommended the following (including the comment, to make it obvious):&lt;br /&gt;var value = crmForm.all.my_bool.DataValue;&lt;br /&gt;&lt;br /&gt;//Default to true if no value is set&lt;br /&gt;if (value == null) {&lt;br /&gt;value = true;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;if (value == true) {&lt;br /&gt;//do something&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;else {&lt;br /&gt;//do something else&lt;br /&gt;}&lt;br /&gt;&lt;strong&gt;Reusing code in OnLoad and OnChange event handlers&lt;/strong&gt;&lt;br /&gt;I often see code like this:&lt;br /&gt;OnLoad:&lt;br /&gt;if (crmForm.all.my_lookup_field.DataValue != null) {&lt;br /&gt;crmForm.all.my_text_field.DataValue = crmForm.all.my_lookup_field.DataValue[0].name;&lt;br /&gt;}&lt;br /&gt;OnChange:&lt;br /&gt;if (crmForm.all.my_lookup_field.DataValue != null) {&lt;br /&gt;crmForm.all.my_text_field.DataValue = crmForm.all.my_lookup_field.DataValue[0].name;&lt;br /&gt;}&lt;br /&gt;The code is identical in both events: it copies the display name of the selected item in a lookup field to a text box. Later you notice that it doesn't remove an existing value in the text field when the user removes the lookup selection and change the OnChange code to this:&lt;br /&gt;if (crmForm.all.my_lookup_field.DataValue != null) {&lt;br /&gt;crmForm.all.my_text_field.DataValue = crmForm.all.my_lookup_field.DataValue[0].name;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;else {&lt;br /&gt;crmForm.all.my_text_field.DataValue = null;&lt;br /&gt;}&lt;br /&gt;It sometimes happens that you forget to change the OnLoad code as well, so instead of copy paste the code between OnChange and OnLoad, you should use one of the following implementation styles:&lt;br /&gt;1. Implementing the code in the OnChange event handler and using FireOnChange to execute it in the OnLoad event:&lt;br /&gt;OnLoad&lt;br /&gt;crmForm.all.my_lookup_field.FireOnChange();&lt;br /&gt;OnChange&lt;br /&gt;if (crmForm.all.my_lookup_field.DataValue != null) {&lt;br /&gt;crmForm.all.my_text_field.DataValue = crmForm.all.my_lookup_field.DataValue[0].name;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;else {&lt;br /&gt;crmForm.all.my_text_field.DataValue = null;&lt;br /&gt;}&lt;br /&gt;2. Implementing the code in OnLoad and calling it from the OnChange event:&lt;br /&gt;OnLoad&lt;br /&gt;MyLookup_OnChange = function() {&lt;br /&gt;if (crmForm.all.my_lookup_field.DataValue != null) {&lt;br /&gt;crmForm.all.my_text_field.DataValue = crmForm.all.my_lookup_field.DataValue[0].name;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;else {&lt;br /&gt;crmForm.all.my_text_field.DataValue = null;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;MyLookup_OnChange();&lt;br /&gt;OnChange&lt;br /&gt;MyLookup_OnChange();&lt;br /&gt;The second implementation has the benefit that all of your code is in a single place.&lt;br /&gt;Tip: The code can be rewritten to this: &lt;/p&gt;&lt;p&gt;&lt;br /&gt;var lookupValue = crmForm.all.my_lookup_field.DataValue;&lt;br /&gt;crmForm.all.my_text_field.DataValue = (lookupValue == null) ? null : lookupValue[0].name;&lt;br /&gt;Getting notified when the user selected an address in the address picker (quote, order, invoice)&lt;br /&gt;When working with quotes, orders and invoices, you pick an address to specify the bill to and ship to address. Though the address fields are properly filled with the selected values, no OnChange event is executed in the CRM form. Here's an easy but unsupported way to be informed when the user closes the address lookup dialog:&lt;br /&gt;if (document.all._MBLookupAddress != null) {&lt;br /&gt;document.all._MBLookupAddress.onclick = function() {&lt;br /&gt;LookupAddress();&lt;br /&gt;alert("Address lookup closed");&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;You don't know if the user selected an address or canceled the operation though. You can use the same idea to override other built-in functions, but as said, it's unsupported and may break in future releases.&lt;br /&gt;What is "if (condition) ? statement1 : statement2"?&lt;br /&gt;I'm using the above notation a lot because it's an easy way to set a value to one out of two values. This construct is available in C, C++, Java, C# and I'm sure that most other languages have similar commands. I noticed though that it's not as as clear as I thought, so here's the same using a standard if/then/else:&lt;br /&gt;if (condition) {&lt;br /&gt;statement1;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;else {&lt;br /&gt;statement2;&lt;br /&gt;}&lt;br /&gt;And here's a real example:&lt;br /&gt;var s = (crmForm.all.my_lookup.DataValue == null) ? null : crmForm.all.my_lookup.DataValue[0].name;&lt;br /&gt;And the same with an if/then/else:&lt;br /&gt;var s;&lt;br /&gt;&lt;br /&gt;if (crmForm.all.my_lookup.DataValue == null) {&lt;br /&gt;s = null;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;else {&lt;br /&gt;s = crmForm.all.my_lookup.DataValue[0].name;&lt;br /&gt;} &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;Copying the display name of a selcted lookup value into a textbox&lt;/strong&gt;&lt;br /&gt;See the sample above. &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;Retrieving all fields inside a CRM form&lt;/strong&gt;&lt;br /&gt;If you want to loop over all fields (input fields) on a CRM form, you can use the following script as a starting point:&lt;br /&gt;for (var index in crmForm.all) {&lt;br /&gt;var control = crmForm.all[index];&lt;br /&gt;&lt;br /&gt;if (control.req &amp;amp;&amp;amp; (control.Disabled != null)) {&lt;br /&gt;//control is a CRM form field&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;The conditions mean that a control must have the "req" attribute and the "Disabled" method. This seems a good indicator for a CRM form field.&lt;br /&gt;&lt;strong&gt;Knowing if you are running in CRM 3.0 or CRM 4.0&lt;/strong&gt;&lt;br /&gt;It's fairly easy to differentiate if your code is running on CRM 4.0 or not. Just pick a method or variable that did not exist in CRM 3.0 and check if it is available:&lt;br /&gt;if (typeof(GenerateAuthenticationHeader) == "undefined") {&lt;br /&gt;alert("Version 3");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;else {&lt;br /&gt;alert("Version 4");&lt;br /&gt;}&lt;br /&gt;GenerateAuthenticationHeader was introduced in CRM 4.0 and is a global function available in all forms.&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Showing/Hiding tabs based on the selection in a picklist&lt;/strong&gt;&lt;br /&gt;The next script shows one out of three tabs based on the selection in the new_combo field. It hides all tabs if no selection is made or a different value is selected.&lt;br /&gt;OnLoad:&lt;br /&gt;//Sanity check: if new_combo is not present on the form, then don't call FireOnChange&lt;br /&gt;if (crmForm.all.new_combo != null) {&lt;br /&gt;crmForm.all.new_combo.FireOnChange();&lt;br /&gt;}&lt;br /&gt;OnChange:&lt;br /&gt;//Check for create, update, read-only or disabled form&lt;br /&gt;if ((crmForm.FormType &amp;gt;= 1) &amp;amp;&amp;amp; (crmForm.FormType &amp;lt;= 4)) {&lt;br /&gt;&lt;br /&gt;var value = crmForm.all.new_combo.DataValue;&lt;br /&gt;&lt;br /&gt;crmForm.all.tab1Tab.style.display = (value == "1") ? "none" : "";&lt;br /&gt;crmForm.all.tab2Tab.style.display = (value == "2") ? "none" : "";&lt;br /&gt;crmForm.all.tab3Tab.style.display = (value == "3") ? "none" : "";&lt;br /&gt;} &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;Changing the background color of a form (CRM 4.0)&lt;/strong&gt;&lt;br /&gt;Instead of explaining in detail, simply copy the following code into the OnLoad event:&lt;br /&gt;document.all.areaForm.style.backgroundColor = 'yellow';&lt;br /&gt;document.all.tab0.style.backgroundColor = 'red';&lt;br /&gt;document.all.tab1.style.backgroundColor = 'blue';&lt;br /&gt;document.all.tab2.style.backgroundColor = 'green';&lt;br /&gt;document.all.tab3.style.backgroundColor = 'cyan';&lt;br /&gt;The above is for an entity with 4 tabs, like the default account form. If you have less tabs, then remove some of the lines at the end (tab0 = the first tab, tab1 = the second tab, ...).&lt;br /&gt;Instead of using color names, you can also specify RGB values, e.g.&lt;br /&gt;document.all.tab0.style.backgroundColor = '#A040FF'; &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;Calculating the difference of two numerical fields&lt;/strong&gt;&lt;br /&gt;Seems easy enough:&lt;br /&gt;var result = crmForm.all.num_field1.DataValue - crmForm.all.num_field2.DataValue;&lt;br /&gt;It will break though if either of the two fields is null. Use the following instead:&lt;br /&gt;var fieldValue1 = (crmForm.all.num_field1.DataValue == null) ? 0 : crmForm.all.num_field1.DataValue;&lt;br /&gt;var fieldValue2 = (crmForm.all.num_field2.DataValue == null) ? 0 : crmForm.all.num_field2.DataValue;&lt;br /&gt;var diff = fieldValue1 - fieldValue2;&lt;br /&gt;You can use a different notation to check for the null value:&lt;br /&gt;var fieldValue1 = crmForm.all.num_field1.DataValue ? 0 : crmForm.all.num_field1.DataValue;&lt;br /&gt;var fieldValue2 = crmForm.all.num_field2.DataValue ? 0 : crmForm.all.num_field2.DataValue;&lt;br /&gt;var diff = fieldValue1 - fieldValue2;&lt;br /&gt;It depends on your coding style which version you prefer. The second is smaller but doesn't really tell what you are comparing, while the first explicitly cheks for a null value. &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;Disable all fields on a form&lt;/strong&gt;&lt;br /&gt;This is just a variation of the code shown in the "Retrieving all fields inside a CRM form" sample:&lt;br /&gt;for (var index in crmForm.all) {&lt;br /&gt;var control = crmForm.all[index];&lt;br /&gt;&lt;br /&gt;if (control.req &amp;amp;&amp;amp; (control.Disabled != null)) {&lt;br /&gt;control.Disabled = true;&lt;br /&gt;}&lt;br /&gt;} &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;When events do not fire anymore&lt;/strong&gt;&lt;br /&gt;If your OnLoad, OnSave or OnChange code isn't executed at all, make sure that you have enabled the event first. It's always a good idea to check the obvious things first. If you have enabled the event and are not testing the code in the form preview, then ask yourself if you have published the changes.&lt;br /&gt;If your code still isn't executed, place an alert('TEST'); as the first line into your code and try again. If you don't see the alert message, then you have a syntax problem in your code. The most common reason is a missing curly brace somewhere in your code and it may be in any event you have added to the CRM form. It may also be related to an inline comment using the "// my comment" notation. Try using "/* my comment */" instead.&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4058165759694816344-7322857657371219896?l=crmdelacreme.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/7322857657371219896'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/7322857657371219896'/><link rel='alternate' type='text/html' href='http://crmdelacreme.blogspot.com/2010/05/replacing-content-of-iframe-if-you.html' title='Some more useful javascripts for MS CRM'/><author><name>Tiaan van Niekerk</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Ky8MLSxenl8/S86MPSGeVPI/AAAAAAAAAO0/Ln5Gkx7EP5I/S220/Snapshot+of+me+4.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-4058165759694816344.post-1293305710600546071</id><published>2010-03-12T08:25:00.006+02:00</published><updated>2010-03-14T11:12:54.420+02:00</updated><title type='text'>Adding Http compression to ms crm</title><content type='html'>&lt;span style="font-family:arial;"&gt;&lt;strong&gt;1.Download and install the HttpModule&lt;/strong&gt; from &lt;/span&gt;&lt;a href="http://capitalhead.com/articles/enable-http-compression-for-your-aspnet-applications.aspx"&gt;&lt;span style="font-family:arial;"&gt;http://capitalhead.com/articles/enable-http-compression-for-your-aspnet-applications.aspx&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;"&gt;. Simply follow this link and download the binary package.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;2.Extract the package and copy the extracted files into the CRMWEB bin folder.&lt;/strong&gt;&lt;br /&gt;blowery.Web.HttpCompress.dll&lt;br /&gt;blowery.Web.HttpCompress.dll.xml&lt;br /&gt;ICSharpCode.SharpZipLib.dll&lt;br /&gt;ICSharpCode.SharpZipLib.dll.xml&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;3.Modify your Web.config &lt;/strong&gt;&lt;br /&gt;1.Add to the configSections&lt;br /&gt;&amp;lt;sectionGroup name="blowery.web"&amp;gt; &amp;lt;section name="httpCompress" type="blowery.Web.HttpCompress.SectionHandler, blowery.Web.HttpCompress"/&amp;gt;&amp;lt;/sectionGroup&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;strong&gt;2.Add to the httpModules section inside system.web (if httpModules section does not exist, create it)&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;&amp;lt;httpModules&amp;gt;&amp;lt;add name="CompressionModule" type="blowery.Web.HttpCompress.HttpModule, blowery.web.HttpCompress"/&amp;gt;&amp;lt;/httpModules&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;strong&gt;3.Add to the configuration section&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;blowery.web&amp;gt;&amp;lt;httpCompress preferredAlgorithm="deflate" compressionLevel="high"&amp;gt; &amp;lt;excludedMimeTypes&amp;gt; &amp;lt;add type="image/jpeg"/&amp;gt; &amp;lt;add type="image/gif"/&amp;gt; &amp;lt;/excludedMimeTypes&amp;gt; &amp;lt;excludedPaths&amp;gt;&amp;lt;/add path="AASA/_grid/cmds/dlg_exportcustomizations.aspx"&amp;lt;/excludedPaths&amp;gt;&amp;lt;/httpCompress&amp;gt;&amp;lt;/blowery.web&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:arial;color:#ff0000;"&gt;&lt;strong&gt;&lt;em&gt;Please Note: When exporting or importing CRM customizations switch the compressin off.Set the compression setting in the webconfig file to "none"&lt;/em&gt;&lt;/strong&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4058165759694816344-1293305710600546071?l=crmdelacreme.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://capitalhead.com/articles/enable-http-compression-for-your-aspnet-applications.aspx' title='Adding Http compression to ms crm'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/1293305710600546071'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/1293305710600546071'/><link rel='alternate' type='text/html' href='http://crmdelacreme.blogspot.com/2010/03/adding-http-compression-to-ms-crm.html' title='Adding Http compression to ms crm'/><author><name>Tiaan van Niekerk</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Ky8MLSxenl8/S86MPSGeVPI/AAAAAAAAAO0/Ln5Gkx7EP5I/S220/Snapshot+of+me+4.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-4058165759694816344.post-1379781599937446132</id><published>2010-03-12T05:43:00.000+02:00</published><updated>2010-03-12T05:45:15.732+02:00</updated><title type='text'>Compare Microsoft Dynamics CRM 4.0 Server Editions</title><content type='html'>&lt;span style="font-family:arial;"&gt;Every server that runs Microsoft Dynamics CRM 4.0 requires a Server License. Three Server Editions are available for Microsoft Dynamics CRM 4.0:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Microsoft Dynamics CRM 4.0 Workgroup Server&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;*Replaces the Small Business Edition of CRM 3.0.&lt;br /&gt;*Includes and supports a maximum of 5 named User licenses.&lt;br /&gt;*Runs on any version of Windows Server.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Microsoft Dynamics CRM 4.0 Professional Server&lt;/strong&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;*Rich feature set with no licensing based scalability limit.&lt;br /&gt;*Single-tenant deployment.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Microsoft Dynamics CRM 4.0 Enterprise Server&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;*Rich feature set with no licensing based scalability limit.&lt;br /&gt;*Multi-tenant deployments.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Client Access Licenses&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;*User CAL - With a user CAL, each licensed user may access the Server from any device.&lt;br /&gt;*Device CAL - With a device CAL, the CAL is assigned to a device and may be shared by non-concurrent users over time, such as in a shift worker or call center scenario.&lt;br /&gt;*Limited Access – Grants read only access to users.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4058165759694816344-1379781599937446132?l=crmdelacreme.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/1379781599937446132'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/1379781599937446132'/><link rel='alternate' type='text/html' href='http://crmdelacreme.blogspot.com/2010/03/compare-microsoft-dynamics-crm-40.html' title='Compare Microsoft Dynamics CRM 4.0 Server Editions'/><author><name>Tiaan van Niekerk</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Ky8MLSxenl8/S86MPSGeVPI/AAAAAAAAAO0/Ln5Gkx7EP5I/S220/Snapshot+of+me+4.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-4058165759694816344.post-4836657712356317278</id><published>2010-03-11T02:02:00.002+02:00</published><updated>2010-03-11T02:07:47.715+02:00</updated><title type='text'>CRM Icons not correctly associated after publishing customizations.</title><content type='html'>HI&lt;br /&gt;Something strange happened with me today.We created a export through the sdk for the customizations and import it into the server.After publishing I noticed all the icons were miss aligned with different entities.&lt;br /&gt;&lt;br /&gt;I edited one entity and changed the icon associated to it to something different.Once pressing ok the crm system reloads the customizations entity page.This corrected the problem.I republished and by luck all the associations was correctly updated.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4058165759694816344-4836657712356317278?l=crmdelacreme.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/4836657712356317278'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/4836657712356317278'/><link rel='alternate' type='text/html' href='http://crmdelacreme.blogspot.com/2010/03/crm-icons-not-correctly-associated.html' title='CRM Icons not correctly associated after publishing customizations.'/><author><name>Tiaan van Niekerk</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Ky8MLSxenl8/S86MPSGeVPI/AAAAAAAAAO0/Ln5Gkx7EP5I/S220/Snapshot+of+me+4.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-4058165759694816344.post-4443753072113925772</id><published>2010-03-08T08:28:00.004+02:00</published><updated>2010-03-08T08:36:20.937+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='publishing customizations'/><category scheme='http://www.blogger.com/atom/ns#' term='customizations'/><category scheme='http://www.blogger.com/atom/ns#' term='multiple crm servers'/><category scheme='http://www.blogger.com/atom/ns#' term='deploy changes'/><title type='text'>CRM Configuration Manager</title><content type='html'>&lt;div&gt;&lt;span style="font-family:arial;"&gt;I Came across this great tool from Daniel Halan, for deploying customizationsfor MSCRM across multiple server deployments.&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;The CRM Configuration Manager is a Windows application to create an Export / Import selection that can later be exported as a command prompt string for later use, or execute directly inside the application. The main features of CRM Configuration Manager are,&lt;br /&gt;&lt;br /&gt;•Easy access to the features of CRM Customization Manager&lt;br /&gt;•Possible to select a CRM server as destination, allowing one click export and import.&lt;br /&gt;•Create advance export/import selections for later use inside scripts / installations&lt;br /&gt;This release includes CRM Customization Manager v2.0 that contains fixes and few new features,&lt;br /&gt;&lt;br /&gt;•JavaScript Export/Import, This allows you to extract JavaScript to a local folder, where you can work in a proper script editor, and later import them back. You can also create new javascripts in the same folder, just follow the name convention and they will also be imported to the correct entity / event.&lt;br /&gt;•Zip support, Now all features works with zipped customizations&lt;br /&gt;•Include Related Entities, This features will automatically include related entities to the selected entities, so their relationships are exported and can be reviewed for conflicts. This is recommended during the development process when relationships may change.&lt;br /&gt;•Publish Workflows, Publish operation now also publishes workflows&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="font-family:Arial;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;p align="center"&gt;&lt;a href="http://4.bp.blogspot.com/_Ky8MLSxenl8/S5SaeQzY-lI/AAAAAAAAAOk/7mRnFH2jG1k/s1600-h/image.jpg"&gt;&lt;img style="WIDTH: 281px; HEIGHT: 253px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5446147694095039058" border="0" alt="" src="http://4.bp.blogspot.com/_Ky8MLSxenl8/S5SaeQzY-lI/AAAAAAAAAOk/7mRnFH2jG1k/s400/image.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="font-family:Arial;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="font-family:Arial;"&gt;Download the application by clicking on the post heading.&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="font-family:Arial;"&gt;Enjoy&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4058165759694816344-4443753072113925772?l=crmdelacreme.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://blog.halan.se/' title='CRM Configuration Manager'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/4443753072113925772'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/4443753072113925772'/><link rel='alternate' type='text/html' href='http://crmdelacreme.blogspot.com/2010/03/crm-configuration-manager.html' title='CRM Configuration Manager'/><author><name>Tiaan van Niekerk</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Ky8MLSxenl8/S86MPSGeVPI/AAAAAAAAAO0/Ln5Gkx7EP5I/S220/Snapshot+of+me+4.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_Ky8MLSxenl8/S5SaeQzY-lI/AAAAAAAAAOk/7mRnFH2jG1k/s72-c/image.jpg' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-4058165759694816344.post-8411457064644130250</id><published>2010-03-08T07:21:00.001+02:00</published><updated>2010-03-08T07:51:21.001+02:00</updated><title type='text'>How to confuse production with management!</title><content type='html'>&lt;span style="font-family:arial;"&gt;&lt;strong&gt;Got this email from a friend and thought this makes so much sense that, I had to blog it.&lt;br /&gt;How many times do we fix stuff that doesn't require fixing ?&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_Ky8MLSxenl8/S5SOKEb0DVI/AAAAAAAAAOc/WBa_1Hj0cLA/s1600-h/1.jpg"&gt;&lt;img style="WIDTH: 400px; HEIGHT: 288px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5446134153038007634" border="0" alt="" src="http://3.bp.blogspot.com/_Ky8MLSxenl8/S5SOKEb0DVI/AAAAAAAAAOc/WBa_1Hj0cLA/s400/1.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_Ky8MLSxenl8/S5SOJ549L_I/AAAAAAAAAOU/zIUkbm6TVF4/s1600-h/2.jpg"&gt;&lt;img style="WIDTH: 400px; HEIGHT: 288px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5446134150207451122" border="0" alt="" src="http://3.bp.blogspot.com/_Ky8MLSxenl8/S5SOJ549L_I/AAAAAAAAAOU/zIUkbm6TVF4/s400/2.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;a href="http://1.bp.blogspot.com/_Ky8MLSxenl8/S5SOJlcQP2I/AAAAAAAAAOM/GAkmzyKd7YA/s1600-h/3.jpg"&gt;&lt;img style="WIDTH: 400px; HEIGHT: 288px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5446134144718356322" border="0" alt="" src="http://1.bp.blogspot.com/_Ky8MLSxenl8/S5SOJlcQP2I/AAAAAAAAAOM/GAkmzyKd7YA/s400/3.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;a href="http://2.bp.blogspot.com/_Ky8MLSxenl8/S5SMCm6p7oI/AAAAAAAAAOE/NZMSMrEUVKQ/s1600-h/4.jpg"&gt;&lt;img style="WIDTH: 400px; HEIGHT: 288px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5446131825831964290" border="0" alt="" src="http://2.bp.blogspot.com/_Ky8MLSxenl8/S5SMCm6p7oI/AAAAAAAAAOE/NZMSMrEUVKQ/s400/4.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;a href="http://3.bp.blogspot.com/_Ky8MLSxenl8/S5SMCEVwx-I/AAAAAAAAAN8/bN1CQmS8LTw/s1600-h/5.jpg"&gt;&lt;img style="WIDTH: 400px; HEIGHT: 288px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5446131816550418402" border="0" alt="" src="http://3.bp.blogspot.com/_Ky8MLSxenl8/S5SMCEVwx-I/AAAAAAAAAN8/bN1CQmS8LTw/s400/5.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;a href="http://3.bp.blogspot.com/_Ky8MLSxenl8/S5SMB7UptDI/AAAAAAAAAN0/-AfcG3gvOWo/s1600-h/6.jpg"&gt;&lt;img style="WIDTH: 400px; HEIGHT: 288px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5446131814129841202" border="0" alt="" src="http://3.bp.blogspot.com/_Ky8MLSxenl8/S5SMB7UptDI/AAAAAAAAAN0/-AfcG3gvOWo/s400/6.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;a href="http://3.bp.blogspot.com/_Ky8MLSxenl8/S5SMBqiKY7I/AAAAAAAAANs/TwqROU_Rq2w/s1600-h/7.jpg"&gt;&lt;img style="WIDTH: 400px; HEIGHT: 288px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5446131809623106482" border="0" alt="" src="http://3.bp.blogspot.com/_Ky8MLSxenl8/S5SMBqiKY7I/AAAAAAAAANs/TwqROU_Rq2w/s400/7.jpg" /&gt;&lt;/a&gt; &lt;div&gt;&lt;a href="http://2.bp.blogspot.com/_Ky8MLSxenl8/S5SMBTFq9PI/AAAAAAAAANk/2ovokzXeskA/s1600-h/8.jpg"&gt;&lt;img style="WIDTH: 400px; HEIGHT: 288px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5446131803329590514" border="0" alt="" src="http://2.bp.blogspot.com/_Ky8MLSxenl8/S5SMBTFq9PI/AAAAAAAAANk/2ovokzXeskA/s400/8.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;a href="http://4.bp.blogspot.com/_Ky8MLSxenl8/S5SLZl0HMpI/AAAAAAAAANc/7T22YYSMlOk/s1600-h/9.jpg"&gt;&lt;img style="WIDTH: 400px; HEIGHT: 288px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5446131121161450130" border="0" alt="" src="http://4.bp.blogspot.com/_Ky8MLSxenl8/S5SLZl0HMpI/AAAAAAAAANc/7T22YYSMlOk/s400/9.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;a href="http://2.bp.blogspot.com/_Ky8MLSxenl8/S5SLZQYmvCI/AAAAAAAAANU/CsxjFSNfxxk/s1600-h/10.jpg"&gt;&lt;img style="WIDTH: 400px; HEIGHT: 288px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5446131115408931874" border="0" alt="" src="http://2.bp.blogspot.com/_Ky8MLSxenl8/S5SLZQYmvCI/AAAAAAAAANU/CsxjFSNfxxk/s400/10.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;a href="http://4.bp.blogspot.com/_Ky8MLSxenl8/S5SLZCwxF2I/AAAAAAAAANM/VeSO0ilfcR0/s1600-h/11.jpg"&gt;&lt;img style="WIDTH: 400px; HEIGHT: 288px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5446131111752177506" border="0" alt="" src="http://4.bp.blogspot.com/_Ky8MLSxenl8/S5SLZCwxF2I/AAAAAAAAANM/VeSO0ilfcR0/s400/11.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;a href="http://4.bp.blogspot.com/_Ky8MLSxenl8/S5SLY356VUI/AAAAAAAAANE/bevQRLYbRKk/s1600-h/12.jpg"&gt;&lt;img style="WIDTH: 400px; HEIGHT: 288px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5446131108837741890" border="0" alt="" src="http://4.bp.blogspot.com/_Ky8MLSxenl8/S5SLY356VUI/AAAAAAAAANE/bevQRLYbRKk/s400/12.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;a href="http://3.bp.blogspot.com/_Ky8MLSxenl8/S5SLYiQaVaI/AAAAAAAAAM8/4-3MtT_Xy-4/s1600-h/13.jpg"&gt;&lt;img style="WIDTH: 400px; HEIGHT: 288px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5446131103026533794" border="0" alt="" src="http://3.bp.blogspot.com/_Ky8MLSxenl8/S5SLYiQaVaI/AAAAAAAAAM8/4-3MtT_Xy-4/s400/13.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;a href="http://4.bp.blogspot.com/_Ky8MLSxenl8/S5SK-yLmmNI/AAAAAAAAAM0/5DpaSdoObPk/s1600-h/14.jpg"&gt;&lt;img style="WIDTH: 400px; HEIGHT: 288px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5446130660624734418" border="0" alt="" src="http://4.bp.blogspot.com/_Ky8MLSxenl8/S5SK-yLmmNI/AAAAAAAAAM0/5DpaSdoObPk/s400/14.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;a href="http://2.bp.blogspot.com/_Ky8MLSxenl8/S5SK-m3Bg9I/AAAAAAAAAMs/z9P4LvjAKk8/s1600-h/15.jpg"&gt;&lt;img style="WIDTH: 400px; HEIGHT: 288px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5446130657585628114" border="0" alt="" src="http://2.bp.blogspot.com/_Ky8MLSxenl8/S5SK-m3Bg9I/AAAAAAAAAMs/z9P4LvjAKk8/s400/15.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;a href="http://4.bp.blogspot.com/_Ky8MLSxenl8/S5SK90Omb5I/AAAAAAAAAMk/zGUY4XZ5xaU/s1600-h/16.jpg"&gt;&lt;img style="WIDTH: 400px; HEIGHT: 288px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5446130643994308498" border="0" alt="" src="http://4.bp.blogspot.com/_Ky8MLSxenl8/S5SK90Omb5I/AAAAAAAAAMk/zGUY4XZ5xaU/s400/16.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;a href="http://4.bp.blogspot.com/_Ky8MLSxenl8/S5SK96gmnyI/AAAAAAAAAMc/WH2cQFAodBI/s1600-h/17.jpg"&gt;&lt;img style="WIDTH: 400px; HEIGHT: 288px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5446130645680430882" border="0" alt="" src="http://4.bp.blogspot.com/_Ky8MLSxenl8/S5SK96gmnyI/AAAAAAAAAMc/WH2cQFAodBI/s400/17.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;a href="http://2.bp.blogspot.com/_Ky8MLSxenl8/S5SK9hehd0I/AAAAAAAAAMU/U1mzhN_nyfk/s1600-h/18.jpg"&gt;&lt;img style="WIDTH: 400px; HEIGHT: 288px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5446130638960817986" border="0" alt="" src="http://2.bp.blogspot.com/_Ky8MLSxenl8/S5SK9hehd0I/AAAAAAAAAMU/U1mzhN_nyfk/s400/18.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;a href="http://1.bp.blogspot.com/_Ky8MLSxenl8/S5SKnmMMhhI/AAAAAAAAAMM/xIDpds5Qp5s/s1600-h/19.jpg"&gt;&lt;img style="WIDTH: 400px; HEIGHT: 288px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5446130262269003282" border="0" alt="" src="http://1.bp.blogspot.com/_Ky8MLSxenl8/S5SKnmMMhhI/AAAAAAAAAMM/xIDpds5Qp5s/s400/19.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;a href="http://2.bp.blogspot.com/_Ky8MLSxenl8/S5SKnWROwGI/AAAAAAAAAME/D6-PhTNbuh0/s1600-h/20.jpg"&gt;&lt;img style="WIDTH: 400px; HEIGHT: 288px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5446130257995153506" border="0" alt="" src="http://2.bp.blogspot.com/_Ky8MLSxenl8/S5SKnWROwGI/AAAAAAAAAME/D6-PhTNbuh0/s400/20.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;a href="http://2.bp.blogspot.com/_Ky8MLSxenl8/S5SKnI_bvOI/AAAAAAAAAL8/CBrd9uLOHKc/s1600-h/21.jpg"&gt;&lt;img style="WIDTH: 400px; HEIGHT: 288px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5446130254430846178" border="0" alt="" src="http://2.bp.blogspot.com/_Ky8MLSxenl8/S5SKnI_bvOI/AAAAAAAAAL8/CBrd9uLOHKc/s400/21.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;a href="http://2.bp.blogspot.com/_Ky8MLSxenl8/S5SKmzmMwrI/AAAAAAAAAL0/Vle64Ob1MYg/s1600-h/22.jpg"&gt;&lt;img style="WIDTH: 400px; HEIGHT: 288px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5446130248687862450" border="0" alt="" src="http://2.bp.blogspot.com/_Ky8MLSxenl8/S5SKmzmMwrI/AAAAAAAAAL0/Vle64Ob1MYg/s400/22.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;a href="http://3.bp.blogspot.com/_Ky8MLSxenl8/S5SKm7SNIOI/AAAAAAAAALs/Evu04pPtUBs/s1600-h/23.jpg"&gt;&lt;img style="WIDTH: 400px; HEIGHT: 288px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5446130250751484130" border="0" alt="" src="http://3.bp.blogspot.com/_Ky8MLSxenl8/S5SKm7SNIOI/AAAAAAAAALs/Evu04pPtUBs/s400/23.jpg" /&gt;&lt;/a&gt; &lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4058165759694816344-8411457064644130250?l=crmdelacreme.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/8411457064644130250'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/8411457064644130250'/><link rel='alternate' type='text/html' href='http://crmdelacreme.blogspot.com/2010/03/how-to-confuse-production-with.html' title='How to confuse production with management!'/><author><name>Tiaan van Niekerk</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Ky8MLSxenl8/S86MPSGeVPI/AAAAAAAAAO0/Ln5Gkx7EP5I/S220/Snapshot+of+me+4.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_Ky8MLSxenl8/S5SOKEb0DVI/AAAAAAAAAOc/WBa_1Hj0cLA/s72-c/1.jpg' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-4058165759694816344.post-3402298060918466868</id><published>2010-02-25T10:06:00.003+02:00</published><updated>2010-02-25T10:18:36.172+02:00</updated><title type='text'>CRM slow in IE browsers!</title><content type='html'>&lt;span style="font-family:arial;"&gt;Is browsing always slow in Internet Explorer? Does it frequently stop responding (hang), or stop working (crash)? Do you receive error messages that indicate that Internet Explorer has "encountered a problem and needs to close"? Or that a Visual C++ "runtime error" has occurred in Iexplore.exe?&lt;br /&gt;&lt;br /&gt;If so, then you might want to try resetting Internet Explorer. When you reset Internet Explorer settings, all add-ons and customizations are deleted, and you basically start with a fresh version of Internet Explorer. This article helps you reset Internet Explorer.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;a href="http://go.microsoft.com/?linkid=9646978"&gt;&lt;span style="font-family:arial;"&gt;Fix this problem&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;Microsoft Fix it 50195&lt;br /&gt;&lt;br /&gt;Note This fix does not work in Windows 7. Instead, you can use the Internet Explorer troubleshooters to achieve this automatically.&lt;br /&gt;&lt;br /&gt;Note This wizard may be in English only; however, the automatic fix also works for other language versions of Windows.&lt;br /&gt;&lt;br /&gt;Note If you are not on the computer that has the problem, you can save the automatic fix to a flash drive or to a CD, and then you can run it on the computer that has the problem.&lt;br /&gt;&lt;br /&gt;If the problem is caused by damaged or incompatible Internet Explorer settings or add-ons, you can usually resolve the problem by resetting Internet Explorer settings.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;To use the Reset Internet Explorer Settings feature from Control Panel, follow these steps:&lt;/strong&gt;&lt;br /&gt;Exit all programs, including Internet Explorer (if it is running).&lt;br /&gt;If you use Windows XP, click Start, and then click Run. Type the following command in the Open box, and then press ENTER:&lt;br /&gt;&lt;em&gt;inetcpl.cpl&lt;/em&gt;&lt;br /&gt;If you use Windows Vista, click StartCollapse this imageExpand this image. Type the following command in the Start Search box, and then press ENTER:&lt;br /&gt;inetcpl.cpl&lt;br /&gt;The Internet Options dialog box appears.&lt;br /&gt;Click the Advanced tab.&lt;br /&gt;Under Reset Internet Explorer settings, click Reset. Then click Reset again.&lt;br /&gt;When Internet Explorer finishes resetting the settings, click Close in the Reset Internet Explorer Settings dialog box.&lt;br /&gt;Start Internet Explorer again.&lt;br /&gt;&lt;br /&gt;To reset Internet Explorer automatically, click the Fix this problem link. Then click Run in the File Download dialog box, and follow the steps in this wizard.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4058165759694816344-3402298060918466868?l=crmdelacreme.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://support.microsoft.com/kb/923737' title='CRM slow in IE browsers!'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/3402298060918466868'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/3402298060918466868'/><link rel='alternate' type='text/html' href='http://crmdelacreme.blogspot.com/2010/02/crm-slow-in-ie-browsers.html' title='CRM slow in IE browsers!'/><author><name>Tiaan van Niekerk</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Ky8MLSxenl8/S86MPSGeVPI/AAAAAAAAAO0/Ln5Gkx7EP5I/S220/Snapshot+of+me+4.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-4058165759694816344.post-2897267507530082310</id><published>2010-02-12T08:28:00.001+02:00</published><updated>2010-02-12T08:30:09.844+02:00</updated><title type='text'>Update Rollup 9 for Microsoft Dynamics CRM 4.0</title><content type='html'>&lt;span style="font-family:arial;"&gt;Update Rollup 9 for Microsoft Dynamics CRM 4.0 resolves the following issues that were not previously documented in a Knowledge Base article:&lt;br /&gt;• When a user runs code that uses the RetrieveAllChildUsersSystemUserRequest method to find the direct reports of another user, you receive the following error message:&lt;br /&gt;The value passed for ConditionOperator.In is empty.&lt;br /&gt;This problem occurs if the user who runs the code is not a manager.&lt;br /&gt;• After you import customizations from Microsoft Dynamics CRM Online to Microsoft Dynamics CRM 4.0, Microsoft Dynamics CRM 4.0 incorrectly uses the SystemUser entity form that is used in Microsoft Dynamics CRM Online.&lt;br /&gt;• Assume that you use Microsoft Dynamics CRM 4.0 in the Internet-Facing Deployment (IFD) mode. When you export data from Microsoft Dynamics CRM 4.0 to an Microsoft Excel worksheet as a dynamic worksheet, a PrimaryKey column of entities is not exported to the Excel worksheet. For example, when you export contacts to an Excel worksheet, the ContactId column is not exported to the Excel worksheet.&lt;br /&gt;• Assume that you enable the Secure Sockets Layer (SSL) setting in Internet Explorer 6. When you use Internet Explorer 6 to run Microsoft Dynamics CRM 4.0, you receive the following security warning message:&lt;br /&gt;This page contains both secure and nonsecure items.&lt;br /&gt;This problem occurs when you create a new report or when you run the Duplicate Detection function.&lt;br /&gt;• Consider the following scenario:&lt;br /&gt;o You run a mail merge process for marketing e-mail messages in the Microsoft dynamics CRM 4.0 client for Outlook.&lt;br /&gt;o The merged e-mail message is addressed to a lead.&lt;br /&gt;o In this e-mail message, you specify an unsubscribing link so that the lead can unsubscribe the marketing materials.&lt;br /&gt;In this scenario, Microsoft Dynamics CRM 4.0 does not consider the unsubscribing request when the lead sends an unsubscribing e-mail message by clicking the link.&lt;br /&gt;• Assume that you use the InvalidPluginExecutionException handler in a custom plug-in and you specify a custom exception message for the handler. When you upload an attachment to a Microsoft Dynamics CRM record, you receive the following exception message:&lt;br /&gt;File Could Not Be Uploaded.&lt;br /&gt;You expect to receive the custom exception message that you specified.&lt;br /&gt;• Consider the following scenario. You select to use the Custom option when you install Microsoft Dynamics CRM 4.0. Then, you click Next, you click Back, and then you select to use the Typical option to install Microsoft Dynamics CRM 4.0. In this scenario, the Platform Server role is deleted when you run the Repair process during the installation of Microsoft Dynamics CRM 4.0.&lt;br /&gt;• Consider the following scenario:&lt;br /&gt;o You use a domain account for the CRMAppPool application pool.&lt;br /&gt;o You enable the Microsoft Dynamics CRM tracing.&lt;br /&gt;In this scenario, the following error message for the domain account is logged in the Application log several times:&lt;br /&gt;User Was Not Found.&lt;br /&gt;• Assume that you use the ISO-2022-JP encoding for POP3 e-mail messages. When the Microsoft Dynamics CRM E-Mail Router tracks an e-mail message, you notice garbage characters in the e-mail message.&lt;br /&gt;• Consider the following scenario:&lt;br /&gt;o You create a workflow to send an e-mail message that uses an e-mail template.&lt;br /&gt;o The template contains HTML code.&lt;br /&gt;o You run the workflow.&lt;br /&gt;In this scenario, the e-mail message is displayed as plain text without HTML code.&lt;br /&gt;• When you include the address of a recipient in an e-mail message by using single straight quotation marks (''), the e-mail message cannot be tracked in Microsoft Dynamics CRM 4.0.&lt;br /&gt;• When you use a lookup field to update a record in an entity form, the corresponding note information does not appear in the entity form.&lt;br /&gt;• If you block the ActiveX control by using the CLSID value "{00000000-0000-0000-0000-000000000000}," you cannot log on to the Microsoft Dynamics CRM 4.0 Web client. Additionally, you are redirected to the following Web page:&lt;br /&gt;http://common/error/unsupportedSecurity.aspx&lt;br /&gt;• You cannot receive all e-mail messages in Microsoft Dynamics CRM 4.0 if the mail server uses a time setting that differs from the time setting that is used by the Microsoft Dynamics CRM E-mail Router.&lt;br /&gt;• The resource name unexpectedly changes to "Selection Rule" after you save a service activity.&lt;br /&gt;• Assume that you create a record in the Phone Call form in Microsoft Dynamics CRM for Microsoft Office Outlook with Offline Access. When you change the Direction value of the record, you receive the following error message:&lt;br /&gt;A record with these values already exists. A duplicate record cannot be created. Select one or more unique values and try again.&lt;br /&gt;• When multiple levels of menus are displayed in the Microsoft Dynamics CRM 4.0 Web client, the sub menus are displayed behind the main menus. This problem occurs if you use Microsoft Internet Explorer 8.0.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4058165759694816344-2897267507530082310?l=crmdelacreme.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.microsoft.com/downloads/details.aspx?FamilyID=5869f2b3-d1a0-4f71-8be3-fde6e8053a2e&amp;displayLang=en' title='Update Rollup 9 for Microsoft Dynamics CRM 4.0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/2897267507530082310'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/2897267507530082310'/><link rel='alternate' type='text/html' href='http://crmdelacreme.blogspot.com/2010/02/update-rollup-9-for-microsoft-dynamics.html' title='Update Rollup 9 for Microsoft Dynamics CRM 4.0'/><author><name>Tiaan van Niekerk</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Ky8MLSxenl8/S86MPSGeVPI/AAAAAAAAAO0/Ln5Gkx7EP5I/S220/Snapshot+of+me+4.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-4058165759694816344.post-7676260790165580618</id><published>2010-02-10T13:09:00.012+02:00</published><updated>2010-02-11T16:21:51.264+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MSCRM'/><category scheme='http://www.blogger.com/atom/ns#' term='editing navigation'/><category scheme='http://www.blogger.com/atom/ns#' term='sitemap'/><title type='text'>Editing the CRM Site Map made so easy!!!!...</title><content type='html'>&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=634508DC-1762-40D6-B745-B3BDE05D7012&amp;amp;displaylang=en"&gt;&lt;span style="font-family:arial;"&gt;Download the CRM Demonstration Toolkit&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/span&gt;&lt;p&gt;&lt;span style="font-family:arial;"&gt;Launch the MSDYCRM4.0_Demonstration Tools.exe &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:arial;"&gt;Use the Site Map Editor to modify the contents of the Microsoft Dynamics CRM Navigation Pane. You can use the editor to move, add, or delete items from the navigation pane.&lt;br /&gt;NOTE: It’s strongly recommended that you back up your CRM data before using this tool.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 275px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5436570529882323938" border="0" alt="" src="http://2.bp.blogspot.com/_Ky8MLSxenl8/S3KUF73-O-I/AAAAAAAAAJ0/-y85XG6tHUI/s400/1.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;• Select the hyperlink “The application is not yet connected to Microsoft Dynamics CRM, Click here to connect”. Located on the top of the page as shown below .&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://2.bp.blogspot.com/_Ky8MLSxenl8/S3KUNtSzteI/AAAAAAAAAJ8/x4ueOQ9Hhbw/s1600-h/2.jpg"&gt;&lt;span style="font-family:arial;"&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 275px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5436570663407302114" border="0" alt="" src="http://2.bp.blogspot.com/_Ky8MLSxenl8/S3KUNtSzteI/AAAAAAAAAJ8/x4ueOQ9Hhbw/s400/2.jpg" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;&lt;br /&gt;• Complete the login credentials and press “connect”&lt;br /&gt;&lt;/span&gt;&lt;a href="http://1.bp.blogspot.com/_Ky8MLSxenl8/S3KURoxGlTI/AAAAAAAAAKE/SYFNws3M7a0/s1600-h/3.jpg"&gt;&lt;span style="font-family:arial;"&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 385px; DISPLAY: block; HEIGHT: 400px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5436570730911667506" border="0" alt="" src="http://1.bp.blogspot.com/_Ky8MLSxenl8/S3KURoxGlTI/AAAAAAAAAKE/SYFNws3M7a0/s400/3.jpg" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;• Select the correct Organization from the dropdown&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;a href="http://3.bp.blogspot.com/_Ky8MLSxenl8/S3KUsnkwARI/AAAAAAAAAKM/Abu-rPNAamY/s1600-h/4.jpg"&gt;&lt;span style="font-family:arial;"&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 104px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5436571194447888658" border="0" alt="" src="http://3.bp.blogspot.com/_Ky8MLSxenl8/S3KUsnkwARI/AAAAAAAAAKM/Abu-rPNAamY/s400/4.jpg" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;Modify the Existing CRM Navigation Pane&lt;br /&gt;To load and edit the current Navigation Pane for CRM:&lt;br /&gt;1. Under Available Tools, click Site Map Editor.&lt;br /&gt;Load the sitemap from CRM by selecting “Open from CRM” &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:arial;"&gt;Under Open and Save, click Open from CRM.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;/span&gt;&lt;a href="http://4.bp.blogspot.com/_Ky8MLSxenl8/S3QMV6FSXsI/AAAAAAAAAKU/mRUEhZ5Z2O8/s1600-h/5.jpg"&gt;&lt;span style="font-family:arial;"&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 274px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5436984220651249346" border="0" alt="" src="http://4.bp.blogspot.com/_Ky8MLSxenl8/S3QMV6FSXsI/AAAAAAAAAKU/mRUEhZ5Z2O8/s400/5.jpg" /&gt; &lt;p align="left"&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:Arial;"&gt;The site map appears as a tree in the Edit Site Map box.&lt;/span&gt;&lt;span style="font-family:Arial;"&gt;&lt;br /&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 399px; DISPLAY: block; HEIGHT: 275px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5436984471799911538" border="0" alt="" src="http://3.bp.blogspot.com/_Ky8MLSxenl8/S3QMkhry1HI/AAAAAAAAAKc/hTyKvoR7zFU/s400/6.jpg" /&gt;To add a navigational section like sales, marketing select add. This will add a section to your crm navigational pane.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;a href="http://4.bp.blogspot.com/_Ky8MLSxenl8/S3QM1aFUXUI/AAAAAAAAAKk/R3ZrtK4d3l8/s1600-h/7.jpg"&gt;&lt;span style="font-family:Arial;"&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 275px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5436984761817259330" border="0" alt="" src="http://4.bp.blogspot.com/_Ky8MLSxenl8/S3QM1aFUXUI/AAAAAAAAAKk/R3ZrtK4d3l8/s400/7.jpg" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:Arial;"&gt;&lt;br /&gt;&lt;strong&gt;Add an Organizational group &lt;/strong&gt;&lt;br /&gt;Adding a group under the section select add Under&lt;br /&gt;&lt;br /&gt;To add a group underneath the section just created, select the group created and select the option “Add Under”. This will allow you to add a group.To display all the groups underneath the main section select the tick box for display groups.)This will use a lot of real-estate under your navigation pane.)&lt;br /&gt;To link a entity or call a url being on the select group you added select “Add Under”.&lt;br /&gt;Groups organize sub-areas for usability purposes. To add a group:&lt;br /&gt;1. In the site map tree, select the entity underwhich you want to add the group, and then click Add Under.&lt;br /&gt;2. In the Add Group dialog, under Name, enter the title for this group. Then click OK.&lt;br /&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 275px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5436984924980499154" border="0" alt="" src="http://3.bp.blogspot.com/_Ky8MLSxenl8/S3QM-56d0tI/AAAAAAAAAKs/fCGJrP3sLos/s400/8.jpg" /&gt;&lt;br /&gt;&lt;strong&gt;Sub-areas&lt;/strong&gt; bring up the actual user interface for accomplishing tasks, such as a website or the lists/forms associated with an entity. To create a subarea:&lt;br /&gt;1. In the site map tree, select a group and then click Add Under or select an existing subarea and click Add Under or Add (to add the new subarea above the selected subarea).&lt;br /&gt;2. In the Sub-Area dialog:&lt;br /&gt;• Under Entity, select the entity to add as a sub-area.&lt;br /&gt;• Under URL, enter the URL to add as a sub-area. Click the Test URL link to verify the URL can be accessed. If you selected URL:&lt;br /&gt;o Under Name, enter the user-friendly name that should appear in the Navigation Pane for this URL.&lt;br /&gt;o Under Icon, enter a URL specifying the location for a graphic file that will act as the icon for this sub-area. Graphics files may be .png, .gif, .bmp, or .jpg files.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;a href="http://2.bp.blogspot.com/_Ky8MLSxenl8/S3QNLvt94eI/AAAAAAAAAK0/t_QjBCoK62E/s1600-h/9.jpg"&gt;&lt;span style="font-family:Arial;"&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 275px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5436985145582019042" border="0" alt="" src="http://2.bp.blogspot.com/_Ky8MLSxenl8/S3QNLvt94eI/AAAAAAAAAK0/t_QjBCoK62E/s400/9.jpg" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;span style="font-family:arial;"&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Modify Existing Areas, Groups, and Subareas&lt;br /&gt;&lt;/strong&gt;You can edit the site map to modify the properties of existing items, move them, and delete them:&lt;br /&gt;&lt;strong&gt;Edit items&lt;/strong&gt;&lt;br /&gt;Select the item you want to edit and then click Edit. Change the title or other information for the item.&lt;br /&gt;&lt;strong&gt;Remove items&lt;/strong&gt;&lt;br /&gt;Select the item you want to remove and then click Remove. If you select an area or a group, all of the items under the area and group will also be removed.&lt;br /&gt;&lt;strong&gt;Move items&lt;/strong&gt;&lt;br /&gt;To move an item up or down, select the item and then click Move Up or Move Down. Areas are moved relative to the nearest area. Groups are moved relative to the nearest group. For example, if you select a group and click Move Down, the group and all its subordinate items will move under the next group. Sub-areas are moved relative to the nearest sub-area, but within their group.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Select Publish to CRM to test the changes.&lt;br /&gt;&lt;/strong&gt;After you’ve modified the site map to reflect the Navigation Pane you want to see in the application, you must publish it:&lt;br /&gt;• On the Site Map Editor page, after you have created the site map, under Open and Save, click Publish to CRM.&lt;br /&gt;Save a Site Map for Future Use&lt;br /&gt;You can save the site map you’ve created for future use. To save the site map:&lt;br /&gt;1. On the Site Map Editor page, after you have created the site map, under Open and Save, click Save.&lt;br /&gt;2. In the Save dialog, specify the location and filename for the new XML file. Then click OK.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;/span&gt;&lt;a href="http://3.bp.blogspot.com/_Ky8MLSxenl8/S3QNZ995InI/AAAAAAAAAK8/oF3_8_0aVmQ/s1600-h/10.jpg"&gt;&lt;span style="font-family:arial;"&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 275px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5436985389925081714" border="0" alt="" src="http://3.bp.blogspot.com/_Ky8MLSxenl8/S3QNZ995InI/AAAAAAAAAK8/oF3_8_0aVmQ/s400/10.jpg" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4058165759694816344-7676260790165580618?l=crmdelacreme.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/7676260790165580618'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/7676260790165580618'/><link rel='alternate' type='text/html' href='http://crmdelacreme.blogspot.com/2010/02/editing-crm-site-map-made-so-easy.html' title='Editing the CRM Site Map made so easy!!!!...'/><author><name>Tiaan van Niekerk</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Ky8MLSxenl8/S86MPSGeVPI/AAAAAAAAAO0/Ln5Gkx7EP5I/S220/Snapshot+of+me+4.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_Ky8MLSxenl8/S3KUF73-O-I/AAAAAAAAAJ0/-y85XG6tHUI/s72-c/1.jpg' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-4058165759694816344.post-7401711962411066836</id><published>2010-02-10T07:13:00.001+02:00</published><updated>2010-02-10T07:23:33.930+02:00</updated><title type='text'>Hides the associated Views buttons/More Actions menu drop down</title><content type='html'>/* Hides the associated Views buttons. i.e Hides the add existing button. */&lt;br /&gt;/* NB: If called multiple times, the settings of the previous calls are overwritten by the final one! */&lt;br /&gt;/* A menu element on the &amp;quot;More actions&amp;quot; drop-down menu can be hidden &lt;br /&gt; * by adding a string such as &amp;#039;More Actions::Activate&amp;#039; to the buttonTitles array.&lt;br /&gt; */&lt;br /&gt;HideAssociatedViewButtons = function(loadAreaId, buttonTitles) &lt;br /&gt;{&lt;br /&gt;    var navElement = document.getElementById(&amp;#039;nav_&amp;#039; + loadAreaId);&lt;br /&gt;    if (navElement != null) &lt;br /&gt;    {&lt;br /&gt;        navElement.onclick = function LoadAreaOverride() &lt;br /&gt;        {&lt;br /&gt;            // Call the original CRM method to launch the navigation link and create area iFrame&lt;br /&gt;            loadArea(loadAreaId);&lt;br /&gt;            HideViewButtons(document.getElementById(loadAreaId + &amp;#039;Frame&amp;#039;), buttonTitles);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/* Used internally by the &amp;#039;HideAssociatedViewButtons&amp;#039; method */&lt;br /&gt;HideViewButtons = function(Iframe, buttonTitles) &lt;br /&gt;{&lt;br /&gt;    if (Iframe != null) &lt;br /&gt;    {&lt;br /&gt;        Iframe.onreadystatechange = function HideTitledButtons() &lt;br /&gt;        {&lt;br /&gt;            if (Iframe.readyState == &amp;#039;complete&amp;#039;) &lt;br /&gt;            {&lt;br /&gt;                var iFrame = frames[window.event.srcElement.id]; &lt;br /&gt;                var liElements = iFrame.document.getElementsByTagName(&amp;#039;li&amp;#039;); &lt;br /&gt;                for (var j = 0; j &amp;lt; buttonTitles.length; j++) &lt;br /&gt;                {&lt;br /&gt;                    buttonTitleParts = buttonTitles[j].split(&amp;#039;::&amp;#039;);&lt;br /&gt;                    if (buttonTitleParts.length &amp;gt; 0)&lt;br /&gt;                    {&lt;br /&gt;                        buttonTitle = buttonTitleParts[0];&lt;br /&gt;                        for (var i = 0; i &amp;lt; liElements.length; i++) &lt;br /&gt;                        {&lt;br /&gt;                            liElement = liElements[i];&lt;br /&gt;                            if (liElement.getAttribute(&amp;#039;title&amp;#039;) == buttonTitle)&lt;br /&gt;                            {&lt;br /&gt;                                if (buttonTitleParts.length == 1)&lt;br /&gt;                                {&lt;br /&gt;                                    liElement.style.display = &amp;#039;none&amp;#039;;&lt;br /&gt;                                    break;&lt;br /&gt;                                }&lt;br /&gt;                                else&lt;br /&gt;                                {&lt;br /&gt;                                    /* We want to hide a menu item in a drop-down menu.&lt;br /&gt;                                       Find the descendant text element with the specified text.&lt;br /&gt;                                       Then find its parent list item and hide it:&lt;br /&gt;                                    */&lt;br /&gt;                                    menuText = buttonTitleParts[1];&lt;br /&gt;                                    var spanElements = liElement.getElementsByTagName(&amp;#039;span&amp;#039;);&lt;br /&gt;                                    &lt;br /&gt;                                    for (var k = 0; k &amp;lt; spanElements.length; k++)&lt;br /&gt;                                    {&lt;br /&gt;                                        spanElement = spanElements[k];&lt;br /&gt;                                        if (spanElement.className == &amp;#039;ms-crm-MenuItem-Text&amp;#039; )&lt;br /&gt;                                        {&lt;br /&gt;                                            textElement = spanElement.firstChild;&lt;br /&gt;                                            if (textElement != null &amp;amp;&amp;amp; textElement.nodeType == 3) /* 3 = Node.TEXT_NODE */&lt;br /&gt;                                            {&lt;br /&gt;                                                if (textElement.data == menuText)&lt;br /&gt;                                                {&lt;br /&gt;                                                    liMenuItemElement &lt;br /&gt;                                                        = spanElement.parentNode.parentNode.parentNode;&lt;br /&gt;                                                    liMenuItemElement.style.display = &amp;#039;none&amp;#039;;&lt;br /&gt;                                                    break;&lt;br /&gt;                                                }&lt;br /&gt;                                            }&lt;br /&gt;                                        }&lt;br /&gt;                                    }&lt;br /&gt;                                }&lt;br /&gt;                            }&lt;br /&gt;                        }&lt;br /&gt;                    }&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4058165759694816344-7401711962411066836?l=crmdelacreme.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/7401711962411066836'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/7401711962411066836'/><link rel='alternate' type='text/html' href='http://crmdelacreme.blogspot.com/2010/02/hides-associated-views-buttonsmore.html' title='Hides the associated Views buttons/More Actions menu drop down'/><author><name>Tiaan van Niekerk</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Ky8MLSxenl8/S86MPSGeVPI/AAAAAAAAAO0/Ln5Gkx7EP5I/S220/Snapshot+of+me+4.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-4058165759694816344.post-3295501927857739498</id><published>2010-02-03T08:46:00.011+02:00</published><updated>2010-02-03T17:44:03.835+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='attribute names'/><category scheme='http://www.blogger.com/atom/ns#' term='tooltips'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='crm tooltips'/><title type='text'>Adding tooltips to CRM and help developers getting the attribute name using the tooltip</title><content type='html'>&lt;span style="font-family:arial;"&gt;Found the wonderful post from Andriy on his&lt;a href="http://a33ik.blogspot.com/2010/01/setting-attribute-description-as.html"&gt; blog&lt;/a&gt; &lt;strong&gt;&lt;em&gt;Setting the description field of the attribute as a tooltip in CRM&lt;/em&gt;&lt;/strong&gt;.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;We changed the code a bit to make it easier for developers to access the attribute name based on the field's tooltip.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;&lt;strong&gt;Step 1: &lt;/strong&gt;Copy the code in onload event of the form &lt;/span&gt;&lt;span style="font-family:arial;"&gt;at the bottom of the post.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:100%;color:#ff0000;"&gt;&lt;span style="color:#000000;"&gt;&lt;span style="font-family:arial;"&gt;&lt;strong&gt;Step 2:&lt;/strong&gt;Publish the changes &lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="color:#000000;"&gt;&lt;strong&gt;Step 3&lt;/strong&gt;:Load the relevant page&lt;/span&gt; &lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:arial;"&gt;&lt;strong&gt;Step 4&lt;/strong&gt;:Click with your mouse on the display name of attribute&lt;/span&gt;&lt;br /&gt;&lt;p align="center"&gt;&lt;span style="font-family:arial;"&gt;&lt;strong&gt;&lt;a href="http://3.bp.blogspot.com/_Ky8MLSxenl8/S2kiBZ5GZoI/AAAAAAAAAHE/Cih42lserdI/s1600-h/picture+1.jpg"&gt;&lt;img style="WIDTH: 400px; HEIGHT: 86px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5433911832924808834" border="0" alt="" src="http://3.bp.blogspot.com/_Ky8MLSxenl8/S2kiBZ5GZoI/AAAAAAAAAHE/Cih42lserdI/s400/picture+1.jpg" /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="font-family:arial;"&gt;&lt;strong&gt;Step 5:&lt;/strong&gt;Keeping your (Crtl) keyboard key in, click with your mouse on the tooltip. &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;strong&gt;Step 6:&lt;/strong&gt; Open Notepad &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;strong&gt;Step 7:&lt;/strong&gt; press (Crtl +v) and the database name will be pasted in notepad.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="center"&gt;&lt;a href="http://3.bp.blogspot.com/_Ky8MLSxenl8/S2kiXXk-WZI/AAAAAAAAAHM/Yn--No5-xEc/s1600-h/picture2.jpg"&gt;&lt;img style="WIDTH: 368px; HEIGHT: 288px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5433912210260646290" border="0" alt="" src="http://3.bp.blogspot.com/_Ky8MLSxenl8/S2kiXXk-WZI/AAAAAAAAAHM/Yn--No5-xEc/s400/picture2.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;span style="font-family:arial;"&gt;You will not have to have the customization window open any more to see the attributes and database names.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;SetTooltips = function() {&lt;br /&gt;try {&lt;br /&gt;var request = "" +&lt;br /&gt;"&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;" +&lt;br /&gt;"&amp;lt;soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"&amp;gt;" +&lt;br /&gt;GenerateAuthenticationHeader() +&lt;br /&gt;" &amp;lt;soap:Body&amp;gt;" +&lt;br /&gt;" &amp;lt;Execute xmlns="http://schemas.microsoft.com/crm/2007/WebServices"&amp;gt;" +&lt;br /&gt;" &amp;lt;Request xsi:type="RetrieveEntityRequest"&amp;gt;" +&lt;br /&gt;" &amp;lt;RetrieveAsIfPublished&amp;gt;true&amp;lt;/RetrieveAsIfPublished&amp;gt;" +&lt;br /&gt;" &amp;lt;EntityItems&amp;gt;IncludeAttributes&amp;lt;/EntityItems&amp;gt;" +&lt;br /&gt;" &amp;lt;LogicalName&amp;gt;" + crmForm.ObjectTypeName + "&amp;lt;/LogicalName&amp;gt;" +&lt;br /&gt;" &amp;lt;/Request&amp;gt;" +&lt;br /&gt;" &amp;lt;/Execute&amp;gt;" +&lt;br /&gt;" &amp;lt;/soap:Body&amp;gt;" +&lt;br /&gt;"&amp;lt;/soap:Envelope&amp;gt;";&lt;br /&gt;&lt;br /&gt;var xmlHttpRequest = new ActiveXObject("Msxml2.XMLHTTP");&lt;br /&gt;&lt;br /&gt;xmlHttpRequest.Open("POST", "/mscrmservices/2007/MetadataService.asmx", false);&lt;br /&gt;xmlHttpRequest.setRequestHeader("SOAPAction", "http://schemas.microsoft.com/crm/2007/WebServices/Execute");&lt;br /&gt;xmlHttpRequest.setRequestHeader("Content-Type", "text/xml; charset=utf-8");&lt;br /&gt;xmlHttpRequest.setRequestHeader("Content-Length", request.length);&lt;br /&gt;xmlHttpRequest.send(request);&lt;br /&gt;&lt;br /&gt;var result = xmlHttpRequest.responseXML;&lt;br /&gt;&lt;br /&gt;for (var i = 0; i &amp;lt; crmForm.all.length; i++)&lt;br /&gt;if (crmForm.all[i].title != null &amp;amp;&amp;amp; crmForm.all[i].title != 'undefined') {&lt;br /&gt;var fieldName = crmForm.all[i].id;&lt;br /&gt;&lt;br /&gt;var desc = result.selectSingleNode("//EntityMetadata/Attributes/Attribute[LogicalName='" + fieldName + "']/Description/UserLocLabel/Label");&lt;br /&gt;try {&lt;br /&gt;if (desc != null) {&lt;br /&gt;crmForm.all[fieldName + '_c'].title = desc.nodeTypedValue;&lt;br /&gt;crmForm.all[fieldName + '_d'].title = desc.nodeTypedValue;&lt;br /&gt;}&lt;br /&gt;crmForm.all[fieldName + '_c'].children[0].onclick = function() { copyFieldNameToClipboard(fieldName) };&lt;br /&gt;}&lt;br /&gt;catch (e) { }&lt;br /&gt;}&lt;br /&gt;} catch (e) {&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function copyFieldNameToClipboard(fieldName) {&lt;br /&gt;if (event.srcElement.tagName.toLowerCase() == 'label' &amp;amp;&amp;amp; event.ctrlKey)&lt;br /&gt;clipboardData.setData('text', event.srcElement.attributes['for'].value);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;setTimeout('SetTooltips();', 1500);&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4058165759694816344-3295501927857739498?l=crmdelacreme.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/3295501927857739498'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/3295501927857739498'/><link rel='alternate' type='text/html' href='http://crmdelacreme.blogspot.com/2010/02/adding-tooltips-to-crm-and-help.html' title='Adding tooltips to CRM and help developers getting the attribute name using the tooltip'/><author><name>Tiaan van Niekerk</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Ky8MLSxenl8/S86MPSGeVPI/AAAAAAAAAO0/Ln5Gkx7EP5I/S220/Snapshot+of+me+4.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_Ky8MLSxenl8/S2kiBZ5GZoI/AAAAAAAAAHE/Cih42lserdI/s72-c/picture+1.jpg' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-4058165759694816344.post-4902043669080170947</id><published>2010-02-01T16:16:00.002+02:00</published><updated>2010-02-01T16:28:16.987+02:00</updated><title type='text'>Cannot add users in crm using "Add Multiple Users"</title><content type='html'>Please see below for the solution : &lt;br /&gt;If you do have more than one, please add a String: "PreferredDC" to the MSCRM hive in the registry on the CRM Server (HKLM - software - Microsoft - MSCRM) Add in the FQDN of the domain controller within your environment which holds the user domain accounts. &lt;br /&gt;&lt;br /&gt;Change the Search order in the registry of the CRM server and point to Your Primary Domain Controller. To do this make the following registry change: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters]"SearchList"= DCName. Change the "DCName" to your Primary Domain Controllers name You should use the FQDN of the Domain Controller where the DNS Server is held and where the CRM Domain   accounts are. You MUST reboot the CRM Server in order for these change to take effect.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4058165759694816344-4902043669080170947?l=crmdelacreme.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/4902043669080170947'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/4902043669080170947'/><link rel='alternate' type='text/html' href='http://crmdelacreme.blogspot.com/2010/02/cannot-add-users-in-crm-using-add.html' title='Cannot add users in crm using &quot;Add Multiple Users&quot;'/><author><name>Tiaan van Niekerk</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Ky8MLSxenl8/S86MPSGeVPI/AAAAAAAAAO0/Ln5Gkx7EP5I/S220/Snapshot+of+me+4.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-4058165759694816344.post-4223617105888045682</id><published>2010-01-29T09:35:00.007+02:00</published><updated>2010-06-01T08:27:23.767+02:00</updated><title type='text'>Adding sort order to the custom entities tab for security roles in MS CRM</title><content type='html'>HI Guys/Girls!&lt;br /&gt;&lt;br /&gt;We are busy with a huge crm implementation and currently have about 200 custom entities.&lt;br /&gt;When we started to look at the security model for the system and it became a nightmare to set the privileges on the security roles as CRM does not sort the custom entities alphabetically.&lt;br /&gt;&lt;br /&gt;So what to DO?&lt;br /&gt;We hack!...&lt;br /&gt;&lt;br /&gt;How the solution works:&lt;br /&gt;Locate the file called edit.aspx located at:&lt;br /&gt;[drive]Program Files\Microsoft Dynamics CRM\CRMWeb\Biz\Roles\edit.aspx&lt;br /&gt;&lt;br /&gt;Between the script tags at the bottom of the page.(As shown below)&lt;br /&gt;&lt;br /&gt;&amp;lt;script&amp;gt;&lt;br /&gt;var tbl = document.getElementById('tab7').children(0).children(0).children(0).children(0).children(0);&lt;br /&gt;var x = [];&lt;br /&gt;for (var i = 0; i &amp;lt; tbl.rows.length; i++)&lt;br /&gt;x[i] = [tbl.rows[i].cells[0].innerHTML,tbl.rows[i].outerHTML];&lt;br /&gt;var str = x[0][1];&lt;br /&gt;for (var i = 1; i &amp;lt; x.length-1; i++)&lt;br /&gt;for (var j = i+1; j &amp;lt; x.length; j++)&lt;br /&gt;if (x[i][0] &amp;gt; x[j][0]) {&lt;br /&gt;var tmp = x[j];&lt;br /&gt;x[j] = x[i];&lt;br /&gt;x[i] = tmp;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;for (var i = 1; i &amp;lt; x.length; i++)&lt;br /&gt;str += x[i][1];&lt;br /&gt;document.getElementById('tab7').children(0).children(0).children(0).children(0).innerHTML = '&amp;lt;TABLE class=ms-crm-Form-Area onmouseover=SetAltText(); ondblclick=ProcessClick(); onclick=ProcessClick(); cellSpacing=0 cellPadding=2&amp;gt;' + str + '&amp;lt;/table&amp;gt;';&lt;br /&gt;&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;br /&gt;Copy and paste the code above into the file or download the file here.&lt;br /&gt;&lt;br /&gt;And there you go!, a neat sort order for all your custom entities.&lt;br /&gt;The code can be adopted for the other tabs as well just make a back of your edit.aspx file.&lt;br /&gt;&lt;br /&gt;This is a unsupported customization!!!!!! so make a copy of the original file first!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4058165759694816344-4223617105888045682?l=crmdelacreme.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/4223617105888045682'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/4223617105888045682'/><link rel='alternate' type='text/html' href='http://crmdelacreme.blogspot.com/2010/01/adding-sort-order-to-custom-entity-for.html' title='Adding sort order to the custom entities tab for security roles in MS CRM'/><author><name>Tiaan van Niekerk</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Ky8MLSxenl8/S86MPSGeVPI/AAAAAAAAAO0/Ln5Gkx7EP5I/S220/Snapshot+of+me+4.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-4058165759694816344.post-137394025583291214</id><published>2009-10-27T06:24:00.002+02:00</published><updated>2009-10-27T06:29:31.596+02:00</updated><title type='text'>CRM 4.0 Disaster Recovery</title><content type='html'>&lt;p&gt;&lt;span style="font-family:arial;"&gt;&lt;strong&gt;1. Backup requirements summary&lt;/strong&gt;&lt;br /&gt;Backup requirements vary according to the servers involved. The following table is a summary of what to back up for Microsoft Dynamics CRM.&lt;br /&gt;Server What to back up for Microsoft Dynamics CRM Comments&lt;br /&gt;Domain controller Full System State None.&lt;br /&gt;Exchange Server Backup not required by Microsoft Dynamics CRM. Backup may be required for Exchange.&lt;br /&gt;SQL Server MSCRM_CONFIG&lt;br /&gt;OrganizationName_MSCRM&lt;br /&gt;master&lt;br /&gt;msdb&lt;br /&gt;ReportServer&lt;br /&gt;ReportServertempdb Backup should be done by using Reporting Services. The OrganizationName_MSCRM and ReportServer databases should have full database backups and transaction log backups. For databases that are rarely updated, such as msdb and MSCRM_CONFIG, you may select only full database backup. Backup of the master and msdb databases are not required by Microsoft Dynamics CRM but should be part of an overall backup strategy.&lt;br /&gt;Microsoft Dynamics CRM Server web.config&lt;br /&gt;(Default location: c:\Inetpub\wwwroot)&lt;br /&gt;Windows registry:&lt;br /&gt;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSCRM The web.config file is required only if the file has been changed from the default settings. The file location assumes the installation occurred at the Default Web site.&lt;br /&gt;Windows registry subkey.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;1.1 Selecting a backup model&lt;br /&gt;&lt;/strong&gt;When you back up to tape, we recommend that you select a tape backup rotation model that guarantees data protection in case a tape malfunctions or loss. When backing up to disk, you can implement similar logic for rotating disk files. A popular tape rotation scheme is grandparent-parent-child:&lt;br /&gt;• The tape used for backup on the last Friday of each month is called the grandparent tape. This tape is stored off-site.&lt;br /&gt;• The tape used for backup every Friday (except the last Friday of the month) is called the parent tape. This tape is also stored off-site.&lt;br /&gt;• The tapes used for backup on Monday, Tuesday, Wednesday, and Thursday are called child tapes. Frequently all child tapes are stored on-site except for the tape from the previous day.&lt;br /&gt;The following backup options are available when you use the Microsoft Backup and Restore Wizard:&lt;br /&gt;• Normal. Backs up all selected files and marks the files as backed up.&lt;br /&gt;• Copy. Backs up all selected files, but does not mark the files as backed up.&lt;br /&gt;• Differential. Backs up selected files, only if they have not been previously backed up, or changed since the last backup, but does not mark the files as backed up.&lt;br /&gt;• Incremental. Backs up selected files, only if they have not been previously backed up, or changed, since the last backup, and marks the files as backed up.&lt;br /&gt;• Daily. Backs up only files that have been changed, on that particular day, and marks them as backed up.&lt;br /&gt;Because many small businesses typically do not have system administrators on staff, a regular backup, which is performed daily and according to the suggested grandparent-parent-child backup model, is recommended for small organizations. Larger organizations likely have an existing backup methodology that Microsoft Dynamics CRM will fit into. &lt;/span&gt;&lt;/p&gt;&lt;span style="font-family:arial;"&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;1.2 Backing up Windows Server 2003&lt;/strong&gt;&lt;br /&gt;Windows Server 2003 has a comprehensive backup utility that lets you back up important company data to disk or tape media. The scheduling capability found in the Backup and Restore Wizard provides data backup for the server itself and workstations in the small business network. The data backed up includes security information, file and share permissions, and registry data. For data security, only a member of the Administrators or Backup Operators group can perform a backup. Individual files and directories on the server can be restored by using the Backup and Restore Wizard.&lt;br /&gt;When you back up to tape, the Backup and Restore Wizard requires that the tape backup device be connected to a compatible SCSI or non-SCSI controller card. The controller card must be installed correctly and functional. Windows Server 2003 automates the installation of a controller card because the new hardware is detected at system startup and the correct drivers are automatically installed.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;1.3 Backing up Active Directory&lt;br /&gt;&lt;/strong&gt;The Backup and Restore Wizard can back up System State data, which includes Active Directory, system startup files, the Component Services Class Registration database, the registry, and SysVol. Possible backup locations for System State data include floppy disks, hard disks, removable media, recordable compact discs, and tapes.&lt;br /&gt;Although we recommend that you back up Active Directory, the only way to avoid data loss is to have multiple Active Directory domain controllers. Then, if a domain controller fails, the other domain controllers will have a complete copy of the directory. With a tape backup, you have data only as recent as your last backup.&lt;br /&gt;Active Directory is a transacted database system that uses log files that support roll-back semantics to make sure that transactions are committed to the database. The files associated with Active Directory are as follows:&lt;br /&gt;• Ntds.dit. The database.&lt;br /&gt;• Edbxxxxx.log. Transaction logs.&lt;br /&gt;• Edb.chk. Checkpoint file.&lt;br /&gt;• Res1.log and Res2.log. Reserved log files.&lt;br /&gt;Ntds.dit grows as the database fills up. However, the logs are of fixed size (10 MB). Any change made to the database is also appended to the current log file, and its disk image is always kept up to date.&lt;br /&gt;Edb.log is the current log file. When a change is made to the database, it is written to the Edb.log file. When the Edb.log file is full of transactions, it is renamed to Edbxxxxx.log. (It starts at 00001 and continues to increment by using hexadecimal notation.) Because Active Directory uses circular logging, old log files are constantly deleted as soon as they have been written to the database. At any point in time, you will have the Edb.log file and maybe one or more Edbxxxxx.log files.&lt;br /&gt;The Edb.chk file stores the database checkpoint, which identifies the point where the database engine has to replay the logs, generally at the time of recovery or initialization.&lt;br /&gt;Res1.log and Res2.log are "placeholders," designed to reserve (in this case) the last 20 MB of disk space. This gives the log files sufficient room for a graceful shutdown if all other disk space is consumed.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;1.4 Backing up SQL Server, including Reporting Services&lt;/strong&gt;&lt;br /&gt;The Backup and Restore Wizard in Windows Server 2003 cannot back up SQL Server databases that are online, instead you must first stop the MSSQLSERVER service. A better solution that can be used while SQL Server runs is the built-in backup. Use SQL Server 2005 Management Studio to create a backup of the SQL Server databases. Then, you can run a backup job from the Backup and Restore Wizard to include database backups that Reporting Services created. You would schedule the backup routing in Reporting Services to run first, followed by a backup job run in the Backup and Restore Wizard. For more information about SQL Server backups, see Backing up and Restoring Databases in SQL Server Books Online.&lt;br /&gt;Microsoft Dynamics CRM creates at least two Microsoft Dynamics CRM-specific databases on SQL Server. In addition, Microsoft Dynamics CRM requires the default master and msdb SQL Server databases for database services and the default report server SQL Server databases for Reporting Services. The databases that make up a Microsoft Dynamics CRM system on SQL Server are as follows:&lt;br /&gt;• OrganizationName_MSCRM&lt;br /&gt;• MSCRM_CONFIG&lt;br /&gt;• ReportServer&lt;br /&gt;• ReportServertempdb&lt;br /&gt;• master&lt;br /&gt;• msdb&lt;br /&gt;Note&lt;br /&gt;Your Microsoft Dynamics CRM deployment may include more than one OrganizationName_MSCRM database.&lt;br /&gt;The SQL Server backup plan should address each of these databases to make sure that Microsoft Dynamics CRM could recover if one, or all, databases fail. If your organization already has SQL Server or another database application, your database administrator may have a database backup strategy. However, if this is the first database application in your organization, you can create and maintain scheduled backup jobs to perform the necessary backups by using the Maintenance Plan Wizard in SQL Server 2005 Management Studio. To start the Maintenance Plan Wizard, in Reporting Services, expand the server, expand the Management folder, right-click the Maintenance Plans folder, and then click Maintenance Plan Wizard.&lt;br /&gt;Your backup plan for the Microsoft Dynamics CRM databases provides you a backup set that includes a full database backup and some number of transaction log backups, depending on the Microsoft Dynamics CRM installation and the frequency with which you determine whether you must have backups. For more information about backup and restore strategies, see SQL Server Books Online.&lt;br /&gt;For databases that are updated infrequently, such as msdb and MSCRM_CONFIG, you might perform only full database backups. The OrganizationName_MSCRM and ReportServer databases should have both full database and transaction-log backups&lt;br /&gt;Databases on which transaction log backups will be performed must have the Full recovery model database property set. You can set this property through SQL Server 2005 Management Studio. For more information about how to set database properties, see "How to Change the Configuration Settings for a Database" in SQL Server Books Online.&lt;br /&gt;Schedule full database backups frequently enough to reduce the number of restores after a failure. For example, if one day's data loss is acceptable, you can back up the transaction log one time per day, and back up the database one time per week. If only one hour's maximum data loss is acceptable, you can back up the transaction log one time per hour. To reduce the number of restores, back up the database one time per day.&lt;br /&gt;To create a database maintenance plan for scheduled backups, run the Maintenance Plan Wizard from SQL Server 2005 Management Studio. Select the option to back up the database as part of the maintenance plan for a full database backup. Select the option to back up the transaction log as part of the maintenance plan for a transaction log backup.&lt;br /&gt;Your computer that is running SQL Server should also be designed with a level of fault-tolerance that is correct for a database server. This includes a RAID-5 disk array for your databases and a RAID-0 (mirror) for your transaction logs. With the correct level of hardware fault-tolerance, restoring from backup should be a very uncommon occurrence. &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;1.5 Backing up Exchange Server 2003 and Exchange Server 2007&lt;br /&gt;&lt;/strong&gt;The Backup and Restore Wizard in Windows Server 2003 can back up the Exchange Server 2003 or Exchange Server 2007 Information Store and directory services databases. Backing up the Exchange Information Store is an important part of creating a fault-tolerant messaging system. The backup and restore features in Exchange Server help you recover from various types of data loss with minimal downtime for your e-mail system.&lt;br /&gt;Exchange Server uses the Backup and Restore Wizard to back up and restore the Exchange Information Store. The wizard helps you protect data from accidental loss or hardware and media failure by using a storage device to back up and restore data on any server in your organization locally, or over the network.&lt;br /&gt;Improvements in Exchange Server make sure that backing up and restoring data is efficient and reliable. For example, you can restore one or more mailbox stores, or public folder stores, without shutting down the Information Store.&lt;br /&gt;You can make sure that your organization is prepared to recover from data loss by performing the necessary planning and implementation. Developing a backup and restoration strategy consists of the following steps:&lt;br /&gt;1. Understand Exchange Server database and storage group technology.&lt;br /&gt;2. Design a backup plan.&lt;br /&gt;3. Develop failure-recovery strategies.&lt;br /&gt;4. Restore data.&lt;br /&gt;The Microsoft Dynamics CRM E-mail Router can be installed to receive incoming e-mail messages from Exchange Servers. If the E-mail Router fails and is recovered, the E-mail Router component must be reinstalled so that it will continue to identify Microsoft Dynamics CRM e-mail messages as they enter the organization. &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;1.6 Backing up Microsoft Dynamics CRM Server&lt;/strong&gt;&lt;br /&gt;Backing up and restoring the Microsoft Dynamics CRM Server basically involves the following data:&lt;br /&gt;• Microsoft Dynamics CRM Server database files (explained previously)&lt;br /&gt;• Microsoft Dynamics CRM Server program files&lt;br /&gt;• Microsoft Dynamics CRM Web site files&lt;br /&gt;• Customizations made to Microsoft Dynamics CRM&lt;br /&gt;By default, all Microsoft Dynamics CRM program files are located in the following folder:&lt;br /&gt;C:\Program Files\Microsoft CRM\&lt;br /&gt;By default, the Microsoft Dynamics CRM Web site files are located in the following folder:&lt;br /&gt;C:\Inetpub\wwwroot&lt;br /&gt;The Export Customizations tool can be used to back up Microsoft Dynamics CRM customizations such as modified forms, views, and mappings. The Export Customizations tool is located in the Customizations area of the Settings area in the Microsoft Dynamics CRM application. It is a good practice to make a backup of your customizations before you try to make changes. &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;1.6.1 Backing up your Customizations&lt;br /&gt;&lt;/strong&gt;It's a good idea to back up (Export) your Customizations on a fairly regular basis - after you create or alter any of your Entities, Workflows, etc. This is a very simple process that can make your live easier in the future. If you are just getting started with CRM Live, go ahead and create a baseline export of the pristine system.&lt;br /&gt;1. Navigate to Settings -&gt; Customizations -&gt; Export Customizations.&lt;br /&gt;2. Select More Actions -&gt; Export All Customizations.&lt;br /&gt;3. You may get an Internet Explorer warning. Click Download File.&lt;br /&gt;4. Don't be surprised if your only result is that you go back to your main Workplace screen. Simply repeat steps 1 &amp;amp; 2 above and I expect you will be successful&lt;br /&gt;5. Give the customization.zip file a logical name and save it to a location that has strong backup procedures in place.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;2. Failure Recovery&lt;br /&gt;&lt;/strong&gt;To understand the failure-recovery procedures, you must examine several different scenarios to learn how restoration occurs in each case. For each scenario in this guide, total server failure is assumed. The following four scenarios contain information that shows the steps to ensure successful recovery.&lt;br /&gt;&lt;strong&gt;2.1 SQL Server failure&lt;/strong&gt;&lt;br /&gt;If the computer that is running Microsoft SQL Server fails, you must restore the databases from backup, and then re-associate them with the Microsoft Dynamics CRM deployment.&lt;br /&gt;To recover from this failure, follow these steps:&lt;br /&gt;1. Install Windows Server 2003 or Windows Server 2008, and make sure that the computer is in the same domain as the Microsoft Dynamics CRM Server. In addition, you should use the same database name and disk structure. If you change either of these, you must take additional steps to correctly restore the SQL Server databases.&lt;br /&gt;2. Install SQL Server.&lt;br /&gt;3. If you have a valid backup of the master database, restore that backup. For more information, see Restoring the master Database in SQL Server Books Online.&lt;br /&gt;4. Restore the msdb database. For more information, see Restoring the model and msdb Databases in SQL Server Books Online.&lt;br /&gt;5. Restore the MSCRM_CONFIG and OrganizationName_MSCRM databases. For more information about how to restore databases, see Backing Up and Restoring Databases.&lt;br /&gt;6. If Microsoft SQL Server Reporting Services and the Microsoft Dynamics CRM 4.0 Connector for Microsoft SQL Server Reporting Services are also installed on the instance of SQL Server, restore the ReportServer and ReportServertempDB databases. For more information about how to restore databases, see Backing Up and Restoring Databases.&lt;br /&gt;7. If you restored the MSCRM_CONFIG database, you must run Microsoft Dynamics CRM Server Setup and use the Connect to existing databases option on the Specify Deployment Options page. If you did not restore the MSCRM_CONFIG database and the database is functioning correctly, you use the Import Organization feature in Microsoft Dynamics CRM Deployment Manager to re-associate the organization database with the Microsoft Dynamics CRM system. For more information about how to import an organization, see the Deployment Manager Help.&lt;br /&gt;This scenario is a worst-case situation, that is, total failure of the computer that is running SQL Server. In other circumstances, such as the failure of a disk, you may only have to restore a single database to recover the environment&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;2.2 Microsoft Dynamics CRM Server failure&lt;/strong&gt;&lt;br /&gt;Most of the Microsoft Dynamics CRM configuration information is stored on the computer that is running SQL Server. Therefore, the information can be recovered if all, or part, of Microsoft Dynamics CRM Server fails. Registry entries on the Microsoft Dynamics CRM Server are recovered when you run repair or reinstall processes for the Microsoft Dynamics CRM Server and Microsoft Dynamics CRM 4.0 Connector for Microsoft SQL Server Reporting Services.&lt;br /&gt;If the computer that is running Microsoft Dynamics CRM Server fails, follow these steps:&lt;br /&gt;1. Install the operating system on another server and join the same domain as the computer that is running SQL Server.&lt;br /&gt;2. Install Microsoft Dynamics CRM Server. During Setup, you must select Connect to existing databases when you are prompted. If Microsoft Dynamics CRM 4.0 Connector for Microsoft SQL Server Reporting Services was also installed on the computer that failed, install the Microsoft Dynamics CRM 4.0 Connector for Microsoft SQL Server Reporting Services after Microsoft Dynamics CRM Server is completed.&lt;br /&gt;3. If ISV.config and web.config have been changed from their default settings, restore these files from backup.&lt;br /&gt;4. Publish all customizations. To do this, in the Web application, click Settings, click Customization, click Customize Entities, on the Actions toolbar select More Actions, and then click Publish all Customizations. &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;2.2.1 Uninstall or repair Microsoft Dynamics CRM Server&lt;/strong&gt;&lt;br /&gt;To remove (uninstall) Microsoft Dynamics CRM Server, on the computer where the application is installed go to Add or Remove Programs, click Microsoft Dynamics CRM Server, click Change/Remove, select Uninstall to remove Microsoft Dynamics CRM Server, and then click Uninstall. Follow the instructions that are on the screen.&lt;br /&gt;Important&lt;br /&gt;The Microsoft Dynamics CRM uninstall process does not remove some components, such as the SQL Server databases, Active Directory groups, or the Microsoft Dynamics CRM Web site. Those components must be removed manually.&lt;br /&gt;For more information about how to remove these components, or how to remove components if Setup cannot successfully remove them, see KB article 946980: How to manually remove the Microsoft Dynamics CRM 4.0 server.&lt;br /&gt;To repair a damaged Microsoft Dynamics CRM Server installation, click Microsoft Dynamics CRM Server, click Change/Remove, select Repair, and then click Next. Follow the instructions that are on the screen. &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;2.3 Exchange Server failure&lt;/strong&gt;&lt;br /&gt;The process to restore a Microsoft Exchange Server computer that is used by Microsoft Dynamics CRM depends on the other uses of that instance of Exchange Server. Except for the forward mailbox, Microsoft Dynamics CRM does not directly use Exchange Server mailboxes.&lt;br /&gt;Note&lt;br /&gt;Installing the E-mail Router on a computer that is running Exchange Server is not required.&lt;br /&gt;1. Restore Exchange Server.&lt;br /&gt;2. If the E-mail Router was installed on the computer that is running Exchange Server, reinstall the E-mail Router.&lt;br /&gt;3. Restore the Microsoft.Crm.Tools.EmailAgent.xml file. By default, this file is located in the Drive:\Program Files\Microsoft CRM Email\Service folder. If this file is not available, you must reconfigure the profiles, settings, users, queue, and forward-mailbox information by running the E-mail Router Configuration Manager.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;2.4 Active Directory failure&lt;br /&gt;&lt;/strong&gt;In most environments, it is highly unlikely that Active Directory will fail on its own, because more than one Active Directory domain controller should be installed.&lt;br /&gt;To recover from a failed domain controller, follow these steps:&lt;br /&gt;1. Reinstall the Windows Server 2003 or Windows Server 2008operating system.&lt;br /&gt;2. Perform a system state restore.&lt;br /&gt;Make sure that you have a method for recovering from an Active Directory failure. Regardless of the size of your environment, you should consider having multiple domain controllers with regular backups of the system state. If your backups are not current, any data that belong to Microsoft Dynamics CRM objects in Active Directory will be orphaned in SQL Server and therefore will be unrecoverable. Any changes that are made in Microsoft Dynamics CRM, such as adding new Microsoft Dynamics CRM users or queues, requires that Active Directory is backed up immediately after the change.&lt;br /&gt;One major problem can occur with Active Directory that stops Microsoft Dynamics CRM from functioning. If an administrator unintentionally deletes the organizational unit (OU) that corresponds to a Microsoft Dynamics CRM deployment, it becomes inoperable. Similarly, if any of the OU security groups that are created by Microsoft Dynamics CRM are deleted (such as PrivUserGroup, ReportingGroup, PrivReportingGroup, SQLAccessGroup, or UserGroup), Microsoft Dynamics CRM will no longer function correctly. In either of these events, an authoritative restore of Active Directory restores the deleted OU, and security groups, to their original state. &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;2.5 Microsoft Dynamics CRM for Outlook failure recovery&lt;/strong&gt;&lt;br /&gt;Microsoft Dynamics CRM for Microsoft Office Outlook with Offline Access includes functionality that uses Microsoft SQL Server 2005 Express Edition. This enables Microsoft Dynamics CRM users to work offline with data synchronized to SQL Server when Microsoft Dynamics CRM for Outlook with Offline Access is brought online again.&lt;br /&gt;In some cases, Microsoft Dynamics CRM users may want to back up the local SQL Server 2005 Express Edition database. This is especially useful when Microsoft Dynamics CRM users are offline for prolonged periods. The following table indicates different methods that can be used for backing up Microsoft Dynamics CRM for Outlook with Offline Access.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Backup Method ,What to Back Up for Microsoft Dynamics CRM&lt;/strong&gt; &lt;/p&gt;&lt;p&gt;&lt;strong&gt;Offline backup&lt;/strong&gt; Contents of Microsoft Dynamics CRM data directory.&lt;br /&gt;Default location is:&lt;br /&gt;SystemDrive:\Documents and Settings\UserName\Application Data\Microsoft\MSCRM\Data&lt;br /&gt;On Windows Vista, the default location is:&lt;br /&gt;SystemDrive:\Users\UserName\AppData\Roaming\Microsoft\MSCRM\Data Before you start the backup, make sure that the SQL Server (CRM) service is stopped. Restart the service after the backup is complete.&lt;br /&gt;&lt;strong&gt;Online backup&lt;/strong&gt; using Microsoft tools MSCRM_MSDE.mdf&lt;br /&gt;MSCRM_MSDE_log.LDF&lt;br /&gt;Use the Osql.exe tool that is provided with Microsoft Office Server Extensions.&lt;br /&gt;Online backup using non-Microsoft tools MSCRM_MSDE.mdf&lt;br /&gt;MSCRM_MSDE_log.LDF&lt;br /&gt;Look for tools that are compatible with SQL Server 2005 Express Edition.&lt;br /&gt;&lt;br /&gt;If there is a problem with Microsoft Dynamics CRM for Outlook with Offline Access before the user can reconnect to the server, the backup can be used to restore Microsoft Dynamics CRM functionality to the client. Outlook should be in offline mode before you restore the backup. When restored, you can then connect to the Microsoft Dynamics CRM Server (online mode). The data not already on the server will be transferred to the server from the client. Be careful when reconnecting to the server. If you restore from an outdated backup, the existing data on the server may have subsequently changed. However, neither SQL Server 2005 Express Edition nor SQL Server recognizes this fact. Therefore you run the risk of overwriting current data on the server by using older data from the offline client backup. &lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4058165759694816344-137394025583291214?l=crmdelacreme.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/137394025583291214'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/137394025583291214'/><link rel='alternate' type='text/html' href='http://crmdelacreme.blogspot.com/2009/10/crm-40-disaster-recovery.html' title='CRM 4.0 Disaster Recovery'/><author><name>Tiaan van Niekerk</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Ky8MLSxenl8/S86MPSGeVPI/AAAAAAAAAO0/Ln5Gkx7EP5I/S220/Snapshot+of+me+4.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-4058165759694816344.post-7857552219598321888</id><published>2009-10-26T06:01:00.000+02:00</published><updated>2009-10-26T06:02:12.847+02:00</updated><title type='text'>Update Rollup 7 for Microsoft Dynamics CRM 4.0</title><content type='html'>&lt;span style="font-family:arial;"&gt;General Details about Update Rollup 7&lt;br /&gt;Update Rollup 7 is cumulative. You do not need to install any previous Update Rollups prior to Update Rollup 7&lt;br /&gt;The Update Rollup 7 download contains updates for the 40 supported Language Packs. Prior to installing the Update Rollup 7 Language pack you must install the original &lt;/span&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;amp;FamilyID=50761e58-6040-4cf3-853a-f5ab535f7194"&gt;&lt;span style="font-family:arial;"&gt;Language pack&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;"&gt;. If you have Language Packs installed, you should&lt;br /&gt;Download the Update Rollup 7 Language Pack&lt;br /&gt;Install the Update Rollup 7 Language Pack&lt;br /&gt;De-provision the Language Pack&lt;br /&gt;Re-provision the Language Pack&lt;br /&gt;Update Rollup 7 adds support for Windows 7, Windows Server 2008 R2 and SQL Server 2008 R2&lt;br /&gt;Information about how to avoid reboots when installing the CRM Outlook Client can be found in the &lt;/span&gt;&lt;a href="http://blogs.msdn.com/crm/archive/2009/05/14/update-rollup-4-for-microsoft-dynamics-crm-4-0.aspx"&gt;&lt;span style="font-family:arial;"&gt;Update Rollup 4 blog&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;"&gt; posting. If the Client is being installed via AutoUpdate a reboot will be required because the AutoUpdate code is being updated in Update Rollup 7.&lt;br /&gt;The Update Rollup 7 Client can be deployed before the server is upgraded to Update Rollup 7&lt;br /&gt;The Update Rollup 7 Client cannot be uninstalled because of schema changes made to the offline database. All other Update Rollup 7 components (Server, Language Pack, SRS, Exchange Router, etc) can be uninstalled.&lt;br /&gt;The Update Rollup 7 Client package will be a prerequisite for all future Client Update Rollups. Starting with Update Rollup 8 the client updates will block installation if the Update Rollup 7 Client is not found.&lt;br /&gt;The Update Rollup 7 Client has new prerequisites&lt;br /&gt;An internet connection is required for successful Client installation&lt;br /&gt;Client update installation will take longer than previous URs, so please be patient&lt;br /&gt;Steps to make the Update Rollup 7 Client available via AutoUpdate can be found in the &lt;/span&gt;&lt;a href="http://blogs.msdn.com/crm/archive/2009/05/14/update-rollup-4-for-microsoft-dynamics-crm-4-0.aspx"&gt;&lt;span style="font-family:arial;"&gt;Update Rollup 4 blog&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;"&gt; posting. Once published the Link and Patch IDs can be found in kb article &lt;/span&gt;&lt;a href="http://support.microsoft.com/?kbid=971782"&gt;&lt;span style="font-family:arial;"&gt;971782&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;"&gt;. &lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4058165759694816344-7857552219598321888?l=crmdelacreme.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;FamilyID=a4893988-7804-4e23-ab58-740441cc696e' title='Update Rollup 7 for Microsoft Dynamics CRM 4.0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/7857552219598321888'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/7857552219598321888'/><link rel='alternate' type='text/html' href='http://crmdelacreme.blogspot.com/2009/10/update-rollup-7-for-microsoft-dynamics.html' title='Update Rollup 7 for Microsoft Dynamics CRM 4.0'/><author><name>Tiaan van Niekerk</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Ky8MLSxenl8/S86MPSGeVPI/AAAAAAAAAO0/Ln5Gkx7EP5I/S220/Snapshot+of+me+4.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-4058165759694816344.post-3889860460016904742</id><published>2009-10-14T06:54:00.001+02:00</published><updated>2009-10-14T06:56:57.219+02:00</updated><title type='text'>CRM 4.0 System Requirements and Required Components</title><content type='html'>&lt;span style="font-family:arial;"&gt;Microsoft Dynamics CRM requires several software applications and components that work together to create an effective system. Before you install Microsoft Dynamics CRM, use this section for guidance to verify that system requirements are met and the necessary software components are available.&lt;br /&gt;Unless specified otherwise, Microsoft Dynamics CRM supports the latest version and service pack (SP) for all required components, such as Windows Server, SQL Server, Internet Explorer, and Exchange Server.&lt;br /&gt;For the most up-to-date information about system requirements and required components, see the &lt;/span&gt;&lt;a id="ctl00_MTCS_main_ctl01" onclick="javascript:Track('ctl00_MTCS_main_ctl00ctl00_MTCS_main_ctl01',this);" href="http://go.microsoft.com/fwlink/?linkid=78157" target="_blank"&gt;&lt;span style="font-family:arial;"&gt;Microsoft Dynamics CRM 4.0 Server Readme&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;"&gt;.&lt;br /&gt;For more information, see:&lt;br /&gt;&lt;/span&gt;&lt;a id="ctl00_MTCS_main_ctl02" onclick="javascript:Track('ctl00_MTCS_main_ctl00ctl00_MTCS_main_ctl02',this);" href="http://technet.microsoft.com/en-us/library/dd979162.aspx" target="_self"&gt;&lt;span style="font-family:arial;"&gt;Microsoft Dynamics CRM Server hardware requirements&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;a id="ctl00_MTCS_main_ctl03" onclick="javascript:Track('ctl00_MTCS_main_ctl00ctl00_MTCS_main_ctl03',this);" href="http://technet.microsoft.com/en-us/library/dd979163.aspx" target="_self"&gt;&lt;span style="font-family:arial;"&gt;Microsoft Dynamics CRM Server software requirements&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;a id="ctl00_MTCS_main_ctl04" onclick="javascript:Track('ctl00_MTCS_main_ctl00ctl00_MTCS_main_ctl04',this);" href="http://technet.microsoft.com/en-us/library/dd979174.aspx" target="_self"&gt;&lt;span style="font-family:arial;"&gt;Microsoft Dynamics CRM Connector for SQL Server Reporting Services&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;a id="ctl00_MTCS_main_ctl05" onclick="javascript:Track('ctl00_MTCS_main_ctl00ctl00_MTCS_main_ctl05',this);" href="http://technet.microsoft.com/en-us/library/dd979176.aspx" target="_self"&gt;&lt;span style="font-family:arial;"&gt;Microsoft Dynamics CRM E-mail Router software requirements&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;a id="ctl00_MTCS_main_ctl06" onclick="javascript:Track('ctl00_MTCS_main_ctl00ctl00_MTCS_main_ctl06',this);" href="http://technet.microsoft.com/en-us/library/dd979179.aspx" target="_self"&gt;&lt;span style="font-family:arial;"&gt;Microsoft Dynamics CRM for Outlook hardware requirements&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;a id="ctl00_MTCS_main_ctl07" onclick="javascript:Track('ctl00_MTCS_main_ctl00ctl00_MTCS_main_ctl07',this);" href="http://technet.microsoft.com/en-us/library/dd979180.aspx" target="_self"&gt;&lt;span style="font-family:arial;"&gt;Microsoft Dynamics CRM for Outlook software requirements&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;a id="ctl00_MTCS_main_ctl08" onclick="javascript:Track('ctl00_MTCS_main_ctl00ctl00_MTCS_main_ctl08',this);" href="http://technet.microsoft.com/en-us/library/dd979184.aspx" target="_self"&gt;&lt;span style="font-family:arial;"&gt;Microsoft Dynamics CRM Web client software requirements&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;a id="ctl00_MTCS_main_ctl09" onclick="javascript:Track('ctl00_MTCS_main_ctl00ctl00_MTCS_main_ctl09',this);" href="http://technet.microsoft.com/en-us/library/dd979185.aspx" target="_self"&gt;&lt;span style="font-family:arial;"&gt;Microsoft Dynamics CRM Data Migration Manager hardware requirements&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;a id="ctl00_MTCS_main_ctl10" onclick="javascript:Track('ctl00_MTCS_main_ctl00ctl00_MTCS_main_ctl10',this);" href="http://technet.microsoft.com/en-us/library/dd979186.aspx" target="_self"&gt;&lt;span style="font-family:arial;"&gt;Data Migration Manager software requirements&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;a id="ctl00_MTCS_main_ctl11" onclick="javascript:Track('ctl00_MTCS_main_ctl00ctl00_MTCS_main_ctl11',this);" href="http://technet.microsoft.com/en-us/library/dd979189.aspx" target="_self"&gt;&lt;span style="font-family:arial;"&gt;64-bit supported configurations&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;a id="ctl00_MTCS_main_ctl12" onclick="javascript:Track('ctl00_MTCS_main_ctl00ctl00_MTCS_main_ctl12',this);" href="http://technet.microsoft.com/en-us/library/dd979190.aspx" target="_self"&gt;&lt;span style="font-family:arial;"&gt;Language support&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;a id="ctl00_MTCS_main_ctl13" onclick="javascript:Track('ctl00_MTCS_main_ctl00ctl00_MTCS_main_ctl13',this);" href="http://technet.microsoft.com/en-us/library/dd979194.aspx" target="_self"&gt;&lt;span style="font-family:arial;"&gt;Currency support&lt;/span&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4058165759694816344-3889860460016904742?l=crmdelacreme.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://technet.microsoft.com/en-us/library/dd979161.aspx' title='CRM 4.0 System Requirements and Required Components'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/3889860460016904742'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/3889860460016904742'/><link rel='alternate' type='text/html' href='http://crmdelacreme.blogspot.com/2009/10/crm-40-system-requirements-and-required.html' title='CRM 4.0 System Requirements and Required Components'/><author><name>Tiaan van Niekerk</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Ky8MLSxenl8/S86MPSGeVPI/AAAAAAAAAO0/Ln5Gkx7EP5I/S220/Snapshot+of+me+4.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-4058165759694816344.post-2358490880531768775</id><published>2009-10-08T19:46:00.005+02:00</published><updated>2009-10-08T19:52:51.745+02:00</updated><title type='text'>Microsoft Dynamics CRM Bulk Update and Export tool</title><content type='html'>&lt;span style="font-family:arial;font-size:85%;"&gt;Orbit One is a software development agency located in Ghent, Belgium.They specialize in internet facing websites, intranet and extranet applications.They use technologies such as ASP.Net, SharePoint and Microsoft Dynamics CRM.&lt;/span&gt;&lt;a class="externalLink" href="http://www.orbitone.com/"&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;http://www.orbitone.com/&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;br /&gt;&lt;br /&gt;Makes it easier for people to update and/or export data from Microsoft Dynamics CRM 4.0. You won't need to do everything manually. Let the computer do the work, you do the thinking. It's developed in C# on the microsoft CRM SDK.&lt;br /&gt;&lt;br /&gt;Features:&lt;br /&gt;You can save your connection. We are a hosting company and we have 6 different CRM instances on 3 different servers, so this is quite nice.&lt;br /&gt;One of our clients has 15.000+ records in their contacts. Because CRM returns only 5.000 records for each request, I can’t update them all in one go. This was changed by making multiple requests if necessary.&lt;br /&gt;Access all the records and all the fields. In the MSCRM 4.0 Bulk Data Export Tool you can only use the tool on Advanced find views. I allow you to use the tool on the main entity. Which is really helpfull in some cases.&lt;br /&gt;Change lookup fields.&lt;br /&gt;It allows you to choose the Authentication type. You can connect to CRM with Active Directory, SPLA, Passport&lt;br /&gt;You can export the data you got from CRM to Excel. Then you can do all your updates in Excel (with vlookup and such).&lt;br /&gt;You can import the date and send it back to CRM.&lt;br /&gt;You can see the update progress on the fly&lt;br /&gt;If an error where to occur you can see the error by hovering over the error field.&lt;br /&gt;Create bulk deletion jobs&lt;br /&gt;You can correct the error or do minor changes in the tool's datagrid itself. Only the changed records will be sent to CRM upon update&lt;br /&gt;Choose the csv delimiters&lt;br /&gt;Define your own color codes for errors, changes, uploaded &lt;/span&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;a href="http://2.bp.blogspot.com/_Ky8MLSxenl8/Ss4mWKHNrjI/AAAAAAAAAGo/xvJp5Q3sX_Q/s1600-h/1.jpg"&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5390287966122651186" style="WIDTH: 350px; CURSOR: hand; HEIGHT: 400px" alt="" src="http://2.bp.blogspot.com/_Ky8MLSxenl8/Ss4mWKHNrjI/AAAAAAAAAGo/xvJp5Q3sX_Q/s400/1.jpg" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;a href="http://1.bp.blogspot.com/_Ky8MLSxenl8/Ss4mkabj4KI/AAAAAAAAAGw/e7U6K7qRjuU/s1600-h/2.jpg"&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5390288211021127842" style="WIDTH: 400px; CURSOR: hand; HEIGHT: 232px" alt="" src="http://1.bp.blogspot.com/_Ky8MLSxenl8/Ss4mkabj4KI/AAAAAAAAAGw/e7U6K7qRjuU/s400/2.jpg" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_Ky8MLSxenl8/Ss4mt8Is_vI/AAAAAAAAAG4/pSYe0ZkG1PM/s1600-h/3.jpg"&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5390288374687661810" style="WIDTH: 400px; CURSOR: hand; HEIGHT: 263px" alt="" src="http://4.bp.blogspot.com/_Ky8MLSxenl8/Ss4mt8Is_vI/AAAAAAAAAG4/pSYe0ZkG1PM/s400/3.jpg" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4058165759694816344-2358490880531768775?l=crmdelacreme.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://mscrmbulkupdatetool.codeplex.com/' title='Microsoft Dynamics CRM Bulk Update and Export tool'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/2358490880531768775'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/2358490880531768775'/><link rel='alternate' type='text/html' href='http://crmdelacreme.blogspot.com/2009/10/microsoft-dynamics-crm-bulk-update-and.html' title='Microsoft Dynamics CRM Bulk Update and Export tool'/><author><name>Tiaan van Niekerk</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Ky8MLSxenl8/S86MPSGeVPI/AAAAAAAAAO0/Ln5Gkx7EP5I/S220/Snapshot+of+me+4.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_Ky8MLSxenl8/Ss4mWKHNrjI/AAAAAAAAAGo/xvJp5Q3sX_Q/s72-c/1.jpg' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-4058165759694816344.post-5514334948733584256</id><published>2009-09-23T06:17:00.001+02:00</published><updated>2009-09-23T06:45:44.779+02:00</updated><title type='text'>CRM 4.0 Software prerequisites</title><content type='html'>&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;strong&gt;Not running on 2008 platform&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;In addition to the software prerequisites below,&lt;br /&gt;the Main Admin Account (which will be the Main Service account in CRM) to be used in the CRM 4.0 Install&lt;br /&gt;must be a local administrator on the CRM Application Server, and possibly on the SQL Server as well.&lt;br /&gt;&lt;br /&gt;Also the Main Admin Account must have full+extended privileges on the specified Organizational Unit (OU) in Active Directory (AD)...&lt;br /&gt;&lt;br /&gt;For the CRM Server (IIS Server), the following must be installed:&lt;br /&gt;1. Windows Server 2003 (Standard or Enterprise Edition, preferably Enterprise Edition on Production) with Service Pack 2&lt;br /&gt;2. IIS 6 (with all options installed)&lt;br /&gt;3. Also Windows Indexing Service&lt;br /&gt;&lt;br /&gt;Please note that the following services must then be running on the CRM Server (IIS Server):&lt;br /&gt;- Indexing Service&lt;br /&gt;- World Wide Web Publishing&lt;br /&gt;- IIS Admin Service&lt;br /&gt;&lt;br /&gt;Then the actual CRM install will go and install the rest of the software listed below (from Microsoft_Dynamics_CRM_IG_Installing.doc, Section 2-8, Page 15):&lt;br /&gt;(Please note that Microsoft .Net Framework 2 and Microsoft .Net Framework 3 can and be installed before this)&lt;br /&gt;• SQL Server 2005 Reporting Services Report Viewer control&lt;br /&gt;• Microsoft SQL Server Native Client&lt;br /&gt;• Microsoft Application Error Reporting tool&lt;br /&gt;• Microsoft Visual C++ Runtime Library&lt;br /&gt;• MSXML 6&lt;br /&gt;• Microsoft .NET Framework 3.0, which includes the following components:&lt;br /&gt;o .NET Framework 2.0 (required by Microsoft Dynamics CRM Server)&lt;br /&gt;o Windows® Workflow Foundation (required by Microsoft Dynamics CRM Server)&lt;br /&gt;o Windows Presentation Foundation&lt;br /&gt;o Windows Communication Foundation&lt;br /&gt;&lt;br /&gt;And the SQL Server 2005 Server must have SQL Server 2005 (Standard or Enterprise Edition, preferably Enterprise Edition on Production)&lt;br /&gt;with the following SQL Server components installed with Service Pack 2 applied on them:&lt;br /&gt;1. SQL Server 2005 Database Engine with SP2&lt;br /&gt;2. SQL Server 2005 Agent with SP2&lt;br /&gt;3. SQL Server 2005 Reporting Services with SP2&lt;br /&gt;4. SQL Server 2005 Full Text Search with SP2&lt;br /&gt;&lt;br /&gt;I think that about covers it, but If I missed anything, perhaps the other guys can spot it… &lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4058165759694816344-5514334948733584256?l=crmdelacreme.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/5514334948733584256'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/5514334948733584256'/><link rel='alternate' type='text/html' href='http://crmdelacreme.blogspot.com/2009/09/crm-40-software-prerequisites.html' title='CRM 4.0 Software prerequisites'/><author><name>Tiaan van Niekerk</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Ky8MLSxenl8/S86MPSGeVPI/AAAAAAAAAO0/Ln5Gkx7EP5I/S220/Snapshot+of+me+4.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-4058165759694816344.post-9204372369748843630</id><published>2009-09-02T07:40:00.004+02:00</published><updated>2010-02-10T06:05:05.763+02:00</updated><title type='text'>Some useful CRMform jscripts</title><content type='html'>&amp;lt;span style=&amp;quot;font-family:arial;font-size:85%;&amp;quot;&amp;gt;/*&lt;br /&gt;function isFormInCreateMode()&lt;br /&gt;function isFormInUpdateMode()&lt;br /&gt;isFormActive = function()&lt;br /&gt;hideNavBarItemById = function(navBarItemId)&lt;br /&gt;setNavBarItemVisibilityByName = function(sectionName, itemName, visible)&lt;br /&gt;hideNavBarItemByName = function(sectionName, itemName)&lt;br /&gt;showNavBarItemByName = function(sectionName, itemName)&lt;br /&gt;setFormEnabled = function(enabled)&lt;br /&gt;hideTabById = function(tabId)&lt;br /&gt;hideTabByName = function(tabName)&lt;br /&gt;setControlEnabled = function(fieldObject, enabled)&lt;br /&gt;setFieldRequired = function(fieldObject)&lt;br /&gt;setFieldRecommended = function(fieldObject)&lt;br /&gt;setFieldNotRequired = function(fieldObject)&lt;br /&gt;refParam = function()&lt;br /&gt;getLastKnownGood = function(fieldObject)&lt;br /&gt;setLastKnownGood = function(fieldObject, value)&lt;br /&gt;captureLastKnownGood = function(fieldObject)&lt;br /&gt;restoreLastKnownGood = function(fieldObject)&lt;br /&gt;hookValidationOnChange = function(fieldObject)&lt;br /&gt;hookValidationOnBlur = function(fieldObject)&lt;br /&gt;hookValidation = function(fieldObject, functionPointer, optionalFocusFieldObject)&lt;br /&gt;performValidation = function()&lt;br /&gt;function guidString4()&lt;br /&gt;createGuid = function()&lt;br /&gt;hideActionMenuItem = function(itemName)&lt;br /&gt;HideAssociatedViewButtons = function(loadAreaId, buttonTitles)&lt;br /&gt;&lt;br /&gt;*/&lt;br /&gt;&lt;br /&gt;&amp;lt;strong&amp;gt;// Check if form in CREATE mode&amp;lt;/strong&amp;gt;&lt;br /&gt;isFormInCreateMode = function()&lt;br /&gt;{&lt;br /&gt;if (crmForm.FormType == 1)&lt;br /&gt;return true;&lt;br /&gt;else&lt;br /&gt;return false;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&amp;lt;strong&amp;gt;// Check if form in UPDATE mode&lt;br /&gt;&amp;lt;/strong&amp;gt;isFormInUpdateMode = function()&lt;br /&gt;{&lt;br /&gt;if (crmForm.FormType == 2)&lt;br /&gt;return true;&lt;br /&gt;else&lt;br /&gt;return false;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;isFormActive = function()&lt;br /&gt;{&lt;br /&gt;var active = true;&lt;br /&gt;if (crmForm.all.statecode != null &amp;amp;amp;&amp;amp;amp; crmForm.all.statecode.DataValue != null )&lt;br /&gt;active = (crmForm.all.statecode.DataValue == 0);&lt;br /&gt;if( active )&lt;br /&gt;active = (crmForm.FormType &amp;lt;&amp;gt; 4); // not readonly or disabled&lt;br /&gt;return active;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/************************************************************************************************************************/&lt;br /&gt;&amp;lt;strong&amp;gt;/* Navigation Map Functions&amp;lt;/strong&amp;gt;&lt;br /&gt;/************************************************************************************************************************/&lt;br /&gt;&lt;br /&gt;/* hide a navigation bar item */&lt;br /&gt;hideNavBarItemById = function(navBarItemId)&lt;br /&gt;{&lt;br /&gt;var navBar = document.getElementById(navBarItemId)&lt;br /&gt;&lt;br /&gt;if (navBar != null)&lt;br /&gt;{&lt;br /&gt;navBar.style.display = &amp;quot;none&amp;quot;;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&amp;lt;strong&amp;gt;/* hide a tab using the tab name as reference */&amp;lt;/strong&amp;gt;&lt;br /&gt;setNavBarSectionVisibilityByName = function( sectionName, visible )&lt;br /&gt;{&lt;br /&gt;var groups = document.getElementById(&amp;quot;crmNavBar&amp;quot;).childNodes;&lt;br /&gt;&lt;br /&gt;if( groups != null )&lt;br /&gt;{&lt;br /&gt;for( var i = 0; i &amp;lt; groups.length; i++ )&lt;br /&gt;{&lt;br /&gt;var groupName = groups[i].childNodes[0];&lt;br /&gt;&lt;br /&gt;if( groupName.innerText.trim() == sectionName )&lt;br /&gt;{&lt;br /&gt;groupName.style.display = visible ? &amp;quot;block&amp;quot; : &amp;quot;none&amp;quot;;&lt;br /&gt;groups[i].childNodes[1].style.display = visible ? &amp;quot;block&amp;quot; : &amp;quot;none&amp;quot;;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&amp;lt;strong&amp;gt;/* hide a tab using the tab name as reference */&amp;lt;/strong&amp;gt;&lt;br /&gt;setNavBarItemVisibilityByName = function( sectionName, itemName, visible )&lt;br /&gt;{&lt;br /&gt;var groups = document.getElementById(&amp;quot;crmNavBar&amp;quot;).childNodes;&lt;br /&gt;&lt;br /&gt;if( groups != null )&lt;br /&gt;{&lt;br /&gt;for( var i = 0; i &amp;lt; groups.length; i++ )&lt;br /&gt;{&lt;br /&gt;var groupName = groups[i].childNodes[0];&lt;br /&gt;&lt;br /&gt;if( groupName.innerText.trim() == sectionName )&lt;br /&gt;{&lt;br /&gt;var items = groups[i].childNodes[1].childNodes;&lt;br /&gt;for( var n = 0; n &amp;lt; items.length; n++ )&lt;br /&gt;{&lt;br /&gt;var item = items[n];&lt;br /&gt;&lt;br /&gt;if( item.innerText.trim() == itemName )&lt;br /&gt;item.style.display = visible ? &amp;quot;inline&amp;quot; : &amp;quot;none&amp;quot;;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&amp;lt;strong&amp;gt;/* hide a tab using the tab name as reference */&amp;lt;/strong&amp;gt;&lt;br /&gt;hideNavBarItemByName = function( sectionName, itemName )&lt;br /&gt;{&lt;br /&gt;setNavBarItemVisibilityByName(sectionName, itemName, false);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/* hide a tab using the tab name as reference */&lt;br /&gt;showNavBarItemByName = function( sectionName, itemName )&lt;br /&gt;{&lt;br /&gt;setNavBarItemVisibilityByName(sectionName, itemName, true);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/************************************************************************************************************************/&lt;br /&gt;&amp;lt;strong&amp;gt;/* Form Functions&amp;lt;/strong&amp;gt;&lt;br /&gt;/************************************************************************************************************************/&lt;br /&gt;&lt;br /&gt;setFormEnabled = function(enabled)&lt;br /&gt;{&lt;br /&gt;var iLen = crmForm.all.length;&lt;br /&gt;&lt;br /&gt;for (i = 0; i &amp;lt; iLen; i++)&lt;br /&gt;{&lt;br /&gt;crmForm.all[i].Disabled = !enabled;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&amp;lt;strong&amp;gt;// gets the ordinal position of a tab&amp;lt;/strong&amp;gt;&lt;br /&gt;getTabNumber = function( tabName ) {&lt;br /&gt;var tabs = document.getElementById(&amp;quot;crmTabBar&amp;quot;).childNodes;&lt;br /&gt;if( tabs != null ) {&lt;br /&gt;for (var i = 0; i &amp;lt; tabs.length; i++) {&lt;br /&gt;var tab = tabs[i];&lt;br /&gt;if (tab.innerText == tabName) {&lt;br /&gt;return i;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;return -1;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&amp;lt;strong&amp;gt;// returns a tab by name&amp;lt;/strong&amp;gt;&lt;br /&gt;getTabByName = function( tabName ) {&lt;br /&gt;var tabs = document.getElementById(&amp;quot;crmTabBar&amp;quot;).childNodes;&lt;br /&gt;if (tabs != null) {&lt;br /&gt;var num = getTabNumber(tabName);&lt;br /&gt;if( num &amp;gt;= 0 ) {&lt;br /&gt;return tabs[num];&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;return null;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&amp;lt;strong&amp;gt;/* disable or enable tab using the tab name as reference */&amp;lt;/strong&amp;gt;&lt;br /&gt;setTabEnabledByName = function(tabName, enabled)&lt;br /&gt;{&lt;br /&gt;var tab = getTabByName(tabName);&lt;br /&gt;if( tab != null ) {&lt;br /&gt;tab.disabled = !enabled;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&amp;lt;strong&amp;gt;/* hide a tab using the tab id as reference */&amp;lt;/strong&amp;gt;&lt;br /&gt;hideTabById = function(tabId)&lt;br /&gt;{&lt;br /&gt;var tab = document.getElementById(tabId);&lt;br /&gt;if( tab != null ) {&lt;br /&gt;tab.style.display = &amp;quot;none&amp;quot;;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&amp;lt;strong&amp;gt;/* hide a tab using the tab name as reference */&amp;lt;/strong&amp;gt;&lt;br /&gt;hideTabByName = function(tabName)&lt;br /&gt;{&lt;br /&gt;var tab = getTabByName(tabName);&lt;br /&gt;if( tab != null ) {&lt;br /&gt;//alert(tab.style.display);&lt;br /&gt;tab.style.display = &amp;quot;none&amp;quot;;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&amp;lt;strong&amp;gt;/* show a tab using the tab name as reference */&lt;br /&gt;&amp;lt;/strong&amp;gt;showTabByName = function(tabName)&lt;br /&gt;{&lt;br /&gt;var tab = getTabByName(tabName);&lt;br /&gt;if( tab != null ) {&lt;br /&gt;tab.style.display = &amp;quot;block&amp;quot;;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&amp;lt;strong&amp;gt;/* Enabled/disable a control by setting the disabled property and toggling &amp;quot;ms-crm-ReadOnly&amp;quot; on the classname */&amp;lt;/strong&amp;gt;&lt;br /&gt;setControlEnabled = function(fieldObject, enabled)&lt;br /&gt;{&lt;br /&gt;fieldObject.disabled = !enabled;&lt;br /&gt;&lt;br /&gt;if (!enabled &amp;amp;amp;&amp;amp;amp; fieldObject.className.indexOf(&amp;quot;ms-crm-Text&amp;quot;) &amp;gt;= 0) {&lt;br /&gt;// append readonly property to className if not already there&lt;br /&gt;if (fieldObject.className.indexOf(&amp;quot;ms-crm-ReadOnly&amp;quot;) &amp;lt; 0)&lt;br /&gt;fieldObject.className += &amp;quot; ms-crm-ReadOnly&amp;quot;;&lt;br /&gt;}&lt;br /&gt;else&lt;br /&gt;fieldObject.className = fieldObject.className.replace(/ ms-crm-ReadOnly/gi, &amp;quot;&amp;quot;);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;setFieldRequired = function(fieldObject)&lt;br /&gt;{&lt;br /&gt;crmForm.SetFieldReqLevel(fieldObject.id, 2);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;setFieldRecommended = function(fieldObject)&lt;br /&gt;{&lt;br /&gt;crmForm.SetFieldReqLevel(fieldObject.id, 1);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;setFieldNotRequired = function(fieldObject)&lt;br /&gt;{&lt;br /&gt;crmForm.SetFieldReqLevel(fieldObject.id, 0);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/************************************************************************************************************************/&lt;br /&gt;&amp;lt;strong&amp;gt;/* Validation base functions&amp;lt;/strong&amp;gt;&lt;br /&gt;/************************************************************************************************************************/&lt;br /&gt;&lt;br /&gt;/* represents a parameter object to be passed by reference&lt;br /&gt;* use param.setValue from a function to set the return value of the parameter&lt;br /&gt;* use param.getValue to read the returned value&lt;br /&gt;*/&lt;br /&gt;refParam = function()&lt;br /&gt;{&lt;br /&gt;this.array = new Array(1);&lt;br /&gt;this.setValue = function(v) { this.array[0] = v; }&lt;br /&gt;this.getValue = function() { return this.array[0]; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/* gets/captures/restores the value of the field as the last known good value */&lt;br /&gt;getLastKnownGood = function(fieldObject)&lt;br /&gt;{&lt;br /&gt;return fieldObject.getAttribute(&amp;quot;lastKnownGood&amp;quot;);&lt;br /&gt;}&lt;br /&gt;setLastKnownGood = function(fieldObject, value)&lt;br /&gt;{&lt;br /&gt;fieldObject.setAttribute(&amp;quot;lastKnownGood&amp;quot;, value);&lt;br /&gt;}&lt;br /&gt;captureLastKnownGood = function(fieldObject)&lt;br /&gt;{&lt;br /&gt;setLastKnownGood(fieldObject, fieldObject.DataValue);&lt;br /&gt;}&lt;br /&gt;restoreLastKnownGood = function(fieldObject)&lt;br /&gt;{&lt;br /&gt;fieldObject.DataValue = getLastKnownGood(fieldObject);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;* captures last known good value (captureLastKnownGood)&lt;br /&gt;* hooks validation of the field onto the &amp;quot;onchange&amp;quot; event&lt;br /&gt;*/&lt;br /&gt;hookValidationOnChange = function(fieldObject)&lt;br /&gt;{&lt;br /&gt;fieldObject.setAttribute(&amp;quot;onblur&amp;quot;, null);&lt;br /&gt;fieldObject.setAttribute(&amp;quot;onchange&amp;quot;, performValidation);&lt;br /&gt;}&lt;br /&gt;hookValidationOnBlur = function(fieldObject)&lt;br /&gt;{&lt;br /&gt;fieldObject.setAttribute(&amp;quot;onchange&amp;quot;, null);&lt;br /&gt;fieldObject.setAttribute(&amp;quot;onblur&amp;quot;, performValidation);&lt;br /&gt;}&lt;br /&gt;hookValidation = function(fieldObject, functionPointer, optionalFocusFieldObject)&lt;br /&gt;{&lt;br /&gt;captureLastKnownGood(fieldObject);&lt;br /&gt;fieldObject.setAttribute(&amp;quot;validationFunction&amp;quot;, functionPointer);&lt;br /&gt;if( optionalFocusFieldObject != null )&lt;br /&gt;fieldObject.setAttribute(&amp;quot;focusFieldObject&amp;quot;, optionalFocusFieldObject);&lt;br /&gt;fieldObject.setAttribute(&amp;quot;onchange&amp;quot;, performValidation);&lt;br /&gt;}&lt;br /&gt;performValidation = function()&lt;br /&gt;{&lt;br /&gt;var fieldObject = event.srcElement;&lt;br /&gt;if( fieldObject.DataValue != getLastKnownGood(fieldObject) )&lt;br /&gt;{&lt;br /&gt;var functionPointer = fieldObject.getAttribute(&amp;quot;validationFunction&amp;quot;);&lt;br /&gt;&lt;br /&gt;var message = new refParam();&lt;br /&gt;var valid = functionPointer(fieldObject, message);&lt;br /&gt;&lt;br /&gt;if( !valid )&lt;br /&gt;{&lt;br /&gt;var msg = message.getValue() + &amp;quot;rnnWould you like to correct the value?&amp;quot;;&lt;br /&gt;if( confirm(msg) )&lt;br /&gt;{&lt;br /&gt;var focusObject = fieldObject.getAttribute(&amp;quot;focusFieldObject&amp;quot;);&lt;br /&gt;if( focusObject == null )&lt;br /&gt;focusObject = fieldObject;&lt;br /&gt;else&lt;br /&gt;{&lt;br /&gt;captureLastKnownGood(fieldObject);&lt;br /&gt;hookValidationOnChange(fieldObject);&lt;br /&gt;setLastKnownGood(focusObject, null);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;focusObject.SetFocus();&lt;br /&gt;event.returnValue = false;&lt;br /&gt;hookValidationOnBlur(focusObject);&lt;br /&gt;}&lt;br /&gt;else&lt;br /&gt;{&lt;br /&gt;restoreLastKnownGood(fieldObject);&lt;br /&gt;hookValidationOnChange(fieldObject);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;else&lt;br /&gt;{&lt;br /&gt;captureLastKnownGood(fieldObject);&lt;br /&gt;hookValidationOnChange(fieldObject);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;else&lt;br /&gt;hookValidationOnChange(fieldObject);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;guidString4 = function()&lt;br /&gt;{&lt;br /&gt;return (((1 + Math.random()) * 0x10000) 0).toString(16).substring(1);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;createGuid = function()&lt;br /&gt;{&lt;br /&gt;return (guidString4() + guidString4() + &amp;quot;-&amp;quot; + guidString4() + &amp;quot;-&amp;quot; + guidString4() + &amp;quot;-&amp;quot; + guidString4() + &amp;quot;-&amp;quot; + guidString4() + guidString4() + guidString4()).toUpperCase();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&amp;lt;strong&amp;gt;/* hide action menu item */&amp;lt;/strong&amp;gt;&lt;br /&gt;hideActionMenuItem = function(itemName)&lt;br /&gt;{&lt;br /&gt;var element = document.getElementById(itemName)&lt;br /&gt;&lt;br /&gt;if (element != null) {&lt;br /&gt;element.style.display = &amp;quot;none&amp;quot;;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;hideActionMenuDeleteButton = function()&lt;br /&gt;{&lt;br /&gt;hideActionMenuItem(&amp;quot;_MIonActionMenuClickdelete&amp;quot; + crmForm.ObjectTypeCode);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;hideActionMenuDeactivateButton = function()&lt;br /&gt;{&lt;br /&gt;hideActionMenuItem(&amp;quot;_MIchangeStatedeactivate&amp;quot; + crmForm.ObjectTypeCode + &amp;quot;5&amp;quot;);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;hideActionMenuActivateButton = function()&lt;br /&gt;{&lt;br /&gt;hideActionMenuItem(&amp;quot;_MIchangeStateactivate&amp;quot; + crmForm.ObjectTypeCode + &amp;quot;6&amp;quot;);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/* Hides the associated Views buttons. i.e Hides the add existing button. */&lt;br /&gt;/* NB: If called multiple times, the settings of the previous calls are overwritten by the final one! */&lt;br /&gt;/* A menu element on the &amp;quot;More actions&amp;quot; drop-down menu can be hidden&lt;br /&gt;* by adding a string such as &amp;#039;More Actions::Activate&amp;#039; to the buttonTitles array.&lt;br /&gt;*/&lt;br /&gt;HideAssociatedViewButtons = function(loadAreaId, buttonTitles)&lt;br /&gt;{&lt;br /&gt;var navElement = document.getElementById(&amp;#039;nav_&amp;#039; + loadAreaId);&lt;br /&gt;if (navElement != null)&lt;br /&gt;{&lt;br /&gt;navElement.onclick = function LoadAreaOverride()&lt;br /&gt;{&lt;br /&gt;// Call the original CRM method to launch the navigation link and create area iFrame&lt;br /&gt;loadArea(loadAreaId);&lt;br /&gt;HideViewButtons(document.getElementById(loadAreaId + &amp;#039;Frame&amp;#039;), buttonTitles);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&amp;lt;strong&amp;gt;/* Used internally by the &amp;#039;HideAssociatedViewButtons&amp;#039; method */&amp;lt;/strong&amp;gt;&lt;br /&gt;HideViewButtons = function(Iframe, buttonTitles)&lt;br /&gt;{&lt;br /&gt;if (Iframe != null)&lt;br /&gt;{&lt;br /&gt;Iframe.onreadystatechange = function HideTitledButtons()&lt;br /&gt;{&lt;br /&gt;if (Iframe.readyState == &amp;#039;complete&amp;#039;)&lt;br /&gt;{&lt;br /&gt;var iFrame = frames[window.event.srcElement.id];&lt;br /&gt;var liElements = iFrame.document.getElementsByTagName(&amp;#039;li&amp;#039;);&lt;br /&gt;for (var j = 0; j &amp;lt; buttonTitles.length; j++)&lt;br /&gt;{&lt;br /&gt;buttonTitleParts = buttonTitles[j].split(&amp;#039;::&amp;#039;);&lt;br /&gt;if (buttonTitleParts.length &amp;gt; 0)&lt;br /&gt;{&lt;br /&gt;buttonTitle = buttonTitleParts[0];&lt;br /&gt;for (var i = 0; i &amp;lt; liElements.length; i++)&lt;br /&gt;{&lt;br /&gt;liElement = liElements[i];&lt;br /&gt;if (liElement.getAttribute(&amp;#039;title&amp;#039;) == buttonTitle)&lt;br /&gt;{&lt;br /&gt;if (buttonTitleParts.length == 1)&lt;br /&gt;{&lt;br /&gt;liElement.style.display = &amp;#039;none&amp;#039;;&lt;br /&gt;break;&lt;br /&gt;}&lt;br /&gt;else&lt;br /&gt;{&lt;br /&gt;/* We want to hide a menu item in a drop-down menu.&lt;br /&gt;Find the descendant text element with the specified text.&lt;br /&gt;Then find its parent list item and hide it:&lt;br /&gt;*/&lt;br /&gt;menuText = buttonTitleParts[1];&lt;br /&gt;var spanElements = liElement.getElementsByTagName(&amp;#039;span&amp;#039;);&lt;br /&gt;&lt;br /&gt;for (var k = 0; k &amp;lt; spanElements.length; k++)&lt;br /&gt;{&lt;br /&gt;spanElement = spanElements[k];&lt;br /&gt;if (spanElement.className == &amp;#039;ms-crm-MenuItem-Text&amp;#039; )&lt;br /&gt;{&lt;br /&gt;textElement = spanElement.firstChild;&lt;br /&gt;if (textElement != null &amp;amp;amp;&amp;amp;amp; textElement.nodeType == 3) /* 3 = Node.TEXT_NODE */&lt;br /&gt;{&lt;br /&gt;if (textElement.data == menuText)&lt;br /&gt;{&lt;br /&gt;liMenuItemElement&lt;br /&gt;= spanElement.parentNode.parentNode.parentNode;&lt;br /&gt;liMenuItemElement.style.display = &amp;#039;none&amp;#039;;&lt;br /&gt;break;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&amp;lt;strong&amp;gt;// Load up a CRM entity into an iframe - typically the main view screen&amp;lt;/strong&amp;gt;&lt;br /&gt;getCRMFormSource = function(tabSet)&lt;br /&gt;{&lt;br /&gt;if (crmForm.ObjectId != null)&lt;br /&gt;{&lt;br /&gt;var oId = crmForm.ObjectId;&lt;br /&gt;var oType = crmForm.ObjectTypeCode;&lt;br /&gt;var security = crmFormSubmit.crmFormSubmitSecurity.value;&lt;br /&gt;&lt;br /&gt;return &amp;quot;/userdefined/areas.aspx?oId=&amp;quot; + oId + &amp;quot;&amp;amp;amp;oType=&amp;quot; + oType + &amp;quot;&amp;amp;amp;security=&amp;quot; + security + &amp;quot;&amp;amp;amp;tabSet=&amp;quot; + tabSet;&lt;br /&gt;}&lt;br /&gt;else&lt;br /&gt;{&lt;br /&gt;return &amp;quot;about:blank&amp;quot;;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;setVisibilityOfSectionContainingField = function(crmField, visibility)&lt;br /&gt;{&lt;br /&gt;if (visibility)&lt;br /&gt;{&lt;br /&gt;crmField.parentElement.parentElement.parentElement.style.display = &amp;#039;block&amp;#039;;&lt;br /&gt;}&lt;br /&gt;else&lt;br /&gt;{&lt;br /&gt;crmField.parentElement.parentElement.parentElement.style.display = &amp;#039;none&amp;#039;;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;hideSectionContainingField = function(crmField)&lt;br /&gt;{&lt;br /&gt;setVisibilityOfSectionContainingField(crmField, false);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;setVisibilityOfSectionWithName = function(tabNumber, sectionName, visibility)&lt;br /&gt;{&lt;br /&gt;var tab = document.getElementById(&amp;#039;tab&amp;#039; + tabNumber.toString());&lt;br /&gt;if (tab != null)&lt;br /&gt;{&lt;br /&gt;var tdElements = tab.getElementsByTagName(&amp;#039;td&amp;#039;);&lt;br /&gt;for (var i = 0; i &amp;lt; tdElements.length; i++)&lt;br /&gt;{&lt;br /&gt;tdElement = tdElements[i];&lt;br /&gt;if (tdElement.className == &amp;#039;ms-crm-Form-Section ms-crm-Form-SectionBar&amp;#039;)&lt;br /&gt;{&lt;br /&gt;textElement = tdElement.firstChild;&lt;br /&gt;if (textElement != null &amp;amp;amp;&amp;amp;amp; textElement.nodeType == 3) /* 3 = Node.TEXT_NODE */&lt;br /&gt;{&lt;br /&gt;if (textElement.data == sectionName)&lt;br /&gt;{&lt;br /&gt;trSectionElement&lt;br /&gt;= tdElement.parentNode.parentNode.parentNode.parentNode.parentNode;&lt;br /&gt;&lt;br /&gt;if (visibility)&lt;br /&gt;{&lt;br /&gt;trSectionElement.style.display = &amp;#039;block&amp;#039;;&lt;br /&gt;}&lt;br /&gt;else&lt;br /&gt;{&lt;br /&gt;trSectionElement.style.display = &amp;#039;none&amp;#039;;&lt;br /&gt;}&lt;br /&gt;return true;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;} &lt;br /&gt;return false;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;hideSectionWithName = function(tabNumber, sectionName)&lt;br /&gt;{&lt;br /&gt;return setVisibilityOfSectionWithName(tabNumber, sectionName, false);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;hideSection = function(tabName, sectionName) {&lt;br /&gt;var tabNumber = getTabNumber(tabName);&lt;br /&gt;return setVisibilityOfSectionWithName(tabNumber, sectionName, false);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;showSection = function(tabName, sectionName) {&lt;br /&gt;var tabNumber = getTabNumber(tabName);&lt;br /&gt;return setVisibilityOfSectionWithName(tabNumber, sectionName, true);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;showModalWindow = function(url, objectparams, x, y, height, width)&lt;br /&gt;{&lt;br /&gt;return window.showModalDialog(url, objectparams,&lt;br /&gt;(height != null ? &amp;quot;dialogHeight:&amp;quot; + height.toString() + &amp;quot;px;&amp;quot; : &amp;quot;&amp;quot;) +&lt;br /&gt;(width != null ? &amp;quot;dialogWidth:&amp;quot; + width.toString() + &amp;quot;px;&amp;quot; : &amp;quot;&amp;quot;) +&lt;br /&gt;(y != null ? &amp;quot;dialogTop:&amp;quot; + y.toString() + &amp;quot;px;&amp;quot; : &amp;quot;&amp;quot;) +&lt;br /&gt;(x != null ? &amp;quot;dialogLeft:&amp;quot; + x.toString() + &amp;quot;px;&amp;quot; : &amp;quot;&amp;quot;) +&lt;br /&gt;&amp;quot;center:Yes;&amp;quot; +&lt;br /&gt;&amp;quot;help:No;&amp;quot; +&lt;br /&gt;&amp;quot;resizable:No;&amp;quot; +&lt;br /&gt;&amp;quot;scroll:No;&amp;quot; +&lt;br /&gt;&amp;quot;status:No;&amp;quot;);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;FetchViewer = function( iframeId ) &lt;br /&gt;{ &lt;br /&gt;var Instance = this; &lt;br /&gt;var vDynamicForm; &lt;br /&gt;var m_iframeTab; &lt;br /&gt;var m_iframeDoc; &lt;br /&gt;&lt;br /&gt;Instance.Entity = &amp;quot;&amp;quot;; &lt;br /&gt;Instance.Iframe = null; &lt;br /&gt;Instance.FetchXml = &amp;quot;&amp;quot;; &lt;br /&gt;Instance.QueryId = &amp;quot;&amp;quot;; &lt;br /&gt;Instance.LayoutXml = &amp;quot;&amp;quot;; &lt;br /&gt;&lt;br /&gt;Instance.RegisterOnTab = function( tabIndex ) &lt;br /&gt;{ &lt;br /&gt;Instance.Iframe = document.getElementById( iframeId ); &lt;br /&gt;&lt;br /&gt;if( !Instance.Iframe ) &lt;br /&gt;return alert( &amp;quot;Iframe &amp;quot; + iframeId + &amp;quot; is undefined&amp;quot; ); &lt;br /&gt;&lt;br /&gt;m_iframeDoc = getIframeDocument(); &lt;br /&gt;var loadingGifHTML = &amp;quot;&amp;lt;table height=&amp;quot;&amp;#039;100%&amp;#039;&amp;quot; width=&amp;quot;&amp;#039;100%&amp;#039;&amp;quot; style=&amp;quot;&amp;#039;cursor:wait&amp;#039;&amp;quot;&amp;gt;&amp;quot;; &lt;br /&gt;loadingGifHTML += &amp;quot;&amp;lt;tr&amp;gt;&amp;quot;; &lt;br /&gt;loadingGifHTML += &amp;quot;&amp;lt;td valign=&amp;quot;&amp;#039;middle&amp;#039;&amp;quot; align=&amp;quot;&amp;#039;center&amp;#039;&amp;quot;&amp;gt;&amp;quot;; &lt;br /&gt;loadingGifHTML += &amp;quot;&amp;lt;img alt=&amp;quot;&amp;#039;&amp;#039;&amp;quot; src=&amp;quot;&amp;#039;/_imgs/AdvFind/progress.gif&amp;#039;/&amp;quot; /&amp;gt;&amp;quot;; &lt;br /&gt;loadingGifHTML += &amp;quot;&amp;lt;div/&amp;gt;&amp;lt;b&amp;gt;Loading View...&amp;lt;/b&amp;gt;&amp;quot;; &lt;br /&gt;loadingGifHTML += &amp;quot;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&amp;quot;; &lt;br /&gt;m_iframeDoc.body.innerHTML = loadingGifHTML; &lt;br /&gt;&lt;br /&gt;if( parseInt( &amp;quot;0&amp;quot; + tabIndex ) == 0 ) Instance.Refresh(); &lt;br /&gt;else Instance.Iframe.attachEvent( &amp;quot;onreadystatechange&amp;quot; , RefreshOnReadyStateChange ); &lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;function RefreshOnReadyStateChange() &lt;br /&gt;{ &lt;br /&gt;if( Instance.Iframe.readyState != &amp;#039;complete&amp;#039; ) &lt;br /&gt;return; &lt;br /&gt;&lt;br /&gt;Instance.Refresh(); &lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;Instance.Refresh = function() &lt;br /&gt;{ &lt;br /&gt;if( !Instance.Iframe ) &lt;br /&gt;return alert( &amp;quot;Iframe &amp;quot; + iframeId + &amp;quot; is undefined&amp;quot; ); &lt;br /&gt;&lt;br /&gt;m_iframeDoc = getIframeDocument(); &lt;br /&gt;&lt;br /&gt;Instance.Iframe.detachEvent( &amp;quot;onreadystatechange&amp;quot; , RefreshOnReadyStateChange ); &lt;br /&gt;&lt;br /&gt;var create = m_iframeDoc.createElement; &lt;br /&gt;var append1 = m_iframeDoc.appendChild; &lt;br /&gt;vDynamicForm = create(&amp;quot;&amp;lt;form name=&amp;quot;&amp;#039;vDynamicForm&amp;#039;&amp;quot; method=&amp;quot;&amp;#039;post&amp;#039;&amp;quot;&amp;gt;&amp;quot;); &lt;br /&gt;&lt;br /&gt;var append2 = vDynamicForm.appendChild; &lt;br /&gt;append2(create(&amp;quot;&amp;lt;input type=&amp;quot;&amp;#039;hidden&amp;#039;&amp;quot; name=&amp;quot;&amp;#039;FetchXml&amp;#039;&amp;quot;&amp;gt;&amp;quot;)); &lt;br /&gt;append2(create(&amp;quot;&amp;lt;input type=&amp;quot;&amp;#039;hidden&amp;#039;&amp;quot; name=&amp;quot;&amp;#039;LayoutXml&amp;#039;&amp;quot;&amp;gt;&amp;quot;)); &lt;br /&gt;append2(create(&amp;quot;&amp;lt;input type=&amp;quot;&amp;#039;hidden&amp;#039;&amp;quot; name=&amp;quot;&amp;#039;EntityName&amp;#039;&amp;quot;&amp;gt;&amp;quot;)); &lt;br /&gt;append2(create(&amp;quot;&amp;lt;input type=&amp;quot;&amp;#039;hidden&amp;#039;&amp;quot; name=&amp;quot;&amp;#039;DefaultAdvFindViewId&amp;#039;&amp;quot;&amp;gt;&amp;quot;)); &lt;br /&gt;append2(create(&amp;quot;&amp;lt;input type=&amp;quot;&amp;#039;hidden&amp;#039;&amp;quot; name=&amp;quot;&amp;#039;ViewType&amp;#039;&amp;quot;&amp;gt;&amp;quot;)); &lt;br /&gt;append1( vDynamicForm ); &lt;br /&gt;&lt;br /&gt;vDynamicForm.action = prependOrgName(&amp;quot;/AdvancedFind/fetchData.aspx&amp;quot;); &lt;br /&gt;vDynamicForm.FetchXml.value = Instance.FetchXml; &lt;br /&gt;vDynamicForm.LayoutXml.value = Instance.LayoutXml; &lt;br /&gt;vDynamicForm.EntityName.value = Instance.Entity; &lt;br /&gt;vDynamicForm.DefaultAdvFindViewId.value = Instance.QueryId; &lt;br /&gt;vDynamicForm.ViewType.value = 1039; &lt;br /&gt;vDynamicForm.submit(); &lt;br /&gt;&lt;br /&gt;Instance.Iframe.attachEvent( &amp;quot;onreadystatechange&amp;quot; , OnViewReady ); &lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;function OnViewReady() &lt;br /&gt;{ &lt;br /&gt;if( Instance.Iframe.readyState != &amp;#039;complete&amp;#039; ) return; &lt;br /&gt;&lt;br /&gt;Instance.Iframe.style.border = 0; &lt;br /&gt;Instance.Iframe.detachEvent( &amp;quot;onreadystatechange&amp;quot; , OnViewReady ); &lt;br /&gt;m_iframeDoc = getIframeDocument(); &lt;br /&gt;m_iframeDoc.body.scroll = &amp;quot;no&amp;quot;; &lt;br /&gt;m_iframeDoc.body.style.padding = &amp;quot;0px&amp;quot;; &lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;getIframeDocument = function()&lt;br /&gt;{ &lt;br /&gt;return Instance.Iframe.contentWindow.document;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&amp;lt;strong&amp;gt;// Set custom form title&amp;lt;/strong&amp;gt;&lt;br /&gt;setFormTitle = function(title)&lt;br /&gt;{&lt;br /&gt;document.all.crmMenuBar.nextSibling.rows[0].cells[1].childNodes[0].innerText = title;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;setLookupEnabled = function(control, enabled)&lt;br /&gt;{&lt;br /&gt;control.Disabled = !enabled;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;strong&amp;gt;/****************** BUTTONS *************************/&amp;lt;/strong&amp;gt;&lt;br /&gt;// Get an element in a document by it&amp;#039;s class name&lt;br /&gt;// Parameters:&lt;br /&gt;// oElm = starting element&lt;br /&gt;// strTagName = tags to filter on, e.g. TR or * for all&lt;br /&gt;// oClassNames = arraylist of class names to find&lt;br /&gt;// Returns:&lt;br /&gt;// array of elements found&lt;br /&gt;function getElementsByClassName(oElm, strTagName, oClassNames){&lt;br /&gt;var arrElements = (strTagName == &amp;quot;*&amp;quot; &amp;amp;amp;&amp;amp;amp; oElm.all)? oElm.all : oElm.getElementsByTagName(strTagName);&lt;br /&gt;var arrReturnElements = new Array();&lt;br /&gt;var arrRegExpClassNames = new Array();&lt;br /&gt;if(typeof oClassNames == &amp;quot;object&amp;quot;){&lt;br /&gt;for(var i=0; i&amp;lt;oClassNames.length; i++){&lt;br /&gt;arrRegExpClassNames.push(new RegExp(&amp;quot;(^s)&amp;quot; + oClassNames[i].replace(/-/g, &amp;quot;-&amp;quot;) + &amp;quot;(s$)&amp;quot;));&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;else{&lt;br /&gt;arrRegExpClassNames.push(new RegExp(&amp;quot;(^s)&amp;quot; + oClassNames.replace(/-/g, &amp;quot;-&amp;quot;) + &amp;quot;(s$)&amp;quot;));&lt;br /&gt;}&lt;br /&gt;var oElement;&lt;br /&gt;var bMatchesAll;&lt;br /&gt;for(var j=0; j&amp;lt;arrElements.length; j++){&lt;br /&gt;oElement = arrElements[j];&lt;br /&gt;bMatchesAll = true;&lt;br /&gt;for(var k=0; k&amp;lt;arrRegExpClassNames.length; k++){&lt;br /&gt;if(!arrRegExpClassNames[k].test(oElement.className)){&lt;br /&gt;bMatchesAll = false;&lt;br /&gt;break;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;if(bMatchesAll){&lt;br /&gt;arrReturnElements.push(oElement);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;return (arrReturnElements)&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&amp;lt;strong&amp;gt;// hide the entire grid menu bar of normal CRM grid view&amp;lt;/strong&amp;gt;&lt;br /&gt;hideGridViewMenuBar = function(document)&lt;br /&gt;{&lt;br /&gt;if (document != null)&lt;br /&gt;{&lt;br /&gt;var menuBar = document.getElementById(&amp;#039;gridMenuBar&amp;#039;);&lt;br /&gt;&lt;br /&gt;if (menuBar != null)&lt;br /&gt;{&lt;br /&gt;menuBar.style.display = &amp;quot;none&amp;quot;;&lt;br /&gt;}&lt;br /&gt;} &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&amp;lt;strong&amp;gt;// hide the entire grid view bar of normal CRM grid view&amp;lt;/strong&amp;gt;&lt;br /&gt;hideGridViewGridBar = function(document)&lt;br /&gt;{&lt;br /&gt;if (document != null)&lt;br /&gt;{&lt;br /&gt;var gridBar = document.getElementById(&amp;#039;gridBar&amp;#039;);&lt;br /&gt;&lt;br /&gt;if (gridBar != null)&lt;br /&gt;{&lt;br /&gt;gridBar.style.display = &amp;quot;none&amp;quot;;&lt;br /&gt;}&lt;br /&gt;} &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&amp;lt;strong&amp;gt;// Hide all the menu items/buttons on a menu bar of normal CRM grid view. &lt;br /&gt;// The menu bar will still be visible when done&amp;lt;/strong&amp;gt;&lt;br /&gt;hideAllGridViewMenuBarButtons = function(document)&lt;br /&gt;{&lt;br /&gt;if (document != null)&lt;br /&gt;{&lt;br /&gt;var menuBar = getElementsByClassName(document, &amp;quot;ul&amp;quot;, &amp;quot;ms-crm-MenuBar-Left&amp;quot;);&lt;br /&gt;&lt;br /&gt;if (menuBar != null &amp;amp;amp;&amp;amp;amp; menuBar.length &amp;gt; 0)&lt;br /&gt;{&lt;br /&gt;menuBar[0].style.display = &amp;quot;none&amp;quot;;&lt;br /&gt;}&lt;br /&gt;} &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&amp;lt;strong&amp;gt;// hide the status bar of normal CRM grid view.&amp;lt;/strong&amp;gt; &lt;br /&gt;hideGridViewStatusBar = function(document)&lt;br /&gt;{&lt;br /&gt;if (document != null)&lt;br /&gt;{&lt;br /&gt;var menuBar = getElementsByClassName(document, &amp;quot;tr&amp;quot;, &amp;quot;ms-crm-List-StatusBar&amp;quot;);&lt;br /&gt;&lt;br /&gt;if (menuBar != null &amp;amp;amp;&amp;amp;amp; menuBar.length &amp;gt; 0)&lt;br /&gt;{&lt;br /&gt;menuBar[0].style.display = &amp;quot;none&amp;quot;;&lt;br /&gt;}&lt;br /&gt;} &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&amp;lt;strong&amp;gt;// add a button to the grid menu bar&amp;lt;/strong&amp;gt;&lt;br /&gt;addGridViewMenuButton = function(document, text, toolTipText, image, javaScriptString)&lt;br /&gt;{&lt;br /&gt;var buttonScript = &amp;quot;&amp;lt;li class=&amp;quot;ms-crm-Menu&amp;quot; tabindex=&amp;quot;-1&amp;quot; title=&amp;quot;&amp;#039;&amp;quot; action=&amp;quot;&amp;quot; onclick=&amp;quot;&amp;#039;window.execScript(action)&amp;#039;&amp;quot;&amp;gt;&amp;quot;;&lt;br /&gt;buttonScript += &amp;quot; &amp;lt;span class=&amp;quot;ms-crm-Menu-Label&amp;quot;&amp;gt;&amp;quot;;&lt;br /&gt;buttonScript += &amp;quot; &amp;lt;a class=&amp;quot;ms-crm-Menu-Label&amp;quot; tabindex=&amp;quot;-1&amp;quot; onclick=&amp;quot;&amp;#039;return&amp;quot; href=&amp;quot;&amp;#039;javascript:onclick();&amp;#039;&amp;quot; target=&amp;quot;_self&amp;quot;&amp;gt;&amp;quot;;&lt;br /&gt;&lt;br /&gt;if (image != null)&lt;br /&gt;{&lt;br /&gt;buttonScript += &amp;quot; &amp;lt;img class=&amp;quot;ms-crm-Menu-ButtonFirst&amp;quot; tabindex=&amp;quot;-1&amp;quot; alt=&amp;quot;&amp;#039;&amp;quot; src=&amp;quot;&amp;#039;/_imgs/vieweditor/&amp;quot; /&amp;gt;&amp;quot;;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;buttonScript += &amp;quot; &amp;lt;span class=&amp;quot;ms-crm-MenuItem-TextRTL&amp;quot; tabindex=&amp;quot;0&amp;quot;&amp;gt;&amp;quot; + text + &amp;quot;&amp;lt;/span&amp;gt;&amp;quot;;&lt;br /&gt;buttonScript += &amp;quot; &amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;buttonScript += &amp;quot; &amp;lt;/span&amp;gt;&amp;quot;;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4058165759694816344-9204372369748843630?l=crmdelacreme.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/9204372369748843630'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/9204372369748843630'/><link rel='alternate' type='text/html' href='http://crmdelacreme.blogspot.com/2009/09/some-useful-crmform-jscripts.html' title='Some useful CRMform jscripts'/><author><name>Tiaan van Niekerk</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Ky8MLSxenl8/S86MPSGeVPI/AAAAAAAAAO0/Ln5Gkx7EP5I/S220/Snapshot+of+me+4.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-4058165759694816344.post-4928771500532183493</id><published>2009-08-31T11:15:00.003+02:00</published><updated>2009-08-31T11:45:44.198+02:00</updated><title type='text'>Hiding Navigational Items based on drop down value</title><content type='html'>&lt;span style="font-family:arial;font-size:85%;"&gt;We had a request were based on a drop down value the navigational structure must show certain options based on the drop down value on the record. &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;em&gt;&lt;strong&gt;Shawn Redmond&lt;/strong&gt;&lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:78%;color:#000099;"&gt;hideNavBarItemByName("Details:", "&lt;strong&gt;Divisions&lt;/strong&gt;"); &lt;/span&gt;&lt;br /&gt;&lt;p&gt;&lt;span style="font-family:arial;font-size:78%;color:#000099;"&gt;If (crmForm.all.&lt;strong&gt;fieldname&lt;/strong&gt; != 3)&lt;br /&gt;{&lt;br /&gt;    hideNavBarByItemName(‘Details’, ‘Value1');&lt;br /&gt;    hideNavBarByItemName(‘Details’, ‘Value2');&lt;br /&gt;&lt;br /&gt;}&lt;/p&gt;hideNavBarItemByName = function( sectionName, itemName )&lt;br /&gt;{&lt;br /&gt;setNavBarItemVisibilityByName(sectionName, itemName, false);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;setNavBarItemVisibilityByName = function( sectionName, itemName, visible )&lt;br /&gt;{&lt;br /&gt;var groups = document.getElementById("crmNavBar").childNodes;&lt;br /&gt;&lt;br /&gt;if( groups != null )&lt;br /&gt;{&lt;br /&gt;for( var i = 0; i &lt; groupname =" groups[i].childNodes[0];" items =" groups[i].childNodes[1].childNodes;" n =" 0;" item =" items[n];" display =" visible"&gt;&lt;span style="font-family:arial;font-size:78%;color:#000099;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4058165759694816344-4928771500532183493?l=crmdelacreme.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/4928771500532183493'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/4928771500532183493'/><link rel='alternate' type='text/html' href='http://crmdelacreme.blogspot.com/2009/08/we-had-request-were-based-on-drop-down.html' title='Hiding Navigational Items based on drop down value'/><author><name>Tiaan van Niekerk</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Ky8MLSxenl8/S86MPSGeVPI/AAAAAAAAAO0/Ln5Gkx7EP5I/S220/Snapshot+of+me+4.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-4058165759694816344.post-7797440430591086258</id><published>2009-08-29T07:23:00.001+02:00</published><updated>2009-08-29T07:23:30.097+02:00</updated><title type='text'>Update Rollup 6 for Microsoft Dynamics CRM 4.0</title><content type='html'>&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;br /&gt;The Microsoft Dynamics CRM Sustained Engineering team released &lt;/span&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;amp;FamilyID=79f90982-c039-41c2-af8e-3119ecf27790"&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;Microsoft Dynamics CRM 4.0 Update Rollup 6&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;font-size:85%;"&gt; on Thursday, August 27, 2009.&lt;br /&gt;Below are the links to the release and related information about the Rollup. Please see the Knowledge Base (KB) article for more details about the Update Rollup 6 content and instructions.&lt;br /&gt;Microsoft Download Center: &lt;/span&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;amp;FamilyID=79f90982-c039-41c2-af8e-3119ecf27790"&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;amp;FamilyID=79f90982-c039-41c2-af8e-3119ecf27790&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;br /&gt;Microsoft Knowledge Base Article: &lt;/span&gt;&lt;a href="http://support.microsoft.com/?kbid=970148"&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;http://support.microsoft.com/?kbid=970148&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;br /&gt;Install Details about Update Rollup 6&lt;br /&gt;Update Rollup 6 is cumulative. You do not need to install any previous Update Rollups prior to Update Rollup 6&lt;br /&gt;The Update Rollup 6 client can be deployed before the server is upgraded to Update Rollup 6&lt;br /&gt;Update Rollup 6 can be uninstalled&lt;br /&gt;Steps to make Update Rollup 6 available via AutoUpdate can be found in the &lt;/span&gt;&lt;a href="http://blogs.msdn.com/crm/archive/2009/05/14/update-rollup-4-for-microsoft-dynamics-crm-4-0.aspx"&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;Update Rollup 4 blog&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;font-size:85%;"&gt; posting. The Link and Patch IDs can be found in the kb article at &lt;/span&gt;&lt;a href="http://support.microsoft.com/?kbid=970148"&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;http://support.microsoft.com/?kbid=970148&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;.&lt;br /&gt;Information about how to avoid reboots when installing the CRM Outlook Client can also be found in the &lt;/span&gt;&lt;a href="http://blogs.msdn.com/crm/archive/2009/05/14/update-rollup-4-for-microsoft-dynamics-crm-4-0.aspx"&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;Update Rollup 4 blog&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;font-size:85%;"&gt; posting.&lt;br /&gt;Update Rollup 6 and all future Update Rollups will contain Mobile Express&lt;br /&gt;The CRM team released the English version of Mobile Express on July 8, 2009 as an update to the CRM Server. Since Mobile Express is now part of the Server product it will be installed and updated as part of all Update Rollups going forward. There is a &lt;/span&gt;&lt;a href="http://blogs.msdn.com/crm/archive/2009/07/23/getting-started-crm-mobile-express.aspx"&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;Getting Started: CRM Mobile Express blog&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;font-size:85%;"&gt; that has some pointers on how to get started. The localized versions of Mobile Express will be delivered in a future update rollup.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4058165759694816344-7797440430591086258?l=crmdelacreme.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://blogs.msdn.com/crm/archive/2009/08/28/update-rollup-6-for-microsoft-dynamics-crm-4-0.aspx' title='Update Rollup 6 for Microsoft Dynamics CRM 4.0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/7797440430591086258'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/7797440430591086258'/><link rel='alternate' type='text/html' href='http://crmdelacreme.blogspot.com/2009/08/update-rollup-6-for-microsoft-dynamics.html' title='Update Rollup 6 for Microsoft Dynamics CRM 4.0'/><author><name>Tiaan van Niekerk</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Ky8MLSxenl8/S86MPSGeVPI/AAAAAAAAAO0/Ln5Gkx7EP5I/S220/Snapshot+of+me+4.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-4058165759694816344.post-6435591959722007887</id><published>2009-08-21T07:32:00.004+02:00</published><updated>2009-08-21T07:46:27.377+02:00</updated><title type='text'>CRM integration into Skydrive</title><content type='html'>&lt;p&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;Hi&lt;br /&gt;&lt;br /&gt;Last week I was asked to assist a user in Russia to integrate Skrydrive into CRM.&lt;br /&gt;Skydrive is a online document mangement system provided by Microsoft using your windows live id.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;This is fairly simple to do:&lt;/strong&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-size:85%;"&gt;&lt;em&gt;Download the CRM demonstration Toolkit and run it on the CRM server.&lt;br /&gt;Connect to your CRM installation.&lt;br /&gt;Open the SiteMap editor&lt;br /&gt;Select the "Open from CRM" option.&lt;br /&gt;&lt;/em&gt;&lt;br /&gt;You will notice that your sitemap is loaded in a easy to use UI editor.Having grouped your areas and subareas respectively.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;em&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;Add a Area called Documents&lt;br /&gt;Add Under (Documents)&lt;br /&gt;On Documents select "Add Under" this will give a window with a drop down to CRM entities and a URL.&lt;br /&gt;Use the URL Option. (You should have created a online skydrive account.Login into skydrive and copy the url for your document library.)&lt;br /&gt;Paste the Url in the URL field&lt;br /&gt;Description"Documents"&lt;br /&gt;Icon URL (Your choice of icon)&lt;br /&gt;Select "Publish to CRM"&lt;br /&gt;Open CRM /Refresh CRM &lt;/span&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;&lt;br /&gt;&lt;/em&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;You should have a Area called "Documents " in the navigational tree.&lt;br /&gt;When opening, this will open your document library on skydrive.&lt;br /&gt;&lt;br /&gt;Easy as falling out of a tree,just remember to let go of the branch.....:) &lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4058165759694816344-6435591959722007887?l=crmdelacreme.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/6435591959722007887'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/6435591959722007887'/><link rel='alternate' type='text/html' href='http://crmdelacreme.blogspot.com/2009/08/crm-integration-into-skydrive.html' title='CRM integration into Skydrive'/><author><name>Tiaan van Niekerk</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Ky8MLSxenl8/S86MPSGeVPI/AAAAAAAAAO0/Ln5Gkx7EP5I/S220/Snapshot+of+me+4.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-4058165759694816344.post-3124106859818514720</id><published>2009-08-20T08:03:00.001+02:00</published><updated>2009-08-20T08:20:06.607+02:00</updated><title type='text'>Microsoft CRM Information Documentation</title><content type='html'>&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;&lt;strong&gt;Microsoft CRM Information PDF's&lt;br /&gt;&lt;/strong&gt;Top 10 Compelling Reasons to Use CRM &lt;/span&gt;&lt;/span&gt;&lt;a href="http://bizitpro.com/images/uploads/CRM_Top_Ten_Reasons.pdf"&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;Download&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;br /&gt;Customer Case Studies &lt;/span&gt;&lt;a href="http://bizitpro.com/images/uploads/MicrosofDynamicsCRMCustomerShowcaseBrochure_08_051_LoRes1.pdf"&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;Download&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;br /&gt;What’s New in MS CRM 4.0 &lt;/span&gt;&lt;a href="http://bizitpro.com/images/uploads/Microsoft_Dynamics_CRM_4.0_Whats_New_Datasheet.pdf"&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;Download&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;br /&gt;Sales Force Automation Overview &lt;/span&gt;&lt;a href="http://bizitpro.com/images/uploads/Microsoft_Dynamics_CRM_Sales_Automation_Brochure_2008_02_15.pdf"&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;Download&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;br /&gt;Marketing Automation Overview &lt;/span&gt;&lt;a href="http://bizitpro.com/images/uploads/Microsoft_Dynamics_CRM_Marketing_Brochure_2008_02_15.pdf"&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;Download&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;br /&gt;Customer Service Overview &lt;/span&gt;&lt;a href="http://bizitpro.com/images/uploads/Microsoft_Dynamics_Customer_Service_Brochure_2008_02_15.pdf"&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;Download&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;br /&gt;MS CRM 4.0 What’s New Top 60 Datasheet &lt;/span&gt;&lt;a href="http://bizitpro.com/images/uploads/MicrosoftDynamicsCRMTop60Guide.pdf"&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;Download&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;font-size:85%;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;br /&gt;&lt;strong&gt;Microsoft CRM Additional Information &lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;Implementing MS CRM 4.0 &lt;/span&gt;&lt;a href="http://bizitpro.com/images/uploads/ImplementingMSCRM.zip"&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;Download&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;br /&gt;Microsoft Dynamics CRM 4.0 Users Guide &lt;/span&gt;&lt;a href="http://bizitpro.com/images/uploads/Microsoft_Dynamics_CRM_4_Users_Guide.pdf"&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;Download&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;Optimizing &amp;amp; Maintaining CRM 4.0 whitepaper &lt;/span&gt;&lt;a href="http://bizitpro.com/images/uploads/MSCRM4_Optimizing_and_Maintaining.docx"&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;Download&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;font-size:85%;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4058165759694816344-3124106859818514720?l=crmdelacreme.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/3124106859818514720'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/3124106859818514720'/><link rel='alternate' type='text/html' href='http://crmdelacreme.blogspot.com/2009/08/microsoft-crm-information-documentation.html' title='Microsoft CRM Information Documentation'/><author><name>Tiaan van Niekerk</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Ky8MLSxenl8/S86MPSGeVPI/AAAAAAAAAO0/Ln5Gkx7EP5I/S220/Snapshot+of+me+4.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-4058165759694816344.post-3599341355229377415</id><published>2009-08-20T07:59:00.004+02:00</published><updated>2009-08-20T08:02:31.699+02:00</updated><title type='text'>Preparing for your CRM Certication made easy with -Richard Knudson’s Dynamics CRM Trick Bag</title><content type='html'>&lt;a onclick="javascript:pageTracker._trackPageview('/outbound/article/www.imginc.com');" href="http://www.imginc.com/Media%20Library/Assessments/CRM_Applications/demo_applications_assessment.htm" target="_blank"&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;Demo practice test for Dynamics CRM Applications exam MB 632&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;font-size:85%;"&gt; (20 questions)&lt;br /&gt;&lt;/span&gt;&lt;a onclick="javascript:pageTracker._trackPageview('/outbound/article/www.imginc.com');" href="http://www.imginc.com/Media%20Library/Assessments/CRM_Installation/installation_assessment.htm" target="_blank"&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;Demo practice test for Dynamics CRM Installation exam MB 633 &lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;(15 questions)&lt;br /&gt;&lt;/span&gt;&lt;a onclick="javascript:pageTracker._trackPageview('/outbound/article/www.imginc.com');" href="http://www.imginc.com/Media%20Library/Assessments/CRM_Customization/Demo%20Customization%20Assessment.htm" target="_blank"&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;Demo practice test for Dynamics CRM Customization exam MB 631&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;font-size:85%;"&gt; (20 questions)&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4058165759694816344-3599341355229377415?l=crmdelacreme.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.dynamicscrmtrickbag.com/category/certification/' title='Preparing for your CRM Certication made easy with -Richard Knudson’s Dynamics CRM Trick Bag'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/3599341355229377415'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/3599341355229377415'/><link rel='alternate' type='text/html' href='http://crmdelacreme.blogspot.com/2009/08/preparing-for-your-crm-certication-mad.html' title='Preparing for your CRM Certication made easy with -Richard Knudson’s Dynamics CRM Trick Bag'/><author><name>Tiaan van Niekerk</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Ky8MLSxenl8/S86MPSGeVPI/AAAAAAAAAO0/Ln5Gkx7EP5I/S220/Snapshot+of+me+4.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-4058165759694816344.post-6024850443924316937</id><published>2009-08-18T07:45:00.001+02:00</published><updated>2009-08-18T07:49:27.721+02:00</updated><title type='text'>Microsoft CRM 4.0 Update Rollup Best Practices</title><content type='html'>&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;strong&gt;Found a great right-up on Rollup's&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;strong&gt;Updates: Microsoft CRM 4.0 Update Rollup Best Practices&lt;/strong&gt; &lt;/span&gt;&lt;br /&gt;&lt;p&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;Frank Lee&lt;br /&gt;&lt;a href="http://microsoft-crm.spaces.live.com/?_c11_BlogPart_BlogPart=blogview&amp;amp;_c=BlogPart&amp;amp;partqs=cat%3dMicrosoft%2520CRM%2520Update"&gt;http://microsoft-crm.spaces.live.com/?_c11_BlogPart_BlogPart=blogview&amp;amp;_c=BlogPart&amp;amp;partqs=cat%3dMicrosoft%2520CRM%2520Update&lt;/a&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;br /&gt;You may have noticed that the Microsoft CRM Update Rollups are being released on a regular basis like every 2 months since Update Rollup 2. This is much more frequent then the previous update release schedule (6 to 9 months). So how do Small Medium Businesses (SMB) manage this given the more frequent updates?&lt;br /&gt;&lt;strong&gt;Here are three approaches and my notes on each one:&lt;br /&gt;&lt;/strong&gt;1. Only apply Update Rollup as needed to solve bugs/issues&lt;br /&gt;- requires the least amount of administration resource, but could result in the highest reactive situation when encountering CRM issues/bugs that are solved by an Update Rollup&lt;br /&gt;2. Apply every Update Rollup upon being released&lt;br /&gt;- requires the most amount of administration effort to update the CRM Server and all of the CRM Outlook Clients upon each release of an Update Rollup. However, this offers the highest avoidance of CRM issues/bugs that are solved by Update Rollups&lt;br /&gt;3. Apply Update Rollup on every 4, 5, or 6 months cycle&lt;br /&gt;- a good balance of administration resource and risk avoidance due to CRM issues/bugs that are solved by an Update Rollup. As for 4, 5, or 6 - it would be your preference.&lt;br /&gt;Guess which approach I'd recommend for most SMBs? Yup, number 3. I'd personally select the every 4 months cycle.&lt;br /&gt;&lt;strong&gt;Some good practices on deploying Update Rollups:&lt;br /&gt;&lt;/strong&gt;1. Always backup your CRM environment per the Update Rollup instructions prior to applying the Update Rollup. If you have a test environment (I highly recommended having one), apply the Update Rollup there first.&lt;br /&gt;2. Wait two weeks after the release of an Update Rollup before applying it - just like any software, Update Rollup may contain some bugs itself. There were some Update Rollups in the past that were "re-released" due to issues/bugs arised from the Update Rollup. If this does happen, contact Microsoft CRM Support immediately for resolution. And if you had waited after two weeks, you would mostly enjoy the benefit that a work-around/resolution is available due to Support already encountered the issue already. No need to be the very first to apply an Update Rollup in production unless it fixes a specific issue/bug&lt;br /&gt;3. It is not necessary to apply both the CRM Server Update and CRM Outlook Client Update at the same time. I do highly recommend they are both applied the same time to get the latest fixes to all your CRM enviornments (Server and Outlook Clients). However, it is OK to apply the CRM Server Update first, and then apply the CRM Outlook Client Update the next few days/weeks. Or the other way around - apply the CRM Outlook Client Update first and then apply the CRM Server Update afterwards&lt;br /&gt;4. Most SMB doesn't have a large CRM Users count, but if yours do, then I would look into auto deployment of the CRM Outlook Client Update to save time. Reference the Microsoft CRM 4.0 Implementation Guide - Microsoft_Dynamics_CRM_IG_Operating.doc, section "Automatically update Microsoft Dynamics CRM for Outlook" for details&lt;br /&gt;5. If you had encountered a bug/issue and have not apply the latest Update Rollup yet. What should you do? I would open a CRM Support Incident via CustomerSource - if the bug is a bug and "not a feature" then there is no cost to the Support Incident and you would get a resolution from the CRM Support engineer to either apply the latest Update Rollup, a Hot Fix, or other work-around.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4058165759694816344-6024850443924316937?l=crmdelacreme.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://microsoft-crm.spaces.live.com/?_c11_BlogPart_BlogPart=blogview&amp;_c=BlogPart&amp;partqs=cat%3dMicrosoft%2520CRM%2520Update' title='Microsoft CRM 4.0 Update Rollup Best Practices'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/6024850443924316937'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/6024850443924316937'/><link rel='alternate' type='text/html' href='http://crmdelacreme.blogspot.com/2009/08/microsoft-crm-40-update-rollup-best.html' title='Microsoft CRM 4.0 Update Rollup Best Practices'/><author><name>Tiaan van Niekerk</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Ky8MLSxenl8/S86MPSGeVPI/AAAAAAAAAO0/Ln5Gkx7EP5I/S220/Snapshot+of+me+4.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-4058165759694816344.post-569512491106438189</id><published>2009-08-18T07:23:00.004+02:00</published><updated>2009-08-18T07:37:01.686+02:00</updated><title type='text'>Configuring Microsoft Dynamics CRM 4.0 for Internet-facing deployment</title><content type='html'>&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;span style="font-size:100%;"&gt;&lt;strong&gt;Configuring Microsoft Dynamics CRM 4.0 for Internet-facing deployment&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;em&gt;Published: February 13, 2009 Updated: May 15, 2009&lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;br /&gt;This document describes configuring Microsoft Dynamics CRM (On-Premise Edition) for Internet-facing deployment (IFD), and a few of the common issues and resolutions associated with Microsoft Dynamics CRM IFD.&lt;br /&gt;You can deploy Microsoft Dynamics CRM (On-Premise Edition) using one of the following deployment types:&lt;br /&gt;·         Microsoft Dynamics CRM for internal users only&lt;br /&gt;·         Microsoft Dynamics CRM for internal users and IFD access&lt;br /&gt;·         Microsoft Dynamics CRM for IFD-only access&lt;br /&gt;For more information about configuring Microsoft Dynamics CRM for Internet access only, see Internal Network Address under the "IFD configuration properties details" section in this article.&lt;br /&gt;Microsoft Dynamics CRM uses Integrated Windows authentication to authenticate internal users. Integrated Windows authentication implements pass-through authentication functionality so that Microsoft Dynamics CRM users are not prompted a second time to log in to Microsoft Dynamics CRM after their initial sign on to the Active Directory network.&lt;br /&gt;Configuring IFD for Microsoft Dynamics CRM enables access to Microsoft Dynamics CRM from the Internet, outside of the company firewall, without using a VPN solution. Microsoft Dynamics CRM configured for Internet access uses forms authentication to verify credentials of external users. When configuring Microsoft Dynamics CRM for Internet access, Integrated Windows Authentication must remain for internal users.&lt;br /&gt;Configuring IFD sets the Microsoft Dynamics CRM Web site to use anonymous authentication for external users, and provides a sign on page to capture users' credentials and obtain an authentication ticket cookie. Microsoft Dynamics CRM IFD checks for a valid CRM ticket cookie before processing the page request. When a page request does not contain a valid CRM ticket, the page request is redirected to the sign-on page. A page request with an expired CRM ticket is also redirected to the sign-on page. Users access the Microsoft Dynamics CRM Web site by typing the IFD URL in Internet Explorer. Because this type of authentication sends user credentials and passwords using clear text, you should always configure Microsoft Dynamics CRM using a Secure Sockets Layer (SSL). For more information about SSL, see &lt;/span&gt;&lt;a href="http://rc.crm.dynamics.com/rc/regcont/en_us/OP/articles/secure_comm.aspx"&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;Make Microsoft Dynamics CRM 4.0 client-to-server network communications more secure&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;. For more information about forms authentication and IFD, see &lt;/span&gt;&lt;a href="http://go.microsoft.com/fwlink/?LinkId=132468"&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;Web Form (IFD) Authentication&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;. For more information about forms authentication with active directory, see &lt;/span&gt;&lt;a href="http://go.microsoft.com/fwlink/?LinkId=132472"&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;Forms Authentication in ASP.NET&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;.&lt;br /&gt;On This Page&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;a href="http://rc.crm.dynamics.com/rc/regcont/en_us/op/articles/ifd_common_issues.aspx#ID0EHMAC"&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;Common Issues&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;a name="ID0E3D"&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;strong&gt;Methods available to configure IFD&lt;/strong&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;You can deploy Microsoft Dynamics CRM for IFD by using one of the following methods:&lt;br /&gt;· During Microsoft Dynamics CRM Server installation or upgrade.&lt;br /&gt;o    Install a new deployment of Microsoft Dynamics CRM (On-Premise Edition) using command-line options and an XML configuration file that contains IFD configuration information (specified in the following topic).&lt;br /&gt;o    Upgrade from Microsoft Dynamics CRM 3.0 to Microsoft Dynamics CRM (On-Premise Edition) using command-line options and an XML configuration file that contains IFD configuration information (described in the following topic).&lt;br /&gt;· Configure an existing deployment using the Microsoft Dynamics CRM Internet Facing Deployment Configuration tool. Configure an existing deployment of Microsoft Dynamics CRM that did not use an XML configuration file that contained IFD configuration information (described in the following topic). To configure the existing deployment, download and run the &lt;/span&gt;&lt;a href="http://go.microsoft.com/fwlink/?LinkId=140146"&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;Microsoft Dynamics CRM Internet Facing Deployment Configuration Tool&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;font-size:85%;"&gt; (described in the topic below).&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;&lt;/span&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;a name="ID0EKF"&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;strong&gt;Configure during Microsoft Dynamics CRM Server installation or upgrade&lt;/strong&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;When using the command-line option to deploy a new installation of Microsoft Dynamics CRM or upgrade from Microsoft Dynamics CRM 3.0, you can enable IFD by adding the &lt;ifdsettings&gt; element to a Microsoft Dynamics CRM Server Setup XML configuration file. The &lt;ifdsettings&gt; element must be defined under the &lt;crmsetup&gt;&lt;server&gt; elements. When the &lt;ifdsettings&gt; enabled element is set to true (&lt;ifdsettings enabled="true"&gt;), Microsoft Dynamics CRM Server Setup configures the deployment for access from the Internet. Additional information is required to make the Web site accessible from the Internet. For more information see, "Use the Command Line to Install Microsoft Dynamics CRM" in the Installing Guide in the &lt;/span&gt;&lt;a href="http://go.microsoft.com/fwlink/?LinkID=107128"&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;Microsoft Dynamics CRM 4.0 Implementation Guide&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;. The Microsoft Dynamics CRM Server Setup XML configuration file makes the same changes as the Microsoft Dynamics CRM Internet Facing Deployment Configuration tool, see the table below for the list of properties that are added or updated. The configuration file should look similar to the following example:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;br /&gt;&lt;em&gt;&lt;ifdsettings enabled="true"&gt;&lt;br /&gt;        &lt;internalnetworkaddress&gt;157.55.160.202-255.255.255.255&lt;/internalnetworkaddress&gt;&lt;br /&gt;        &lt;rootdomainscheme&gt;https&lt;/rootdomainscheme&gt;&lt;br /&gt;        &lt;sdkrootdomain&gt;mysubDomain.myDomain.com:443&lt;/sdkrootdomain&gt;&lt;br /&gt;        &lt;webapplicationrootdomain&gt;mysubDomain.myDomain.com:443&lt;/webapplicationrootdomain&gt;&lt;br /&gt;&lt;/ifdsettings&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;/em&gt;&lt;br /&gt;For more information about the IFD deployment properties in the &lt;ifdsettings&gt; element see, the IFD Configuration Properties on this post by clicking on the post link.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;a name="ID0EQG"&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;strong&gt;Configure an existing deployment using Microsoft Dynamics CRM Internet Facing Deployment Configuration tool&lt;/strong&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;The Microsoft Dynamics CRM Internet Facing Deployment Configuration tool adds a node to the web.config file for IFD settings, creates deployment properties in the MSCRM_config database, and adds a registry key to Microsoft Dynamics CRM Server enabling Internet-facing access. You can use the Internet Facing Deployment Configuration tool after installing or upgrading to Microsoft Dynamics CRM. You can also use this tool any time you want to change the IFD configuration properties.&lt;br /&gt;Read the &lt;/span&gt;&lt;a href="http://go.microsoft.com/fwlink/?LinkId=140077"&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;Microsoft Dynamics CRM 4.0 Internet Facing Deployment Scenarios&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;font-size:85%;"&gt; document for specific configuration scenarios and instructions to help you successfully implement Microsoft Dynamics CRM IFD.&lt;br /&gt;You can also get detailed instructions for using the Microsoft Dynamics CRM Internet Facing Deployment Configuration tool in &lt;/span&gt;&lt;a href="http://go.microsoft.com/fwlink/?LinkId=114765"&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;How to use the Microsoft Dynamics CRM Internet Facing Deployment Configuration tool&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;.&lt;br /&gt;Note&lt;br /&gt;To update other configuration fields, download and run the Microsoft Dynamics CRM Internet Facing Deployment Configuration tool from &lt;/span&gt;&lt;a href="http://go.microsoft.com/fwlink/?LinkId=114765"&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;Microsoft Dynamics CRM 4.0: Planning and Deployment Guidance for Service Providers&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;.&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;a name="ID0EKHAC"&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;strong&gt;IFD configuration properties details&lt;/strong&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;Internal Network Address&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;br /&gt;When you configure Microsoft Dynamics CRM for IFD using the Internet Facing Deployment Configuration tool or using an XML configuration file, on initial Microsoft Dynamics CRM installations only, you are adding a new Windows registry key. The IfdInternalNetworkAddress registry key contains the IP addresses and subnet masks for internal computers using Microsoft Dynamics CRM. The registry key location is&lt;br /&gt;&lt;br /&gt;&lt;em&gt;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSCRM&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;When a user submits a page request, the Microsoft Dynamics CRM Server compares the user's IP address and subnet mask with the values in the registry key to determine which authentication type to use, anonymous access authentication for Internet access or Integrated Windows authentication for internal users. For example, the IP addresses and subnet masks of your Microsoft Dynamics CRM users are as follows:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;10.10.1.1-255.255.255.0,157.55.164.93-255.255.255.0&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;When the subnet is 255.255.255.0 and the IP address are 10.10.1.1 or 157.55.164.93 then any IP address that starts with 10.10.1 or 157.55.164 is considered internal.&lt;br /&gt;When a user requests a Microsoft Dynamics CRM page and the user's IP address and subnet masks is 157.55.165.22-255.255.254.0 and the IP address and subnet mask is not found, Microsoft Dynamics CRM uses forms authentication to display a sign on page. Any IP addresses and subnet masks not in the Internal Network Address registry key cause the Microsoft Dynamics CRM Server to respond with the IFD sign on page to request the user's credentials.&lt;br /&gt;If users are accessing Microsoft Dynamics CRM from multiple subnets, you must update the IfdInternalNetworkAddress registry value to reflect the different subnets. When you have more than 1 subnet, you can add multiple values to the IfdInternalNetworkAddress registry key. Separate the values using a comma but do not add a space after the comma.&lt;br /&gt;To configure Microsoft Dynamics CRM for IFD only access, enter the IP address to the Microsoft Dynamics CRM Server and a subnet mask of 255.255.255.255. Then only those page requests from the Microsoft Dynamics CRM Server are considered internal, and all other page requests prompt the sign on page.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;em&gt;IFD Root Domain Scheme&lt;/em&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;em&gt;&lt;/em&gt;&lt;/strong&gt;&lt;br /&gt;In the Root Domain Scheme or IFD Root Domain when using the Internet Facing Deployment Configuration tool, enter https as the value of this MSCRM_config database property when you have SSL set for the Web site.&lt;br /&gt;Important&lt;br /&gt;SSL is strongly recommended fo Internet-facing deployment of Microsoft Dynamics CRM.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;em&gt;SDK Root Domain&lt;/em&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;em&gt;&lt;/em&gt;&lt;/strong&gt;&lt;br /&gt;In the SDK Root Domain or the IFD SDK Domain when using the Internet Facing Deployment Configuration tool , enter the domain name where the SDK Server role is installed. This is used for applications that use the methods from the Microsoft Dynamics CRM Software Development Kit(SDK) as the value for this MSCRM_config database property. Add the domain name and the root domain (.com), for example mycompany.com rather than mycompany. If using a port that is not the default, then you need to include the port number in the SDK Root Domain, for example, domain.com:5555.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;em&gt;Web Application Root Domain&lt;/em&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;em&gt;&lt;/em&gt;&lt;/strong&gt;&lt;br /&gt;In the Web Application Root Domain or the IfdWebApplicationRootDomain when using the Internet Facing Deployment Configuration tool , enter the domain name only for the Microsoft Dynamics CRM Web application as the value for this MSCRM_config database property. Add the domain name and the root domain (.com), for example mycompany.com rather than mycompany. If using a port that is not the default, then you need to include the port number in the Web Application Root Domain, for example, domain.com:5555.&lt;br /&gt;Important&lt;br /&gt;When using server roles divided out to different computers, you must use different domain name values for IfdWebApplicationRootDomain and IfdSdkRootDomain. For more information, see the topic below Using Server Roles.&lt;br /&gt;Service Provide License Agreement&lt;br /&gt;ServiceProviderLicenseAgreement replaces OnPremise as the authentication strategy in the &lt;crm.authentication&gt; node of the Web.config file.&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;a name="ID0EVLAC"&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;strong&gt;&lt;em&gt;IFD URL&lt;/em&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;You must define a URL for the Microsoft Dynamics CRM IFD deployment using the following format:&lt;br /&gt;https://&lt;organization&gt;.&lt;domain&gt;&lt;br /&gt;For information about changing Microsoft Dynamics CRM port assignment, see &lt;/span&gt;&lt;a href="http://go.microsoft.com/fwlink/?LinkId=140164"&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;How to update the Microsoft Dynamics CRM Web site port after you install Microsoft Dynamics CRM 4.0&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;.&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;a name="ID0EHMAC"&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;strong&gt;&lt;em&gt;Common Issues&lt;/em&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;Use DNS host or alias record with IFD&lt;br /&gt;Create a host or alias record for each organization that plans to access Microsoft Dynamics CRM externally from the Internet. If you use host headers to uniquely identify the Microsoft Dynamics CRM Web site, you should remove the host headers and set up a Domain Name Service (DNS) alias record. This is particularly important because SSL does not work with host headers. The DNS alias record ensures that the URL address for the external and internal organization resolves correctly. The alias record is a name for your Web application that is composed of a subdomain name to identify the organization, second-level domain name to identify your company, and root domain name such as .gov, .tv. or .com. For Microsoft Dynamics CRM IFD, your DNS alias record should resemble the following:&lt;br /&gt;crm_organization_name.domain.com&lt;br /&gt;The Internet Facing Deployment Configuration tool includes a Check DNS option on the Tools menu to test DNS resolution. If you have not defined domain names in DNS, the Internet Facing Deployment Configuration tool displays a message indicating that the domain name cannot be resolved. For specific instructions, see Setup test DNS record in &lt;/span&gt;&lt;a href="http://go.microsoft.com/fwlink/?LinkID=140077"&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;How to configure an Internet-Facing Deployment for Microsoft Dynamics CRM 4.0&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;.&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;br /&gt;&lt;strong&gt;Firewall exceptions&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;&lt;br /&gt;If one or more firewalls are running between the clients and the Microsoft Dynamics CRM Server, an exception for the port used by the Microsoft Dynamics CRM Web site must be established to allow clients to connect.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Running reports&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;&lt;br /&gt;To enable complete reporting functionality for a Microsoft Dynamics CRM deployment configured for IFD, the deployment must be running the Microsoft Dynamics CRM Connector for SQL Server Reporting Services.&lt;br /&gt;When a Microsoft Dynamics CRM user runs a report from Microsoft Dynamics CRM, Microsoft SQL Server Reporting Services Viewer requests the report and data from the remote Microsoft SQL Server Reporting Services computer. To access the report, the Microsoft Dynamics CRM user enters the Microsoft Dynamics CRM server URL. Microsoft Dynamics CRM Connector for SQL Server Reporting Services runs as a Microsoft SQL Server Reporting Services data processing extension and handles the authentication in the delegated mode used for reports.&lt;br /&gt;However, the Microsoft Dynamics CRM Connector for SQL Server Reporting Services does not work with the Microsoft SQL Server 2005 Workgroup Edition because it does not support custom data extensions used in the Microsoft Dynamics CRM Connector for SQL Server Reporting Services. To resolve this issue, upgrade Microsoft SQL Server 2005 Workgroup Edition to one of the following editions:&lt;br /&gt;·         SQL Server 2005 Standard Edition&lt;br /&gt;·         SQL Server 2005 Enterprise Edition&lt;br /&gt;·         SQL Server 2008 Enterprise Edition&lt;br /&gt;·         SQL Server 2008 Standard Edition&lt;br /&gt;For specific SQL Server 2008 upgrade version information, see &lt;/span&gt;&lt;a href="http://go.microsoft.com/fwlink/?LinkId=141231"&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;SQL Server 2008 Books Online Version and Edition Upgrades&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;.&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;br /&gt;&lt;strong&gt;&lt;em&gt;Using Dynamic worksheets or Dynamic PivotTables&lt;/em&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;em&gt;&lt;/em&gt;&lt;/strong&gt;&lt;br /&gt;To export data to Dynamic worksheets or Dynamic PivotTables for Microsoft Dynamics CRM users connecting to a Microsoft Dynamics CRM IFD deployment, install and configure the Microsoft Dynamics CRM for Microsoft Office Outlook client on the computer of the Microsoft Dynamics CRM user trying to open the Dynamic worksheet. When Microsoft Dynamics CRM is not in the same domain as the client computer, Microsoft Dynamics CRM for Microsoft Office Outlook client handles the Microsoft Dynamics CRM user login credentials for the Microsoft Dynamics CRM database used in the worksheet.&lt;br /&gt;For information about securing data exported to Microsoft Office Excel, see Microsoft Dynamics CRM Team blog article &lt;/span&gt;&lt;a href="http://go.microsoft.com/fwlink/?LinkId=141233"&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;Dynamic Export to Excel feature – How to protect data over the wire&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;.&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;br /&gt;&lt;strong&gt;&lt;em&gt;Using server roles&lt;/em&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;em&gt;&lt;/em&gt;&lt;/strong&gt;&lt;br /&gt;In a Microsoft Dynamics CRM deployment you can split the configuration into two separate server role groups or separate each individual server role across multiple computers. If you configure IFD for a Microsoft Dynamics CRM deployment using server role groups or separate server roles, you must obtain different SSL certificates if the Application server role and the SDK server role are on different computers. You cannot use the same certificate for both server roles. If you did not obtain different SSL certificates defined with root domain names specific to the Application server role and SDK server role, then the DNS server detects duplicate mappings and cannot resolve the domain names. To resolve this duplicate mapping issue, assign different values in the deployment properties for the IFD App Root Domain and IFD SDK Root Domain. The value that you enter in the Internet Facing Deployment Configuration tool for the App Root Domain is the domain associated with the Application server role. The value that you enter in the Internet Facing Deployment Configuration tool for the SDK Root Domain is the domain associated with the SDK server role.&lt;br /&gt;For more information about server roles, see &lt;/span&gt;&lt;a href="http://go.microsoft.com/fwlink/?LinkID=125950"&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;Making Sense of Server Roles&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;.&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;br /&gt;&lt;strong&gt;&lt;em&gt;Configure IFD with an ISA server&lt;/em&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;After you configure Microsoft Dynamics CRM for IFD and you are using an Internet Security and Acceleration (ISA) server, any user attempts to login from the Internet are challenged for a Windows login instead of the Microsoft Dynamics CRM sign on page. This causes the user authentication to fail. You can resolve this issue by changing the configuration setting on the ISA server to Request Appear to come from Original Client. This setting causes the ISA server to interpret the request as coming from the original client IP. For this configuration setting to work, the web server must point to ISA Server's internal IP address as the Default Gateway.&lt;br /&gt;Configure IFD for a multi-forest with a perimeter network model&lt;br /&gt;When you use a perimeter network to isolate Internet-facing resources from your internal corporate network, you have to open the ports to the local area network to successfully deploy Internet-facing Microsoft Dynamics CRM. You can see an example of a perimeter network model in the Planning Guide in the &lt;/span&gt;&lt;a href="http://go.microsoft.com/fwlink/?LinkId=107055"&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;Microsoft Dynamics CRM 4.0 Implementation Guide&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;font-size:85%;"&gt; under the heading, "Multi-forest with client Internet access."&lt;br /&gt;The following information on how to configure Microsoft Dynamics CRM for IFD with a perimeter network model is from Joel Lindstrom's &lt;/span&gt;&lt;a href="http://go.microsoft.com/fwlink/?LinkId=139037"&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;CustomerEffective&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;font-size:85%;"&gt; blog. You need to do the following when using a perimeter network model:&lt;br /&gt;1.     Install and configure Microsoft Dynamics CRM.&lt;br /&gt;On an initial installation, you can install and configure Microsoft Dynamics CRM for Internet-facing access using the command-line installation options or you can wait until after you have Microsoft Dynamics CRM running and tested before configuring it for IFD.&lt;br /&gt;2.     Enable the perimeter network solution.&lt;br /&gt;3.     Open the required ports to the local area network:&lt;br /&gt;o    Microsoft SQL Server&lt;br /&gt;o    Microsoft SQL Server Reporting Services&lt;br /&gt;o    Microsoft Exchange Server 2003 or Microsoft Exchange Server 2007&lt;br /&gt;o    Domain Controllers&lt;br /&gt;For more information about Microsoft Dynamics CRM ports, see "Network ports used for Microsoft Dynamics CRM 4.0" in the Planning Guide in the &lt;/span&gt;&lt;a href="http://go.microsoft.com/fwlink/?LinkID=107128"&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;Microsoft Dynamics CRM 4.0 Implementation Guide&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;.&lt;br /&gt;4.     Test the Microsoft Dynamics CRM server to ensure that it is working as expected.&lt;br /&gt;5.     Obtain and install a wildcard SSL certificate for your Microsoft Dynamics CRM deployment.&lt;br /&gt;6.     Use the Internet Facing Deployment Configuration tool to set up the IFD deployment. While using the IFD tool, verify that the DNS values resolve.&lt;br /&gt; &lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4058165759694816344-569512491106438189?l=crmdelacreme.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://rc.crm.dynamics.com/rc/regcont/en_us/op/articles/ifd_common_issues.aspx' title='Configuring Microsoft Dynamics CRM 4.0 for Internet-facing deployment'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/569512491106438189'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/569512491106438189'/><link rel='alternate' type='text/html' href='http://crmdelacreme.blogspot.com/2009/08/configuring-microsoft-dynamics-crm-40.html' title='Configuring Microsoft Dynamics CRM 4.0 for Internet-facing deployment'/><author><name>Tiaan van Niekerk</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Ky8MLSxenl8/S86MPSGeVPI/AAAAAAAAAO0/Ln5Gkx7EP5I/S220/Snapshot+of+me+4.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-4058165759694816344.post-8043242002697816512</id><published>2009-08-18T06:11:00.002+02:00</published><updated>2009-08-18T06:17:45.196+02:00</updated><title type='text'>Hiding Button's on related views in CRM</title><content type='html'>&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;strong&gt;Onload:&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;HideAssociatedViewButtons = function(loadAreaId, buttonTitles)&lt;br /&gt;{&lt;br /&gt;    var navElement = document.getElementById('nav_' + loadAreaId);&lt;br /&gt;    if (navElement != null)&lt;br /&gt;    {&lt;br /&gt;        navElement.onclick = function LoadAreaOverride()&lt;br /&gt;        {&lt;br /&gt;            // Call the original CRM method to launch the navigation link and create area iFrame&lt;br /&gt;            loadArea(loadAreaId);&lt;br /&gt;            HideViewButtons(document.getElementById(loadAreaId + 'Frame'), buttonTitles);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;/* Used internally by the 'HideAssociatedViewButtons' method */&lt;br /&gt;HideViewButtons = function(Iframe, buttonTitles)&lt;br /&gt;{&lt;br /&gt;    if (Iframe != null)&lt;br /&gt;    {&lt;br /&gt;        Iframe.onreadystatechange = function HideTitledButtons()&lt;br /&gt;        {&lt;br /&gt;            if (Iframe.readyState == 'complete')&lt;br /&gt;            {&lt;br /&gt;                var iFrame = frames[window.event.srcElement.id];&lt;br /&gt;                var liElements = iFrame.document.getElementsByTagName('li');&lt;br /&gt;                for (var j = 0; j &lt; buttonTitles.length; j++)&lt;br /&gt;                {&lt;br /&gt;                    buttonTitleParts = buttonTitles[j].split('::');&lt;br /&gt;                    if (buttonTitleParts.length &gt; 0)&lt;br /&gt;                    {&lt;br /&gt;                        buttonTitle = buttonTitleParts[0];&lt;br /&gt;                        for (var i = 0; i &lt; liElements.length; i++)&lt;br /&gt;                        {&lt;br /&gt;                            liElement = liElements[i];&lt;br /&gt;                            if (liElement.getAttribute('title') == buttonTitle)&lt;br /&gt;                            {&lt;br /&gt;                                if (buttonTitleParts.length == 1)&lt;br /&gt;                                {&lt;br /&gt;                                    liElement.style.display = 'none';&lt;br /&gt;                                    break;&lt;br /&gt;                                }&lt;br /&gt;                                else&lt;br /&gt;                                {&lt;br /&gt;                                    /* We want to hide a menu item in a drop-down menu.&lt;br /&gt;                                       Find the descendant text element with the specified text.&lt;br /&gt;                                       Then find its parent list item and hide it:&lt;br /&gt;                                    */&lt;br /&gt;                                    menuText = buttonTitleParts[1];&lt;br /&gt;                                    var spanElements = liElement.getElementsByTagName('span');&lt;br /&gt;                                   &lt;br /&gt;                                    for (var k = 0; k &lt; spanElements.length; k++)&lt;br /&gt;                                    {&lt;br /&gt;                                        spanElement = spanElements[k];&lt;br /&gt;                                        if (spanElement.className == 'ms-crm-MenuItem-Text' )&lt;br /&gt;                                        {&lt;br /&gt;                                            textElement = spanElement.firstChild;&lt;br /&gt;                                            if (textElement != null &amp;amp;&amp;amp; textElement.nodeType == 3) /* 3 = Node.TEXT_NODE */&lt;br /&gt;                                            {&lt;br /&gt;                                                if (textElement.data == menuText)&lt;br /&gt;                                                {&lt;br /&gt;                                                    liMenuItemElement&lt;br /&gt;                                                        = spanElement.parentNode.parentNode.parentNode;&lt;br /&gt;                                                    liMenuItemElement.style.display = 'none';&lt;br /&gt;                                                    break;&lt;br /&gt;                                                }&lt;br /&gt;                                            }&lt;br /&gt;                                        }&lt;br /&gt;                                    }&lt;br /&gt;                                }&lt;br /&gt;                            }&lt;br /&gt;                        }&lt;br /&gt;                    }&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;HideAssociatedViewButtons("CRMRELATIONSHIP", ["Add existing XXXXto this record", "Add a new XXXX to this record"]);&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4058165759694816344-8043242002697816512?l=crmdelacreme.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/8043242002697816512'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/8043242002697816512'/><link rel='alternate' type='text/html' href='http://crmdelacreme.blogspot.com/2009/08/hiding-buttons-on-related-views-in-crm.html' title='Hiding Button&apos;s on related views in CRM'/><author><name>Tiaan van Niekerk</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Ky8MLSxenl8/S86MPSGeVPI/AAAAAAAAAO0/Ln5Gkx7EP5I/S220/Snapshot+of+me+4.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-4058165759694816344.post-7490162675732178574</id><published>2009-08-18T05:52:00.000+02:00</published><updated>2009-08-18T05:53:56.618+02:00</updated><title type='text'>Troubleshooting CRM, Kerberos, and the Error 401.1 – Unauthorized: Access is denied</title><content type='html'>&lt;span style="font-family:arial;font-size:85%;"&gt;Troubleshooting CRM, Kerberos, and the Error 401.1 – Unauthorized: Access is denied&lt;br /&gt;&lt;strong&gt;&lt;em&gt;&lt;span style="font-size:78%;"&gt;Posted on January 23, 2009 by Dan Blake &lt;/span&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;strong&gt;&lt;em&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/em&gt;&lt;/strong&gt;You install Microsoft Dynamics CRM 4.0 a&lt;/span&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;nd follow the instructions to the best of your ability only to find that when you try to access the CRM web site, it prompts you for a password three times then you get the message:&lt;br /&gt;&lt;br /&gt;You are not authorized to view this page.&lt;br /&gt;HTTP Error 401.1 – Unauthorized: Access is denied due to invalid credentials.&lt;br /&gt;&lt;br /&gt;This has got to be the #1 most common error people run into when installing Microsoft Dynamics CRM 4.0. In all of the production, testing, and development environments I have set up, the 401.1 error is the one I have spent the most time troubleshooting. It is ALWAYS caused by a problem with Kerberos and double-hop authentication. The trouble is that there are SO MANY ways you can break Kerberos. Over the weekend, I went through another marathon troubleshooting session to resolve yet another Kerberos issue. This time it was in our Sandbox (testing) hosting environment. It came down to an incorrect SPN this time.&lt;br /&gt;&lt;br /&gt;Service Principal Names (SPNs) and Delegation&lt;br /&gt;For Kerberos double-hop authentication to work, you must have the proper SPNs configured and you must configure delegation for the computer account or service account that the service runs under. For CRM, this is the identity that your CRM web site’s application pool uses.&lt;br /&gt;&lt;br /&gt;The SPNs you need to configure for Kerberos double-hop authentication to work properly are set up as follows:&lt;br /&gt;&lt;br /&gt;setspn –A HTTP/servername:5555 domain\serviceusername_or_computername&lt;br /&gt;setspn –A HTTP/servername.company.com domain\serviceusername_or_computername&lt;br /&gt;&lt;br /&gt;If you configure the application pool to use an AD user account (service account) as its identity, you should use the name of that account in the above configuration. If you use Network Service, you should use the computer name (and you won’t need to prefix it with domain\). These commands add an SPN in Active Directory. You can also use ADSIEdit to configure this. Note that you need to use the port number for the short (NetBIOS) name version of the SPN but NOT for the FQDN version. This one got me recently.&lt;br /&gt;&lt;br /&gt;Next, you need to allow delegation for the computer or service account using ADUC.&lt;br /&gt;&lt;br /&gt;Incorrect or Missing SPN&lt;br /&gt;You need to make sure that you have the correct SPN configured. Use setspn -L “computer_or_account_name” to list all SPNs for the service account and computer accounts.&lt;br /&gt;&lt;br /&gt;Ex:&lt;br /&gt;setspn -L CRMSERVERNAME&lt;br /&gt;setspn -L Domain\service_account_name&lt;br /&gt;&lt;br /&gt;In a recent troubleshooting experience, I had the port number added to the FQDN SPN and I got the following misleading error in the event log:&lt;br /&gt;&lt;br /&gt;Event Type: Error&lt;br /&gt;Event Source: Kerberos&lt;br /&gt;Event Category: None&lt;br /&gt;Event ID: 4&lt;br /&gt;Date: 1/20/2009&lt;br /&gt;Time: 1:55:03 PM&lt;br /&gt;User: N/A&lt;br /&gt;Computer: ONCCRM01 &lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/span&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;br /&gt;Description:&lt;br /&gt;The kerberos client received a KRB_AP_ERR_MODIFIED error from the server host/crmdiscoveryserver.domain.net. The target name used was HTTP/crmdiscoveryserver.domain.net. This indicates that the password used to encrypt the kerberos service ticket is different than that on the target server. Commonly, this is due to identically named machine accounts in the target realm (MSCRMHOST.NET), and the client realm. Please contact your system administrator.&lt;br /&gt;For more information, see Help and Support Center at&lt;br /&gt;&lt;br /&gt;All of the info I found while searching indicated that the problem was due to the next issue, Duplicate SPNs, when in reality, it was because Kerberos was looking for an SPN without the TCP port and I had configured it with the TCP port.&lt;br /&gt;&lt;br /&gt;Duplicate SPNs&lt;br /&gt;Duplicate SPNs can be difficult to resolve if you don’t know how.&lt;br /&gt;&lt;br /&gt;Knowledgebase Article Windows 2000 Server Prompts Domain User for Credentials describes how to use LDP and Adsiedit.msc to troubleshoot and fix a duplicate SPN problem. When you run LDP, make your search string http/* to return all SPNs configured for web sites. You can narrow that down further to http/computername* if the former string yields too many results. Do the same for host/* and MSSQLServer/* just in case.&lt;br /&gt;&lt;br /&gt;Event ID 11 — Service Principal Name Configuration&lt;br /&gt;Note the important comment that the “setspn -X” option is only available in Windows Server 2008, not 2003. If you have Server 2008, this is much simpler than using LDP which can be daunting to those unfamiliar with AD and LDAP.&lt;br /&gt;&lt;br /&gt;“Negotiate,NTLM” not configured on the web site and/or virtual directories&lt;br /&gt;Your web site must have Negotiate/NTLM configured or the client and server will not negotiate Kerberos. This is the default setting but any number of things can change this configuration. The following article discusses how to configure this parameter using adsutil. I prefer to use the Metabase Explorer in the IIS Resource kit because it lets me see all of the configuration parameters and edit them directly. Either way will work.&lt;br /&gt;&lt;br /&gt;Error message when you try to access the Microsoft Dynamics CRM Web site: “You are not authorized to view this page”&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Keepalives not enabled on the CRM web site&lt;br /&gt;Keepalives are turned on by default in IIS. If they are turned off, Kerberos will break. This is the most difficult issue I have ever had to troubleshoot related to the 401.1 error in CRM. I don’t know how it got turned off but the only thing that led me to the fix was to analyze the traffic with Netmon then use IIS Diagnostics to troubleshoot Kerberos. Use Metabase Explorer or adsutil to examine and change the keepalive setting. &lt;/span&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4058165759694816344-7490162675732178574?l=crmdelacreme.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://thecrmarchitect.com/2009/01/23/crm_401_unauthorized/' title='Troubleshooting CRM, Kerberos, and the Error 401.1 – Unauthorized: Access is denied'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/7490162675732178574'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/7490162675732178574'/><link rel='alternate' type='text/html' href='http://crmdelacreme.blogspot.com/2009/08/troubleshooting-crm-kerberos-and-error.html' title='Troubleshooting CRM, Kerberos, and the Error 401.1 – Unauthorized: Access is denied'/><author><name>Tiaan van Niekerk</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Ky8MLSxenl8/S86MPSGeVPI/AAAAAAAAAO0/Ln5Gkx7EP5I/S220/Snapshot+of+me+4.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-4058165759694816344.post-1912744351715490034</id><published>2009-08-06T06:33:00.001+02:00</published><updated>2009-08-06T06:35:11.057+02:00</updated><title type='text'>Three Top Tips for CRM 4.0 Plugin Development</title><content type='html'>&lt;span style="font-family:arial;"&gt;&lt;span style="font-size:85%;"&gt;&lt;strong&gt;Guest Post: Three Top Tips for CRM 4.0 Plugin Development&lt;/strong&gt;&lt;br /&gt;by menno&lt;br /&gt;&lt;br /&gt;Tip #1 Sign your assembly!&lt;br /&gt;This is a step that's importance isn't made blatantly clear in the SDK documentation, but is absolutely key to the successful implementation of your plugin (and also makes a huge difference to debugging successfully as well). If you follow the "create a simple plugin" walkthrough in the SDK, it is listed as step 3 here: http://msdn.microsoft.com/en-au/library/bb955365.aspx.&lt;br /&gt;&lt;br /&gt;The steps it describes are basically as follows:&lt;br /&gt;&lt;br /&gt;Right-click your project in Solution Explorer and click Properties.&lt;br /&gt;Create a new strong key file by clicking the Signing tab, select the Sign the assembly check box and select &lt;/NEW…&gt;in the drop down list.&lt;br /&gt;Type a name for your key and decide if you need to password your assembly enter the password here or if not, clear the Protect my key file with a password check box.&lt;br /&gt;Click OK.&lt;br /&gt;Save your changes by clicking the Save All button.&lt;br /&gt;The screenshot below shows the Signing Tab &amp;amp; the Create Strong Name Pop up:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Alternatively you can use the sn.exe command line tool. Once you have signed your assembly, you will see a *.snk file listed in your solution explorer.&lt;br /&gt;&lt;br /&gt;Tip #2 Register any Interops in the GAC&lt;br /&gt;In my most recent project, I was working with some COM API's to integrate into the clients Line of Business Accounting System. Visual Studio is smart enough to build a COM Interop around any (registered) dll you wish to import, which is very handy - until you try to deploy your plugin to the CRM Server &amp;amp; it has no knowledge of the Interop you are referring to in your code.&lt;br /&gt;&lt;br /&gt;You need to make sure that your interop dll is registered in the Global Assembly Cache (GAC) of the CRM Server. The first step you need to keep in mind is that to register your dll into the GAC, your assembly must be signed - so if you followed Tip #1 above you'll be fine! Once your assembly is signed, you can add it to the GAC in two ways, if your a fan of command line utilities, you can use the gacutil.exe command: gacutil /i MyComInterop.dll&lt;br /&gt;&lt;br /&gt;I however tend to prefer the GUI tools provided, such as the .NET Framework 2.0 Configuration tool. To use this:&lt;br /&gt;&lt;br /&gt;Select Microsoft .NET Framework 2.0 Configuration (CRM 4.0 uses .Net 2.0 by default) from the administrative tools menu&lt;br /&gt;Select Manage the Assembly Cache&lt;br /&gt;Click Add an Assembly to the Assembly Cache (The second option)&lt;br /&gt;&lt;br /&gt;Locate your dll using the dialog window that appears and Click Open.&lt;br /&gt;Tip #3 Use the Plugin Registration tool (in the SDK)&lt;br /&gt;The registration of plugins in CRM 4.0 is made so much easier than it used to be in CRM 3.0 - mainly due to the Plugin Registration Tool that ships with the SDK &amp;amp; can be found in the SDK\tools\pluginregistration directory. Some good instructions on how to set it up &amp;amp; use it are listed here, so I wont waste time in repeating them.&lt;br /&gt;&lt;br /&gt;What it doesn't mention is what you need to do if you update your Dll's. Initially I wasn’t sure if I had to delete &amp;amp; re-register them, or how to get CRM to recognize that I had updated my dll. If you spent any time at all writing callouts for CRM 3.0 or earlier versions, your first instinct is to stop services, copy over dll's and then restart the services. However you do not need to do this anymore (thank goodness)!&lt;br /&gt;&lt;br /&gt;Using the Plugin Registration tool, you can simply:&lt;br /&gt;&lt;br /&gt;Copy over your dll's in the server\bin\assembly\ directory&lt;br /&gt;Select the Update option for the selected plugin:&lt;br /&gt;&lt;br /&gt;Browse to the new dll file by clicking on the elipse on the update assembly window, and selecting your dll from the dialog window&lt;br /&gt;Select Load assembly&lt;br /&gt;&lt;br /&gt;Once the assembly has loaded, select Update Selected Plugins&lt;br /&gt;You will receive a confirmation popup once the system is finished that confirms what has actually been changed&lt;br /&gt;Click OK.&lt;br /&gt;All this occurs without having to restart services - so is seamless to end users and a lot less painful than it was with callouts in CRM 3.0! I really love this change for developing plugins in Microsoft Dynamics CRM 4.0.&lt;br /&gt;&lt;br /&gt;So thats it...&lt;br /&gt;So there you have it, my three top tips for CRM 4.0 plugin development. These are the 3 things that I find when working with plugins are not highly documented, but can either save you a lot of time if you know about them - or give you a lot of grief if you forget them! I hope they help you.&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4058165759694816344-1912744351715490034?l=crmdelacreme.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.tekoppele.com/Blog/post/2008/06/26/Guest-Post-Three-Top-Tips-for-CRM-40-Plugin-Development.aspx' title='Three Top Tips for CRM 4.0 Plugin Development'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/1912744351715490034'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/1912744351715490034'/><link rel='alternate' type='text/html' href='http://crmdelacreme.blogspot.com/2009/08/three-top-tips-for-crm-40-plugin.html' title='Three Top Tips for CRM 4.0 Plugin Development'/><author><name>Tiaan van Niekerk</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Ky8MLSxenl8/S86MPSGeVPI/AAAAAAAAAO0/Ln5Gkx7EP5I/S220/Snapshot+of+me+4.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-4058165759694816344.post-2739024258059480444</id><published>2009-07-30T09:37:00.000+02:00</published><updated>2009-07-30T09:38:36.464+02:00</updated><title type='text'>Installing CRM 3.0 in a SQL instance</title><content type='html'>&lt;span style="font-family:arial;font-size:85%;"&gt;If you want to use CRM 3.0 with a named SQL instance you first have to disable the Environmental Diagnostics Wizard (EDW). How to do this? I couldn’t find a way except for a couple blogs/newsgroups pointing me to a support call with Microsoft. The Microsoft CRM Support Team might not like me posting this simple solution, but I think it is crazy that we got charged a support call for something like this and hopefully my post can prevent someone else from being on hold for two hours.&lt;br /&gt;&lt;br /&gt;To disable it, you simply open RegEdit on the CRM server, browse to the MSCRM key at HKEY_LOCAL_MACHINE -&gt; SOFTWARE -&gt; Microsoft -&gt; MSCRM and add the DWORD “IgnoreChecks” and give a value of 1.&lt;br /&gt;&lt;br /&gt;You will have to reinstall CRM on the box and reconfigure what SQL server/instance you want to use there. You will get to the screen that has the warnings/errors, and the SQL line item will still give you an warning/error, but with the registry edit you can still click the Next button to proceed (without EDW disabled you can’t proceed). After finishing the install you can delete the registry entry you added. &lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4058165759694816344-2739024258059480444?l=crmdelacreme.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://kaledavis.com/2006/12/30/using-crm-with-a-sql-named-instance/' title='Installing CRM 3.0 in a SQL instance'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/2739024258059480444'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/2739024258059480444'/><link rel='alternate' type='text/html' href='http://crmdelacreme.blogspot.com/2009/07/installing-crm-30-in-sql-instance.html' title='Installing CRM 3.0 in a SQL instance'/><author><name>Tiaan van Niekerk</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Ky8MLSxenl8/S86MPSGeVPI/AAAAAAAAAO0/Ln5Gkx7EP5I/S220/Snapshot+of+me+4.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-4058165759694816344.post-2266872407271937204</id><published>2009-07-13T06:46:00.000+02:00</published><updated>2009-07-13T06:47:54.072+02:00</updated><title type='text'>Active Directory Security Groups for MSCRM</title><content type='html'>&lt;a title="Active Directory Security Groups for MSCRM" href="http://ayazahmad.wordpress.com/2007/01/26/active-directory-security-groups-for-mscrm/" rel="bookmark"&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;Active Directory Security Groups for MSCRM&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;Posted on January 26, 2007 by Ayaz Ahmad [MVP - MSCRM]&lt;br /&gt;When developing custom applications or MSCRM integration with SharePoint, security issues are the prime concerns. In order to handle these issues, one must need to know the internals of MSCRM security and how it interacts with Active Directory. Microsoft Dynamics CRM stores user information in Active Directory to provide application security. For this purpose, the following Active Directory groups are added to the Organizational Unit specified during installation:&lt;br /&gt;UserGroup&lt;br /&gt;ReportingGroup&lt;br /&gt;PrivUserGroup&lt;br /&gt;SQLAccessGroup&lt;br /&gt;UserGroupAll Microsoft CRM users. This group is updated automatically as users are added and removed from Microsoft CRM.&lt;br /&gt;ReportingGroupA group that contains all users within Microsoft CRM. This group is updated as users are added to Microsoft CRM. Users in this group have read-only access to the filtered views in the Microsoft CRM database.&lt;br /&gt;PrivUserGroupPrivileged Mi&lt;/span&gt;&lt;a title="ad1.JPG" href="http://ayazahmad.wordpress.com/?attachment_id=26" rel="attachment wp-att-26"&gt;&lt;/a&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;crosoft CRM user group for special administrative functions.&lt;br /&gt;SQLAccessGroupA group that contains Microsoft CRM ASP.NET account and other service accounts. Members in this group have full access to the Microsoft CRM database and this group is used by the Microsoft CRM platform layer. End users should never be added to this group. Now instead of adding each user and granting him access to SharePoint Libraries, try adding these security groups and setting permissions as given in the screenshot below:&lt;br /&gt;&lt;/span&gt;&lt;a title="ad1.JPG" href="http://ayazahmad.wordpress.com/?attachment_id=26" rel="attachment wp-att-26"&gt;&lt;/a&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;br /&gt;Use these two SQL queries to get these groups at your system:&lt;br /&gt;SELECT SqlAccessGroupName FROM FilteredOrganization&lt;br /&gt;SELECT ReportingGroupName FROM FilteredOrganization&lt;br /&gt;When developing applications/add-on, please consider these scenarios:&lt;br /&gt;Callout and Workflow .NET assemblies typically run under the context of the local machine’s Network Service account.&lt;br /&gt;Code called from the client using a custom script typically runs under the context of the logged on user.&lt;br /&gt;Code called from the server using an ASPX page running in a Virtual Directory or other Internet Information Services (IIS) site typically runs under the context of the logged on user.&lt;br /&gt;So, configure proper security roles to your users before setting up add-on/custom applications/callouts/workflows.&lt;br /&gt;For information on how to grant access to your user, please look into MSCRM SDK “External Components”&lt;br /&gt;For Information on how to manage security at Reports, please look into MSCRM Implementation guide “Understanding Report Permissions”. &lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4058165759694816344-2266872407271937204?l=crmdelacreme.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/2266872407271937204'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/2266872407271937204'/><link rel='alternate' type='text/html' href='http://crmdelacreme.blogspot.com/2009/07/active-directory-security-groups-for.html' title='Active Directory Security Groups for MSCRM'/><author><name>Tiaan van Niekerk</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Ky8MLSxenl8/S86MPSGeVPI/AAAAAAAAAO0/Ln5Gkx7EP5I/S220/Snapshot+of+me+4.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-4058165759694816344.post-4077980249375661977</id><published>2009-05-05T07:48:00.001+02:00</published><updated>2009-05-05T07:54:02.937+02:00</updated><title type='text'>The Business Productivity Workflow Tools Accelerator</title><content type='html'>&lt;p&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;strong&gt;The Business Productivity Workflow Tools Accelerator&lt;/strong&gt; may be a mouthful, but it might have the extra options you’ve been needing for workflow customization. Note: this release is only intended for On-Premise deployments of Microsoft Dynamics CRM 4.0.&lt;br /&gt;This accelerator was just released today, so I’ll be sure to post some feedback once I get a chance to install it and play around. If you beat me to the punch and have already reviewed it, let me know your thoughts in the comments section below!&lt;br /&gt;&lt;strong&gt;Download Link&lt;/strong&gt;&lt;br /&gt;&lt;/span&gt;&lt;a onclick="javascript:pageTracker._trackPageview('/outbound/article/http://crmaccelerators.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=26691');" href="http://crmaccelerators.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=26691"&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;Business Productivity Workflow Tools Accelerator (92 MB) [codeplex.com]&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;br /&gt;Release Notes&lt;br /&gt;The Business Productivity Workflow Tools Accelerator provides additional workflow step actions for customers to configure their workflow processes. Each custom action provides additional capabilities around string handling, mathematical functions and HTML hyperlink creation. Once this accelerator is installed workflow designers within Microsoft Dynamics CRM have more flexibility in terms of the processes they can manage through workflows.&lt;br /&gt;Documentation Excerpt&lt;br /&gt;Once installed, the Workflow Tools Accelerator provides the following new step actions in your workflow designer:&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;1. Retrieve the record ID (Guid) of the record that is driving the workflow.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;2. Generate an HTML Hyperlink for a link to the CRM record which can then be used in outbound emails. The hyperlink can display a user-friendly label rather than a long complex url, e.g. Click Here to Open CRM Contact rather than &lt;a href="http://server:port/organization/sfa/conts/edit.aspx?id=20f89e5c-4833-de11-bd89-0003ffc4b483"&gt;http://server:port/organization/sfa/conts/edit.aspx?id=20f89e5c-4833-de11-bd89-0003ffc4b483&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;3. Generate an HTML Hyperlink for a link to any URL which can then be used in outbound emails. The hyperlink can display a user-friendly label rather than a long complex url, e.g. Click Here to Register for this Event rather than &lt;a href="http://server/register.aspx?campainid=20f89e5c-4833-de11-bd89-0003ffc4b483&amp;amp;firstname=Reuben&amp;amp;lastname=Krippner"&gt;http://server/register.aspx?campainid=20f89e5c-4833-de11-bd89-0003ffc4b483&amp;amp;firstname=Reuben&amp;amp;lastname=Krippner&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;4. Generate an HTML Hyperlink for an Email link which can then be used in outbound emails. The hyperlink can display a user-friendly label rather than a long complex url, e.g. Email Us! rather than mailto:your@email.address?subject=Sales Enquiry&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;5. Join (concatenate) two strings together for use elsewhere in your workflow.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;6. Use mathematical functions on two numeric values in crm in your workflows, e.g. calculate a weighted revenue amount on a sales opportunity. You have the following math functions at your disposal:&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;a. Add (Use the “+” symbol for the Math Operator parameter )&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;b. Subtract (Use the “-“ symbol for the Math Operator parameter )&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;c. Multiply (Use the “*” symbol for the Math Operator parameter )&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;d. Divide (Use the “/” symbol for the Math Operator parameter )&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;e. Mod (remainder) (Use “MOD” for the Math Operator parameter )&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4058165759694816344-4077980249375661977?l=crmdelacreme.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://crmaccelerators.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=26691' title='The Business Productivity Workflow Tools Accelerator'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/4077980249375661977'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/4077980249375661977'/><link rel='alternate' type='text/html' href='http://crmdelacreme.blogspot.com/2009/05/business-productivity-workflow-tools.html' title='The Business Productivity Workflow Tools Accelerator'/><author><name>Tiaan van Niekerk</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Ky8MLSxenl8/S86MPSGeVPI/AAAAAAAAAO0/Ln5Gkx7EP5I/S220/Snapshot+of+me+4.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-4058165759694816344.post-3022253788610701005</id><published>2009-04-30T06:04:00.000+02:00</published><updated>2009-04-30T06:06:27.112+02:00</updated><title type='text'>Coding CRM Lookup Fields</title><content type='html'>&lt;span style="font-family:arial;"&gt;&lt;span style="font-size:85%;"&gt;&lt;strong&gt;Coding CRM Lookup Fields &lt;/strong&gt;&lt;br /&gt;A Lookup is a reference or a pointer to another record (GUID) in crm. As opposed to other crm types, lookups are handled differently in many aspects. One “interesting” aspect which I relate to here is how a lookup DataValue is assigned when used in JavaScript.&lt;br /&gt;&lt;br /&gt;The lookup DataValue is actually an array which holds a “lookup item” object or objects. Each lookup item exposes a set of properties we need to address in code for crm to acknowledge&lt;br /&gt;its value. In reality an entity with a lookup is comprised of 3 table columns, so for example the primary contact lookup field on the account entity is actually a combination of primarycontactid (guid “{1234…}”) , primarycontactidname (name “Adi Katz”) and primarycontactiddesc columns in the database.&lt;br /&gt;&lt;br /&gt;Now, crm only cares about GUIDs so until we start calling our selves by GUID (and not by NAME) we need to bridge that gap. Ms does relate to this gap, but only from the UI / End user perspective (auto complete feature). Unfortunately this ability is not exposed through code in any supported way and we need to build that bridge (automate the process) our selves using custom Ajax calls.&lt;br /&gt;&lt;br /&gt;In the simplest scenario the lookup DataValue requires only a GUID (id) and entity name(typename). For example:&lt;br /&gt;view plaincopy to clipboardprint? &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;1. var LookupItem = new Object();&lt;br /&gt;2. LookupItem.name = “Crm only cares about GUIDs (pls Save...)”;&lt;br /&gt;3. LookupItem.id = “{D04D44AD-36D0-DC11-AA32-0003FF33509E}”;&lt;br /&gt;4. LookupItem.typename = “contact”;&lt;br /&gt;5. crmForm.all.&lt;lookup&gt;.DataValue = [LookupItem];&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;The problem is that we usually don’t know the entity id (GUID) only its name e.g.&lt;br /&gt;view plaincopy to clipboardprint? &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;1. var LookupItem = new Object();&lt;br /&gt;2. LookupItem.name = “Adi Katz”;&lt;br /&gt;3. LookupItem.id = “”;&lt;br /&gt;4. LookupItem.typename = “contact”;&lt;br /&gt;5. crmForm.all.&lt;lookup&gt;.DataValue = [LookupItem];&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;And of course this won’t work unless we lookup “Adi Katz" GUID by name and assign&lt;br /&gt;it to the LookupItem.id.&lt;br /&gt;&lt;br /&gt;The following “LookupHelper” class facilitates / automates the process by providing&lt;br /&gt;the following features:&lt;br /&gt;&lt;br /&gt;If “Adi Katz” does not exist then a clean lookup dialog is opened.&lt;br /&gt;If “Adi Katz” exists more then once a lookup dialog is opened with the name “Adi Katz” inside the search box.&lt;br /&gt;If one “Adi Katz” exists then the lookup is assigned a valid DataValue&lt;br /&gt;&lt;br /&gt;The Lookup Helper works with all lookup types e.g. (single entity, customer, regarding and party lookup).&lt;br /&gt;&lt;br /&gt;In all lookups, setting the entity name will set the lookup defaulttype property so when you open the lookup dialog the entity being searched is set in advance.&lt;br /&gt;&lt;br /&gt;The OnCrmPageLoad bellow describes the How-to and possibilities you might encounter&lt;br /&gt;in your daily “lookup programming”.&lt;br /&gt;view plaincopy to clipboardprint?&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;1. var curLookup;&lt;br /&gt;2. function OnCrmPageLoad()&lt;br /&gt;3. {&lt;br /&gt;4. /*&lt;br /&gt;5. - Both GUID (id) and name are known&lt;br /&gt;6. - entity name is taken from the lookup&lt;br /&gt;7. */&lt;br /&gt;8. curLookup = new LookupHelper( "transactioncurrencyid" );&lt;br /&gt;9. curLookup.SetValue( "US Dollar" , "{944038FC-65C1-DC11-B67A-0003FFBB057D}" );&lt;br /&gt;10.&lt;br /&gt;11. /*&lt;br /&gt;12. - Search Mode&lt;br /&gt;13. - Open the lookup dialog window&lt;br /&gt;14. */&lt;br /&gt;15. curLookup = new LookupHelper( "transactioncurrencyid" );&lt;br /&gt;16. curLookup.SetValue("");&lt;br /&gt;17. /*&lt;br /&gt;18. - only GUID (id) is known (usually not the case)&lt;br /&gt;19. - name is a temporary text until you save the record&lt;br /&gt;20. */&lt;br /&gt;21. curLookup = new LookupHelper( "transactioncurrencyid" );&lt;br /&gt;22. curLookup.SetValue( "" , "{944038FC-65C1-DC11-B67A-0003FFBB057D}");&lt;br /&gt;23. /*&lt;br /&gt;24. - only name is known, the id is fetched from crm&lt;br /&gt;25. - must provide PrimaryField of the lookup entity in this case currencyname&lt;br /&gt;26. */&lt;br /&gt;27. curLookup = new LookupHelper( "transactioncurrencyid" , "currencyname" );&lt;br /&gt;28. curLookup.SetValue( "US Dollar" );&lt;br /&gt;29. //OR&lt;br /&gt;30. curLookup = new LookupHelper( "transactioncurrencyid" );&lt;br /&gt;31. curLookup.PrimaryField = "currencyname";&lt;br /&gt;32. curLookup.SetValue( "US Dollar" );&lt;br /&gt;33. /*&lt;br /&gt;34. - Customer Lookup&lt;br /&gt;35. - Change from account to contact entity&lt;br /&gt;36. - the id is fetched form crm&lt;br /&gt;37. */&lt;br /&gt;38. curLookup = new LookupHelper( "customerid" );&lt;br /&gt;39. curLookup.SetEntity( "contact" , "fullname" , "Adi Katz" );&lt;br /&gt;40. //is the same as&lt;br /&gt;41. curLookup = new LookupHelper( "customerid" );&lt;br /&gt;42. curLookup.SetEntity( "contact" );&lt;br /&gt;43. curLookup.PrimaryField = "fullname";&lt;br /&gt;44. curLookup.SetValue( "Adi Katz" );&lt;br /&gt;45. /*&lt;br /&gt;46. - getting the actual lookup field&lt;br /&gt;47. */&lt;br /&gt;48. curLookup = new LookupHelper( "customerid" );&lt;br /&gt;49. alert(curLookup.Lookup.DataValue[0].name); //assuming datavalue exists.&lt;br /&gt;50. }&lt;br /&gt;51.&lt;br /&gt;52. /*&lt;br /&gt;53. Parameters:&lt;br /&gt;54.&lt;br /&gt;55. lookupId - Mandatory, The lookup schema name.&lt;br /&gt;56. primaryField - Optional, Required for fetch. can be set here or later&lt;br /&gt;57. entity - Optional, Taken from the lookup control&lt;br /&gt;58. */&lt;br /&gt;59. function LookupHelper( lookupId , primaryField , entity )&lt;br /&gt;60. {&lt;br /&gt;61. //Lookup Reference&lt;br /&gt;62. this.Lookup = document.getElementById( lookupId );&lt;br /&gt;63. //Checks if the lookupId is valid&lt;br /&gt;64. if(isUndefined(this.Lookup))&lt;br /&gt;65. return alert('lookup ' + lookupId + ' is undefined');&lt;br /&gt;66.&lt;br /&gt;67.&lt;br /&gt;68. /* Private Fields */&lt;br /&gt;69.&lt;br /&gt;70. var Instance = this;&lt;br /&gt;71. var data = this.Lookup.lookuptypenames.split(',')[0].split(':');&lt;br /&gt;72. var Entity = isUndefined(entity)? data[0]:entity;&lt;br /&gt;73. var PK = Entity + "id";&lt;br /&gt;74.&lt;br /&gt;75. /* Public Fields */&lt;br /&gt;76.&lt;br /&gt;77. //Holds the lookup text e.g. Adi Katz&lt;br /&gt;78. this.Text = "Value Selected (Save...)";&lt;br /&gt;79. //Holds the default operator for the fetchxml condition e.g. 'fullname eq "Adi Katz"'&lt;br /&gt;80. this.Operator = "eq";&lt;br /&gt;81. //Holds the lookup entity primary field e.g. contact = fullname , account = name&lt;br /&gt;82. this.PrimaryField = primaryField;&lt;br /&gt;83.&lt;br /&gt;84. /*public Functions&lt;br /&gt;85.&lt;br /&gt;86. Descrition:&lt;br /&gt;87.&lt;br /&gt;88. Sets the Entity and PrimaryKey - Required For Fetch&lt;br /&gt;89. Sets the Primary Field - Required For Fetch&lt;br /&gt;90. Sets the Default Lookup Type - Feature for lookup popup window&lt;br /&gt;91. If the text is supplied then the id is Fetched from crm&lt;br /&gt;92.&lt;br /&gt;93. Parameters:&lt;br /&gt;94.&lt;br /&gt;95. entity - Mandatory, Required For Fetch&lt;br /&gt;96. primaryField - Mandatory (unless supplied in the ctor),Required For Fetch&lt;br /&gt;97. text - Optional&lt;br /&gt;98. */&lt;br /&gt;99.&lt;br /&gt;100. this.SetEntity = function( entity , primaryField , text )&lt;br /&gt;101. {&lt;br /&gt;102. Entity = entity;&lt;br /&gt;103. PK = entity + "id";&lt;br /&gt;104.&lt;br /&gt;105. if(!isUndefined(primaryField))&lt;br /&gt;106. Instance.PrimaryField = primaryField;&lt;br /&gt;107.&lt;br /&gt;108. var regDefType = new RegExp(entity + ":(\\d+)","gi");&lt;br /&gt;109. regDefType.exec(Instance.Lookup.lookuptypenames);&lt;br /&gt;110. Instance.Lookup.defaulttype = RegExp.$1;&lt;br /&gt;111.&lt;br /&gt;112. if(!isUndefined(text))&lt;br /&gt;113. Instance.SetValue(text);&lt;br /&gt;114. }&lt;br /&gt;115.&lt;br /&gt;116. /*&lt;br /&gt;117. Description:&lt;br /&gt;118. Sets The lookup DataValue&lt;br /&gt;119.&lt;br /&gt;120. if text is undefined and guid is supplied then&lt;br /&gt;121. use default text e.g. 'Value Selected (Save...)'&lt;br /&gt;122. else&lt;br /&gt;123. use supplied text&lt;br /&gt;124.&lt;br /&gt;125. if guid is supplied then&lt;br /&gt;126. set the lookup datavalue&lt;br /&gt;127. else if text is undefined then&lt;br /&gt;128. open clean lookup dialog&lt;br /&gt;129. else&lt;br /&gt;130. fetch for lookup item id&lt;br /&gt;131. if 1 record is returned then set datavalue&lt;br /&gt;132. else&lt;br /&gt;133. open lookup dialog with specified search condition&lt;br /&gt;134.&lt;br /&gt;135. Parameters:&lt;br /&gt;136. guid - record id - global unique identifier&lt;br /&gt;137. text - name displayed inside the lookup&lt;br /&gt;138. */&lt;br /&gt;139. this.SetValue = function( text , guid )&lt;br /&gt;140. {&lt;br /&gt;141. if(!isUndefined(text))&lt;br /&gt;142. Instance.Text = text;&lt;br /&gt;143.&lt;br /&gt;144. if(!isUndefined(guid))&lt;br /&gt;145. {&lt;br /&gt;146. var LookupItem = new Object();&lt;br /&gt;147. LookupItem.name = text;&lt;br /&gt;148. LookupItem.id = guid;&lt;br /&gt;149. LookupItem.typename = Entity;&lt;br /&gt;150. Instance.Lookup.DataValue = [LookupItem];&lt;br /&gt;151. }&lt;br /&gt;152. else if(isUndefined(text)) Search( "" );&lt;br /&gt;153. else LookupValue( text );&lt;br /&gt;154. }&lt;br /&gt;155.&lt;br /&gt;156. /* Clear Lookup Value - DataVale = null */&lt;br /&gt;157. this.Clear = function()&lt;br /&gt;158. {&lt;br /&gt;159. Instance.Lookup.DataValue = null;&lt;br /&gt;160. }&lt;br /&gt;161.&lt;br /&gt;162. /* Private Functions&lt;br /&gt;163.&lt;br /&gt;164. builds a valid Fetchxml for the current lookup type&lt;br /&gt;165. fetch value and ( set datavalue or open lookup dialog )&lt;br /&gt;166. */&lt;br /&gt;167. function LookupValue( text )&lt;br /&gt;168. {&lt;br /&gt;169. var xmlHttp = CreateXmlHttp();&lt;br /&gt;170. var xml = "&lt;/span&gt;&lt;/em&gt;&lt;/span&gt;&lt;/span&gt;&lt;?xml:namespace prefix = soap /&gt;&lt;soap:envelope soap="'\" xsi="'\" xsd="'\"&gt;&lt;span style="font-family:arial;font-size:85%;color:#009900;"&gt;&lt;em&gt;";&lt;br /&gt;174.&lt;br /&gt;175. xml += GenerateAuthenticationHeader();&lt;br /&gt;176. xml += "&lt;/em&gt;&lt;/span&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-size:85%;"&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;&lt;soap:body&gt;";&lt;br /&gt;177. xml += "&lt;fetch xmlns="'\"&gt;";&lt;br /&gt;179. xml += "&lt;fetchxml&gt;";&lt;br /&gt;180.&lt;br /&gt;181. var fetchxml = "&lt;fetch distinct="false" mapping="logical" version="1.0" format="xml-platform"&gt;";&lt;br /&gt;182.&lt;br /&gt;183. fetchxml += "&lt;entity name="'"&gt;";&lt;br /&gt;184. fetchxml += "&lt;attribute name="'"&gt;";&lt;br /&gt;185. fetchxml += "&lt;filter type="and"&gt;";&lt;br /&gt;186. fetchxml += "&lt;condition value="'" operator="'" attribute="'"&gt;";&lt;br /&gt;189. fetchxml += "&lt;/filter&gt;";&lt;br /&gt;190. fetchxml += "&lt;/entity&gt;";&lt;br /&gt;191. fetchxml += "&lt;/fetch&gt;";&lt;br /&gt;192.&lt;br /&gt;193. xml += _HtmlEncode(fetchxml);&lt;br /&gt;194. xml += "&lt;/fetchxml&gt;";&lt;br /&gt;195. xml += "&lt;/fetch&gt;";&lt;br /&gt;196. xml += "&lt;/soap:body&gt;";&lt;br /&gt;197. xml += "&lt;/span&gt;&lt;/em&gt;&lt;/span&gt;&lt;/span&gt;&lt;/soap:envelope&gt;&lt;span style="font-family:arial;font-size:85%;color:#009900;"&gt;&lt;em&gt;";&lt;br /&gt;198.&lt;br /&gt;199. xmlHttp.open("POST", "/mscrmservices/2007/crmservice.asmx", false );&lt;br /&gt;200. xmlHttp.setRequestHeader("Content-Type", "text/xml; charset=utf-8");&lt;br /&gt;201. xmlHttp.setRequestHeader("SOAPAction", "http://schemas.microsoft.com/crm/2007/WebServices/Fetch");&lt;br /&gt;202. xmlHttp.send(xml);&lt;br /&gt;203.&lt;br /&gt;204. var resultDoc = loadXmlDocument(xmlHttp.responseXML.text);&lt;br /&gt;205. var resultRecords = resultDoc.selectNodes("//" + PK );&lt;br /&gt;206.&lt;br /&gt;207. if( resultRecords.length == 1 )&lt;br /&gt;208. {&lt;br /&gt;209. var guid = resultRecords[0].text;&lt;br /&gt;210. Instance.SetValue( Instance.Text , guid );&lt;br /&gt;211. }&lt;br /&gt;212. else&lt;br /&gt;213. {&lt;br /&gt;214. Search( Instance.Text );&lt;br /&gt;215. }&lt;br /&gt;216. }&lt;br /&gt;217.&lt;br /&gt;218. /* Fill search&lt;br /&gt;219. condtion and open lookup dialog */&lt;br /&gt;220.&lt;br /&gt;221. function Search( text ){&lt;br /&gt;222. Instance.Lookup.AddParam("search" , text );&lt;br /&gt;223. Instance.Lookup.click();&lt;br /&gt;224. }&lt;br /&gt;225.&lt;br /&gt;226. /* Checks object definition */&lt;br /&gt;227. function isUndefined(obj){&lt;br /&gt;228. return obj == null  typeof(obj) == "undefined"  obj == "";&lt;br /&gt;229. }&lt;br /&gt;230. }&lt;br /&gt;231.&lt;br /&gt;232. OnCrmPageLoad();&lt;br /&gt;&lt;br /&gt;&lt;/em&gt;&lt;/span&gt;&lt;span style="font-family:arial;font-size:85%;color:#009900;"&gt;&lt;em&gt;&lt;/em&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4058165759694816344-3022253788610701005?l=crmdelacreme.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/3022253788610701005'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/3022253788610701005'/><link rel='alternate' type='text/html' href='http://crmdelacreme.blogspot.com/2009/04/coding-crm-lookup-fields.html' title='Coding CRM Lookup Fields'/><author><name>Tiaan van Niekerk</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Ky8MLSxenl8/S86MPSGeVPI/AAAAAAAAAO0/Ln5Gkx7EP5I/S220/Snapshot+of+me+4.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-4058165759694816344.post-5774738958775600275</id><published>2009-04-16T06:44:00.010+02:00</published><updated>2009-04-16T09:16:07.177+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jscript'/><category scheme='http://www.blogger.com/atom/ns#' term='forms'/><category scheme='http://www.blogger.com/atom/ns#' term='crm 3.0'/><category scheme='http://www.blogger.com/atom/ns#' term='crm 4.0'/><category scheme='http://www.blogger.com/atom/ns#' term='iframes'/><title type='text'>More CRM Jscript Code Snips!</title><content type='html'>&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;strong&gt;Replacing the content of an IFRAME&lt;/strong&gt;&lt;br /&gt;If you really want to do some funny things in your CRM form, you can create an IFRAME serving as a placeholder for your real HTML code. Create an IFRAME in an entity and name it "IFRAME_TEST". In the Onload event put the following code:&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;crmForm.all.IFRAME_TEST_d.innerHTML ="&lt;b&gt;Some HTML text&lt;/b&gt;";&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;Note the "_d" at the end of IFRAME_TEST. This single line replaces the whole IFRAME element with your own HTML. &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;Adding additional values to duration fields&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;The following script adds the new option "42 Minutes" to the actualdurationminutes field in a task:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;var duration = crmForm.all.actualdurationminutesSelect;&lt;/span&gt;&lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;color:#009900;"&gt;&lt;em&gt;var tables = duration.getElementsByTagName("table");&lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;color:#009900;"&gt;&lt;em&gt;var table = tables[1];&lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;color:#009900;"&gt;&lt;em&gt;var row = table.insertRow();&lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;color:#009900;"&gt;&lt;em&gt;var newOption = row.insertCell(-1);&lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;color:#009900;"&gt;&lt;em&gt;var newValue = "42 Minutes";&lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;color:#009900;"&gt;&lt;em&gt;newOption.setAttribute("val", newValue);&lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;color:#009900;"&gt;&lt;em&gt;newOption.innerText = newValue;&lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;/span&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;Changing the title of a CRM&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;formdocument.title = "Hello World!";&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Changing the Link of a Ticker Symbol from MSN Money to Yahoo Finances&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;This is an unsupported solution as it requires modifications to server files!Open the following directory on your CRM server:&lt;br /&gt;C:\Inetpub\wwwroot\_forms\controls (may vary depending on your installation)&lt;br /&gt;Open the following file: INPUT.text.ticker.htc&lt;br /&gt;Search the following function:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;function Launch()&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;{ &lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;if(value.length &gt; 0) &lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;{ &lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;Parse(); &lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;window.open("&lt;/span&gt;&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;a href="http://go.microsoft.com/fwlink?linkid=8506&amp;amp;Symbol"&gt;&lt;span style="font-family:arial;font-size:85%;color:#009900;"&gt;&lt;em&gt;http://go.microsoft.com/fwlink?linkid=8506&amp;amp;Symbol&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;font-size:85%;color:#009900;"&gt;&lt;em&gt;=" + encodeURIComponent(value), "", "height=" + (screen.availHeight * .75) + ",width=" + (screen.availWidth * .75) + ,scrollbars=1,resizable=1,status=1,toolbar=1,menubar=1,location=1"); &lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:arial;font-size:85%;color:#009900;"&gt;&lt;em&gt;}}Replace it with the following:function Launch()&lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;color:#009900;"&gt;&lt;em&gt;{ &lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;color:#009900;"&gt;&lt;em&gt;if(value.length &gt; 0) &lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;color:#009900;"&gt;&lt;em&gt;{ Parse(); &lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;color:#009900;"&gt;&lt;em&gt;//window.open("&lt;/em&gt;&lt;/span&gt;&lt;a href="http://go.microsoft.com/fwlink?linkid=8506&amp;amp;Symbol"&gt;&lt;span style="font-family:arial;font-size:85%;color:#009900;"&gt;&lt;em&gt;http://go.microsoft.com/fwlink?linkid=8506&amp;amp;Symbol&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;font-size:85%;color:#009900;"&gt;&lt;em&gt;=" + encodeURIComponent(value), "", "height=" + (screen.availHeight * .75) + ",width=" + (screen.availWidth * .75) + ,scrollbars=1,resizable=1,status=1,toolbar=1,menubar=1,location=1"); &lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;color:#009900;"&gt;&lt;em&gt;window.open("&lt;/em&gt;&lt;/span&gt;&lt;a href="http://finance.yahoo.com/q?s"&gt;&lt;span style="font-family:arial;font-size:85%;color:#009900;"&gt;&lt;em&gt;http://finance.yahoo.com/q?s&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;font-size:85%;color:#009900;"&gt;&lt;em&gt;=" + encodeURIComponent(value), "", "height=" + (screen.availHeight * .75) + ",width=" + (screen.availWidth * .75) + ",scrollbars=1,resizable=1,status=1,toolbar=1,menubar=1,location=1"); &lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;color:#009900;"&gt;&lt;em&gt;}}&lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;br /&gt;Save the file.On your client machine: Open Internet Explorer and remove all temporary internet files, so that the new htc source is retrieved. Navigate to any ticker symbol, enter a valid value and double click it.&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;Counting the number of backslashes in a string&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;&lt;br /&gt;Of course you can use the two code snippets with any character you like.&lt;br /&gt;Solution 1 &lt;/p&gt;&lt;p&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;var text = "hardware\\printers\\Epson";var paths = text.split("&lt;/span&gt;&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;a href="file://%22);alert(paths.length/"&gt;&lt;span style="font-family:arial;font-size:85%;color:#009900;"&gt;&lt;em&gt;\\");alert(paths.length&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;&lt;span style="font-family:arial;font-size:85%;"&gt; -1);&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;Solution 2&lt;/span&gt; &lt;p&gt;&lt;span style="color:#009900;"&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;var text = "hardware\\printers\\Epson";&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;var numBs = 0;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#009900;"&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;var index = 0;while(index != -1) &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;{ &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;index = text.indexOf("\\", index); &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;if (index != -1) &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;{ &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;numBs++; index++; }}alert(numBs);&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;Changing the label of a field at runtime&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;&lt;br /&gt;Lets say you want to change the label of the revenue field, then you simply write:&lt;/p&gt;&lt;p&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;crmForm.all.revenue_c.innerText = "Amount Euro";&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Simply append the "_c" to the field name. This should work for most labels.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Changing the colour of a single option in a picklist&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;&lt;br /&gt;You can change the colour and background colour of an option element using the following syntax:&lt;br /&gt;//TODO:&lt;br /&gt;Replace &lt;name&gt;with the schema name of the picklist in question.&lt;br /&gt;var list = crmForm.all.&lt;name&gt;;&lt;br /&gt;//using the first option here, you need to find the one you need.&lt;br /&gt;var option = list.options[0];&lt;br /&gt;//Set the background colour to red.&lt;br /&gt;option.style.backgroundColor = "#FF0000";&lt;br /&gt;//Set the text colour to white.&lt;br /&gt;option.style.color = "#FFFFFF";&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Opening a new window without the IE menu and status bars&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;&lt;br /&gt;The following is a sample HTML page that you can use to test. Replace the link with the URL of your web page.&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#009900;"&gt;&lt;a onclick="" href="javascript:;" toolbar="no,status=" menubar="no,scrollbars=" resizable="yes');"&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;return false"&gt;Domain&lt;/a&gt;&lt;/p&gt;&lt;/span&gt;&lt;/em&gt;&lt;span style="color:#000000;"&gt;&lt;strong&gt;Retrieving the text of a lookup control&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;var lookup = crmForm.all.&lt;lookupfield&gt;.DataValue;&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;if (lookup[0] != null) &lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;{ &lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;var theText = lookup[0].name;&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;}&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="color:#000000;"&gt;Disabling a form at runtime&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;&lt;br /&gt;&lt;span style="color:#009900;"&gt;&lt;em&gt;document.body.disabled = true;&lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#000000;"&gt;This will disable all controls except the Notes tab, where you still can enter new notes.&lt;br /&gt;Automatically changing the value of a text field to capitalsPut the following script in the OnChange event of the text field:&lt;br /&gt;&lt;/span&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;crmForm.all.&lt;name&gt;.DataValue = crmForm.all.&lt;name&gt;.DataValue.toUpperCase();&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="color:#000000;"&gt;Getting notified when the user selects a another tab on a form&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Put the following in the OnLoad event of your form:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;crmForm.all.tab0Tab.onclick = function()&lt;br /&gt;{&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;alert("Tab 0 clicked");&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;}crmForm.all.tab1Tab.onclick = function() &lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;{ &lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;alert("Tab 1 clicked");&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;}&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#000000;"&gt;It seems that the tab pages are always named "tabxTab", where x is a number starting from 0 (first tab) to (n-1), where n is the total number of tabs. Maybe you find better events that handle the activation instead of a click, but that's the general way it should work.&lt;br /&gt;The current record idThe primary key is always available in crmForm.ObjectIdIt is set to null, if the record hasn't been saved yet. There are some other useful properties. Look at the "Form Object Model" in the SDK docs for more information.&lt;br /&gt;The current object type codeThe type code of the entity being displayed in a CRM form is available through&lt;br /&gt;crmForm.ObjectTypeCode&lt;br /&gt;There are some other useful properties. Look at the "Form Object Model" in the SDK docs for more information.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Initializing a date field with the current date&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;crmForm.all.&lt;attribute&gt;.DataValue = new Date();&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;span style="color:#000000;"&gt;&lt;strong&gt;Changing the URL of an IFRAME at runtime&lt;/strong&gt; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#000000;"&gt;Set the initial URL of the IFRAME to about:blank and execute the following line:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;document.all.IFRAME_&lt;name&gt;.src = &lt;/span&gt;&lt;/em&gt;&lt;/span&gt;&lt;a href="http://domain/file"&gt;&lt;span style="font-family:arial;font-size:85%;color:#009900;"&gt;&lt;em&gt;http://domain/file&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;;&lt;/span&gt;&lt;/em&gt; &lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;br /&gt;&lt;strong&gt;Displaying a picture in a CRM form&lt;/strong&gt;,&lt;br /&gt;Using a text field to store the data source ,&lt;/span&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;Let's say you have a custom field storing the image name called new_pictureName. &lt;/span&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;Then in the OnLoad event do the following:&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;if ((crmForm.all.new_pictureName != null) &amp;amp;&amp;amp; (crmForm.all.new_pictureName.DataValue != null)) &lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;{ &lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;document.all.IFRAME_&lt;name&gt;.src = &lt;/span&gt;&lt;/em&gt;&lt;/span&gt;&lt;a href="http://server/dir/images/"&gt;&lt;span style="font-family:arial;font-size:85%;color:#009900;"&gt;&lt;em&gt;http://server/dir/images/&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;font-size:85%;color:#009900;"&gt;&lt;em&gt; + crmForm.all.new_pictureName.DataValue;&lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:arial;font-size:85%;color:#009900;"&gt;&lt;em&gt;}&lt;br /&gt;In the OnChange event of the new_pictureName place the following:&lt;br /&gt;if (crmForm.all.new_pictureName.DataValue != null) &lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;color:#009900;"&gt;&lt;em&gt;{ &lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;color:#009900;"&gt;&lt;em&gt;document.all.IFRAME_&lt;name&gt;.src = &lt;/em&gt;&lt;/span&gt;&lt;a href="http://server/dir/images/"&gt;&lt;span style="font-family:arial;font-size:85%;color:#009900;"&gt;&lt;em&gt;http://server/dir/images/&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;font-size:85%;color:#009900;"&gt;&lt;em&gt; + crmForm.all.new_pictureName.DataValue;&lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;color:#009900;"&gt;&lt;em&gt;}&lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;color:#009900;"&gt;&lt;em&gt;else &lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;color:#009900;"&gt;&lt;em&gt;{ document.all.IFRAME_&lt;name&gt;.src = "about:blank"&lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;color:#009900;"&gt;&lt;em&gt;}&lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;br /&gt;Checking crmForm.all.new_pictureName for null in the OnLoad event is a sanity check. Bulk edit forms will not display all fields and if it is not contained in the form, it will be null. This check is not required in the OnChange event, as this event will never fire if the field does not exist.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Changing the default lookup type&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;&lt;br /&gt;When opening a lookup that can select from multiple entity types, you may want to use a different default entity in the lookup dialog. The following script changes the default entity of the regardingobjectid field in an activity to contacts:if (crmForm.all.regardingobjectid != null) { crmForm.all.regardingobjectid.setAttribute("defaulttype", "2");}Checking if a field is present in a formif (crmForm.all.&lt;name&gt; != null) { //do your JavaScript processing here}&lt;br /&gt;You should always check if a field is present before accessing it, because your script may throw an exception if it is not included in a form (like in quick create forms if your field is not required or recommended).&lt;br /&gt;Calculating a date field based upon the selection of a picklistThe following script assumes that you have a picklist with three values: "1 year", "2 years" and "3 years".&lt;br /&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;var years = 0;&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;switch(crmForm.all.&lt;name&gt;.DataValue) &lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;{ &lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;//You need to check the picklist values if they have the values 1, 2 and 3. Look at the attribute in the entity customization and note the option values. &lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;case "1": years = 1; &lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;break; &lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;case "2": years = 2; &lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;break; &lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;case "3": years = 3; b&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;reak;&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;}if (years != 0) {var date = new Date(); &lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;date.setYear(date.getYear() + years); &lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;crmForm.all.&lt;name&gt;.DataValue = date;&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;}&lt;br /&gt;Creating a new email when double-clicking a standard text field&lt;br /&gt;if (crmForm.all.&lt;name&gt; != null) &lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;{ &lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;crmForm.all.&lt;name&gt;.ondblclick = function() &lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;{ &lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;var email = crmForm.all.&lt;name&gt;.DataValue; &lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;if ((email != null) &amp;amp;&amp;amp; (email.length &gt; 0)) &lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;{ &lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;window.navigate("mailto:" + email); &lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;} &lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;}}&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Resetting a field value if validation fails&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;&lt;br /&gt;In the OnLoad event, place the following code:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;crmForm.all.&lt;field&gt;.setAttribute("lastKnownGood", crmForm.all.&lt;field&gt;.DataValue);&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;This adds a new attribute to field for later access.&lt;br /&gt;In the OnChange event put the following:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;//checkFailed contains either true or false and must be set to the result of your validation routineif (checkFailed) &lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;{ &lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;crmForm.all.&lt;field&gt;.DataValue = crmForm.all.fieldToCheck.getAttribute("lastKnownGood");&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;else &lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;{ &lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;crmForm.all.&lt;field&gt;.setAttribute("lastKnownGood", crmForm.all.fieldToCheck.DataValue);&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;}&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Inserting line breaks in a text area control&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Put the following in the OnLoad event:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;crmForm.all.&lt;your&gt;.style.whiteSpace = "pre";&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Hiding an entire row of a CRM form&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;//the field you want to hidevar field = crmForm.all.name;&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;//search the enclosing table rowwhile ((field.parentNode != null) &amp;amp;&amp;amp; (field.tagName.toLowerCase() != "tr")) &lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;{ &lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;field = field.parentNode;}//if we found a row, disable itif (field.tagName.toLowerCase() == "tr") &lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;{ &lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;field.style.display = "none";&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;}&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Disabling the time selection of a date/time field&lt;/strong&gt;&lt;br /&gt;You can dynamically enable or disable the time selection box of a date/time field using the following syntax:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;var dateField = crmForm.all.&lt;name&gt;;&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;//Check the existence of the time field. It is null if the control is setup to only display the date.&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;if (dateField.all.time != null) &lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;{ &lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;//Disable the time field &lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;dateField.all.time.disable(); &lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;//Enable the time field &lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;dateField.all.time.enable();&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;}&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;CRM automatically enables the time selection box if the date value changes to a non-null value, so in order to always disable the time selection box, you need to add the following OnChange event script to the datetime field:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;var dateField = crmForm.all.&lt;name&gt;;&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;//Check the existence of the time field. It is null if the control is setup to only display the date.&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;if (dateField.all.time != null) &lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;{ &lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;//Disable the time field &lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;dateField.all.time.disable();&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;}&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;To initially disable the time field, put the following into the form OnLoad event:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;var dateField = crmForm.all.&lt;name&gt;;&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;//Check the existence of the datetime field. It may not be included in a quick create form!&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;if (dateField != null) &lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;{ &lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;//Call the OnChange event handler &lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;dateField.FireOnChange();&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;}&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Changing the time interval in date/time fields&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;The time selection box of a date/time field uses a 30 minute interval. You can change it to a different interval using the following code in an OnLoad event:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;var dateField = crmForm.all.&lt;name&gt;;&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;//Check the existence of the datetime field. It may not be included in a quick create form!&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;if (dateField != null) &lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;{ &lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;var timeField = dateField.all.time; &lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;//Check the existence of the time field. It is null if the control is setup to only display the date. &lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;if (timeField != null) &lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;{ &lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;//The new interval in minutes. &lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;var interval = 15; &lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;var tables = timeField.getElementsByTagName("table"); &lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;if ((tables != null) &amp;amp;&amp;amp; (tables.length &gt; 0)) &lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;{ &lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;var table = tables[1]; &lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;//Remove all existing values from the selection box while (table.firstChild != null) &lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;{ &lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;table.removeChild(table.firstChild); &lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;} &lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;//Add the new values for (hour = 0; hour &lt;&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;{ &lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;for (min = 0; min &lt;&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;{ &lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;var row = table.insertRow();&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;var cell = row.insertCell(); &lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;var time = ((hour &lt;&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;cell.setAttribute("val", time); &lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;cell.innerText = time; &lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;} &lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;} &lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;} &lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;}}&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;strong&gt;Getting the quote id inside a quotedetail form&lt;/strong&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;span style="color:#009900;"&gt;&lt;span style="color:#009900;"&gt;&lt;span style="color:#009900;"&gt;&lt;br /&gt;&lt;span style="color:#000000;"&gt;There's a hidden field in the quotedetail form storing the quote id. You can access it usingalert("Quote ID = " + crmForm.all.quoteid.DataValue);How to know which button triggered the OnSave eventYou can use the event.Mode property in the OnSave event. It will tell you which button was used to save an entity. Not all values are documented in the SDK, e.g the "Save as completed" in a phone call has a value of 58. As it's not documented, this number may change in future releases.To get started enter the following into your OnSave script:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;alert ("event.Mode = " + event.Mode);&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;event.returnValue = false;&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;return false;&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#000000;"&gt;This codes makes it impossible to save the entity, but allows you to write down all of the values passed to OnSave. You will see 1 for a normal save operation and 2 for Save and Close. Most but not all constants are defined in /_common/scripts/formevt.js. &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#000000;"&gt;&lt;strong&gt;Accessing the CRM database from JavaScript&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#000000;"&gt;To access the CRM database from JavaScript, use the following as a template:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;var connection = new ActiveXObject("ADODB.Connection");&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;var connectionString = "Provider=SQLOLEDB;&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;Server=STUNNWARECRM;&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;Database=stunnware_mscrm;&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;Integrated Security=sspi";connection.Open(connectionString);&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;var query = "SELECT name FROM FilteredAccount";&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;var rs = new ActiveXObject("ADODB.Recordset");rs.Open(query, connection, /*adOpenKeyset*/1, /*adLockPessimistic*/2);&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;rs.moveFirst();var values = "";while (!rs.eof) &lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;{ &lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;values += rs.Fields(0).Value.toString() + " ";&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;rs.moveNext();&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;}&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;connection.Close();&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;alert(values); &lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#000000;"&gt;You may need to adjust your security settings in IE in order to run this code.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Modifying the Quick Create Form&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Allthough the quick create form isn't listed in the forms and views dialog, it uses the same scripts entered in the main application form. You can use the following in the OnLoad script to run code when inside of a quick create form:&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#009900;"&gt;&lt;em&gt;if (crmForm.FormType == 5 /* Quick Create Form */) &lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#009900;"&gt;&lt;em&gt;{ &lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#009900;"&gt;&lt;em&gt;//modify the form using DHTML}&lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#000000;"&gt;&lt;strong&gt;Forcing the selection of an account in the potential customer field of an opportunity.&lt;/strong&gt; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#000000;"&gt;Put the following into the opportunity's OnLoad event:&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;crmForm.all.customerid.setAttribute("lookuptypes", "1");&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#000000;"&gt;This tells the customer lookup to only include the account (object type code 1). A value of 2 forces the lookup to only display contacts.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Hiding and showing fields dynamically based on other field values&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;You can do this in client-side JavaScript. Let's say you have a picklist named "new_category" and you have assigned the following options to it:&lt;br /&gt;1 – Business&lt;br /&gt;2 – Private&lt;br /&gt;3 - Unspecified&lt;br /&gt;Let's further assume that you want to hide the fields "new_a" and "new_b" whenever a user selects "Private", but they should be visible if a different option is selected in the picklist.&lt;br /&gt;&lt;br /&gt;Your OnChange event script of the new_category field will be:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;var hideValues = (crmForm.all.new_category != null) &amp;amp;&amp;amp; (crmForm.all.new_category.DataValue == "2");&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;var displayStyle = hideValues ? "none" : "";&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;crmForm.all.new_a.style.display = displayStyle;&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;crmForm.all.new_b.style.display = displayStyle;&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#000000;"&gt;To run the code when the form is initially loaded, put the following into the OnLoad event:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;if (crmForm.all.new_category != null) &lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;{ &lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;crmForm.all.new_category.FireOnChange();&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;}&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#000000;"&gt;The test for a null value of crmForm.all.new_category is included to avoid errors if the field is not available on a form. This is true for quick create forms if the field required level is not set to business required or business recommended.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Removing the value from a lookup field&lt;/strong&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;crmForm.all.&lt;lookupfield&gt;.DataValue = null;&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#000000;"&gt;&lt;strong&gt;Hiding tabs at runtime&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;&lt;br /&gt;You can hide and show entire tabs dynamically using the following code://Add your condition here, usually a field comparison in an OnChange event:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;if (condition == true) &lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;{ &lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;//hide the second tab &lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;crmForm.all.tab1Tab.style.display = "none";&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;}&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;else &lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;{ &lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;//show the second tab &lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;crmForm.all.tab1Tab.style.display = "";&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;}&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#000000;"&gt;The tabs are named "tab0Tab", "tab1Tab", "tab2Tab" and so on.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Setting the active tab&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;From the SDK docs:SetFocus: Sets the focus, changes tabs, and scrolls the window as necessary to show the specified field. Example:&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;// Set focus to the field.&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;crmForm.all.SOME_FIELD_ID.SetFocus();&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;strong&gt;Displaying related entities instead of the form when opening a record&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;To open a related entity view of the left navigation bar (like contacts in an account entity), you can use the following:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;span style="color:#009900;"&gt;&lt;span style="color:#009900;"&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;span style="color:#009900;"&gt;&lt;em&gt;loadArea("areaContacts");&lt;/em&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;span style="color:#009900;"&gt;&lt;span style="color:#009900;"&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;span style="color:#009900;"&gt;&lt;span style="color:#009900;"&gt;&lt;span style="color:#000000;"&gt;Each entry in the navigation bar has a unique area name (areaContacts is just a sample). If you haven't already done it, download and install the Internet Explorer Developer Toolbar to find the name of the entry you're after. Some instructions on how to use it are in &lt;/span&gt;&lt;a href="http://www.stunnware.com/crm2/topic.aspx?id=CrmLookAndFeel1"&gt;&lt;span style="font-family:arial;font-size:85%;color:#000000;"&gt;http://www.stunnware.com/crm2/topic.aspx?id=CrmLookAndFeel1&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;span style="color:#009900;"&gt;&lt;span style="color:#000000;"&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;though it is a different topic, I included some screenshots using the developer toolbar in CRM.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;span style="color:#009900;"&gt;&lt;span style="color:#000000;"&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;strong&gt;Modifying the color of disabled form fields&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;span style="color:#009900;"&gt;&lt;span style="color:#000000;"&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;span style="color:#009900;"&gt;&lt;span style="color:#000000;"&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;Disabled form fields are sometimes hard to read. Making the color a little bit darker greatly helps to read all of the content without loosing the information that a field is read-only. Open the following file in your CRM web:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;/_forms/controls/controls.css. &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;Then find the following style:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;color:#009900;"&gt;&lt;em&gt;INPUT.ro,TEXTAREA.ro,DIV.ro,SPAN.ro{background-color: #ffffff;color:#808080;border-color: #808080;}&lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#000000;"&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;The color attribute is the light gray you're seeing by default. You may change it to #404040 to get a slightly darker gray. If you don't see the new colors in IE, hit CTRL-F5 to reload the source files, including the updated css file.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;strong&gt;Removing a navigation bar entry at runtime&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;To remove a navigation bar entry dynamically, you can use the following code:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;color:#009900;"&gt;&lt;em&gt;var navigationBarEntry = document.getElementById("navProds");&lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;color:#009900;"&gt;&lt;em&gt;if (navigationBarEntry != null) &lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;color:#009900;"&gt;&lt;em&gt;{ &lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;color:#009900;"&gt;&lt;em&gt;var lbArea = navigationBarEntry.parentNode; &lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;color:#009900;"&gt;&lt;em&gt;if (lbArea != null) &lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;color:#009900;"&gt;&lt;em&gt;{ &lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;color:#009900;"&gt;&lt;em&gt;lbArea.removeChild(navigationBarEntry); &lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;color:#009900;"&gt;&lt;em&gt;}}&lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;color:#000000;"&gt;If you haven't already done it, download and install the Internet Explorer Developer Toolbar to find the name of the navigation bar entry.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;color:#000000;"&gt;&lt;strong&gt;Changing the colour of a label&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;color:#009900;"&gt;&lt;em&gt;var label = crmForm.all.&lt;field&gt;_c;label.innerHTML = "&lt;span colour="'#FF0000'"&gt;" + label.innerText + "&lt;/span&gt;";&lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;em&gt;&lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#000000;"&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;strong&gt;Hide a section on a form&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;color:#009900;"&gt;&lt;em&gt;crmForm.all.new_attribute_c.parentElement.parentElement.parentElement.style.display = 'none'&lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;To show the section again:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;color:#009900;"&gt;&lt;em&gt;crmForm.all.new_attribute_c.parentElement.parentElement.parentElement.style.display = 'block'&lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;span style="color:#009900;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4058165759694816344-5774738958775600275?l=crmdelacreme.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://stunnware.com' title='More CRM Jscript Code Snips!'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/5774738958775600275'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/5774738958775600275'/><link rel='alternate' type='text/html' href='http://crmdelacreme.blogspot.com/2009/04/more-crm-jscript-snippets.html' title='More CRM Jscript Code Snips!'/><author><name>Tiaan van Niekerk</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Ky8MLSxenl8/S86MPSGeVPI/AAAAAAAAAO0/Ln5Gkx7EP5I/S220/Snapshot+of+me+4.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-4058165759694816344.post-8831417409886120856</id><published>2009-04-15T06:30:00.003+02:00</published><updated>2009-04-16T10:15:07.036+02:00</updated><title type='text'>CRM Tools Just makes Life so much easier!</title><content type='html'>&lt;span style="font-family:arial;font-size:85%;color:#ff0000;"&gt;&lt;strong&gt;Hi&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;color:#ff0000;"&gt;&lt;strong&gt;CRM Tools is one of those things that just makes your life easier.Below is a list of tools found from Patrick Verbeeten.&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.patrickverbeeten.com/pages/ContentListPage.aspx?id=9&amp;amp;&amp;amp;&amp;amp;&amp;amp;"&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;http://www.patrickverbeeten.com/pages/ContentListPage.aspx?id=9&amp;amp;&amp;amp;&amp;amp;&amp;amp;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;color:#000099;"&gt;&lt;strong&gt;&lt;em&gt;Make sure that befor you install these tools you comply with the system requirements:&lt;/em&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;strong&gt;&lt;em&gt;&lt;span style="color:#000099;"&gt;&lt;span style="font-size:85%;"&gt;.Net 3.5 will be required so make sure it is installed on the machine on which the toll is being deployed.&lt;/span&gt;&lt;/span&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;p&gt;&lt;span style="font-family:arial;"&gt;&lt;strong&gt;&lt;span style="color:#000099;"&gt;&lt;span style="font-size:85%;"&gt;&lt;em&gt;Full Installation package:&lt;br /&gt;&lt;/em&gt;&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-size:78%;color:#000099;"&gt;&lt;a href="http://download.microsoft.com/download/6/0/f/60fc5854-3cb8-4892-b6db-bd4f42510f28/dotnetfx35.exe"&gt;&lt;em&gt;http://download.microsoft.com/download/6/0/f/60fc5854-3cb8-4892-b6db-bd4f42510f28/dotnetfx35.exe&lt;/em&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;strong&gt;&lt;em&gt;Redistrubutable package:&lt;br /&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:arial;"&gt;&lt;em&gt;&lt;span style="color:#000099;"&gt;&lt;a href="http://download.microsoft.com/download/7/0/3/703455ee-a747-4cc8-bd3e-98a615c3aedb/dotNetFx35setup.exe"&gt;&lt;span style="font-size:78%;"&gt;http://download.microsoft.com/download/7/0/3/703455ee-a747-4cc8-bd3e-98a615c3aedb/dotNetFx35setup.exe&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/span&gt;&lt;/em&gt;&lt;/span&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;br /&gt;&lt;strong&gt;Event Listner&lt;/strong&gt;&lt;br /&gt;A new tool is available which allows you to view CRM plug-in events as they occur, including all details available from the IPluginExectionContext.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Tracing and Debugging error in CRM 4.0&lt;/strong&gt;&lt;br /&gt;If errors in Microsoft CRM occur there can be a user friendly or otherwise limited message presented. To find out what actually is the problem is not difficult you just have to know where to look.&lt;br /&gt;Wether it is an authentication issue or a SoapException 'Server was unable to process request'. This article offers some pointers on where to look for additional details.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Microsoft CRM Date values&lt;br /&gt;&lt;/strong&gt;CRM support user working in multiple time zones by storing alle date time values as UTC. This way the time can be easily adjusted to the users time zone setting. This article explains this in a bit more detail.&lt;br /&gt;&lt;br /&gt;As for date values, some dates such as a birth date can be fixed regardless of time zone. CRM will still adjust these to the time zone, this may show as a full day difference in the interface. This article contains a plugin to allow you to use dates without timezone dependecies in CRM.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;CRM 4: Waiting workflows&lt;/strong&gt;&lt;br /&gt;In CRM 4 workflows can have the status waiting when an they are waiting for an event such as a timer or they will also have this status if an error has occured. To find out which take the following steps.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Translation assistant&lt;br /&gt;&lt;/strong&gt;With version 4.0 Microsoft CRM the option to have multiple languages in a single interface became available. To translate the various available labels CRM offers an option to export all labels to an excel file.&lt;br /&gt;&lt;br /&gt;The problem I found with this file is that it lacks context of the text you are translating. For instance the text "Address 1: Line 1" this appears for each entity, form and view that uses this fields. So if you want to change only one label it will take you a lot of trial and error to find out which field you want to change.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Cross domain remote debugging&lt;/strong&gt;&lt;br /&gt;When you are developing with a virtual PC which is running in its own domain or want to debug any other system which is in a different domain than you own user remote debuggin will normally fail on authentication errors.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Crm 4.0 Sitemap &amp;amp; ISV.Config Editor&lt;/strong&gt;&lt;br /&gt;As of CRM 4.0 the sitemap and isv.config file are no longer available on the file system but stored in the database. Which means that for each change you have to export the customization, make your changes and then reimport the customizations file.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Plug-ins and Workflows: Extension of Microsoft CRM 4.0&lt;/strong&gt;&lt;br /&gt;Microsoft CRM 4.0 has several methods to add functionality, to create custom workflow in CRM you have two options plugins and workflows.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Generating an Time table in SQL&lt;/strong&gt;&lt;br /&gt;In reporting queries it happens often that you need a ruler of some sort for instance a table containing all days between a start and end date. You can generate such tables by using a looping construct but this isn't the strong point of SQL.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Source control server setup&lt;/strong&gt;&lt;br /&gt;For my source control I use subversion and I found the easiest method to install a fully working subversion server (combined with trac for issue tracking) is to do that on linux. I can setup a clean server from scratch in about an hour including all required configuration. For a windows server I would need that just to install windows and get all the software packages. Best thing is I have a single script to do this, this also includes some scripts to facilitate backups and setting up new subversion/trac repositories.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;CRM 4.0 Plug-in message input parameters&lt;br /&gt;&lt;/strong&gt;The CRM 4.0 plug-in model offers great capabilities. But when working with the plug-in messages you would need to know which input and output parameters are available. Unfortunaly this is not (yet) in the supplied documentation, but here it is.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Crm Developers Tool&lt;/strong&gt;&lt;br /&gt;A combined Entity and Plug-in Browser for Microsoft Dynamics CRM. Allows you to browse the entire entity model beyond the standard list.aspx Entity Browser. And a plug-in browser which offers a GUI to view and update plug-in registrations.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;CrmService Testing v1.1&lt;/strong&gt;&lt;br /&gt;I have added some new features to the Crm Test service proxy which you can read about in this article. The changes allow you to dicate which requests are expected and validation is then handled by the base class.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Embedded Sql, LINQ like behaviour&lt;/strong&gt;&lt;br /&gt;When ever you create an application which uses a database. There certainly are variatons but you have basically two option when it comes to how you have de SQL-Statements. You can choose to type the SQL-statements in the source code or you can create stored procedures. Both of these have their own advantages and disadavatanges.&lt;br /&gt;In-code statements ensure that when te application is deployed, no stored procedures have to be updated. Stored procedures on the other hand offer better speed and reusablility.&lt;br /&gt;&lt;br /&gt;To allow stored procedures to be created, maximize easy of deployment I created the this. The .sql files can be edited in either Visual Studio or the SQL Management studio with full support of the syntax checkers and code-Highlighting. This class does have one other main feature it makes each declared procedure available as a strong type .NET class to access the parameters.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Testing without touching the CrmService&lt;/strong&gt;&lt;br /&gt;If you have ever tried to do unit testing on code which uses the Microsoft Crm Webservice proxy you will is nearly impossible to test just that code. I will allways rely on the Crm Server for data and callouts to function and test these in to process. This article offers a class implementation which actually stubs out the CrmService request.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Command Crm Customization Export, Import and Publication&lt;/strong&gt;&lt;br /&gt;Import, Exporting and publishing customizations in CRM 3.0 using the web interface can be time consuming. Also when an export fails the information returned is very limited. I created a small command line application to do just the same. It uses three WebServices provided by CRM specifically for this purpose.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Localhost and integrated security&lt;/strong&gt;&lt;br /&gt;One thing I allways run across when installing a new server is that it won't allow connections over the loopback interface when using integrated security. I usually test the applications from the server console and everytime they give errors; 401.1 for most applications but the Microsoft Virtual server administration console for instance returns status 500 with a message parameter incorrect.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Captcha&lt;/strong&gt;&lt;br /&gt;For this site I wanted to add some mechanism to avoid getting the article comments spammed with links and other junk. To this end I added validation using captcha. I found the code to generate the image on the internet and extended it a little. I extended a TextBox control and created a Http Handler to facilitate easy use. The code for these is downloadable here.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Version Control&lt;br /&gt;&lt;/strong&gt;Version control is important when your developing software. I know I am not the first guy to throw away the wrong file or section off code. When properly installed using source control will also service as atleast a partial backup you of your source. And as an added benefit you can see who did what and when which can be usefull in tracking bugs.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;The CRM webservice&lt;/strong&gt;&lt;br /&gt;The Crm 3.0 webservice is a great improvement on the 1.2 version but still due to the nature of webservices working with it can require some quite elaborate code. You need to instantiate the class, configure security, create a ColumnSet, add columns to the column set and finally execute the Retrieve method and cast its result. This results in about 10 lines of code for such a simple action. Using partial classes introduced in the .Net 2.0 framework you can extend the Webservice without lossing the easy of recreating the webproxy when you change or and a type. Using generics you can even enforce type safety at compiletime.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;This site&lt;/strong&gt;&lt;br /&gt;As you probably will guess and easily can see this site is written in .NET to be more specific in C# .NET 2.0. It also uses some content management. This basic content management system was written in a single weekend. Granted it isn't entirely fool-proof nor does it offer the options of the system available like DotNetNuke, but using some of the framework .NET features this system offers the same extensibility. The content management is an extension of the framework it self.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Generic strong Type String to Any Converter&lt;/strong&gt;&lt;br /&gt;This is one of the oldes pieces of code i wrote in .NET and still use. This class is written for conversion of xml node values to a .NET type but can also be used to with plain strings. Every time I needed a node value I had to check if the node existed, is it an element or an attribute before I could even start converting the value. This class handles all this and using generics and the IConvertible interface returns all strongly types and correctly converted.&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/em&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4058165759694816344-8831417409886120856?l=crmdelacreme.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/8831417409886120856'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/8831417409886120856'/><link rel='alternate' type='text/html' href='http://crmdelacreme.blogspot.com/2009/04/crm-tools-just-makes-life-so-much.html' title='CRM Tools Just makes Life so much easier!'/><author><name>Tiaan van Niekerk</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Ky8MLSxenl8/S86MPSGeVPI/AAAAAAAAAO0/Ln5Gkx7EP5I/S220/Snapshot+of+me+4.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-4058165759694816344.post-7295851101991423795</id><published>2009-04-09T14:52:00.000+02:00</published><updated>2009-04-09T14:54:09.700+02:00</updated><title type='text'>Rename Left Navigational Display Names</title><content type='html'>&lt;span style="font-family:arial;font-size:78%;color:#009900;"&gt;&lt;em&gt;/* Retext/Rename Left Nav Display links. */&lt;br /&gt;function leftNavRename(leftNav, oldName, newName)&lt;br /&gt;{&lt;br /&gt;    var navItem = document.getElementById(leftNav);&lt;br /&gt;    if(navItem  != null)&lt;br /&gt;    {&lt;br /&gt;        navItem.innerHTML = navItem.innerHTML.replace(oldName, newName);&lt;br /&gt;        navItem.innerHTML = navItem.innerHTML.replace(oldName, newName);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;leftNavRename ('navWriteInProducts','Write-In Products','Products');&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/* Remove Left Nav bar links */&lt;br /&gt;function leftNavRemove(lNav)&lt;br /&gt;{&lt;br /&gt;    var lNavItem = document.getElementById(lNav);&lt;br /&gt;    if (lNavItem != null)&lt;br /&gt;    {&lt;br /&gt;        lNavItem.parentNode.style.display ='none';&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;leftNavRemove('navExistingProducts');&lt;/em&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4058165759694816344-7295851101991423795?l=crmdelacreme.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/7295851101991423795'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/7295851101991423795'/><link rel='alternate' type='text/html' href='http://crmdelacreme.blogspot.com/2009/04/rename-left-navigational-display-names.html' title='Rename Left Navigational Display Names'/><author><name>Tiaan van Niekerk</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Ky8MLSxenl8/S86MPSGeVPI/AAAAAAAAAO0/Ln5Gkx7EP5I/S220/Snapshot+of+me+4.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-4058165759694816344.post-288763731881734744</id><published>2009-04-08T09:08:00.006+02:00</published><updated>2009-04-08T09:14:36.191+02:00</updated><title type='text'>Additional CRM 4.0 Tools</title><content type='html'>&lt;span style="font-family:arial;font-size:85%;color:#ff0000;"&gt;&lt;em&gt;HI&lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;color:#ff0000;"&gt;&lt;em&gt;Please look at the "Additional CRM Tools &amp;amp; Software" (on the right navigation pane ) section of my blog.Here you will find all the&lt;/em&gt;&lt;/span&gt; &lt;span style="font-family:arial;font-size:85%;color:#ff0000;"&gt;&lt;em&gt;tools I tested myself ,which made my life so much easier.The Links will take you&lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;color:#ff0000;"&gt;&lt;em&gt;to the developers sites were you can download them.&lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;color:#ff0000;"&gt;&lt;em&gt;&lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;color:#ff0000;"&gt;&lt;em&gt;Enjoy&lt;/em&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4058165759694816344-288763731881734744?l=crmdelacreme.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/288763731881734744'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/288763731881734744'/><link rel='alternate' type='text/html' href='http://crmdelacreme.blogspot.com/2009/04/additional-crm-40-tools.html' title='Additional CRM 4.0 Tools'/><author><name>Tiaan van Niekerk</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Ky8MLSxenl8/S86MPSGeVPI/AAAAAAAAAO0/Ln5Gkx7EP5I/S220/Snapshot+of+me+4.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-4058165759694816344.post-1589930547351683640</id><published>2009-04-07T09:51:00.002+02:00</published><updated>2009-04-07T09:54:38.965+02:00</updated><title type='text'>CRM 4.0 Installation Requirements</title><content type='html'>&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;strong&gt;Microsoft .NET Framework&lt;/strong&gt;&lt;br /&gt;Download From: &lt;/span&gt;&lt;a href="http://go.microsoft.com/fwlink/?LinkId=91338&amp;amp;clcid=1033" jquery1239090453660="62"&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;http://go.microsoft.com/fwlink/?LinkId=91338&amp;amp;clcid=1033&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;br /&gt;Location: DOTNETFX\dotnetfx3.exe &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;br /&gt;&lt;strong&gt;Microsoft Visual C++ Runtime&lt;br /&gt;&lt;/strong&gt;Download From: &lt;/span&gt;&lt;a href="http://go.microsoft.com/fwlink/?LinkId=91355&amp;amp;clcid=1033" jquery1239090453660="63"&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;http://go.microsoft.com/fwlink/?LinkId=91355&amp;amp;clcid=1033&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;br /&gt;Location: VcRedist\vcredist_x86.exe &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;em&gt;&lt;span style="font-size:78%;color:#cc0000;"&gt;Tip:Extract this file within the root of the installation folder from where you run the setup.exe from.&lt;/span&gt;&lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;em&gt;&lt;span style="font-size:78%;color:#cc0000;"&gt;&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;strong&gt;SQL Reporting Service Report Viewer Control&lt;br /&gt;&lt;/strong&gt;Download From: &lt;/span&gt;&lt;a href="http://go.microsoft.com/fwlink/?LinkId=91351&amp;amp;clcid=1033" jquery1239090453660="64"&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;http://go.microsoft.com/fwlink/?LinkId=91351&amp;amp;clcid=1033&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;br /&gt;Location: ReportViewer\ReportViewer.exe   &lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;For 64 Bit installations rather update the installation files from the internet.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4058165759694816344-1589930547351683640?l=crmdelacreme.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/1589930547351683640'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/1589930547351683640'/><link rel='alternate' type='text/html' href='http://crmdelacreme.blogspot.com/2009/04/crm-40-installation-requirements.html' title='CRM 4.0 Installation Requirements'/><author><name>Tiaan van Niekerk</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Ky8MLSxenl8/S86MPSGeVPI/AAAAAAAAAO0/Ln5Gkx7EP5I/S220/Snapshot+of+me+4.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-4058165759694816344.post-5704214056166403401</id><published>2009-04-07T07:45:00.002+02:00</published><updated>2009-04-16T05:40:00.978+02:00</updated><title type='text'>CRM Report Performance</title><content type='html'>&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;span style="font-size:100%;"&gt;&lt;strong&gt;Report Performance&lt;br /&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;Performance related issues are often caused by poor report design or an incorrectly configured report server. Below are a few of the common reasons for poor performance when using reports.&lt;br /&gt;The best way to improve report performance is by limiting the data that is used in each report and sub-report. This is accomplished by adding parameters that users must specify when they run the report, such as date ranges or owner, or by adding additional selection criteria to a report. This will greatly reduce the data that is filtered for the report each time it is run by a user.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;em&gt;&lt;span style="color:#ff0000;"&gt;NOTE:&lt;/span&gt;&lt;/em&gt;&lt;/strong&gt; For more information on writing reports using SQL Reporting Services refer to training variety of published resources available from Microsoft.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;If there is a noticeable delay (5 seconds or more) in displaying data in a Microsoft Dynamics CRM list, or when opening a Microsoft Dynamics CRM form on a local area network, it could be caused by configuration problems in the SQL Reporting Server (SRS). Typically, this only occurs when Microsoft Dynamics CRM is installed on a separate server from the SRS server.&lt;br /&gt;&lt;span style="font-size:100%;color:#ff0000;"&gt;&lt;em&gt;&lt;strong&gt;Reasons for this delay can include the following:&lt;/strong&gt;&lt;/em&gt;&lt;/span&gt;&lt;br /&gt;*Incorrect SRS locations in the SQLRSServerURL registry key in HKEY_LOCAL_MACHINE_SOFTWARE  Microsoft  MSCRM&lt;br /&gt;*DNS problems&lt;br /&gt;*Missing or invalid Service Principal Names (SPNs) for the Host name or Microsoft SQL Server (both the SQL Server that contains the Microsoft Dynamics CRM databases and the SRS Microsoft SQL Server)&lt;br /&gt;*Incorrect permissions on the computer that is running Microsoft SQL Server for SRS&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;em&gt;&lt;span style="color:#ff0000;"&gt;NOTE:&lt;/span&gt;&lt;/em&gt;&lt;/strong&gt; Incorrect permissions can cause problems accessing Microsoft Dynamics CRM reports. This can prevent Microsoft Dynamics CRM from displaying the list of valid reports in lists and forms.&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4058165759694816344-5704214056166403401?l=crmdelacreme.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/5704214056166403401'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/5704214056166403401'/><link rel='alternate' type='text/html' href='http://crmdelacreme.blogspot.com/2009/04/crm-report-performance.html' title='CRM Report Performance'/><author><name>Tiaan van Niekerk</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Ky8MLSxenl8/S86MPSGeVPI/AAAAAAAAAO0/Ln5Gkx7EP5I/S220/Snapshot+of+me+4.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-4058165759694816344.post-2935159594673600829</id><published>2009-04-07T07:38:00.003+02:00</published><updated>2009-04-07T07:45:02.229+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='synchronization'/><category scheme='http://www.blogger.com/atom/ns#' term='Outlook Performance'/><category scheme='http://www.blogger.com/atom/ns#' term='Dynamics CRM Client'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><title type='text'>Microsoft Dynamics CRM Client for Outlook Performance</title><content type='html'>&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;strong&gt;&lt;span style="font-size:100%;"&gt;Procedure: Set synchronization options for optimal performance&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;*In Microsoft Dynamics CRM client for Outlook, on the CRM menu, click Options.&lt;br /&gt;*In the Set Personal Options dialog box, click the Synchronization tab, within Synchronize Microsoft Dynamics CRM items with my default folders, select only record types required to be synchronized.&lt;br /&gt;*Within Schedule automatic synchronization with Outlook, increase the interval between each occurrence of automatic synchronization.&lt;br /&gt;*Within Schedule what to do if duplicates are found during synchronization, click Do not create duplicates to block the creation of records if key fields contain the same data.&lt;br /&gt;*Click OK to close the Set Personal Options dialog box and save the configuration. &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-family:arial;"&gt;Procedure: Limit record types synchronized&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;If a user must synchronize contacts, tasks, and appointments, limit the record types synchronized to those that the user must have offline.&lt;br /&gt;*In Microsoft Dynamics CRM client for Outlook, on the CRM menu, click Options.&lt;br /&gt;*In the Set Personal Options dialog box, on the Synchronization tab, select only the record types that must be synchronized.&lt;/span&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;span style="font-size:100%;"&gt;&lt;strong&gt;Procedure: Deactivate local data groups not used&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Deactivate local data groups for areas the user does not use in the Microsoft Dynamics CRM client for Outlook. Local Data groups are a set of filters that determines what data is available offline and stored on the local computer.&lt;br /&gt;*In Microsoft Dynamics CRM client for Outlook, on the CRM menu, click Modify local data groups.&lt;br /&gt;*On the Data Groups tab, select one or more data groups.&lt;br /&gt;*On the toolbar, click Deactivate. This deactivates all the local data groups, and then moves them to the Inactive Data Groups tab. &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;br /&gt;&lt;strong&gt;&lt;em&gt;&lt;span style="color:#ff0000;"&gt;NOTE:&lt;/span&gt;&lt;/em&gt;&lt;/strong&gt; After implementing any of these suggestions, synchronize the data manually while still online. The first synchronization will be slower than later synchronizations because Microsoft Dynamics CRM must remove records from the local data store. It is best to complete the initial synchronization while connected to the LAN or a High Speed internet connection.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;strong&gt;Procedure: Set Address Book options for optimal performance&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;*In Microsoft Dynamics CRM for Outlook, on the CRM menu, click Options.&lt;br /&gt;*In the Set Personal Options dialog box, click the Address Book tab, within Select how e-mail recipients are reconciled with Microsoft Dynamics CRM records, to the right of Contacts, verify that Match only against contacts synchronized to Microsoft Dynamics CRM is selected.&lt;br /&gt;*To the right of Other record types, ensure that Match only the items I own is selected, and then click OK to save the configuration and close the Set Personal Options dialog box. &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;strong&gt;&lt;em&gt;&lt;span style="color:#ff0000;"&gt;NOTE:&lt;/span&gt;&lt;/em&gt;&lt;/strong&gt; The Address Book tab also provides the option to configure the frequency with which the Address Book is updated from Microsoft Dynamics CRM&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4058165759694816344-2935159594673600829?l=crmdelacreme.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/2935159594673600829'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/2935159594673600829'/><link rel='alternate' type='text/html' href='http://crmdelacreme.blogspot.com/2009/04/microsoft-dynamics-crm-client-for.html' title='Microsoft Dynamics CRM Client for Outlook Performance'/><author><name>Tiaan van Niekerk</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Ky8MLSxenl8/S86MPSGeVPI/AAAAAAAAAO0/Ln5Gkx7EP5I/S220/Snapshot+of+me+4.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-4058165759694816344.post-1895560013425016923</id><published>2009-04-07T07:35:00.001+02:00</published><updated>2009-04-07T07:36:51.456+02:00</updated><title type='text'>Performance - View Optimization CRM 4.0</title><content type='html'>&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;span style="font-size:100%;"&gt;&lt;strong&gt;View Optimization&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Modifying Quick Find Search Columns&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The following example shows how to check the default search columns and change them if necessary. In this case, the steps below describe how to modify the columns on one of the most commonly used views, the Active Accounts view. This is such an important view because for many organizations, the list of Accounts represents the largest and most commonly used data sets of all the Microsoft Dynamics CRM data.&lt;br /&gt;&lt;br /&gt;In the Microsoft Dynamics CRM Navigation Pane, click Settings.&lt;br /&gt;In the Customization sub-area, click Customize Entities.&lt;br /&gt;In the Customize Entities view, double-click to open Account.&lt;br /&gt;In the left hand navigation area of the Account entity form, click Forms and Views.&lt;br /&gt;Double-click to open the Quick Find Active Accounts view.&lt;br /&gt;In the Common Tasks area, click Add Find Columns.&lt;br /&gt;In the Add Find Columns dialog, mark the check boxes for the columns that you want to include in your Quick Find search and clear any check boxes for columns you want to remove. Click OK to close the dialog.&lt;br /&gt;Click the Save and Close button to save the changes and return to the Account entity form.&lt;br /&gt;From the Actions menu of the Account entity form, select Publish.&lt;br /&gt;The Add Find Columns dialog box displays all fields available for the Account entity. Any fields that have the check box selected are fields that are searched when users use the Quick find feature.&lt;br /&gt;&lt;br /&gt;For example, if Account Name and Account Number are selected, the Quick Find feature searches both Account Name and Account Number columns to find records that match that text.&lt;br /&gt;&lt;br /&gt;IMPORTANT: To minimize the performance effect on the Microsoft SQL Server that is used for Microsoft Dynamics CRM, whenever possible, it is recommended to select three or fewer columns.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4058165759694816344-1895560013425016923?l=crmdelacreme.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/1895560013425016923'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/1895560013425016923'/><link rel='alternate' type='text/html' href='http://crmdelacreme.blogspot.com/2009/04/performance-view-optimization-crm-40.html' title='Performance - View Optimization CRM 4.0'/><author><name>Tiaan van Niekerk</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Ky8MLSxenl8/S86MPSGeVPI/AAAAAAAAAO0/Ln5Gkx7EP5I/S220/Snapshot+of+me+4.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-4058165759694816344.post-3189478642748339428</id><published>2009-04-06T14:28:00.012+02:00</published><updated>2009-04-30T06:10:35.832+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='toolbar button'/><category scheme='http://www.blogger.com/atom/ns#' term='link'/><category scheme='http://www.blogger.com/atom/ns#' term='xml'/><category scheme='http://www.blogger.com/atom/ns#' term='website'/><category scheme='http://www.blogger.com/atom/ns#' term='isv'/><category scheme='http://www.blogger.com/atom/ns#' term='CRM'/><title type='text'>Adding a toolbar button in CRM 4.0</title><content type='html'>&lt;span style="font-family:arial;"&gt;&lt;strong&gt;How to add a toolbar button in CRM&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Before these steps are done please backup or copy your ISVConfig.xml,so you have a master to restore if anything goes wrong.&lt;br /&gt;&lt;br /&gt;This is very useful when you maybe want to do some branding of your company on your customer's CRM system,and link it to your website&lt;br /&gt;&lt;br /&gt;Export the ISVConfig.xml from crm and open with editor, I use notepad.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_Ky8MLSxenl8/Sdn7pJWys_I/AAAAAAAAADE/M942s8hDaho/s1600-h/button.jpg"&gt;&lt;/a&gt;Locate the following section within the xml file;&lt;br /&gt;&lt;br /&gt;&lt;!--Application Level Tool Bar--&gt;&lt;br /&gt;&lt;br /&gt;Below the &lt;toolbar&gt;section paste this code below!&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4058165759694816344-3189478642748339428?l=crmdelacreme.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/3189478642748339428'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/3189478642748339428'/><link rel='alternate' type='text/html' href='http://crmdelacreme.blogspot.com/2009/04/adding-toolbar-button-in-crm-40.html' title='Adding a toolbar button in CRM 4.0'/><author><name>Tiaan van Niekerk</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Ky8MLSxenl8/S86MPSGeVPI/AAAAAAAAAO0/Ln5Gkx7EP5I/S220/Snapshot+of+me+4.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-4058165759694816344.post-5464939809124753043</id><published>2009-04-06T08:37:00.006+02:00</published><updated>2009-04-07T06:13:05.294+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sql server'/><category scheme='http://www.blogger.com/atom/ns#' term='installation'/><category scheme='http://www.blogger.com/atom/ns#' term='2005'/><category scheme='http://www.blogger.com/atom/ns#' term='CRM'/><category scheme='http://www.blogger.com/atom/ns#' term='2008'/><title type='text'>Installing CRM 4.0 with SQL Server</title><content type='html'>&lt;a href="http://3.bp.blogspot.com/_Ky8MLSxenl8/SdrStNbamBI/AAAAAAAAADM/XQMj6v-rw7c/s1600-h/sqlserver.bmp"&gt;&lt;img id="BLOGGER_PHOTO_ID_5321797583832258578" style="WIDTH: 183px; CURSOR: hand; HEIGHT: 100px" alt="" src="http://3.bp.blogspot.com/_Ky8MLSxenl8/SdrStNbamBI/AAAAAAAAADM/XQMj6v-rw7c/s400/sqlserver.bmp" border="0" /&gt;&lt;/a&gt;  &lt;div&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;This post will address the requirements for installating CRM on the relavant platforms.We will look at SQl Server 2005 and SQL Server 2008.&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4058165759694816344-5464939809124753043?l=crmdelacreme.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/5464939809124753043'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/5464939809124753043'/><link rel='alternate' type='text/html' href='http://crmdelacreme.blogspot.com/2009/04/installing-crm-40-with-sql-server.html' title='Installing CRM 4.0 with SQL Server'/><author><name>Tiaan van Niekerk</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Ky8MLSxenl8/S86MPSGeVPI/AAAAAAAAAO0/Ln5Gkx7EP5I/S220/Snapshot+of+me+4.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_Ky8MLSxenl8/SdrStNbamBI/AAAAAAAAADM/XQMj6v-rw7c/s72-c/sqlserver.bmp' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-4058165759694816344.post-3012623907004895068</id><published>2009-04-06T07:57:00.009+02:00</published><updated>2009-04-07T06:20:17.903+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='entities'/><category scheme='http://www.blogger.com/atom/ns#' term='jscript'/><category scheme='http://www.blogger.com/atom/ns#' term='views'/><category scheme='http://www.blogger.com/atom/ns#' term='iframes'/><category scheme='http://www.blogger.com/atom/ns#' term='CRM'/><title type='text'>CRM JScripts- IFrames</title><content type='html'>&lt;a href="http://2.bp.blogspot.com/_Ky8MLSxenl8/SdmvAUHl1lI/AAAAAAAAABw/CEo9mZVC0lw/s1600-h/jscript.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5321476854650361426" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; WIDTH: 195px; CURSOR: hand; HEIGHT: 85px" alt="" src="http://2.bp.blogspot.com/_Ky8MLSxenl8/SdmvAUHl1lI/AAAAAAAAABw/CEo9mZVC0lw/s200/jscript.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="color:#ff0000;"&gt;&lt;em&gt;&lt;span style="font-size:78%;"&gt;&lt;span style="font-family:arial;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/em&gt;&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="color:#ff0000;"&gt;&lt;em&gt;&lt;span style="font-size:78%;"&gt;&lt;span style="font-family:arial;"&gt;All code can be used to save time in adding funtionality to CRM.&lt;/span&gt;&lt;span style="font-family:arial;"&gt;All Code published on this post is for use at your own risk.MSCRMER will not be held responsible in any way for any errors or system failures by using the code provided.&lt;/span&gt;&lt;/span&gt;&lt;/em&gt; &lt;span style="font-family:arial;font-size:78%;"&gt;&lt;em&gt;Code formatting might be affected by table size.&lt;/em&gt;&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;&lt;div align="left"&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;div align="left"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;IFrame Code for NAV items in CRM.You will find alot of code across the internet explaining how to do this.The code below is also the same but just add your iframe and change the code.Enjoy!&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;span style="font-family:Arial;"&gt;==========&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Arial;"&gt;&lt;strong&gt;IFrames&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:arial;font-size:78%;color:#009900;"&gt;&lt;em&gt;//Contacts IFrame&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:arial;font-size:78%;color:#009900;"&gt;&lt;em&gt;function GetFrameSource(tabSet)&lt;br /&gt;&lt;/em&gt;&lt;/span&gt;&lt;span style="font-family:arial;font-size:78%;color:#009900;"&gt;&lt;em&gt;{&lt;br /&gt;&lt;/em&gt;&lt;/span&gt;&lt;span style="font-family:arial;font-size:78%;color:#009900;"&gt;&lt;em&gt;if (crmForm.ObjectId != null)&lt;br /&gt;&lt;/em&gt;&lt;/span&gt;&lt;span style="font-family:arial;font-size:78%;color:#009900;"&gt;&lt;em&gt;{&lt;br /&gt;&lt;/em&gt;&lt;/span&gt;&lt;span style="font-family:arial;font-size:78%;color:#009900;"&gt;&lt;em&gt;var oId = crmForm.ObjectId;&lt;br /&gt;var oType = crmForm.ObjectTypeCode;&lt;br /&gt;var security = crmFormSubmit.crmFormSubmitSecurity.value;&lt;br /&gt;return "areas.aspx?oId=" + oId + "&amp;amp;oType=" + oType + "&amp;amp;security=" + security + "&amp;amp;tabSet=" + tabSet;&lt;br /&gt;&lt;/em&gt;&lt;/span&gt;&lt;span style="font-family:arial;font-size:78%;color:#009900;"&gt;&lt;em&gt;}&lt;br /&gt;&lt;/em&gt;&lt;/span&gt;&lt;span style="font-family:arial;font-size:78%;color:#009900;"&gt;&lt;em&gt;else&lt;br /&gt;&lt;/em&gt;&lt;/span&gt;&lt;span style="font-family:arial;font-size:78%;color:#009900;"&gt;&lt;em&gt;{&lt;br /&gt;&lt;/em&gt;&lt;/span&gt;&lt;span style="font-family:arial;font-size:78%;color:#009900;"&gt;&lt;em&gt;return "about:blank";&lt;br /&gt;&lt;/em&gt;&lt;/span&gt;&lt;span style="font-family:arial;font-size:78%;color:#009900;"&gt;&lt;em&gt;}&lt;br /&gt;&lt;/em&gt;&lt;/span&gt;&lt;span style="font-family:arial;font-size:78%;"&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;}&lt;br /&gt;crmForm.all.IFRAME_Contacts.src = GetFrameSource("areaContacts");&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;=========&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;strong&gt;&lt;span style="font-size:100%;"&gt;Custom Related Entities in a IFRAME&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;I used this code to have 5 iframes to related custom entities on a CRM form:Replace The (*) with your field and relationship names.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;&lt;span style="font-family:arial;font-size:78%;color:#009900;"&gt;//OnLoad - JavaScript - (placed into the entity you want an iframe in)&lt;br /&gt;function GetFrameSource(tabSet) {&lt;br /&gt;if (crmForm.ObjectId != null) {&lt;br /&gt;var oId = crmForm.ObjectId;&lt;br /&gt;var oType = crmForm.ObjectTypeCode;&lt;br /&gt;var security = crmFormSubmit.crmFormSubmitSecurity.value;&lt;br /&gt;return "/userdefined/areas.aspx?oId=" + oId + "&amp;amp;oType=" + oType + "&amp;amp;security=" + security + "&amp;amp;tabSet=" + tabSet;&lt;br /&gt;}&lt;br /&gt;else {&lt;br /&gt;return "about:blank";&lt;br /&gt;}}&lt;br /&gt;//Iframe 1&lt;br /&gt;crmForm.all.IFRAME_*.src = GetFrameSource("*Unique relationship name*");&lt;br /&gt;//Iframe 2&lt;br /&gt;crmForm.all.IFRAME_*.src = GetFrameSource("*Unique relationship name*");&lt;br /&gt;//Iframe 3&lt;br /&gt;crmForm.all.IFRAME_*.src = GetFrameSource("*Unique relationship name*");&lt;br /&gt;//Iframe 4&lt;br /&gt;crmForm.all.IFRAME_*.src = GetFrameSource("*Unique relationship name*");&lt;br /&gt;//Iframe 5;&lt;br /&gt;crmForm.all.IFRAME_*.src = GetFrameSource("*Unique relationship name*");&lt;/span&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:85%;"&gt;&lt;/p&gt;&lt;/span&gt;&lt;p&gt;========&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:arial;"&gt;&lt;strong&gt;Maximize your CRM Screens&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;&lt;span style="font-family:arial;font-size:78%;color:#009900;"&gt;if (window.screen)&lt;br /&gt;&lt;/span&gt;&lt;/em&gt;&lt;em&gt;&lt;span style="font-family:arial;font-size:78%;color:#009900;"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;/em&gt;&lt;em&gt;&lt;span style="font-family:arial;font-size:78%;color:#009900;"&gt;var aw = screen.availWidth;&lt;br /&gt;var ah = screen.availHeight;&lt;br /&gt;window.moveTo(0, 0);&lt;br /&gt;window.resizeTo(aw, ah);&lt;br /&gt;&lt;/span&gt;&lt;/em&gt;&lt;em&gt;&lt;span style="font-family:arial;font-size:78%;color:#009900;"&gt;}&lt;/span&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;==========&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family:arial;"&gt;Confirm Save&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;&lt;span style="font-size:78%;color:#009900;"&gt;if (confirm("Are you sure you want to save this form?"))&lt;br /&gt;&lt;/span&gt;&lt;/em&gt;&lt;em&gt;&lt;span style="font-size:78%;color:#009900;"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;/em&gt;&lt;em&gt;&lt;span style="font-size:78%;color:#009900;"&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/em&gt;&lt;em&gt;&lt;span style="font-size:78%;color:#009900;"&gt;else&lt;br /&gt;&lt;/span&gt;&lt;/em&gt;&lt;em&gt;&lt;span style="font-size:78%;color:#009900;"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;/em&gt;&lt;em&gt;&lt;span style="font-size:78%;color:#009900;"&gt;event.returnValue = false;&lt;br /&gt;&lt;/span&gt;&lt;/em&gt;&lt;em&gt;&lt;span style="font-size:78%;color:#009900;"&gt;validationErrors = true;&lt;br /&gt;&lt;/span&gt;&lt;/em&gt;&lt;em&gt;&lt;span style="font-size:78%;"&gt;&lt;span style="color:#009900;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/em&gt;&lt;span style="font-size:78%;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;==========&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:arial;"&gt;&lt;strong&gt;Making a field Read-Only&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;Copy this code in the onload on the crm form.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Arial;font-size:78%;color:#009900;"&gt;&lt;em&gt;crmForm.all.*fieldname*.readOnly=true&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;==========&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:arial;"&gt;&lt;strong&gt;Autofill other dates form a selected date&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;This is very usefil if for example if you have and entity like contracts and depending on the date slected for "Start date" other date fields are updated.Copy this code to the respective field ,change event.&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family:arial;font-size:78%;color:#009900;"&gt;&lt;em&gt;function dateAddExtention(p_Interval, p_Number)&lt;br /&gt;{&lt;br /&gt;var thing = new String();&lt;br /&gt;p_Interval = p_Interval.toLowerCase();&lt;br /&gt;if(isNaN(p_Number))&lt;br /&gt;{&lt;br /&gt;throw "The second parameter must be a number. \n You passed: " + p_Number;&lt;br /&gt;return false;&lt;br /&gt;}&lt;br /&gt;p_Number = new Number(p_Number);&lt;br /&gt;switch(p_Interval.toLowerCase())&lt;br /&gt;{&lt;br /&gt;case "yyyy": {// year this.setFullYear(this.getFullYear() + p_Number);&lt;br /&gt;break;&lt;br /&gt;}&lt;br /&gt;case "q":&lt;br /&gt;{&lt;br /&gt;// quarter this.setMonth(this.getMonth() + (p_Number*3));&lt;br /&gt;break;&lt;br /&gt;}&lt;br /&gt;case "m":&lt;br /&gt;{&lt;br /&gt;// month this.setMonth(this.getMonth() + p_Number);&lt;br /&gt;break;&lt;br /&gt;}&lt;br /&gt;case "y":// day of year case "d":&lt;br /&gt;// day case "w":&lt;br /&gt;{&lt;br /&gt;// weekday this.setDate(this.getDate() + p_Number);&lt;br /&gt;break;&lt;br /&gt;}&lt;br /&gt;case "ww": {&lt;br /&gt;// week of year this.setDate(this.getDate() + (p_Number*7));&lt;br /&gt;break;&lt;br /&gt;}&lt;br /&gt;case "h":&lt;br /&gt;{&lt;br /&gt;// hour this.setHours(this.getHours() + p_Number);&lt;br /&gt;break;&lt;br /&gt;}&lt;br /&gt;case "n":&lt;br /&gt;{&lt;br /&gt;// minute this.setMinutes(this.getMinutes() + p_Number);&lt;br /&gt;break;&lt;br /&gt;}&lt;br /&gt;case "s":&lt;br /&gt;{&lt;br /&gt;// second this.setSeconds(this.getSeconds() + p_Number);&lt;br /&gt;break;&lt;br /&gt;}&lt;br /&gt;case "ms": { // second this.setMilliseconds(this.getMilliseconds() + p_Number);&lt;br /&gt;break;&lt;br /&gt;}&lt;br /&gt;default: { throw "The first parameter must be a string from this list: \n" + "yyyy, q, m, y, d, w, ww, h, n, s, or ms. You passed: " + p_Interval; return false;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;return this;&lt;br /&gt;}&lt;br /&gt;Date.prototype.dateAdd = dateAddExtention;&lt;br /&gt;var expireson= new Date(crmForm.all.activeon.DataValue );&lt;br /&gt;var *new_increasedate*= new Date(crmForm.all.activeon.DataValue ); &lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family:arial;font-size:78%;color:#009900;"&gt;&lt;em&gt;//CONTRACT EXPIRES ON 60 MONTHS FROM START DATE&lt;br /&gt;expireson.dateAdd("m",60);&lt;br /&gt;&lt;/em&gt;&lt;/span&gt;&lt;span style="font-family:arial;font-size:78%;color:#009900;"&gt;&lt;em&gt;//RENEWAL DATE IS 55 MONTHS FORM START DATE&lt;br /&gt;*new_increasedate*.dateAdd("m",55);&lt;br /&gt;crmForm.all.expireson.DataValue = expireson;&lt;br /&gt;crmForm.all.new_increasedate.DataValue = new_increasedate;&lt;br /&gt;crmForm.all.billingendon.DataValue = expireson;&lt;br /&gt;crmForm.all.billingstarton.DataValue = crmForm.all.activeon.DataValue;&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;===========&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4058165759694816344-3012623907004895068?l=crmdelacreme.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/3012623907004895068'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/3012623907004895068'/><link rel='alternate' type='text/html' href='http://crmdelacreme.blogspot.com/2009/04/crm-jscripts.html' title='CRM JScripts- IFrames'/><author><name>Tiaan van Niekerk</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Ky8MLSxenl8/S86MPSGeVPI/AAAAAAAAAO0/Ln5Gkx7EP5I/S220/Snapshot+of+me+4.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_Ky8MLSxenl8/SdmvAUHl1lI/AAAAAAAAABw/CEo9mZVC0lw/s72-c/jscript.jpg' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-4058165759694816344.post-6456048260884637195</id><published>2009-04-04T12:54:00.003+02:00</published><updated>2009-04-07T06:16:02.442+02:00</updated><title type='text'>Re-Deploy CRM</title><content type='html'>&lt;a href="http://3.bp.blogspot.com/_Ky8MLSxenl8/SdrTdCNS3hI/AAAAAAAAADU/UMKvfwUT5ms/s1600-h/logo_dynamics_crm.gif"&gt;&lt;img id="BLOGGER_PHOTO_ID_5321798405453962770" style="WIDTH: 170px; CURSOR: hand; HEIGHT: 135px" alt="" src="http://3.bp.blogspot.com/_Ky8MLSxenl8/SdrTdCNS3hI/AAAAAAAAADU/UMKvfwUT5ms/s400/logo_dynamics_crm.gif" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;p&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;This post will address all tips and tricks of re-deploying CRM to new servers.&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4058165759694816344-6456048260884637195?l=crmdelacreme.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/6456048260884637195'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/6456048260884637195'/><link rel='alternate' type='text/html' href='http://crmdelacreme.blogspot.com/2009/04/re-deploy-crm.html' title='Re-Deploy CRM'/><author><name>Tiaan van Niekerk</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Ky8MLSxenl8/S86MPSGeVPI/AAAAAAAAAO0/Ln5Gkx7EP5I/S220/Snapshot+of+me+4.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_Ky8MLSxenl8/SdrTdCNS3hI/AAAAAAAAADU/UMKvfwUT5ms/s72-c/logo_dynamics_crm.gif' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-4058165759694816344.post-8547590776556702487</id><published>2009-04-04T12:53:00.000+02:00</published><updated>2009-04-04T12:54:20.659+02:00</updated><title type='text'>Upgrade CRM</title><content type='html'>&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4058165759694816344-8547590776556702487?l=crmdelacreme.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/8547590776556702487'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/8547590776556702487'/><link rel='alternate' type='text/html' href='http://crmdelacreme.blogspot.com/2009/04/upgrade-crm.html' title='Upgrade CRM'/><author><name>Tiaan van Niekerk</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Ky8MLSxenl8/S86MPSGeVPI/AAAAAAAAAO0/Ln5Gkx7EP5I/S220/Snapshot+of+me+4.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-4058165759694816344.post-5567303167901171173</id><published>2009-04-04T12:26:00.006+02:00</published><updated>2009-04-07T14:16:20.546+02:00</updated><title type='text'>Installing CRM 4.0 Server</title><content type='html'>&lt;a href="http://2.bp.blogspot.com/_Ky8MLSxenl8/Sdmfj-bzsoI/AAAAAAAAABQ/0AsdDf4DwZM/s1600-h/os.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5321459875118822018" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; WIDTH: 200px; CURSOR: hand; HEIGHT: 39px" alt="" src="http://2.bp.blogspot.com/_Ky8MLSxenl8/Sdmfj-bzsoI/AAAAAAAAABQ/0AsdDf4DwZM/s200/os.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;This post will be dedicated to the installation of CRM on Server Platforms.We will&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;address Windows Server 2003 and Windows server 2008 (32 bit and 64 bit) installations.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4058165759694816344-5567303167901171173?l=crmdelacreme.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/5567303167901171173'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4058165759694816344/posts/default/5567303167901171173'/><link rel='alternate' type='text/html' href='http://crmdelacreme.blogspot.com/2009/04/troubleshhoting-crm.html' title='Installing CRM 4.0 Server'/><author><name>Tiaan van Niekerk</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Ky8MLSxenl8/S86MPSGeVPI/AAAAAAAAAO0/Ln5Gkx7EP5I/S220/Snapshot+of+me+4.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_Ky8MLSxenl8/Sdmfj-bzsoI/AAAAAAAAABQ/0AsdDf4DwZM/s72-c/os.jpg' height='72' width='72'/></entry></feed>
