<?xml version="1.0" encoding="UTF-8"?><!--RSS generated by Windows SharePoint Services V3 RSS Generator on 7/30/2010 1:01:54 PM--><?xml-stylesheet type="text/xsl" href="/en/blog/_layouts/RssXslt.aspx?List=2c30449f-e1dd-4f11-99fe-ed23589c1c3a" version="1.0"?><rss version="2.0"><channel><title>Orbit One Blog</title><link>http://www.orbitone.com/en/blog</link><description>RSS feed for the Posts list.</description><lastBuildDate>Fri, 30 Jul 2010 11:01:54 GMT</lastBuildDate><generator>SharePoint CKS:EBE</generator><ttl>60</ttl><image><title>Orbit One Blog</title><url>http://www.orbitone.com/en/blog/_layouts/images/homepage.gif</url><link>http://www.orbitone.com/en/blog</link></image><item><title>Moving to the cloud with BPOS – Public Folders</title><link>http://www.orbitone.com/en/blog/archive/2010/06/28/moving-to-the-cloud-with-bpos-–-public-folders.aspx</link><guid>/en/blog/archive/2010/06/28/moving-to-the-cloud-with-bpos-–-public-folders.aspx</guid><description><![CDATA[<div class="ExternalClassE1E102E54D6F47419DADE25FAFA9E4DD">
<p>Microsoft Business Productivity Online Standard Suite (BPOS) is a set of messaging and collaboration solutions hosted by Microsoft, and consists of Exchange Online, SharePoint Online, Office Live Meeting, and Office Communications Online. </p>
<p>Unfortunately, public folders are not supported by BPOS. To migrate your old public folders to BPOS, you’ll need to find a workaround.</p>
<p>One of the ways to migrate your old Shared Folders, is by creating a shared mailbox that everybody can access. </p>
<p>The easiest way to set up a Shared Mailbox, is to create a new BPOS account (for example <a href="mailto:shared@example.com">shared@example.com</a>). On a client machine, you can install the Microsoft Online Services Sign In tool, which you can download from <a title="http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;FamilyID=5c2ca866-4107-4ae5-98d5-76bf1b18ff87" href="http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;FamilyID=5c2ca866-4107-4ae5-98d5-76bf1b18ff87">http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;FamilyID=5c2ca866-4107-4ae5-98d5-76bf1b18ff87</a> .</p>
<p>The Sign In Tool will configure your outlook to access the new mailbox. Once your outlook is restored, you can import a PST file containing your public folders to your new mailbox and Outlook will start synchronizing with BPOS. Off course, this will take some time depending on the size of your Public Folders.</p>
<p>Now, we need to give all people access to this new shared mailbox. One way to do this is by right-clicking on the folders and edit the Permissions of the folders as shown in the figures below.</p>
<p><a href="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/62/image_2_13964200.png"><img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px" title="image" border="0" alt="image" src="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/62/image_thumb_13964200.png" width="408" height="545"></a> </p>
<p>This looks like the easiest way, but there’s one problem with this method: setting Permissions on a folder is not recursive, so you will need to set these permissions on all subfolders. If you have a complex folder structure with lots of subfolders, and you need to give some people access to all folders using this method, good luck!</p>
<p>But there is an alternative way: in BPOS, you can give other people Full Access to a mailbox. So by giving all the members of your team Full Access to the shared mailbox, they will automatically have Full Access to all subfolders of your shared mailbox. To do this, you’ll need to have the Migration Tools installed on the client machine, and use some PowerShell.</p>
<p>To grant somebody full-access to the shared mailbox, you can use the <strong>Add-MSOnlineMailPermission</strong> as described in <a title="http://technet.microsoft.com/en-us/library/ee662271.aspx" href="http://technet.microsoft.com/en-us/library/ee662271.aspx">http://technet.microsoft.com/en-us/library/ee662271.aspx</a></p>
<p>An example is shown below:</p>
<p>Add-MSOnlineMailPermission -Identity <a href="mailto:shared@example.com">shared@example.com</a> -Credential $cred -TrustedUser admin@example.com –GrantFullAccess True –GrantSendAs True </p>
<p>This will give the user <a href="mailto:admin@example.com">admin@example.com</a> Full Access and SendAs permissions to the <a href="mailto:shared@example.com">shared@example.com</a> mailbox. This is only a basic example, with some coding skills you’ll easily manage to write a PowerShell script to give all users the needed permissions.</p>
<p>To finish the story, the users still need to open the Shared Mailbox. When using Outlook, they can easily open an additional mailbox. To do this, just follow the steps explained on <a title="http://office.microsoft.com/en-us/outlook-help/add-another-person-s-mailbox-to-your-account-HP005242139.aspx" href="http://office.microsoft.com/en-us/outlook-help/add-another-person-s-mailbox-to-your-account-HP005242139.aspx">http://office.microsoft.com/en-us/outlook-help/add-another-person-s-mailbox-to-your-account-HP005242139.aspx</a>.</p>
<p>Good luck migrating to BPOS!</p></div>]]></description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Pieter-Jan Maenhaut</dc:creator><pubDate>Mon, 28 Jun 2010 19:15:00 GMT</pubDate></item><item><title>SharePoint 2010: transparent login with mixed authentication</title><link>http://www.orbitone.com/en/blog/archive/2010/06/23/sharepoint-2010-mixed-authentication-automatic-login.aspx</link><guid>/en/blog/archive/2010/06/23/sharepoint-2010-mixed-authentication-automatic-login.aspx</guid><description><![CDATA[<div class="ExternalClass64100EA28AEF46808799CC462DD65D38"><div class="ExternalClass40A8CBFD2CD94BEFA075F1CF464FC0AB">   <h2>Authentication in SharePoint 2007</h2>    <p>In SharePoint 2007 it was possible to enable forms based authentication next to windows authentication only by extending a web application and basically running two separate applications on the same content database.</p>    <p>side from the problems with forms based authentication in SharePoint 2007, there were also some usability issues. </p>    <ul>     <li>The two sites are <strong>accessed by a different url.</strong> For internal users the url could be https://intranet, for external users https://intranet.company.com.         <br>This is especially a problem when sending links to document or pages. The links point to a different site depending on if an internal or external user copied the link. This lead to a lot of confusion and unexpected errors </li>      <li>Email alerts sent by SharePoint itself can contain the wrong urls </li>      <li>Smartparts and some other customisations need to be deployed twice </li>      <li>Changes to the web.config need to be duplicated        <br></li>   </ul>    <h2>Authentication in SharePoint 2010</h2>    <p>SharePoint 2010 comes with a nice new feature that aims to solve this problem: Mixed Authentication. It allows for the configuration of multiple authentication providers (Windows authentication, forms authentication, trusted Identity providers) together using <strong>the same url</strong>, without having to extend the web application. Both external and internal users would access the web site on https://intranet.company.com for example.</p>    <p>By default the user has to choose the authentication method when upon logging in.</p>    <p><a href="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/61/image_2_2BFB2463.png"><img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px" title="image" border="0" alt="image" src="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/61/image_thumb_2BFB2463.png" width="538" height="204"></a> </p>    <p>While this is very nice, and a great improvement over the previous version, the downside is that there is <strong>no more transparent authentication in an intranet environment.</strong></p>    <p>With the correct browser settings is it possible to log on automatically when using windows authentication.</p>    <p>In Internet Explorer it can be configured in the security settings of the Local Intranet zone. These settings can also be pushed through group policies.</p>    <p><a href="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/61/image_6_1A720650.png"><img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px" title="image" border="0" alt="image" src="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/61/image_thumb_2_1A720650.png" width="437" height="401"></a> </p>    <p><a href="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/61/image_8_1A720650.png"><img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px" title="image" border="0" alt="image" src="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/61/image_thumb_3_1A720650.png" width="370" height="210"></a> </p>    <p>If the intranet is configured correctly, or “detected automatically”, all login attempts will transparently use the windows identity.</p>    <p>Each time a user tries to access the intranet, he is greeted by the “user friendly” choice above. Each time he tries to open a document stored on the intranet, he gets the same login popup.</p>    <p>In an intranet environment, this is simply unacceptable.</p>    <h2>The solution for SharePoint 2010</h2>    <p>Looking to improve on this situation we found a great <a href="http://blogs.msdn.com/b/brporter/archive/2010/05/10/temp.aspx" target="_blank">blog post</a> by Bryan Porter. By using a custom login page and custom PowerShell snap-in he was able to automatically choose the authentication provider based on the IP address of the user logging in.</p>    <p>The solution consists of two parts</p>    <ul>     <li>A custom PowerShell snap-in that is used to manage the mappings between IP addresses and authentication providers. The mapping is stored in the Hierarchical Object Store, on the level of the Web Application. </li>      <li>A custom sign-in page. When the custom sign-in page is loaded it will first check the IP address of the user. Then it will check if the address is mapped to an authentication provider. If it is mapped, the user will be redirected to the sign-in page of that provider. In other words, if the mapping is found the “Select the credentials you want to use to logon to the SharePoint site” step of the sign in process is automated. </li>   </ul>    <p>In order to use Bryan’s solution we added some features:</p>    <ul>     <li>Wild card mapping. Authentication providers can now be mapped to wildcard IP range, for example 192.168.0.* </li>      <li>IPv6 support. </li>      <li>Fix the redirection to make “Sign in as a different user” work correctly </li>   </ul>    <p>After installing the web application can be configured to automatically use Windows Authentication for a certain range of IP’s, and forms authentication for the others.</p>    <p><strong>Update</strong>: The project is now available on codeplex: <a href="http://spautomaticsignin.codeplex.com/">http://spautomaticsignin.codeplex.com/</a></p>    <p>We are currently using this solution for several customers.</p>    <p> </p>    <h2>Deployment</h2>    <p>All commands are executed in the SharePoint 2010 Management Shell</p>    <p>The custom login page is deployed to the SharePoint Root: “C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\TEMPLATE\IDENTITYMODEL\LOGIN”</p>    <p>The assembly containing the code-behind of the login page and the powershell cmdlet code are deployed to the GAC</p>    <ol>     <li>       <h5>Add the solution to the solution store          <br></h5>        <p>stsadm -o addsolution -filename OrbitOne.SharePoint.Claims.SignIn.wsp</p>     </li>      <li>       <h5>Deploy the solution to all web applications          <br></h5>        <p>stsadm -o deploysolution -name OrbitOne.SharePoint.Claims.SignIn.wsp -immediate -allowgacdeployment </p>        <p>stsadm -o execadmsvcjobs</p>     </li>      <li>       <h5>Register the assembly          <br></h5>        <p>C:\WINDOWS\Microsoft.NET\Framework64\v2.0.50727\installutil /assemblyname &quot;OrbitOne.SharePoint.Claims.SignIn, Culture=neutral, Version=1.0.0.0, PublicKeyToken=3c7a593397c60142&quot;</p>     </li>   </ol>    <h2>Deployment of an updated version</h2>    <ol>     <li>       <h5>Retract and delete the existing solution          <br></h5>        <p>stsadm -o retractsolution -name OrbitOne.SharePoint.Claims.SignIn.wsp -immediate </p>        <p>stsadm -o execadmsvcjobs </p>        <p>stsadm -o deletesolution -name OrbitOne.SharePoint.Claims.SignIn.wsp</p>     </li>      <li>       <h5>Deploy the new solution          <br></h5>        <p>stsadm -o addsolution -filename OrbitOne.SharePoint.Claims.SignIn.wsp </p>        <p>stsadm -o deploysolution -name OrbitOne.SharePoint.Claims.SignIn.wsp -immediate -allowgacdeployment </p>        <p>stsadm -o execadmsvcjobs</p>     </li>      <li>       <p> </p>     </li>   </ol>    <h2>Configuration</h2>    <p>In the SharePoint 2010 Management Console:</p>    <p>load the snap-in</p>    <p>Add-PSSnapin ClaimsSignInAdmin</p>    <p>Create a configuration object. Note: the url is the url of your web application</p>    <p>$config = Get-SPSignInConfiguration –webapplication “http://www.website.com”</p>    <p>Mappings can be managed with the following commands</p>    <ul>     <li>       <h5>View all configured mappings          <br></h5>        <p>$config.ProviderMappings</p>     </li>   </ul>    <ul>     <li>       <h5>Add a mapping          <br></h5>        <p>$config.ProviderMappings.Add(&quot;192.168.20.*&quot;,&quot;Windows Authentication&quot;)</p>        <p>$config.Update()</p>     </li>   </ul>    <ul>     <li>       <h5>Remove a mapping          <br></h5>        <p>$config.ProviderMappings.Remove(&quot;192.168.20.*&quot;)</p>        <p>$config.Update()</p>     </li>   </ul>    <ul>     <li>       <h5>Clear all mappings          <br></h5>        <p>$config.ProviderMappings.Clear()</p>        <p>$config.Update()</p>     </li>   </ul>    <h2> </h2>    <h2>Configure the custom sign-in page</h2>    <p>Configuration of a custom sign-in page is now a fully supported feature. In SharePoint 2007 it was possible to do this in the web.config, in Sharepoint 2010 it is a settings in the Central Administration.</p>    <p>Application Management -&gt; Manage Web Applications</p>    <p>Select one - &gt; Authentication providers –&gt; select the Zone (usually Default)</p>    <p><a href="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/61/image_4_2BFB2463.png"><img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px" title="image" border="0" alt="image" src="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/61/image_thumb_1_2BFB2463.png" width="431" height="166"></a> </p>    <p>Is there a way to do this from Powershell? It would make the deployment a lot faster.</p>    <h2>Code</h2>    <p>The IP address to Authentication provider mappings are stored in the Hierarchal Object Store associated with a web application. To create a custom Persisted Object for SharePoint all that is needed is to inherit from SPPersistedObject and mark the fields to persist with the “Persisted” attribute.</p>    <p>    <div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:97f2713f-59d0-4f41-832e-525b48a47c72" class="wlWriterEditableSmartContent"><pre style="background-color:White;overflow:auto"><span style="color:#0000FF">public</span><span style="color:#000000"> </span><span style="color:#0000FF">class</span><span style="color:#000000"> SignInConfiguration : SPPersistedObject
{
    [Persisted()]
    </span><span style="color:#0000FF">private</span><span style="color:#000000"> Dictionary</span><span style="color:#000000">&lt;</span><span style="color:#0000FF">string</span><span style="color:#000000">, </span><span style="color:#0000FF">string</span><span style="color:#000000">&gt;</span><span style="color:#000000"> m_providerMappings </span><span style="color:#000000">=</span><span style="color:#000000"> </span><span style="color:#0000FF">new</span><span style="color:#000000"> Dictionary</span><span style="color:#000000">&lt;</span><span style="color:#0000FF">string</span><span style="color:#000000">, </span><span style="color:#0000FF">string</span><span style="color:#000000">&gt;</span><span style="color:#000000">();
    
    </span><span style="color:#0000FF">public</span><span style="color:#000000"> SignInConfiguration(): </span><span style="color:#0000FF">base</span><span style="color:#000000">()
    { }

    </span><span style="color:#0000FF">public</span><span style="color:#000000"> SignInConfiguration(</span><span style="color:#0000FF">string</span><span style="color:#000000"> name, SPPersistedObject parent): </span><span style="color:#0000FF">base</span><span style="color:#000000">(name, parent)
    { }

    </span><span style="color:#0000FF">public</span><span style="color:#000000"> SignInConfiguration(</span><span style="color:#0000FF">string</span><span style="color:#000000"> name, SPPersistedObject parent, Guid id): </span><span style="color:#0000FF">base</span><span style="color:#000000">(name, parent, id)
    { }
    
    </span><span style="color:#0000FF">public</span><span style="color:#000000"> Dictionary</span><span style="color:#000000">&lt;</span><span style="color:#0000FF">string</span><span style="color:#000000">, </span><span style="color:#0000FF">string</span><span style="color:#000000">&gt;</span><span style="color:#000000"> ProviderMappings
    {
        </span><span style="color:#0000FF">get</span><span style="color:#000000"> { </span><span style="color:#0000FF">return</span><span style="color:#000000"> m_providerMappings; }
    }
}</span></pre></div>

  <p>

  <p>To add this object to a web application or to get an existing one from a web application a custom PowerShell cmdlet is used</p>

  <div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:f048f2d2-8c75-4845-a053-6fc0686e933a" class="wlWriterEditableSmartContent"><pre style="background-color:#FFFFFF;overflow:auto"><span style="color:#000000">[Cmdlet(</span><span style="color:#800000">&quot;</span><span style="color:#800000">Get</span><span style="color:#800000">&quot;</span><span style="color:#000000">, </span><span style="color:#800000">&quot;</span><span style="color:#800000">SPSignInConfiguration</span><span style="color:#800000">&quot;</span><span style="color:#000000">, DefaultParameterSetName </span><span style="color:#000000">=</span><span style="color:#000000"> </span><span style="color:#800000">&quot;</span><span style="color:#800000">DefaultSet</span><span style="color:#800000">&quot;</span><span style="color:#000000">)]
</span><span style="color:#0000FF">public</span><span style="color:#000000"> </span><span style="color:#0000FF">class</span><span style="color:#000000"> SPCmdletGetSignInConfigObject : SPCmdlet
{
   </span><span style="color:#0000FF">private</span><span style="color:#000000"> SPWebApplicationPipeBind m_webAppPipeBind;

   </span><span style="color:#0000FF">protected</span><span style="color:#000000"> </span><span style="color:#0000FF">override</span><span style="color:#000000"> </span><span style="color:#0000FF">void</span><span style="color:#000000"> InternalProcessRecord()
   {
       SPWebApplication webApp </span><span style="color:#000000">=</span><span style="color:#000000"> m_webAppPipeBind.Read();
       SignInConfiguration sc </span><span style="color:#000000">=</span><span style="color:#000000"> webApp.GetChild</span><span style="color:#000000">&lt;</span><span style="color:#000000">SignInConfiguration</span><span style="color:#000000">&gt;</span><span style="color:#000000">(</span><span style="color:#800000">&quot;</span><span style="color:#800000">SignInConfig</span><span style="color:#800000">&quot;</span><span style="color:#000000">);
        
       </span><span style="color:#0000FF">if</span><span style="color:#000000"> (sc </span><span style="color:#000000">==</span><span style="color:#000000"> </span><span style="color:#0000FF">null</span><span style="color:#000000">)
       {
           sc </span><span style="color:#000000">=</span><span style="color:#000000"> </span><span style="color:#0000FF">new</span><span style="color:#000000"> SignInConfiguration(</span><span style="color:#800000">&quot;</span><span style="color:#800000">SignInConfig</span><span style="color:#800000">&quot;</span><span style="color:#000000">, webApp);
       }

       sc.Update();
       </span><span style="color:#0000FF">base</span><span style="color:#000000">.WriteObject(sc);
   }

   [ValidateNotNull]
   [Parameter(Mandatory</span><span style="color:#000000">=</span><span style="color:#0000FF">true</span><span style="color:#000000">, ValueFromPipeline</span><span style="color:#000000">=</span><span style="color:#0000FF">true</span><span style="color:#000000">, Position</span><span style="color:#000000">=</span><span style="color:#800080">0</span><span style="color:#000000">)]
   [Alias(</span><span style="color:#0000FF">new</span><span style="color:#000000"> </span><span style="color:#0000FF">string</span><span style="color:#000000">[] { </span><span style="color:#800000">&quot;</span><span style="color:#800000">WebApplication</span><span style="color:#800000">&quot;</span><span style="color:#000000">, </span><span style="color:#800000">&quot;</span><span style="color:#800000">WebApp</span><span style="color:#800000">&quot;</span><span style="color:#000000">})]
   </span><span style="color:#0000FF">public</span><span style="color:#000000"> SPWebApplicationPipeBind Identity
   {
       </span><span style="color:#0000FF">get</span><span style="color:#000000"> { </span><span style="color:#0000FF">return</span><span style="color:#000000"> m_webAppPipeBind; }
       </span><span style="color:#0000FF">set</span><span style="color:#000000"> { m_webAppPipeBind </span><span style="color:#000000">=</span><span style="color:#000000"> value; }
   }
}</span></pre></div>

  <p>A SignInConfiguration object is returned for the specified web application. If the configuration does not exist yet a new one will be created. This gives us a reference to the SingInConfig object in the Powershell environment. Any changes are persisted after calling the Update() method on the object.</p>

  <p>Finally, in the code behind of the login page the mappings are retrieved, the IP address of the request is checked against the mappings, and if an authentication provider is found the user is redirected to the provider’s sign-in page.</p>

  <div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:f06517ad-a840-4a18-9ba1-ec9c577bf2bc" class="wlWriterEditableSmartContent"><pre style="background-color:#FFFFFF;overflow:auto"><span style="color:#0000FF">protected</span><span style="color:#000000"> </span><span style="color:#0000FF">override</span><span style="color:#000000"> </span><span style="color:#0000FF">void</span><span style="color:#000000"> OnLoad(EventArgs e)
{
  </span><span style="color:#0000FF">if</span><span style="color:#000000"> (SPContext.Current </span><span style="color:#000000">==</span><span style="color:#000000"> </span><span style="color:#0000FF">null</span><span style="color:#000000">) </span><span style="color:#0000FF">return</span><span style="color:#000000">;
  </span><span style="color:#0000FF">if</span><span style="color:#000000"> (SPContext.Current.Site </span><span style="color:#000000">==</span><span style="color:#000000"> </span><span style="color:#0000FF">null</span><span style="color:#000000">) </span><span style="color:#0000FF">return</span><span style="color:#000000">;
  </span><span style="color:#0000FF">if</span><span style="color:#000000"> (SPContext.Current.Site.WebApplication </span><span style="color:#000000">==</span><span style="color:#000000"> </span><span style="color:#0000FF">null</span><span style="color:#000000">) </span><span style="color:#0000FF">return</span><span style="color:#000000">;

  SPWebApplication app </span><span style="color:#000000">=</span><span style="color:#000000"> SPContext.Current.Site.WebApplication;
  SignInConfiguration config </span><span style="color:#000000">=</span><span style="color:#000000"> app.GetChild</span><span style="color:#000000">&lt;</span><span style="color:#000000">SignInConfiguration</span><span style="color:#000000">&gt;</span><span style="color:#000000">(</span><span style="color:#800000">&quot;</span><span style="color:#800000">SignInConfig</span><span style="color:#800000">&quot;</span><span style="color:#000000">);

  SPAlternateUrl u </span><span style="color:#000000">=</span><span style="color:#000000"> app.AlternateUrls[Request.Url];
  SPUrlZone zone </span><span style="color:#000000">=</span><span style="color:#000000"> u.UrlZone;

  </span><span style="color:#0000FF">string</span><span style="color:#000000"> components </span><span style="color:#000000">=</span><span style="color:#000000"> Request.Url.GetComponents(UriComponents.Query, UriFormat.SafeUnescaped);
  SPIisSettings settings </span><span style="color:#000000">=</span><span style="color:#000000"> app.IisSettings[zone];

  </span><span style="color:#0000FF">string</span><span style="color:#000000"> ip </span><span style="color:#000000">=</span><span style="color:#000000"> IpNetworking.GetIP4Address();
  ip </span><span style="color:#000000">=</span><span style="color:#000000"> Regex.Replace(ip, </span><span style="color:#800000">@&quot;</span><span style="color:#800000">^(?&lt;Prefix&gt;(\d{1,3}\.){3})\d{1,3}$</span><span style="color:#800000">&quot;</span><span style="color:#000000">, </span><span style="color:#800000">&quot;</span><span style="color:#800000">${Prefix}*</span><span style="color:#800000">&quot;</span><span style="color:#000000">);
  </span><span style="color:#0000FF">if</span><span style="color:#000000"> (config </span><span style="color:#000000">!=</span><span style="color:#000000"> </span><span style="color:#0000FF">null</span><span style="color:#000000"> </span><span style="color:#000000">&amp;&amp;</span><span style="color:#000000"> config.ProviderMappings.ContainsKey(ip))
  {
      </span><span style="color:#0000FF">string</span><span style="color:#000000"> targetProvider </span><span style="color:#000000">=</span><span style="color:#000000"> config.ProviderMappings[ip];
      </span><span style="color:#0000FF">foreach</span><span style="color:#000000"> (SPAuthenticationProvider provider </span><span style="color:#0000FF">in</span><span style="color:#000000"> settings.ClaimsAuthenticationProviders)
      {
          </span><span style="color:#0000FF">if</span><span style="color:#000000"> (</span><span style="color:#0000FF">string</span><span style="color:#000000">.Compare(provider.DisplayName, targetProvider, </span><span style="color:#0000FF">true</span><span style="color:#000000">, System.Globalization.CultureInfo.CurrentUICulture) </span><span style="color:#000000">==</span><span style="color:#000000"> </span><span style="color:#800080">0</span><span style="color:#000000">
              </span><span style="color:#000000">||</span><span style="color:#000000"> </span><span style="color:#0000FF">string</span><span style="color:#000000">.Compare(provider.ClaimProviderName, targetProvider, </span><span style="color:#0000FF">true</span><span style="color:#000000">, System.Globalization.CultureInfo.CurrentUICulture) </span><span style="color:#000000">==</span><span style="color:#000000"> </span><span style="color:#800080">0</span><span style="color:#000000">)
          {
              </span><span style="color:#0000FF">string</span><span style="color:#000000"> url </span><span style="color:#000000">=</span><span style="color:#000000"> provider.AuthenticationRedirectionUrl.ToString();
              </span><span style="color:#0000FF">if</span><span style="color:#000000"> (provider </span><span style="color:#0000FF">is</span><span style="color:#000000"> SPWindowsAuthenticationProvider)
              {
                  components </span><span style="color:#000000">=</span><span style="color:#000000"> EnsureReturnUrl(components);
              }
              SPUtility.Redirect(url, SPRedirectFlags.Default, </span><span style="color:#0000FF">this</span><span style="color:#000000">.Context, components);
          }
      }
  }
  </span><span style="color:#0000FF">else</span><span style="color:#000000">
  {
      SPUtility.Redirect(</span><span style="color:#800000">&quot;</span><span style="color:#800000">/_forms/default.aspx</span><span style="color:#800000">&quot;</span><span style="color:#000000">, SPRedirectFlags.Default, </span><span style="color:#0000FF">this</span><span style="color:#000000">.Context, components);   
  }
  </span><span style="color:#0000FF">base</span><span style="color:#000000">.OnLoad(e);
}</span></pre></div>
</div></div>]]></description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Mel Gerats</dc:creator><pubDate>Wed, 23 Jun 2010 17:12:00 GMT</pubDate><category domain="http://www.orbitone.com/en/blog/archive/tags/SharePoint 2010/default.aspx">SharePoint 2010</category><category domain="http://www.orbitone.com/en/blog/archive/tags/SharePoint/default.aspx">SharePoint</category></item><item><title>OData and WCF Data Services</title><link>http://www.orbitone.com/en/blog/archive/2010/06/09/odata-and-wcf-data-services.aspx</link><guid>/en/blog/archive/2010/06/09/odata-and-wcf-data-services.aspx</guid><description><![CDATA[<div class="ExternalClassC8C29EC76BB54C879CAD64F46A3E083F"><p class="ExternalClass77FC5E03CAFF4C7DA5F08BD09D764ACC">This week we started investigating OData and WCF data services as a way to easily expose and query a remote database.</p>
<p class="ExternalClass77FC5E03CAFF4C7DA5F08BD09D764ACC">OData, the <a href="http://www.odata.org/" target="_blank">Open Data Protocol</a> is a protocol for querying and updating data over using Http and AtomPub</p>
<p class="ExternalClass77FC5E03CAFF4C7DA5F08BD09D764ACC">Visual studio 2010 and .NET 4.0 come with rich support to both produce and consume data using the Open Data Protocol.</p>
<p class="ExternalClass77FC5E03CAFF4C7DA5F08BD09D764ACC">This post is a tutorial on how to set up a web service that exposes OData, and how to query it from a client application.</p>
<h2 class="ExternalClass77FC5E03CAFF4C7DA5F08BD09D764ACC">Prerequisites</h2>
<div class="ExternalClass77FC5E03CAFF4C7DA5F08BD09D764ACC">
<ul>
<li>Download and install the Northwind database<br><a href="http://www.codeproject.com/KB/database/InstallingNorthwindAndPub.aspx">http://www.codeproject.com/KB/database/InstallingNorthwindAndPub.aspx</a></li></ul></div>
<div class="ExternalClass87112F66381A4C70A49D8D5A51D5AED2">
<ul>
<li>Visual Studio 2010</li>
<li>.NET 4.0  Framework or the Data Services update for Microsoft .NET Framework 3.5 Service Pack 1</li></ul></div>
<h2>Exposing data as Odata</h2>
<p> </p>
<h5>Create a new ASP.NET Web application</h5>
<p><a href="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/60/image_6_54ED993C.png"><img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px" title="image" border="0" alt="image" src="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/60/image_thumb_2_54ED993C.png" width="562" height="320"></a> </p>
<p> </p>
<h5>Create the Entity Data Model for the Northwind database</h5>
<p>The Entity Data Model will be the base for the WCF Data Service that will expose the Northwind data in the OData format</p>
<p><a href="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/60/image_8_54ED993C.png"><img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px" title="image" border="0" alt="image" src="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/60/image_thumb_3_54ED993C.png" width="564" height="368"></a> </p>
<p><a href="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/60/image_10_54ED993C.png"><img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px" title="image" border="0" alt="image" src="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/60/image_thumb_4_54ED993C.png" width="566" height="505"></a> </p>
<p><a href="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/60/image_12_54ED993C.png"><img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px" title="image" border="0" alt="image" src="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/60/image_thumb_5_54ED993C.png" width="570" height="499"></a> </p>
<p>Here we can choose which Tables, Views and Stored Procedures will be exposed</p>
<p>Finish creates the Entity Data Model for the Northwind database</p>
<p><a href="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/60/image_14_54ED993C.png"><img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px" title="image" border="0" alt="image" src="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/60/image_thumb_6_54ED993C.png" width="550" height="466"></a> </p>
<p> </p>
<h5>Create a new WCF Data Service</h5>
<p><a href="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/60/image_16_54ED993C.png"><img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px" title="image" border="0" alt="image" src="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/60/image_thumb_7_54ED993C.png" width="557" height="331"></a> </p>
<p> </p>
<p><a href="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/60/image_18_54ED993C.png"><img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px" title="image" border="0" alt="image" src="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/60/image_thumb_8_54ED993C.png" width="566" height="259"></a> </p>
<p> </p>
<p>The NorthwindService inherits from the DataService with as generic parameter the EntityDataModel we want to expose, in this case the NorthwindEntities we just created.</p>
<p>By default noone can do anything, we first need to set access rules for our entities.</p>
<p>The easyest way to do this is to expose all entities with read-all rights:</p>
<p>
<div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:b84fb22e-97dd-466e-8d10-4d754dabd941" class="wlWriterEditableSmartContent"><pre style="background-color:#ffffff;overflow:auto"><span style="color:#000000">config.SetEntitySetAccessRule(</span><span style="color:#800000">&quot;</span><span style="color:#800000">*</span><span style="color:#800000">&quot;</span><span style="color:#000000">, EntitySetRights.AllRead);</span></pre></div>
<p>
<p>If the Entity Data Model is in a different assembly you’ll need to add a reference, and make sure the connectionstring is in the web.config of the referencing project</p>
<p> </p>
<p>Visiting the service now shows the exposed data:</p>
<p><a href="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/60/image_20_54ED993C.png"><img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px" title="image" border="0" alt="image" src="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/60/image_thumb_9_54ED993C.png" width="292" height="430"></a> </p>
<p> </p>
<p> </p>
<h2>Consuming the data</h2>
<p>To use the data exposed by the web service we create a client application.</p>
<p>Add a Service Reference to the web service. </p>
<p>For testing, there is always a public Northwind web service available on <a href="http://services.odata.org/Northwind/Northwind.svc/">http://services.odata.org/Northwind/Northwind.svc/</a></p>
<p><a href="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/60/image_24_54ED993C.png"><img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px" title="image" border="0" alt="image" src="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/60/image_thumb_11_54ED993C.png" width="535" height="433"></a> </p>
<p>This generates a web service proxy.</p>
<p>New is that this also generates a DataServiceContext. </p>
<p>Using the DataServiceContext we can query the data service through a linq provider.</p>
<p>The following extremely simple example print a list with the Name and Unit Price of all available products.</p>
<p> </p>
<div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:3b558ca2-050d-42a4-ae5f-cb77eb504486" class="wlWriterEditableSmartContent"><pre style="background-color:#ffffff;overflow:auto"><span style="color:#0000ff">class</span><span style="color:#000000"> Program
{
   </span><span style="color:#0000ff">static</span><span style="color:#000000"> </span><span style="color:#0000ff">void</span><span style="color:#000000"> Main(</span><span style="color:#0000ff">string</span><span style="color:#000000">[] args)
   {
       </span><span style="color:#0000ff">string</span><span style="color:#000000"> url </span><span style="color:#000000">=</span><span style="color:#000000"> </span><span style="color:#800000">&quot;</span><span style="color:#800000">http://localhost:40171/NorthwindService.svc/</span><span style="color:#800000">&quot;</span><span style="color:#000000">;
       var context </span><span style="color:#000000">=</span><span style="color:#000000"> </span><span style="color:#0000ff">new</span><span style="color:#000000"> NorthwindEntities(</span><span style="color:#0000ff">new</span><span style="color:#000000"> Uri(url));

       var someProducts </span><span style="color:#000000">=</span><span style="color:#000000"> from p </span><span style="color:#0000ff">in</span><span style="color:#000000"> context.Products
                          </span><span style="color:#0000ff">where</span><span style="color:#000000"> </span><span style="color:#000000">!</span><span style="color:#000000">p.Discontinued
                          select p;

       </span><span style="color:#0000ff">foreach</span><span style="color:#000000"> (var product </span><span style="color:#0000ff">in</span><span style="color:#000000"> someProducts)
       {
           Console.Out.WriteLine(</span><span style="color:#800000">&quot;</span><span style="color:#800000">{0} - {1}</span><span style="color:#800000">&quot;</span><span style="color:#000000">,product.ProductName,product.UnitPrice);
       }
       Console.Read();
   }
}</span></pre></div>
<p>
<p><a href="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/60/image_26_54ED993C.png"><img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px" title="image" border="0" alt="image" src="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/60/image_thumb_12_54ED993C.png" width="614" height="312"></a> </p>
<p>
<p>Download the sample code: </p>
<p><a title="http://www.orbitone.com/SiteCollectionDocuments/Northwind%20OData%20Service%20Sample.zip" href="http://www.orbitone.com/SiteCollectionDocuments/Northwind%20OData%20Service%20Sample.zip">http://www.orbitone.com/SiteCollectionDocuments/Northwind%20OData%20Service%20Sample.zip</a></p>
<p> </p>
<p>More information, samples, articles and tutorials can be found on <a href="http://www.odata.org/">http://www.odata.org/</a></p>
<p><span style="font-family:'Tahoma','sans-serif';color:black;font-size:8pt">Some more links to get you started: </span></p>
<ul>
<li><span style="font-family:'Tahoma','sans-serif';color:black;font-size:8pt">Open Data Protocol Visualizer <br><a href="http://visualstudiogallery.msdn.microsoft.com/en-us/f4ac856a-796e-4d78-9a3d-0120d8137722"><font color="#0000ff">http://visualstudiogallery.msdn.microsoft.com/en-us/f4ac856a-796e-4d78-9a3d-0120d8137722</font></a> <br></span></li>
<li><span style="font-family:'Tahoma','sans-serif';color:black;font-size:8pt">Open Data Protocol (OData) with Pablo Castro<br><a href="http://www.hanselminutes.com/default.aspx?ShowID=223"><font color="#0000ff">http://www.hanselminutes.com/default.aspx?ShowID=223</font></a> <br></span></li>
<li><span style="font-family:'Tahoma','sans-serif';color:black;font-size:8pt">Episode 43: Talking OData and SQL Modeling with Douglas Purdy <br><a href="http://deepfriedbytes.com/podcast/episode-43-talking-odata-and-sql-modeling-services-with-douglas-purdy/?utm_source=feedburner&amp;utm_medium=feed&amp;utm_campaign=Feed:+deepfriedbytes+(Deep+Fried+Bytes)&amp;utm_content=Google+Reader"><font color="#0000ff">http://deepfriedbytes.com/podcast/episode-43-talking-odata-and-sql-modeling-services-with-douglas-purdy/?utm_source=feedburner&amp;utm_medium=feed&amp;utm_campaign=Feed%3A+deepfriedbytes+%28Deep+Fried+Bytes%29&amp;utm_content=Google+Reader</font></a> <br></span></li>
<li><span style="font-family:'Tahoma','sans-serif';color:black;font-size:8pt">Carl and Richard get the word on oData from Brad Abrams, Bob Dimpsey and Lance Olson. <br><a href="http://www.dotnetrocks.com/default.aspx?ShowNum=519"><font color="#0000ff">http://www.dotnetrocks.com/default.aspx?ShowNum=519</font></a> <br></span></li>
<li><span style="font-family:'Tahoma','sans-serif';color:black;font-size:8pt">Using Data Services over SharePoint 2010 – Part 1 – Getting Started <br><a href="http://blogs.msdn.com/b/astoriateam/archive/2009/10/21/using-data-services-over-sharepoint-2010-part-1-getting-started.aspx"><font color="#0000ff">http://blogs.msdn.com/b/astoriateam/archive/2009/10/21/using-data-services-over-sharepoint-2010-part-1-getting-started.aspx</font></a><br></span></li>
<li><span style="font-family:'Tahoma','sans-serif';color:black;font-size:8pt">The Open Data Protocol (OData) <br><a href="http://www.stephenforte.net/PermaLink,guid,28df55a8-8811-4c4b-b319-75c5c58d1444.aspx"><font color="#0000ff">http://www.stephenforte.net/PermaLink,guid,28df55a8-8811-4c4b-b319-75c5c58d1444.aspx</font></a> </span></li></ul></div>]]></description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Mel Gerats</dc:creator><pubDate>Wed, 09 Jun 2010 12:10:00 GMT</pubDate></item><item><title>How to motivate knowledge workers, developers, creative people?</title><link>http://www.orbitone.com/en/blog/archive/2010/06/02/how-to-motivate-knowledge-workers-developers-creative-people.aspx</link><guid>/en/blog/archive/2010/06/02/how-to-motivate-knowledge-workers-developers-creative-people.aspx</guid><description><![CDATA[<div class="ExternalClassFEAC45B8A3894D5C8DD3997F44189578"><p>Thanks to a colleague of mine <a href="http://www.facebook.com/people/Voicu-Matei/100000752477710#!/profile.php?id=100000752477710">Voicu Matei</a> I came across this very interesting presentation about what actually motivates people:</p>  <p>Giving <b>money rewards</b> works very well to motivate people doing simple, straightforward tasks.</p>  <p>But surprisingly, it has the <b>opposite effect for more complicated tasks</b> that require some conceptual, creative thinking! For these kind of tasks, such as software development, <b>3 factors</b> lead to better performance &amp; personal satisfaction:</p>  <p>1. <b>Autonomy</b>: the desire to direct our own lives. Self-direction leads to engagement.</p>  <p>2. <b>Challenge and Mastery</b>: the urge to get better at stuff and making a contribution.</p>  <p>3. <b>Purpose</b>: more and more organisations feel that having a transcendent purpose/ motive helps people set higher goals and achieve better results. </p>  <div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:3f160cf6-67d2-4859-a13b-914c5880affa" class="wlWriterEditableSmartContent"><div id="cc765fd8-b05a-4934-a09a-147306ea58bd" style="margin:0px;padding:0px;display:inline"><div><a href="http://www.youtube.com/watch?v=u6XAPnuFjJc&amp;hl=en_GB&amp;fs=1&amp;"><img src="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/59/video045f1d55377a_5ED8D937.jpg" style="border-style:none" alt=""></a></div></div></div>  <p>This research is completely in-line with the concepts of <b>The New World of Work</b>. We at Orbit One strongly believe in a <b>flexible working environment</b> resulting in <b>people feeling better</b>, and organization being more productive.</p>  <p>See blog post about The New World of Work: <a href="http://www.orbitone.com/en/blog/archive/2010/05/03/the-new-world-of-work-het-nieuwe-werken-orbit-one.aspx">http://www.orbitone.com/en/blog/archive/2010/05/03/the-new-world-of-work-het-nieuwe-werken-orbit-one.aspx</a></p></div>]]></description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Thijs ter Beek</dc:creator><pubDate>Wed, 02 Jun 2010 09:18:40 GMT</pubDate></item><item><title>Mail Merge in Microsoft Dynamics CRM 4.0 doesn’t sort contacts</title><link>http://www.orbitone.com/en/blog/archive/2010/05/28/mail-merge-in-microsoft-dynamics-crm-4-0-doesn’t-sort-contacts.aspx</link><guid>/en/blog/archive/2010/05/28/mail-merge-in-microsoft-dynamics-crm-4-0-doesn’t-sort-contacts.aspx</guid><description><![CDATA[<div class="ExternalClassDD4D444B63BF4E5A8561831133224790">
<p>Noticed when tested the next CRM rollup.</p>
<p>Consider this scenario:</p>
<p>1. Open Active Contacts view in CRM.</p>
<p>2. Select several contacts (ctrl + click, or shift + click).</p>
<p><a href="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/58/image_2_78D254EB.png"><img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px" title="image" border="0" alt="image" src="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/58/image_thumb_78D254EB.png" width="463" height="258"></a> </p>
<p>3. Start mail merge with merging selected records on current page. </p>
<p><a href="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/58/image_4_78D254EB.png"><img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px" title="image" border="0" alt="image" src="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/58/image_thumb_1_78D254EB.png" width="205" height="94"></a> </p>
<p>When we get a list of recipients, it is sorted randomly, as well as resulting letters: </p>
<p>
<p><a href="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/58/image_6_78D254EB.png"><img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px" title="image" border="0" alt="image" src="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/58/image_thumb_2_78D254EB.png" width="368" height="300"></a> </p>
<p>Then we are at risk to put wrong letters to envelopes. </p>
<p>Work around? Don’t forget to sort the list of recipients in mail merge dialog box before creating letters. No others’ experience found by now. </p>
<p>Luckily this didn’t happen with merging all contacts from saved Advanced Find views or from marketing lists. This is an advised way of working.</p></div>]]></description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Viktor Bardadym</dc:creator><pubDate>Fri, 28 May 2010 16:02:00 GMT</pubDate><category domain="http://www.orbitone.com/en/blog/archive/tags/CRM 4.0/default.aspx">CRM 4.0</category></item><item><title>Search Server Express 2010 available</title><link>http://www.orbitone.com/en/blog/archive/2010/05/28/search-server-express-2010-available.aspx</link><guid>/en/blog/archive/2010/05/28/search-server-express-2010-available.aspx</guid><description><![CDATA[<div class="ExternalClassBDBB581EFFC64C938E1DCD2194085C7D"><p>Microsoft unveiled Search Server Express 2010. This is a <strong><a href="http://www.microsoft.com/enterprisesearch/searchserverexpress/en/us/download.aspx" target="_blank">free download</a></strong> from Microsoft and is supposed to be a Google Mini Appliance killer. It’s main drawback compared to the full SharePoint Server 2010 Search is that it can only be used in a one server farm. But still with proper hardware it should be able to index and search about 3 million items with a sub-second response time.</p>  <p>See the <a href="http://www.microsoft.com/enterprisesearch/searchserverexpress/en/us/compare.aspx">compare chart</a>:</p>  <p><a href="http://www.microsoft.com/enterprisesearch/searchserverexpress/en/us/compare.aspx"><img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px" title="image" border="0" alt="image" src="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/57/image_3_3CB71622.png" width="919" height="431"></a> </p>  <p>As the Search Server is based on SharePoint technology (so effectively comes on top of SharePoint Foundation) it appears the ideal solution for small deployments on premise compared to Foundation itself as that offers only very limited search capabilities: <strong>No cross site search, no refinements, no external source indexing.</strong> </p>  <p><a href="http://www.microsoft.com/enterprisesearch/searchserverexpress/en/us/default.aspx">http://www.microsoft.com/enterprisesearch/searchserverexpress/en/us/default.aspx</a></p></div>]]></description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Thijs ter Beek</dc:creator><pubDate>Fri, 28 May 2010 11:48:31 GMT</pubDate></item><item><title>Opening .msg files in Outlook from SharePoint 2010</title><link>http://www.orbitone.com/en/blog/archive/2010/05/26/opening-msg-files-in-outlook-from-sharepoint-2010.aspx</link><guid>/en/blog/archive/2010/05/26/opening-msg-files-in-outlook-from-sharepoint-2010.aspx</guid><description><![CDATA[<div class="ExternalClass44ECEC9836144D6B87723EBC45F1F11F"><p>Since we started using SharePoint 2010 we had trouble using it to store .msg (Outlook message format) in document libraries.</p>  <p>You can easily save your email from Outlook to a SharePoint location but opening it always gave a prompt dialog to save or cancel, not to open. So you were forced to store the email locally and then open it. Needless to say that this behavior is really annoying. I tried changing MIME types in IIS but it didn’t help and searching the internet I didn’t find a solution either.</p>  <p><a href="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/56/image_6_458A4724.png"><img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px" title="image" border="0" alt="image" src="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/56/image_thumb_2_458A4724.png" width="613" height="205"></a> </p>  <p>But then a colleague pointed me to a setting that changes the way SharePoint treats files opened from a browser. Its located in <strong>Central Administration &gt; Manage Web Applications &gt; Your WebApp &gt; General Settings</strong></p>  <p><a href="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/56/image_4_458A4724.png"><img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px" title="image" border="0" alt="image" src="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/56/image_thumb_1_458A4724.png" width="343" height="405"></a> </p>  <p>Changing this setting to <strong>permissive </strong>makes it possible to open .msg files in Outlook from SharePoint straight away. See screenshot below:</p>  <p><a href="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/56/image_2_458A4724.png"><img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px" title="image" border="0" alt="image" src="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/56/image_thumb_458A4724.png" width="441" height="255"></a></p></div>]]></description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Thijs ter Beek</dc:creator><pubDate>Wed, 26 May 2010 14:32:39 GMT</pubDate></item><item><title>LifeSize videoconference: side-by-side comparison</title><link>http://www.orbitone.com/en/blog/archive/2010/05/11/lifesize-videoconference-side-by-side-comparison.aspx</link><guid>/en/blog/archive/2010/05/11/lifesize-videoconference-side-by-side-comparison.aspx</guid><description><![CDATA[<div class="ExternalClass6559B767123743A7B75936E54C809F39">
<p>LifeSize is a HD videoconference equipment market leader. They have a wide range of devices, and it can be confusing to understand the differences between them.</p>
<p>We made a comparison matrix that helps you select the right device for your scenario:</p>
<p><a href="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/55/image_8_5199622C.png"><img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px" title="image" border="0" alt="image" src="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/55/image_thumb_3_5199622C.png" width="640" height="359"></a> </p>
<p>Download the <a href="http://www.orbitone.com/SiteCollectionDocuments/LifeSize%20compare%20sheet%20May%202010.pdf">PDF compare sheet</a>.</p>
<p><strong><font size="4">Selecting the right model for your needs</font></strong></p>
<p>Here is how we help our customers selecting the right model for their needs:</p>
<ul>
<li>We start by looking at an Express 220 </li>
<li>If the customer plan to have meetings with 3 or more parties, we advise a Team 220 Phone or Room 220. These are multipoint devices: 
<ul>
<li>The Team 220 allows for calls up to 4 parties: yourself + 3 other locations </li>
<li>The Room 220 allows for calls up to 8 parties: yourself + 7 other locations </li></ul></li>
<li>If the customer is looking for a low-cost, portable solution, we offer the LifeSize Passport. </li>
<ul>
<li>It’s important to understand the limitations of the Passport. The most important are: 
<ul>
<li>You cannot send PC images from the Passport. From our experience, 50% of the videoconferences benefit from PC screen sharing. This issue can be solved by using a 3rd party software such as WebEx or LiveMeeting. </li>
<li>You cannot view video and PC content simultaneously on the LifeSize Passport. Imagine that you are in a videoconference with another party that has an Express, Team or Room. The moment they start sending PC content, you cannot see their faces anymore. It’s one or the other. This is very annoying. </li></ul></li>
<li>Conclusion: the LifeSize Passport is a low cost alternative for people who do not need to share PC content often. </li></ul></ul>
<p><strong><font size="3">Notes</font></strong></p>
<ul>
<li>We do advise against buying the earlier 200 models. They are outdated and not will offer less compatibility with future products, such as the LifeSize Video Center </li>
<li>Once a customer selects the Team 220, we always advise to take the “Phone” version instead of the Dual Mic pod. The price difference is not that much anymore (700€ excl VAT), and having the phone comes in handy: 
<ul>
<li>When you are not videoconferencing, you can use it as a high quality conference phone. </li>
<li>When you are in a videoconference, you can add audio-only participants by calling them up, or having them dial-in. </li></ul></li></ul></div>]]></description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Olivier Mangelschots</dc:creator><pubDate>Tue, 11 May 2010 21:14:00 GMT</pubDate></item><item><title>SharePoint 2010: Social Features</title><link>http://www.orbitone.com/en/blog/archive/2010/05/04/sharepoint-2010-social-features.aspx</link><guid>/en/blog/archive/2010/05/04/sharepoint-2010-social-features.aspx</guid><description><![CDATA[<div class="ExternalClass5D23788486A841BFBDA673BBD50FF30F">
<p>Although Microsoft would claim that during the design process of SharePoint 2007 it invented social networking before Facebook and LinkedIn did, the times have changed somewhat since then and SharePoint 2007 wasnt really as social capable as we are now accustomed to.</p>
<p>In this post I would like to give an overview of all the cool new social features which I think will make SharePoint that much more interesting from a knowledge management perspective.</p>
<h1>Tagging &amp; Noteboard</h1>
<p>In my previous post on <a title="SharePoint 2010 Term store and other metadata enhancements - Orbit One Blog" href="http://www.orbitone.com/en/blog/archive/2010/04/21/sharepoint-2010-term-store-and-other-metadata-enhancements.aspx">SharePoint 2010 Term store and other metadata enhancements - Orbit One Blog</a> I talked about the new tagging possibilities in SharePoint. The cool thing is that this functionality is present on all pages within SharePoint at the top right of the page.</p>
<p><a href="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/52/image_21_757E5A62.png"><img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px" title="image" border="0" alt="image" src="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/52/image_thumb_9_757E5A62.png" width="122" height="72"></a> </p>
<p>So by clicking on these buttons you can quickly tag en note pages that you see within SharePoint but even nicer is to  put a button on your favorites bar to tag and note stuff on the internet as well </p>
<p><a href="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/52/image_23_757E5A62.png"><img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px" title="image" border="0" alt="image" src="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/52/image_thumb_10_757E5A62.png" width="535" height="329"></a> </p>
<p>– Well for that just press the button once on a SharePoint page make the link on the screen a favorite.</p>
<p><a href="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/52/image_10_757E5A62.png"><img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px" title="image" border="0" alt="image" src="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/52/image_thumb_4_757E5A62.png" width="682" height="233"></a></p>
<p><a href="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/52/image_12_757E5A62.png"></a>
<p><img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px" title="image" border="0" alt="image" src="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/52/image_thumb_5_757E5A62.png" width="576" height="469"></p>
<p>
<p>
<p>The tagging function works with autocomplete which is nice and on the same screen you see recent activity on the item.</p>
<h1>SharePoint profiles</h1>
<p>Already since SharePoint 2003, users of SharePoint have had a profile with information about themselves. Normally these profiles get stale from the moment it got first updated on the first working day of a new employee :-)</p>
<p>The new version of SharePoint offers some new features that might be interesting in this respect:</p>
<h2>Integration of the Microsoft Knowledge Network</h2>
<p>The <a title="Microsoft Knowledge Network" href="http://blogs.msdn.com/kn/">Microsoft Knowledge Network</a> was introduced by Microsoft as an add-on for SharePoint 2007. It automates the discovery and sharing of undocumented knowledge and relationships, mining your communications for keywords and relationships within Outlook and updating your SharePoint profile accordingly. This way enabling you to quickly locate who knows whom and who knows what within your constantly changing organization. </p>
<p><a href="http://channel9.msdn.com/posts/Charles/Office-SharePoint-Server-2007-Knowledge-Network/" target="_blank"><img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px" title="image" border="0" alt="image" src="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/52/image_15_757E5A62.png" width="425" height="327"></a> </p>
<p>Now the combination of Outlook 2010 and SharePoint 2010 gives you the opportunity to do just that out-of-the-box. It’s called Colleague and Outlook Social Connector</p>
<h2>Sync SharePoint profile with other systems (social networks, Active Directory)</h2>
<p>It is now possible to sync your SharePoint profile back to Active Directory including your profile picture. This way it will be easier to maintain data in your Active Directory. Another cool <strong><em>opportunity</em></strong> would be a <a href="http://msdn.microsoft.com/en-us/library/ee534979(office.14).aspx" target="_blank">Business Connectivity Services (BCS)</a> connection that would sync your SharePoint profile with your profile on a social network, for instance LinkedIn? </p>
<ul>
<li><a title="What's New Business Connectivity Services" href="http://msdn.microsoft.com/en-us/library/ee534979(office.14).aspx">What's New Business Connectivity Services</a> </li>
<li><a title="LinkedIn Developer Network Community APIs" href="http://developer.linkedin.com/community/apis?view=overview">LinkedIn Developer Network Community APIs</a> </li></ul>
<h2> </h2>
<p>So now that you are tagging, noting inside and outside of the firewall and your SharePoint profile is always up to date how will you other people within your organisation benefit from all this data?</p>
<h1>Newsfeed</h1>
<p>Well with a newsfeed just like you have on common social network sites:</p>
<p><a href="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/52/image_19_757E5A62.png"><img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px" title="image" border="0" alt="image" src="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/52/image_thumb_8_757E5A62.png" width="339" height="396"></a> </p>
<p>Within your profile you can set the types of updates you want to get in your newsfeed. See the following screenshot for the out-of-the-box settings. Developers can customize the activities that can be followed so you can track custom actions happening in SharePoint as well.</p>
<p><a href="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/52/image_2_757E5A62.png"><img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px" title="image" border="0" alt="image" src="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/52/image_thumb_757E5A62.png" width="594" height="466"></a> </p>
<p>That is it for the new and interesting social networking features in SharePoint.<a href="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/52/image_6_757E5A62.png"></a></p></div>]]></description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Thijs ter Beek</dc:creator><pubDate>Wed, 05 May 2010 20:18:00 GMT</pubDate><category domain="http://www.orbitone.com/en/blog/archive/tags/SharePoint 2010/default.aspx">SharePoint 2010</category><category domain="http://www.orbitone.com/en/blog/archive/tags/SharePoint/default.aspx">SharePoint</category></item><item><title>SharePoint 2010 mixed Authentication</title><link>http://www.orbitone.com/en/blog/archive/2010/05/04/sharepoint-2010-mixed-authentication.aspx</link><guid>/en/blog/archive/2010/05/04/sharepoint-2010-mixed-authentication.aspx</guid><description><![CDATA[<div class="ExternalClass47904F5DD300429795D0528FCD304B0D"><p>We have deployed several intranet/extranet applications on SharePoint 2007 that required a mixed authentication scheme. Windows Integrated authentication for domain user and forms based authentication for extranet users.</p>  <p>In SharePoint 2007 this was possible by extending a web application and using different authentication schemes for the different sites. This worked somewhat nice, but there were several problems with it.</p>  <ul>   <li>There are really separate websites running on the same content database. Some customisations need to be deployed twice, for example Smart Parts. </li>    <li>There are two url’s, for example extranet.example.com and intranet.example.com. </li>    <li>Rich Client Integration has lots and lots of problems when using forms based authentication </li>    <li>The possibilities of the People Picker are somewhat limited. </li> </ul>  <p> </p>  <p>SharePoint 2010 was announced to have Mixed Authentication, which would solve all problems!</p>  <h3>Setting up Mixed authentication in SharePoint 2010</h3>  <ol>   <li>     <h5>Create a new Web Application with Claims Based Authentication</h5>     <img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px" title="image" border="0" alt="image" src="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/54/image_34_5F0DCABD.png" width="467" height="114">       <br></li>    <li>     <h5>Select Authentication providers </h5>      <p><a href="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/54/image_8_5EB08363.png"></a> </p>      <p><img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px" title="image" border="0" alt="image" src="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/54/image_thumb_3_01744BD2.png" width="467" height="371"> </p>      <p>Note: As you can see the last option is “Trusted Identity Provider” </p>      <p>This option is only available if you have configured Trusted Identity Providers. To do this the certificate of the trusted party needs to be installed first.</p>   </li>    <li>     <h5>Select Sign In page. </h5>      <h6>       <br></h6>      <p><img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px" title="image" border="0" alt="image" src="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/54/image_33_5F0DCABD.png" width="480" height="167"> </p>      <p>here you can specify a custom login page. The default Sign In pages offers a drop down list with the configured authentication types.</p>   </li>    <li>     <h5>Create a site collection for the new web application </h5>      <h6>       <br></h6>      <p>The web application needs a root site collection </p>   </li>    <li>     <h5>Select a site collection administrator </h5>      <h6>       <br>        <br></h6>      <p><img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px" title="image" border="0" alt="image" src="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/54/image_thumb_01744BD2.png" width="453" height="200"> </p>      <p>The people picker is much improved. Search results are linked to the membership provider and it is possible to search only for a single provider.</p>   </li>    <li>     <h5>Configure the providers </h5>      <h6>       <br></h6>      <p>Add the Membership and Role provider to the web.config of the web application we just created </p>      <p><img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px" title="image" border="0" alt="image" src="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/54/image_thumb_2_01744BD2.png" width="664" height="155"> </p>      <p>for simplicity’s sake I used an XML Membership and Role provider from <a href="http://aspnetxmlproviders.codeplex.com/" target="_blank">Codeplex</a>         <br></p>   </li>    <li>     <h5>Sign in using Forms Authentication</h5>      <p>Trying to access  the web site now presents us with a Sign In page where we can choose how we authenticate</p>      <p><img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px" title="image" border="0" alt="image" src="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/54/image_thumb_5_01744BD2.png" width="510" height="183"> </p>      <p>With windows authentication we can log in with our domain account</p>      <p><img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px" title="image" border="0" alt="image" src="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/54/image_thumb_6_01744BD2.png" width="166" height="68"> </p>      <p>with forms authentication we get a login form</p>      <p><img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px" title="image" border="0" alt="image" src="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/54/image_thumb_7_01744BD2.png" width="480" height="210"> </p>      <p>However, trying to log in with forms authentication will give a yellow page of death: A WCF FaultException telling us we can’t see the real error.        <br></p>   </li>    <li>     <h5>Configure the Security Token Service </h5>      <h6>       <br></h6>      <p>Digging through the SharePoint logs reveals the following error message:</p>      <blockquote>       <p>Cannot get Membership Provider with name XmlMembershipProvider. The membership provider for this process was not properly configured. You must configure the membership provider in the .config file for every SharePoint process.</p>     </blockquote>      <p>It turns out the SecurityTokenService tries to access the membership provider directly, but is not configured to do so.</p>      <p>After adding the Membership and Role provider to the web.config of the Security Token Service everything starts working. The web.config can be found here:        <br>C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\WebServices\SecurityToken</p>      <p><img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px" title="image" border="0" alt="image" src="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/54/image_thumb_8_6C82C95E.png" width="460" height="162">         <br></p>   </li>    <li>     <h5>Sign in using forms authentication </h5>      <h6>       <br></h6>      <p>We can now sign in using forms authentication. Make sure to add the forms authentication based users to a SharePoint Group, or they will get Access Denied the moment they log in.</p>      <p><img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px" title="image" border="0" alt="image" src="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/54/image_thumb_9_6C82C95E.png" width="244" height="56"> </p>      <h6> </h6>   </li> </ol>  <h3>Rich Client Integration</h3>  <br>  <p>Office integration works great for both windows and forms authentication now. If you didn’t click “remember me” on the Sign In page you will be presented with a log in page that is actually usable. After clicking “remember me” all authentication will be transparent, and you can open the document for editing straight from SharePoint.</p></div>]]></description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Mel Gerats</dc:creator><pubDate>Wed, 05 May 2010 20:16:00 GMT</pubDate><category domain="http://www.orbitone.com/en/blog/archive/tags/SharePoint 2010/default.aspx">SharePoint 2010</category></item><item><title>The New World of Work (Het Nieuwe Werken) @ Orbit One</title><link>http://www.orbitone.com/en/blog/archive/2010/05/03/the-new-world-of-work-het-nieuwe-werken-orbit-one.aspx</link><guid>/en/blog/archive/2010/05/03/the-new-world-of-work-het-nieuwe-werken-orbit-one.aspx</guid><description><![CDATA[<div class="ExternalClass1874252428C74193B99F77AE41D521F0">
<h1>Concept</h1>
<p><a href="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/51/image_7_0469A41C.png"><img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px" title="image" border="0" alt="image" src="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/51/image_thumb_2_0469A41C.png" width="596" height="135"></a> </p>
<p>The New World of Work is a new<strong> flexible way of working and collaborating with co-workers, partners, customers etc.</strong> This new kind of working is funded on three pillars: <strong>People &amp; Organisation, The Office and ICT</strong>.</p>
<h2>People &amp; Organisation</h2>
<p>In order to stay competitive organisations need to hire and retain the best staff. To be an attractive employer for talent you need to <strong>challenge</strong> them and make them <strong>responsible for the results</strong> they deliver. In this <strong>culture of openness</strong> Managers control less and support more.</p>
<h2>ICT</h2>
<p>ICT is the <strong>underlying enabler</strong> of the “New World of Work” because it makes it possible for people to work from <strong>anywhere, at any time, with anybody</strong>. We use solutions as <strong>video conferencing, presence and virtual workspaces</strong> on a daily basis and feel it is key for working in the “New World of Work”  </p>
<h2>The Office – Workplace</h2>
<p>The office &amp; its workplaces need to <strong>invite</strong> and <strong>stimulate</strong> people to perform different types of work in the most <strong>effective</strong> and <strong>pleasurable</strong> way. People spend more and more time <strong>collaborating</strong> with others (co-workers, partners or customers) so setup workspaces specific for these types of activity: <strong>meetings, brainstorms, video conferences, chats</strong> and of course some <strong>relax</strong> spaces to play and have fun. </p>
<h1>Orbit One and The New World of Work</h1>
<p>Within Orbit One we wanted to know where we stand in ‘the new world of work’ so we did a survey originally created by <a href="http://twitter.com/dikbijl">Dik Bijl</a> in Dutch and translated it into English because in our team of 17 enthusiastic employees that is the working language :-)</p>
<p>If you want to do the survey yourself please <a href="http://www.orbitone.com/SiteCollectionDocuments/Survey%20The%20New%20World%20of%20Work.docx">download</a> it and use the <a href="http://www.orbitone.com/SiteCollectionDocuments/Template%20Results%20survey%20new%20world%20of%20work.xlsx">excel template</a> analyzing the results.<a href="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/51/image_2_0469A41C.png"></a> </p>
<p> <img title="" alt="Culinair team at work by Orbit One." src="http://farm4.static.flickr.com/3608/3327487451_39ebbaf7a9.jpg" width="333" height="500"></p>
<h2>Results</h2>
<p>Here is a graph of the results of the survey focusing on the different aspects of ‘the new world of work’</p>
<p><img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px" title="Results survey new world of work" border="0" alt="Results survey new world of work" src="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/51/image_thumb_0469A41C.png" width="510" height="308"></p>
<p>The results of the survey told us that we are doing reasonably well but as always there is room for improvement! We started on our physical work environment: The Office.</p>
<h1>Come and experience One Office</h1>
<p>With the survey in mind we started with the <a href="http://www.flickr.com/photos/orbitone/sets/72157623224923235/">upgrade of our Office in Gent</a> to be ready for the ‘New World of Work’.</p>
<p>We <strong>rent out part of our office</strong> so if you want to take advantage of this <strong>highly productive and fun working environment </strong>or if you just want to have peek inside, don’t be shy, come and visit us in Gent! </p>
<p>For more info on one office flexible workplaces see our <a href="http://www.oneoffice.be/">website “One Office”</a> <img alt="Kenmerken" src="http://www.oneoffice.be/media/5032/header_hetkantoor.jpg" width="653" height="136"></p>
<h1>What can Orbit One offer you?</h1>
<p>Orbit One is a Internet Solutions provider that assists clients in becoming more efficient using technologies such as: <a href="http://sharepoint2010.microsoft.com/Pages/default.aspx">SharePoint</a>, <a href="http://www.microsoft.com/communicationsserver/nl/nl/default.aspx">Office Communications Server (OCS),</a> <a href="http://www.microsoft.com/exchange/2010/en/us/default.aspx">Exchange</a>, <a href="http://technet.microsoft.com/en-us/network/dd420463.aspx">Direct Access</a> and SSL VPN. With these technologies we create an integrated environment for your people (employees, partners and customers) that simply works and will boosts their productivity!</p>
<p>Find out more in <a href="http://www.slideshare.net/orbitone/the-new-world-of-work">our presentation</a> on slideshare</p>
<p><a href="http://www.slideshare.net/orbitone/the-new-world-of-work"><img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px" title="image" border="0" alt="image" src="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/51/image_5_0469A41C.png" width="405" height="342"></a> </p>
<p><img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;margin-left:0px;border-left-width:0px;margin-right:0px" title="image" border="0" alt="image" align="right" src="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/51/image_thumb_3_0469A41C.png" width="188" height="244"></p>
<h1>Downloads and other related stuff<a href="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/51/image_9_0469A41C.png"></a> </h1>
<ul>
<li><a href="http://www.orbitone.com/SiteCollectionDocuments/Survey%20The%20New%20World%20of%20Work.docx">Survey for the New World of Work</a> </li>
<li><a href="http://www.orbitone.com/SiteCollectionDocuments/Template%20Results%20survey%20new%20world%20of%20work.xlsx">Excel template for results survey</a> </li>
<li><a href="http://www.slideshare.net/orbitone/the-new-world-of-work">Orbit One Presentation “The New World of Work”</a> </li>
<li><a href="http://www.oneoffice.be/nl">OneOffice</a> website </li>
<li><a title="Klein receptenboek voor het nieuwe werken door Roland Hameeteman, Ben Kuiken, Gonny Vink (Boek)" href="http://www.managementboek.nl/boek/9789077881651/klein_receptenboek_voor_het_nieuwe_werken_roland_hameeteman">Klein receptenboek voor het nieuwe werken door Roland Hameeteman, ..</a> </li>
<li><a title="Het nieuwe werken, op weg naar een productieve kenniseconomie door Dik Bijl (Boek) - ISBN 978901" href="http://www.managementboek.nl/boek/9789012119481/het_nieuwe_werken_op_weg_naar_een_productieve_kenniseconomie_dik_bijl">Het nieuwe werken, op weg naar een productieve kenniseconomie</a> </li></ul>
<p>If you’re interested <a href="http://www.orbitone.com/nl/Over-Orbit-One/Pages/Contacteer-ons.aspx">contact us</a> we can give a <strong>presentation/demo</strong> of how we work in the new world of work and how we can make you work<strong> more productive</strong> as well</p></div>]]></description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Thijs ter Beek</dc:creator><pubDate>Mon, 03 May 2010 18:14:00 GMT</pubDate><category domain="http://www.orbitone.com/en/blog/archive/tags/Office/default.aspx">Office</category><category domain="http://www.orbitone.com/en/blog/archive/tags/SharePoint/default.aspx">SharePoint</category><category domain="http://www.orbitone.com/en/blog/archive/tags/SharePoint 2010/default.aspx">SharePoint 2010</category></item><item><title>Orbit One developed a free application to import/migrate files and folders to SharePoint 2010</title><link>http://www.orbitone.com/en/blog/archive/2010/04/28/orbit-one-developed-a-free-application-to-importmigrate-files-and-folders-to-sharepoint-2010.aspx</link><guid>/en/blog/archive/2010/04/28/orbit-one-developed-a-free-application-to-importmigrate-files-and-folders-to-sharepoint-2010.aspx</guid><description><![CDATA[<div class="ExternalClass7B0B369F551C48CDB7C0567B747A96AD"><p>Orbit One is one of the SharePoint 2010 launch partners in Belgium.</p>  <p>We have several clients who are planning to upgrade to Microsoft SharePoint 2010, and we have some real-life projects running on Microsoft SharePoint 2010 RC. </p>  <p>One of the issues was finding a tool to migrate a big load of files and folders to SharePoint, and keep the original created and modified dates. The creation/modified date of files are sometimes really important, as it allows the user to understand how relevant the information is.</p>  <p>We looked at <a href="http://www.metalogix.net/Home/">MetaLogix</a> and <a href="http://www.vyapin.com/products/sharepoint/moss-2007/dockit/sharepoint-2007-file-migration.htm">DocKIT</a>, both where working on beta versions of migration tools for SharePoint 2010. </p>  <p>Our customers where looking for a cost-effective solution, without having to pay based on the number of GB they want to transfer. </p>  <p>This was a perfect scenario to make use of the new <a title="SharePoint 2010 managed client object model" href="http://msdn.microsoft.com/en-us/library/ee537247(v=office.14).aspx">Managed Client Object Model</a>, allowing us to build a nice small tool. </p>  <p>Since we figure this could be useful to others, we published the <a title="SharePoint 2010 Bulk Document Importer" href="http://spbulkdocumentimport.codeplex.com/">SharePoint 2010 Bulk Document Importer on Codeplex</a>. </p>  <p>Feel free to use and improve it! </p>  <p>Features: </p>  <ul>   <li>Run it anywhere. Every action is done using the Client Object Model, there is no need to install it on the server.</li>    <li>Import folders and files with all subfolders </li>    <li>Retain creation and modified date fields after moving to SharePoint </li>    <li>Retain author/editor fields from office documents after moving to SharePoint </li>    <li>Incompatible file names are renamed (filename too long, illegal characters) </li>    <li>Unsupported files (large file size, blocked file extension, …) are skipped </li>    <li>Files already existing on SharePoint are skipped (no overwrite) </li>    <li>Successfully migrated files and folders can be moved to an “archive” folder </li>    <li>Detailed log (<a title="log4net" href="http://logging.apache.org/log4net/">log4Net</a>) with info on migration issues </li>    <li>Option to skip creation of empty folders in SharePoint </li>    <li>Option to merge subfolders to a flat list in SharePoint. </li> </ul>  <p> </p>  <p>The application is a command line application that can be easily batched for several migrations to different document libraries.</p>  <p>Example:</p>  <p>Import all files from the <strong>user guides</strong> folder on the central file share to the <strong>userguides</strong> document library on the <strong>intranet.</strong></p>  <p><b>OrbitOne.SharePoint.Importer.exe -folder:&quot;\\fileshare\documents\user guides&quot; site:&quot;http://intranet/documentation&quot; -documentlibrary:userguides</b></p>  <p> More information, examples and technical information can be found on the <a title="SharePoint 2010 Bulk Document Importer documentation" href="http://spbulkdocumentimport.codeplex.com/documentation">documentation wiki</a>.</p></div>]]></description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Mel Gerats</dc:creator><pubDate>Wed, 28 Apr 2010 16:13:04 GMT</pubDate></item><item><title>SharePoint 2010: Term store and other metadata enhancements</title><link>http://www.orbitone.com/en/blog/archive/2010/04/21/sharepoint-2010-term-store-and-other-metadata-enhancements.aspx</link><guid>/en/blog/archive/2010/04/21/sharepoint-2010-term-store-and-other-metadata-enhancements.aspx</guid><description><![CDATA[<div class="ExternalClass0A54AC9352024D0796C7427A63C7AFE6">
<p>The long expected successor of MOSS 2007, SharePoint 2010 will launch on May 12. We are all very excited about this! The last couple of months we have been working with the new version and we would like to give you an overview of the key new features regarding metadata and classification.</p>
<p>In the coming weeks we will dive deeper into other aspects of the platform: Search, Social Features, Offline access and Workflow.</p>
<h2>Term store </h2>
<p>The Term store is a service application that can be setup to manage metadata across farms, web applications and site collections. </p>
<h3>Taxonomy and Folksonomy</h3>
<p>Within the term store metadata can be managed top-down (taxonomy) or bottom-up (folksonomy). This means that an organisation can have an official taxonomy but at the same time provide users with the ability to add free tags to content as they please. Another cool thing about this is that you can ‘upgrade’ terms from the folksonomy to the taxonomy!</p>
<h3>Hierarchical terms</h3>
<p>The terms within the term store can be hierarchical in nature: For instance Regions and countries form a hierarchical structure. When people tag a specific item within SharePoint with Bermuda you can find it under Caribbean or Americas as well. </p>
<p><img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px" title="Hierarchical metadata" border="0" alt="Hierarchical metadata" src="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/49/clip_image001_thumb_31CFFA99.png" width="229" height="244"></p>
<h3>Management of terms</h3>
<p>Each set of terms has an owner. He or she can maintain the terms and other people can give suggestions on synonyms or missing terms directly via the user interface. This makes SharePoint a very user friendly tool for managing metadata.</p>
<h3>Autocomplete on terms and tags </h3>
<p>When typing a term users get an autocomplete functionality to guide them to already used tags and the predefined taxonomy. </p>
<p><a href="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/49/clip_image002_2_31CFFA99.png"><img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px" title="clip_image002" border="0" alt="clip_image002" src="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/49/clip_image002_thumb_31CFFA99.png" width="216" height="183"></a></p>
<h3>Content type hub</h3>
<p>With the term store it is possible to reuse content types across site collections, web applications and even farms. This way policies and workflows can be forced on content across the enterprise which is key in larger organisations. To start using this functionality you need to set up a site collection as your content type hub. In this site collection you’ll maintain your enterprise wide content types. Other sites can use the content types created there.</p>
<h2>Other enhancements to metadata usage</h2>
<h3>Metadata navigation</h3>
<p>When browsing libraries or lists users can use key filters and metadata navigation to quickly find the right document within the library. This functionality makes folders look so 2009 ;-)</p>
<p><a href="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/49/clip_image003_2_31CFFA99.png"><img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px" title="clip_image003" border="0" alt="clip_image003" src="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/49/clip_image003_thumb_31CFFA99.png" width="150" height="244"></a> </p>
<h3>Facetted Search</h3>
<p>Known already from addons like <a href="http://facetedsearch.codeplex.com/Wikipage">Codeplex’s MOSS Faceted Search</a> or Surfray’s <a href="http://www.surfray.com/products/ontolica.html">Ontolica Search for SharePoint</a> this feature creates dynamic filters based on your search result which make it easy for end users to refine their search based on metadata properties.</p>
<p><a href="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/49/image_2_31CFFA99.png"><img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px" title="image" border="0" alt="image" src="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/49/image_thumb_31CFFA99.png" width="543" height="458"></a> </p>
<h3>Validation based on Excel based formulas </h3>
<p>SharePoint 2010 makes it possible to validate data coming into SharePoint. The user will be instructed on what specific rules a certain property needs to comply to be saved to SharePoint. The formulas describing the rules are based on Excel logic.</p>
<p><a href="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/49/image_4_31CFFA99.png"><img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px" title="image" border="0" alt="image" src="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/49/image_thumb_1_31CFFA99.png" width="624" height="177"></a> </p>
<p>That's it for now. Stay tuned for more good SharePoint 2010 stuff!</p></div>]]></description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Thijs ter Beek</dc:creator><pubDate>Wed, 21 Apr 2010 15:48:00 GMT</pubDate><category domain="http://www.orbitone.com/en/blog/archive/tags/SharePoint/default.aspx">SharePoint</category><category domain="http://www.orbitone.com/en/blog/archive/tags/SharePoint 2010/default.aspx">SharePoint 2010</category></item><item><title>A new website has been launched: www.recytyre.be</title><link>http://www.orbitone.com/en/blog/archive/2010/03/29/a-new-website-has-been-launched-www-recytyre-be.aspx</link><guid>/en/blog/archive/2010/03/29/a-new-website-has-been-launched-www-recytyre-be.aspx</guid><description><![CDATA[<div class="ExternalClassCBA8DF69CF6D43B3A3718892D5933A1F"><p>We’re happy to announce that the new website of Recytyre VZW was launched. Recytyre is a controlling organism for waste-tyres in Belgium, focussing on sustainable solutions contributing to a greener future.</p>  <p><a href="http://www.recytyre.be">www.recytyre.be</a> </p>  <p><a href="http://www.recytyre.be"><img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px" title="image" border="0" alt="image" src="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/48/image_3_3A3A53C4.png" width="471" height="249"></a></p></div>]]></description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Rik Helsen</dc:creator><pubDate>Mon, 29 Mar 2010 16:38:36 GMT</pubDate></item><item><title>Meet us at Microsoft TechDays: 30-31 March &amp; 1 April</title><link>http://www.orbitone.com/en/blog/archive/2010/03/28/meet-us-at-microsoft-techdays-30-31-march-amp-1-april.aspx</link><guid>/en/blog/archive/2010/03/28/meet-us-at-microsoft-techdays-30-31-march-amp-1-april.aspx</guid><description><![CDATA[<div class="ExternalClass15AB78D8160B41D2978B54B00AAF13D9"><p>Orbit One will attend <a href="http://www.microsoft.com/belux/techdays/2010">Microsoft TechDays</a> this week, Metropolis Antwerp - Belgium.     <br>I’m looking forward to good sessions, meeting friends and loads of food :-)</p>  <p>Meet our team, look for our T-shirts!</p>  <ul>   <li><strong>Pre-conference + Techdays 30-31 March, 1 April</strong>: Mel, Wim DC, Thijs, Viktor, Tom, Olivier </li>    <li><strong>TechDays 31-1 April</strong>: Wim R, Jan, Hans, Dennis, Voicu, Lieven, Pieter-Jan </li> </ul>  <p><a title="Try a NEW world of work, experience OneOffice" href="http://www.oneoffice.be"><img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px" title="Try a NEW world of work, experience OneOffice" border="0" alt="Try a NEW world of work, experience OneOffice" src="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/47/image_3_11BC5C70.png" width="519" height="230"></a> </p>  <p>There is a lot to talk about this year:</p>  <ul>   <li>SharePoint 2010 </li>    <li>Visual Studio 2010 </li>    <li>.NET Framework 4.0 </li>    <li>ASP.NET 4.0 </li>    <li>Entity Framework 4.0 </li>    <li>Windows Communication Foundation 4 </li>    <li>Workflow Foundation 4 </li>    <li>Windows Server 2008 R2 </li>    <li>SQL Server 2008 R2 </li>    <li>Exchange 2010 </li>    <li>Office 2010 </li> </ul></div>]]></description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Olivier Mangelschots</dc:creator><pubDate>Sun, 28 Mar 2010 13:20:28 GMT</pubDate></item><item><title>Looking for an office in Gent?</title><link>http://www.orbitone.com/en/blog/archive/2010/03/19/looking-for-an-office-in-gent.aspx</link><guid>/en/blog/archive/2010/03/19/looking-for-an-office-in-gent.aspx</guid><description><![CDATA[<div class="ExternalClass9D15538D1B2F43B9B0C7F401C650DD57">
<p>Met het concept OneOffice stelt Orbit One haar <a href="http://www.oneoffice.be/nl/het-kantoor.aspx">kantoren</a> open voor mensen die op zoek zijn naar een <strong><a href="http://www.oneoffice.be/nl/het-kantoor/open-office-spaces.aspx">flexibele werkomgeving</a> in hartje Gent</strong>.</p>
<p><a href="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/46/image_2_43111AB8.png"><img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px" title="image" border="0" alt="image" src="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/46/image_thumb_43111AB8.png" width="454" height="278"></a> </p>
<p>De nadruk ligt op het creëren van een <strong>aangename</strong> omgeving waar mensen werken en <strong>samenwerken</strong>, ondersteund door de laatste <strong><a href="http://www.oneoffice.be/nl/diensten.aspx">technologie</a></strong>. </p>
<p>Het concept is opgebouwd rond <strong><a href="http://www.oneoffice.be/nl/het-concept/het-nieuwe-werken.aspx">Het nieuwe werken</a></strong>, een vooruitstrevende manier van samenwerken.</p>
<p><a title="http://www.oneoffice.be" href="http://www.oneoffice.be/">http://www.oneoffice.be</a></p></div>]]></description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Olivier Mangelschots</dc:creator><pubDate>Fri, 19 Mar 2010 18:43:00 GMT</pubDate></item><item><title>Experience of web deployment of Office 2007 templates</title><link>http://www.orbitone.com/en/blog/archive/2010/01/20/experience-of-web-deployment-of-office-2007-templates.aspx</link><guid>/en/blog/archive/2010/01/20/experience-of-web-deployment-of-office-2007-templates.aspx</guid><description><![CDATA[<div class="ExternalClass52CD869B4E344B9A97EF61096BEB68C0">
<div>
<p style="margin:0cm 0cm 0pt" class="MsoNormal"><span lang="EN-US"><font size="2"><font color="#000000" face="Calibri">Together with known ways to use user and workgroup templates Windows folders, the 2007 Microsoft Office system gives a possibility to use templates located on web sources. It is combined with the tools to customize the New Document dialog box for Word, PowerPoint and Excel.</font></font></span></p>
<p style="margin:0cm 0cm 0pt" class="MsoNormal"><span lang="EN-US"></span><font size="2"><font face="Calibri"><span lang="EN-US"><font color="#000000">The source </font></span><span lang="EN-GB"><a href="http://technet.microsoft.com/en-us/library/cc178976.aspx"><span lang="EN-US"><font color="#0000ff">http://technet.microsoft.com/en-us/library/cc178976.aspx</font></span></a></span><span lang="EN-US"><font color="#000000"> gives good guidelines to start with web deployment. </font></span></font></font></p><font size="2"><font face="Calibri"><span lang="EN-US"></span></font></font><span lang="EN-US"><font size="3"><font color="#000000" face="Calibri">
<p style="margin:0cm 0cm 0pt" class="MsoNormal"><span lang="EN-US"><font face="Calibri"><font color="#000000" size="4"><strong>Limitations</strong></font></font></span></p><span lang="EN-US">
<p style="margin:0cm 0cm 0pt 36pt" class="MsoListParagraph"><font color="#000000"><span style="font-family:Symbol" lang="EN-US"><span><font size="2">·</font><span style="font:7pt 'Times New Roman'">         </span></span></span><span lang="EN-US"><font face="Calibri"><font size="2">The method needs to work online when creating new documents. If you want typing documents in a train or in an airport, think about making an offline replica of a web application with templates, or saving templates on your PC. </font></font></span></font></p>
<p style="margin:0cm 0cm 0pt 36pt" class="MsoListParagraph"><font color="#000000"><span lang="EN-US"></span></font><font color="#000000"><span lang="EN-US"><font size="2"><font face="Calibri"><span style="font-family:Symbol" lang="EN-US"><span><font size="2">·</font><span style="font:7pt 'Times New Roman'">         </span></span></span>To deploy the templates, you have to prepare XML files, preview and thumbnail images. If the preparation of XML files can be scripted, images have to be done manually. </font></font></span></font></p>
<p style="margin:0cm 0cm 0pt" class="MsoNormal"></span><span lang="EN-US"><font face="Calibri"><font color="#000000" size="4"><strong>Issues and work around</strong></font></font></span><p>
<p style="margin:0cm 0cm 0pt" class="MsoNormal"><span lang="EN-US"></span><strong><font color="#000000">Deployment templates on SharePoint - authentication issue</font></strong></p>
<p style="margin:0cm 0cm 0pt" class="MsoNormal"></font></font></span><span lang="EN-US"><font size="2"><font color="#000000" face="Calibri">If you used a template saved on a SharePoint site to create a document, you or other users can be prompted to log in to the SharePoint site when opening the document. It happens even if anonymous access is enabled on the template site. If the login is ignored, the document still opens. This happens because of a known authentication issue between SharePoint and Office:</font></font></span><p>
<p style="margin:0cm 0cm 0pt" class="MsoNormal"><span lang="EN-GB"><a href="http://social.technet.microsoft.com/forums/en-US/sharepointadmin/thread/7c69af51-d1b1-4642-b5fc-548663dd4564/"><span lang="EN-US"><font color="#0000ff" size="2" face="Calibri">http://social.technet.microsoft.com/forums/en-US/sharepointadmin/thread/7c69af51-d1b1-4642-b5fc-548663dd4564/</font></span></a></span><span lang="EN-US"></span></p>
<p style="margin:0cm 0cm 0pt" class="MsoNormal"><span lang="EN-GB"><a href="http://webborg.blogspot.com/2007/12/how-to-open-office-document-in-document.html"><span lang="EN-US"><font color="#0000ff" size="2" face="Calibri">http://webborg.blogspot.com/2007/12/how-to-open-office-document-in-document.html</font></span></a></span><span lang="EN-US"></span></p>
<p style="margin:0cm 0cm 0pt" class="MsoNormal"><span lang="EN-US"><font size="2"><font color="#000000" face="Calibri">After all fiddling on access settings, the conclusion was: don’t deploy Office templates on a SharePoint site. </font></font></span></p>
<p style="margin:0cm 0cm 0pt" class="MsoNormal"><span lang="EN-US"><font size="2"><font color="#000000" face="Calibri">An easy work around may be just publishing the document in PDF format. </font></font></span></p>
<p style="margin:0cm 0cm 0pt" class="MsoNormal"><span lang="EN-US"></span><span lang="EN-US"><font face="Calibri"><font color="#000000" size="3"><strong>International</strong></font></font></span></p>
<p style="margin:0cm 0cm 0pt" class="MsoNormal"><span lang="EN-US"></span><span lang="EN-US"><font face="Calibri"><font color="#000000" size="2"><strong>LCID in folder names</strong></font></font></span></p>
<p style="margin:0cm 0cm 0pt" class="MsoNormal"><font face="Calibri"><font size="2"><span lang="EN-US"><font color="#000000">Pay attention that the examples in </font></span><span lang="EN-GB"><a href="http://technet.microsoft.com/en-us/library/cc178976.aspx"><span lang="EN-US"><font color="#0000ff">http://technet.microsoft.com/en-us/library/cc178976.aspx</font></span></a></span><span lang="EN-GB"> </span><span lang="EN-US"><font color="#000000">have 1033, the ID of the US English language locale. If the language of Microsoft Office user interface is different from English, the templates will not be shown. The XML files have to be b adapted. If users in your organization have different locales, you have to prepare variations of XML files per language. If the user interface of Microsoft Office on a PC has been changed, the templates have to be reinstalled. </font></span></font></font></p>
<p style="margin:0cm 0cm 0pt" class="MsoNormal"><font face="Calibri"><font size="2"><span lang="EN-US"></span></font></font><span lang="EN-US"><font size="2"><font color="#000000" face="Calibri"><strong>Non-Latin characters</strong></font></font></span></p>
<p style="margin:0cm 0cm 0pt" class="MsoNormal"><span lang="EN-US"><font size="2"><font color="#000000" face="Calibri">If your language is using other characters than 26 “standard” Latin letters, you have to encode the characters in XML files explicitly. In particular, it is required for Latin characters with diacritics (accents, umlauts, etc.) See an example: </font></font></span></p>
<p style="margin:0cm 0cm 0pt" class="MsoNormal"><i><span lang="EN-US"><font size="2"><font color="#000000" face="Calibri">&lt;o:featuredtemplate title=&quot;PV r&amp;#233;union&quot; source=&quot;http://templateprovider.client.com/templates/ PV%20reunion%20FR.dotx&quot;&gt;</font></font></span></i></p>
<p style="margin:0cm 0cm 0pt" class="MsoNormal"><span lang="EN-US"><font size="2"><font color="#000000" face="Calibri">Here the (ANSI) code &amp;#233; represents the Latin letter with accent é. </font></font></span></p>
<p style="margin:0cm 0cm 0pt" class="MsoNormal"><span lang="EN-US"><font size="2"><font color="#000000" face="Calibri">The provider names in the registry also have to convert such characters. For example, to get é, you have to use the character with ANSI code 130 (shown as comma in text files):</font></font></span></p>
<p style="margin:0cm 0cm 0pt" class="MsoNormal"><font size="2"><font face="Calibri"><font color="#000000"><i><span lang="EN-US">HKCU\Software\Microsoft\Office\12.0\</span></i></font></font></font><font size="2"><font face="Calibri"><font color="#000000"><i><span lang="EN-US">Common\Spotlight\Providers\Comit‚</span></i><span lang="EN-US"> for Comité</span></font></font></font></p>
<p style="margin:0cm 0cm 0pt" class="MsoNormal"><font size="2"><font face="Calibri"><font color="#000000"><span lang="EN-US"></span></font></font></font><span lang="EN-US"><font face="Calibri"><font color="#000000" size="3"><strong>Sorting issue – numbers sorted as texts</strong></font></font></span></p>
<p style="margin:0cm 0cm 0pt" class="MsoNormal"><span lang="EN-US"><font size="2"><font color="#000000" face="Calibri">Normally the template thumbnails are shown in the same order as they are listed in the XML file. </font></font></span><span lang="EN-US"><font size="2"><font color="#000000" face="Calibri">But if a template group contains more than nine templates, their order in UI is different. It happens because templates get ordinal numbers used in registry keys and folder names. And both these values are sorted as texts, so that 10 and 19 come before 2. If you want to show thumbnails in proper order, make a formula which sorts the original XML entries in the way which is turned correctly when sorted as a text. </font></font></span></p>
<p style="margin:0cm 0cm 0pt" class="MsoNormal"><span lang="EN-US"></span><span lang="EN-US"><font face="Calibri"><font color="#000000" size="3"><strong>Delays</strong></font></font></span></p>
<p style="margin:0cm 0cm 0pt" class="MsoNormal"><span lang="EN-US"><font size="2"><font color="#000000" face="Calibri">When the templates are just installed on a PC, the groups are shown in the New Document dialog box, but template thumbnails are not. Go out and go in, then you get the templates. </font></font></span></p>
<p style="margin:0cm 0cm 0pt" class="MsoNormal"><span lang="EN-US"></span><span lang="EN-US"><font face="Calibri"><font color="#000000" size="3"><strong>Different versions of Windows</strong></font></font></span></p>
<p style="margin:0cm 0cm 0pt" class="MsoNormal"><span lang="EN-US"><font size="2"><font color="#000000" face="Calibri">Office 2007 works in Windows XP or later. But the structure of the registry and the folders is different in Windows 7, Vista and XP. So the scripts used to install or to uninstall the templates will also be different. </font></font></span></p>
<p style="margin:0cm 0cm 0pt" class="MsoNormal"><span lang="EN-US"></span><span lang="EN-US"><font face="Calibri"><font color="#000000" size="4"><strong>Bulk processing </strong></font></font></span></p>
<p style="margin:0cm 0cm 0pt" class="MsoNormal"><span lang="EN-US"><font size="2"><font color="#000000" face="Calibri">Our client is using about 200 different Office templates varied by document type, language, institute, and availability of mail merge. Their client PC’s have to be maintained consistently. </font></font></span></p>
<p style="margin:0cm 0cm 0pt" class="MsoNormal"><span lang="EN-US"><font size="2"><font color="#000000" face="Calibri">The needed XML files can be created either by software utilities or by Excel spreadsheets with formulas based on lists of templates. </font></font></span></p>
<p style="margin:0cm 0cm 0pt" class="MsoNormal"><span lang="EN-US"><font size="2"><font color="#000000" face="Calibri">The installation of the templates is done by a batch file which uses commands of getting, creating and setting registry keys. The script can identify the Windows version and the language locale of Microsoft Office user interface, and adapt the installation accordingly:</font></font></span></p>
<p style="margin:0cm 0cm 0pt" class="MsoNormal"><i><span lang="EN-US"><font size="2"><font color="#000000" face="Calibri">rem works for both Vista and XP</font></font></span></i></p>
<p style="margin:0cm 0cm 0pt" class="MsoNormal"><i><span lang="EN-US"><font size="2"><font color="#000000" face="Calibri">reg query &quot;HKEY_CURRENT_USER\Software\Microsoft\Office\12.0\Common\LanguageResources&quot; /v UILanguage &gt;c:\temp\uilang.txt</font></font></span></i></p>
<p style="margin:0cm 0cm 0pt" class="MsoNormal"><i><span lang="EN-US"><font size="2"><font color="#000000" face="Calibri">rem check Dutch</font></font></span></i></p>
<p style="margin:0cm 0cm 0pt" class="MsoNormal"><i><span lang="EN-US"><font size="2"><font color="#000000" face="Calibri">find &quot;413&quot; c:\temp\uilang.txt</font></font></span></i></p>
<p style="margin:0cm 0cm 0pt" class="MsoNormal"><i><span lang="EN-US"><font size="2"><font color="#000000" face="Calibri">if %errorlevel% equ 0 goto setlang1043</font></font></span></i></p>
<p style="margin:0cm 0cm 0pt" class="MsoNormal"><i><span lang="EN-US"><font size="2"><font color="#000000" face="Calibri">rem check French</font></font></span></i></p>
<p style="margin:0cm 0cm 0pt" class="MsoNormal"><i><span lang="EN-US"><font size="2"><font color="#000000" face="Calibri">find &quot;40C&quot; c:\temp\uilang.txt</font></font></span></i></p>
<p style="margin:0cm 0cm 0pt" class="MsoNormal"><i><span lang="EN-US"><font size="2"><font color="#000000" face="Calibri">if %errorlevel% equ 0 goto setlang1036</font></font></span></i></p>
<p style="margin:0cm 0cm 0pt" class="MsoNormal"><i><span lang="EN-US"><font size="2"><font color="#000000" face="Calibri">rem check German</font></font></span></i></p>
<p style="margin:0cm 0cm 0pt" class="MsoNormal"><i><span lang="EN-US"><font size="2"><font color="#000000" face="Calibri">find &quot;407&quot; c:\temp\uilang.txt</font></font></span></i></p>
<p style="margin:0cm 0cm 0pt" class="MsoNormal"><i><span lang="EN-US"><font size="2"><font color="#000000" face="Calibri">if %errorlevel% equ 0 goto setlang1031</font></font></span></i></p>
<p style="margin:0cm 0cm 0pt" class="MsoNormal"><i><span><font size="2"><font color="#000000" face="Calibri">del c:\temp\uilang.txt /f /q</font></font></span></i></p>
<p style="margin:0cm 0cm 0pt" class="MsoNormal"><span lang="EN-GB"><font color="#000000" size="2" face="Calibri">This script creates one group of Word templates entitled “Comité”:</font></span></p>
<p style="margin:0cm 0cm 0pt" class="MsoNormal"><i><span lang="EN-GB"><font size="2"><font color="#000000" face="Calibri">:regkey</font></font></span></i></p>
<p style="margin:0cm 0cm 0pt" class="MsoNormal"><i><span lang="EN-GB"><font size="2"><font color="#000000" face="Calibri">:source</font></font></span></i></p>
<p style="margin:0cm 0cm 0pt" class="MsoNormal"><i><span lang="EN-GB"><font size="2"><font color="#000000" face="Calibri">:langid</font></font></span></i></p>
<p style="margin:0cm 0cm 0pt" class="MsoNormal"><i><span lang="EN-GB"><font size="2"><font color="#000000" face="Calibri">set regkey=HKCU\Software\Microsoft\Office\12.0\Common\Spotlight</font></font></span></i></p>
<p style="margin:0cm 0cm 0pt" class="MsoNormal"><i><span lang="EN-GB"><font size="2"><font color="#000000" face="Calibri">set source=http://templateprovider.client.com</font></font></span></i></p>
<p style="margin:0cm 0cm 0pt" class="MsoNormal"><i><span lang="EN-GB"><font size="2"><font color="#000000" face="Calibri">:setlang1036</font></font></span></i></p>
<p style="margin:0cm 0cm 0pt" class="MsoNormal"><i><span lang="EN-GB"><font size="2"><font color="#000000" face="Calibri">set langid=_fr</font></font></span></i></p>
<p style="margin:0cm 0cm 0pt" class="MsoNormal"><i><span lang="EN-GB"><font size="2"><font color="#000000" face="Calibri">reg add %regkey%\Providers /f</font></font></span></i></p>
<p style="margin:0cm 0cm 0pt" class="MsoNormal"><i><span lang="EN-GB"><font size="2"><font color="#000000" face="Calibri">reg add &quot;%regkey%\Providers\Comit‚&quot; /f</font></font></span></i></p>
<p style="margin:0cm 0cm 0pt" class="MsoNormal"><i><span lang="EN-GB"><font size="2"><font color="#000000" face="Calibri">reg add &quot;%regkey%\Providers\Comit‚&quot; /v ServiceURL /d &quot;%source%/xml/comite_wd%langid%.xml&quot; /f</font></font></span></i></p>
<p style="margin:0cm 0cm 0pt" class="MsoNormal"><i><span lang="EN-GB"><font size="2"><font color="#000000" face="Calibri">reg add &quot;%regkey%\Providers\Comit‚&quot; /v Application /d &quot;WD&quot; /f</font></font></span></i></p>
<p style="margin:0cm 0cm 0pt" class="MsoNormal"><span lang="EN-US"><font size="2"><font color="#000000" face="Calibri">A good guide about managing registry keys in command prompt can be found here:</font></font></span></p>
<p style="margin:0cm 0cm 0pt" class="MsoNormal"><span lang="EN-GB"><a href="http://www.chaminade.org/MIS/Articles/RegistryEdit.htm"><span lang="EN-US"><font color="#0000ff" size="2" face="Calibri">http://www.chaminade.org/MIS/Articles/RegistryEdit.htm</font></span></a></span><span lang="EN-US"></span></p>
<p style="margin:0cm 0cm 0pt" class="MsoNormal"><span lang="EN-US"><font size="2"><font color="#000000" face="Calibri">The batch file itself can be created by a script. </font></font></span></p>
<p style="margin:0cm 0cm 0pt" class="MsoNormal"><span lang="EN-US"><font size="2"><font color="#000000" face="Calibri">Don’t forget about keeping systems clean. Together with the installation batch file, foresee another one to uninstall the templates. Put the code to clean up the registry and the Office folders for any template which was ever used in the organization. Remember that the system creates several registry keys and folders in user profile for each template, and all of them have to be deleted when uninstalling the template. If it is not done, the obsolete template versions or group titles may stay in cache and pop up when the user tries to open the latest version. </font></font></span></p>
<p style="margin:0cm 0cm 0pt" class="MsoNormal"><span lang="EN-US"><font size="2"><font color="#000000" face="Calibri">Here is a sample script of clean uninstall of one group of templates in Vista:</font></font></span></p>
<p style="margin:0cm 0cm 0pt" class="MsoNormal"><i><span lang="EN-US"><font size="2"><font color="#000000" face="Calibri">:regkey</font></font></span></i></p>
<p style="margin:0cm 0cm 0pt" class="MsoNormal"><i><span lang="EN-US"><font size="2"><font color="#000000" face="Calibri">:locfiles</font></font></span></i></p>
<p style="margin:0cm 0cm 0pt" class="MsoNormal"><i><span lang="EN-US"><font size="2"><font color="#000000" face="Calibri">:spotlight</font></font></span></i></p>
<p style="margin:0cm 0cm 0pt" class="MsoNormal"><i><span lang="EN-US"><font size="2"><font color="#000000" face="Calibri">:cookies</font></font></span></i></p>
<p style="margin:0cm 0cm 0pt" class="MsoNormal"><i><span lang="EN-US"><font size="2"><font color="#000000" face="Calibri">set regkey=HKCU\Software\Microsoft\Office\12.0\Common\Spotlight</font></font></span></i></p>
<p style="margin:0cm 0cm 0pt" class="MsoNormal"><i><span lang="EN-US"><font size="2"><font color="#000000" face="Calibri">set locfiles=http://templateprovider.client.com/</font></font></span></i></p>
<p style="margin:0cm 0cm 0pt" class="MsoNormal"><i><span lang="EN-US"><font size="2"><font color="#000000" face="Calibri">set spotlight=&quot;C:\Users\%username%\AppData\Local\Microsoft\Office\Spotlight\Office 12&quot;</font></font></span></i></p>
<p style="margin:0cm 0cm 0pt" class="MsoNormal"><i><span lang="EN-US"><font size="2"><font color="#000000" face="Calibri">set cookies=&quot;C:\Users\%username%\AppData\Roaming\Microsoft\Windows\Cookies&quot;</font></font></span></i></p>
<p style="margin:0cm 0cm 0pt" class="MsoNormal"><i><span lang="EN-US"><font size="2"><font color="#000000" face="Calibri">rem Deletion of Providers registry keys per organisation/Office application</font></font></span></i></p>
<p style="margin:0cm 0cm 0pt" class="MsoNormal"><i><span lang="EN-US"><font size="2"><font color="#000000" face="Calibri">reg delete &quot;%regkey%\Providers\Client docx&quot; /f</font></font></span></i></p>
<p style="margin:0cm 0cm 0pt" class="MsoNormal"><i><span lang="EN-US"><font size="2"><font color="#000000" face="Calibri">reg delete &quot;%regkey%\Content\Client docx&quot; /f</font></font></span></i></p>
<p style="margin:0cm 0cm 0pt" class="MsoNormal"><i><span lang="EN-US"><font size="2"><font color="#000000" face="Calibri">rem Cleaning cookies</font></font></span></i></p>
<p style="margin:0cm 0cm 0pt" class="MsoNormal"><i><span lang="EN-US"><font size="2"><font color="#000000" face="Calibri">del %cookies%&quot;\*client*.txt&quot;</font></font></span></i></p>
<p style="margin:0cm 0cm 0pt" class="MsoNormal"><i><span lang="EN-US"><font size="2"><font color="#000000" face="Calibri">rem Cleaning cache</font></font></span></i></p>
<p style="margin:0cm 0cm 0pt" class="MsoNormal"><i><span lang="EN-US"><font size="2"><font color="#000000" face="Calibri">rd %spotlight%&quot;\Client docx&quot; /s /q</font></font></span></i></p>
<p style="margin:0cm 0cm 0pt" class="MsoNormal"><span lang="EN-US"><font size="2"><font color="#000000" face="Calibri">and in XP:</font></font></span></p>
<p style="margin:0cm 0cm 0pt" class="MsoNormal"><i><span lang="EN-US"><font size="2"><font color="#000000" face="Calibri">:regkey</font></font></span></i></p>
<p style="margin:0cm 0cm 0pt" class="MsoNormal"><i><span lang="EN-US"><font size="2"><font color="#000000" face="Calibri">:locfiles</font></font></span></i></p>
<p style="margin:0cm 0cm 0pt" class="MsoNormal"><i><span lang="EN-US"><font size="2"><font color="#000000" face="Calibri">:spotlight</font></font></span></i></p>
<p style="margin:0cm 0cm 0pt" class="MsoNormal"><i><span lang="EN-US"><font size="2"><font color="#000000" face="Calibri">:cookies</font></font></span></i></p>
<p style="margin:0cm 0cm 0pt" class="MsoNormal"><i><span lang="EN-US"><font size="2"><font color="#000000" face="Calibri">set regkey=HKCU\Software\Microsoft\Office\12.0\Common\Spotlight</font></font></span></i></p>
<p style="margin:0cm 0cm 0pt" class="MsoNormal"><i><span lang="EN-US"><font size="2"><font color="#000000" face="Calibri">set locfiles=http://templateprovider.client.com/</font></font></span></i></p>
<p style="margin:0cm 0cm 0pt" class="MsoNormal"><i><span lang="EN-US"><font size="2"><font color="#000000" face="Calibri">set spotlight=&quot;C:\Documents and Settings\%username%\Local Settings\Application Data\Microsoft\Office\Spotlight\Office 12&quot;</font></font></span></i></p>
<p style="margin:0cm 0cm 0pt" class="MsoNormal"><i><span lang="EN-US"><font size="2"><font color="#000000" face="Calibri">set cookies=&quot;C:\Documents and Settings\%username%\Cookies&quot;</font></font></span></i></p>
<p style="margin:0cm 0cm 0pt" class="MsoNormal"><i><span lang="EN-US"><font size="2"><font color="#000000" face="Calibri">rem Deletion of Providers registry keys per organisation/Office application</font></font></span></i></p>
<p style="margin:0cm 0cm 0pt" class="MsoNormal"><i><span lang="EN-US"><font size="2"><font color="#000000" face="Calibri">reg delete &quot;%regkey%\Providers\Client docx&quot; /f</font></font></span></i></p>
<p style="margin:0cm 0cm 0pt" class="MsoNormal"><i><span lang="EN-US"><font size="2"><font color="#000000" face="Calibri">reg delete &quot;%regkey%\Content\Client docx&quot; /f</font></font></span></i></p>
<p style="margin:0cm 0cm 0pt" class="MsoNormal"><i><span lang="EN-US"><font size="2"><font color="#000000" face="Calibri">rem Cleaning cookies</font></font></span></i></p>
<p style="margin:0cm 0cm 0pt" class="MsoNormal"><i><span lang="EN-US"><font size="2"><font color="#000000" face="Calibri">del %cookies%&quot;\*client*.txt&quot;</font></font></span></i></p>
<p style="margin:0cm 0cm 0pt" class="MsoNormal"><i><span lang="EN-US"><font size="2"><font color="#000000" face="Calibri">rem Cleaning cache</font></font></span></i></p>
<p style="margin:0cm 0cm 0pt" class="MsoNormal"><i><span lang="EN-US"><font size="2"><font color="#000000" face="Calibri">rd %spotlight%&quot;\Client docx&quot; /s /q</font></font></span></i></p>
<p style="margin:0cm 0cm 0pt" class="MsoNormal"><span lang="EN-US"><font size="2"><font color="#000000" face="Calibri">The batch files prepared for Vista run perfectly in Windows 7 when started from file system. You can easily start the batch files from web locations (e.g. SharePoint site) in Vista and XP, but in Windows 7 they will not work: the access will be denied. The bacth files have to be copied to file system and started from there.</font></font></span></p></div></div>]]></description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Viktor Bardadym</dc:creator><pubDate>Mon, 08 Mar 2010 19:46:00 GMT</pubDate><category domain="http://www.orbitone.com/en/blog/archive/tags/Office/default.aspx">Office</category></item><item><title>Unexpected conversion of links in SharePoint 2007 rich text content</title><link>http://www.orbitone.com/en/blog/archive/2010/03/05/unexpected-conversion-of-links-in-sharepoint-2007-rich-text-content.aspx</link><guid>/en/blog/archive/2010/03/05/unexpected-conversion-of-links-in-sharepoint-2007-rich-text-content.aspx</guid><description><![CDATA[<div class="ExternalClassC759CC6CA30047FC81364BD53ACD476F">
<p>Imagine the following scenario. You are typing some rich text entry on your SharePoint intranet with the internal URL <a href="http://intranet/">http://intranet/</a>. It might be a blog post, a discussion board, or just a content editor web part. You insert a link to other intranet site, like <a href="http://intranet.client.com/">http://intranet.client.com</a>. When you test the link, it looks like you want, but it works as just <a href="http://intranet/">http://intranet/</a>. </p>
<p><a href="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/45/image_2_706BF121.png"><img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px" title="image" border="0" alt="image" src="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/45/image_thumb_706BF121.png" width="244" height="217"></a> <a href="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/45/image_4_706BF121.png"><img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px" title="image" border="0" alt="image" src="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/45/image_thumb_1_706BF121.png" width="244" height="219"></a> </p>
<p>If the site has alternate access mapping (AAM) with several web applications (for example, with different authentication), and default or intranet AAM has such short form (in the following example it’s <a href="http://portal/">http://portal/</a>), all instances of the website convert the link this way: </p>
<p><a href="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/45/image_6_706BF121.png"><img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px" title="image" border="0" alt="image" src="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/45/image_thumb_2_706BF121.png" width="458" height="253"></a> </p>
<p>(normally it ends with 404 error)</p>
<p>So SharePoint converts internal links to relative and overrules the conversion for such external links. The links which have the same beginning as default or intranet site URL are converted to relative ones, and then they are interpreted as being located on the default URL:</p>
<p> </p>
<p><a href="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/45/image_10_706BF121.png"><img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px" title="image" border="0" alt="image" src="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/45/image_thumb_4_5B7A6EAE.png" width="486" height="139"></a></p>
<p> <a href="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/45/image_8_5B7A6EAE.png"><img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px" title="image" border="0" alt="image" src="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/45/image_thumb_3_5B7A6EAE.png" width="481" height="127"></a> </p>
<p>How does SharePoint do the translation? Possible scenarios: <br>a) In real time every time the page is loaded. This means that in the database, the absolute link is still there. <br>b) in the background process (database) (not very probable). <br>c) When the user saves the content.</p>
<p>Shortly after saving, on the back end (in the content database, table AllUserData, field ntext2) the links are already relative: </p>
<p>&lt;div class=ExternalClass97C68512A4184122B15D3302EC759305&gt; <br>&lt;div&gt;&lt;a href=&quot;<a href="http://portal.client.org&quot;/">http://portal.client.org&quot;</a>&gt;<a href="http://portal.client.org/">http://portal.client.org</a>&lt;/a&gt;&lt;/div&gt; <br>&lt;div&gt;&lt;a <strong>href=&quot;/&quot;</strong>&gt;<a href="http://intranet.client.com/">http://intranet.client.com</a>&lt;/a&gt; &lt;/div&gt;&lt;/div&gt;</p>
<p>What happens when you add additional alternative access mappings AFTER you already entered content? The relative URL’s are no more updated, they stay as they were with an old AAM.</p>
<p>So this conversion takes place when the user saves the content (scenario c).</p>
<p>Cheating like trying to put a slash next to short URL in AAM doesn’t work, the extra slash is cleaned on saving.</p>
<p>This behavior was noticed a long time ago and not fixed by now in SP 2007:</p>
<p><a title="http://www.eggheadcafe.com/software/aspnet/30556472/directrelative-links-in.aspx" href="http://www.eggheadcafe.com/software/aspnet/30556472/directrelative-links-in.aspx">http://www.eggheadcafe.com/software/aspnet/30556472/directrelative-links-in.aspx</a></p>
<p><a title="http://www.toddklindt.com/blog/Lists/Posts/Post.aspx?ID=57" href="http://www.toddklindt.com/blog/Lists/Posts/Post.aspx?ID=57">http://www.toddklindt.com/blog/Lists/Posts/Post.aspx?ID=57</a></p>
<p><a title="http://blog.mastykarz.nl/inconvenient-content-editor-web-part/" href="http://blog.mastykarz.nl/inconvenient-content-editor-web-part/">http://blog.mastykarz.nl/inconvenient-content-editor-web-part/</a></p>
<p>Luckily in SharePoint 2010 this bug is fixed.</p></div>]]></description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Viktor Bardadym</dc:creator><pubDate>Mon, 08 Mar 2010 19:46:00 GMT</pubDate></item><item><title>ASP.Net Exception Reporter</title><link>http://www.orbitone.com/en/blog/archive/2009/11/03/asp-net-exception-reporter.aspx</link><guid>/en/blog/archive/2009/11/03/asp-net-exception-reporter.aspx</guid><description><![CDATA[<div class="ExternalClass9287445424874595B9BC085365830E0C">
<p>Orbit One has developed a unique solution that allows you to track and analyse “unhandled exceptions” in the code of web applications. “Unhandled exceptions” are problems that are not supposed to happen. <br>No system is perfect and environmental changes as well as different types of clients devices (browsers) can result in small issues. <br>You can make a friendly error page that explains the user an issue has happened, and invite him to try his action again. <br>If the problem remains, the user can click on a link and send an email to your support. <br>This email contains the unique reference number of the issue. <br>Your development team can monitor and fix the issues as soon as possible. <br>All issues are centralized in a database, allowing your team to quickly find detailed information about the problem. <br>This unique solution allows you to be efficient and provide high quality web applications. </p>
<p><br><img title="elmahws1.png" alt="elmahws1.png" src="http://aspexceptionreporter.codeplex.com/Project/Download/FileDownload.aspx?DownloadId=90564"> <br></p>
<p>You can find more information, the code, documentation and ready to use installers on <a href="http://aspexceptionreporter.codeplex.com/">Codeplex.</a></p></div>]]></description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Wim De Coninck</dc:creator><pubDate>Tue, 03 Nov 2009 14:26:00 GMT</pubDate><category domain="http://www.orbitone.com/en/blog/archive/tags/.NET/default.aspx">.NET</category><category domain="http://www.orbitone.com/en/blog/archive/tags/Visual Studio/default.aspx">Visual Studio</category></item><item><title>Minimum Dynamics CRM Permissions</title><link>http://www.orbitone.com/en/blog/archive/2009/10/06/minimum-dynamics-crm-permissions.aspx</link><guid>/en/blog/archive/2009/10/06/minimum-dynamics-crm-permissions.aspx</guid><description><![CDATA[<div class="ExternalClass05B68448D8B14C3D884484B6B9BBD418">
<div><font color="#000000">When configuring security roles in Dynamics CRM, a system administrator is situated between </font><a href="http://en.wikipedia.org/wiki/Scylla">Scylla</a><font color="#000000">, allowing users things they shouldn’t do, (and, believe me, the users will do it very soon once permitted) and </font><a href="http://en.wikipedia.org/wiki/Charybdis">Charybdis</a><font color="#000000">, blocking users’ work. And K.I.S.S. advices, like “leave only read permissions just to the entities we use”, or “use only out-of-the-box CRM permissions, or their copies with minimal changes“ may lead the user to one of these beasts. </font></div>
<div><br><font color="#000000">To perform an action within CRM, the user may need various permissions that don’t necessarily link link with each other, and which are located far away from each other in the user interface Security Roles. <br></font></div>
<div><font color="#000000">To choose the right permissions you need an understanding of processes within Dynamics CRM. <br></font></div>
<div><font color="#000000">This post lists the minimal permissions for several important functionalities of Microsoft Dynamics CRM and explains the backgrounds of them. <br></font></div>
<div><font color="#000000">In general it is advised to test each new security role with an “alter ego” user having this role. </font></div>
<div><br><font color="#000000">
<h3>First login</h3><br>- Business Management – User Settings – Write – User<br><img alt="First login" src="http://www.orbitone.com/en/blog/Lists/Photos/min_crm_permissions_01.jpg"> <br>Even if you create a 100% read-only user, let him write his user settings. If a user doesn’t have this permission, on the first login he gets an “Insufficient Permissions” error, because CRM cannot set &amp; save his default entity in UI. <br></font></div>
<div><font color="#000000">Source: </font><a href="http://support.microsoft.com/kb/948311">http://support.microsoft.com/kb/948311</a> <br></div>
<div><font color="#000000">If you still have a good reason for blocking users to save their settings (via Tools - Options), you can block this permission. But then you have to follow these steps for every new user: <br>- assign System Administrator security role to the new user; <br>- log in as the new user; <br>- in Tools – Options slect the default enityt for the user(e.g. Accounts) and save user settings; <br>- log off; <br>- remove System Administrator security role and assign the actual security roleto the user. </font></div>
<div><font color="#000000"><img alt="Set default entity" src="http://www.orbitone.com/en/blog/Lists/Photos/min_crm_permissions_02.jpg"><br> <br></font><font color="#000000">
<h3>Create an Activity</h3><br>Looks simple: Core Records – Activities – Create – User. After it, the user can create an activity. But when saving, the user gets an error message ”The logged-on user does not have the appropriate security permissions…”. First of all, activities require Append To rights (don’t ask me why). Good enough for tasks. <br></font></div>
<div><font color="#000000">Letters, faxes, phone calls and e-mails always have another party: a lead, a contact, a user (to send correspondence to your colleagues), and possibly an account. They have to be appended to other entities, so they need Append rights. And recipients’ entities need Append To. <br></font></div>
<div><font color="#000000">It goes well with all types of activities except appointments. On saving an appointment, the user gets the same error message, followed by “General Failure in Scheduling Engine”. The first error happens because other users will not see the appointment if it is not shared. The second means that all appointments in the CRM have to be checked with the service calendar for availability, even if users don’t use the service calendar directly. <br>Add Core Records – Activity - Share (at least for business unit, not just for user) and Service management – Search Availability permissions  and get it working: <br><img alt="Create an activity" src="http://www.orbitone.com/en/blog/Lists/Photos/min_crm_permissions_03.jpg"><br><img alt="Create an activity" src="http://www.orbitone.com/en/blog/Lists/Photos/min_crm_permissions_04.jpg"><br><img alt="Create an activity" src="http://www.orbitone.com/en/blog/Lists/Photos/min_crm_permissions_05.jpg"></font></div>
<div><br><font color="#000000">
<h3>Track an Activity in CRM</h3><br>Was the above adventure enough to track Outlook entities in CRM? Oops, we get ”The logged-on user does not have the appropriate security permissions…” again. Business Management – Sync to Outlook? Right, but not sufficient. You also need Write access to activities. <br><img alt="Track an activity in CRM" src="http://www.orbitone.com/en/blog/Lists/Photos/min_crm_permissions_06.jpg"><br>Some sources (e.g. </font><a href="http://social.microsoft.com/Forums/en-US/crmdeployment/thread/3451e18a-4afd-4436-b0b9-8ebd94156f67">http://social.microsoft.com/Forums/en-US/crmdeployment/thread/3451e18a-4afd-4436-b0b9-8ebd94156f67</a><font color="#000000">) refer to the necessity of read access to all of these records: account, contact, lead, user, and queue. The test shows that some of these entities, like account and queue, may be blocked, and the user still can track the activity (possibly changed by a rollup). The entities you select for Read &amp; Append To access will be available in user’s Set Regarding dialog. </font></div>
<div><br><font color="#000000">
<h3>Send Mail Merge Letters</h3><br>The obvious selections are: <br>- Business management – Mail Merge (from Outlook) and/or Web Mail Merge (from web interface);<br>- Core Records – Mail Merge Template – Read; <br>- Core Records – [used recipient entities, e.g. Lead, Account, Contact] – Read; <br><img alt="Send mail merge letters" src="http://www.orbitone.com/en/blog/Lists/Photos/min_crm_permissions_07.jpg"><br>Then users have to select the recipients in one of the ways:<br>- Advanced Find: Core Records – Saved View – Read – User, or<br>- Marketing List: Marketing  – Marketing List – Create – User, or – Read – Business Unit, or<br>- Quick Campaign: Marketing  – Create Quick Campaign.<br></font></div>
<div><font color="#000000">They still don’t get Word icon on your workspace? Ah, like </font><a href="http://en.wikipedia.org/wiki/Le_Bourgeois_gentilhomme">monsieur Jourdain</a><font color="#000000"> didn’t realize that his speech was  prose, we don’t realize that mail merge is an activity. Moreover an activity has to be appended to the entities to which we send the letters. So we have to add the following permissions: <br>- Core Records – [used recipient entities] – Append To; <br>- Core Records – Activity – Create, Read, Append – User.<br><img alt="Send mail merge letters" src="http://www.orbitone.com/en/blog/Lists/Photos/min_crm_permissions_08.jpg"></font></div>
<div><br><font color="#000000">
<h3>Create Queck Campaign</h3><br>As well as Mail Merge, Quick Campaign requires permissions to create, write and append activities. Otherwise the Quick Campaign wizard starts looping. </font></div>
<div><br><font color="#000000">
<h3>Create Reports with Report Wizard</h3><br>When a user with custom security role tries to create a new report, he gets Insufficient Permissions error. The security role has all permissions regarding reports, but Report Wizard still doesn’t start. It happens in Microsoft Dynamics CRM 4.0 environments which have been migrated from 3.0. <br><img alt="Create reports with Report Wizard" src="http://www.orbitone.com/en/blog/Lists/Photos/min_crm_permissions_09.jpg"><br>The problem is that the new security role is missing some permission(s) and the same time the user interface is missing a control to change them. You can create a copy of System Administrator role and make the needed security role by removal of redundant permissions. (luckily “all to nothing” change takes just one click) This witching works like a charm. <br></font></div>
<div><font color="#000000">There may be other permission issues solved the same way. (I saw a reference but can’t find it anymore)</font></div>
<div><br><font color="#000000"><strong>Conclusion</strong>: by preference use (copies of) standard CRM security roles rathen than creating security roles from scratch. <br></font></div>
<div><font color="#000000">Another advice you can find in literature and on the internet is not to change any predefined roles in the CRM. <br>Source: </font><a href="http://www.techtalkz.com/microsoft-dynamics-crm/494850-insufficient-permission-report-wizard-crm4-0-a.html">http://www.techtalkz.com/microsoft-dynamics-crm/494850-insufficient-permission-report-wizard-crm4-0-a.html</a></div>
<div> </div>
<div><font color="#000000">
<h3>Use Custom Entities</h3><br>If a new custom entity is created, by default only the system administrator gets access to it. Other users will not see the entity. Even worse, they will not see any related values, lookup fileds in other entities,which use the custom entity. So whenever you create a new custom entity, give permissions to this entity for all security roles which are expected to use it, or any entities related with it. Configure the permissions on Custom Entities tab. </font></div>
<div><font color="#000000">
<h3><img alt="Use custom entities" src="http://www.orbitone.com/en/blog/Lists/Photos/min_crm_permissions_10.jpg"></h3><br><br></font><font color="#000000">
<h3>Run Automatic Workflows</h3><br>An action taken by the user may start a workflow which will create or update other records. For example, creating an opportunity may start a workflow which creates a follow-up task. Whenever you set up such a workflow, control that the user who may perform the original action cal also run workflows and take actions upon entities affected by the workflow. </font></div>
<div><br><font color="#000000">
<h3>Deletion of Records – The Rule and The Exceptions</h3><br>The last but not the least, and it’s different. You can do anything but lay off of deleting blue suede CRM records. <br></font></div>
<div><font color="#000000">Block deletion of records for all security roles except for System Administrator. By deleting records users will not only produce orphan records of other types. If a deleted record (like account) has parental relationship with other records, they all will be deleted. <br></font></div>
<div><font color="#000000">Advise users to deactivate records, or to close activity records instead. One of many advantages is that you get “undo”. You can reactivate lead / customer records. In principle you can reactivate other types as well, but that’s another story.<br></font></div>
<div><font color="#000000">The action to deactivate records has several reincarnations: <br>- Cancel (orders, invoices, cases and campaigns);<br>- Close (activities, opportunities and quotes);<br>- Convert (leads);<br>- Unpublish (workflows, duplicate detection rules and knowledge base articles). <br></font></div>
<div><font color="#000000">And there are still quite some entities which cannot be deactivated: <br>- E-mails (it’s completed only when it’s sent. To delete an unsent draft, you have to enable deletion for all types of activities); <br>- Customer Relationships;<br>- Saved Views (Advanced Find);<br>- System jobs, like import, duplicate detection,…<br>- Reports (only revert to personal); <br>- Competitors;<br>- Products;<br>- Sales Literature;<br>- Quick Campaigns;<br>- Contracts;<br>- Announcements;<br>- Security Roles;<br>- Teams (neither deleted);<br>- Facilities/Equipment;<br>- Subjects.<br></font></div>
<div><font color="#000000">As exception, deletion of some of them may be permitted for few power users. <br><img alt="Deletion of records" src="http://www.orbitone.com/en/blog/Lists/Photos/min_crm_permissions_11.jpg"></font></div>
<div><br><font color="#000000">
<h3>Still don’t know what to do? </h3><br>If this post does not cover your situation, or the advises don’t help, go for an advanced action. <br>- Enable  tracing: </font><a href="http://support.microsoft.com/kb/907490">http://support.microsoft.com/kb/907490</a><br><font color="#000000">- Reproduce the error.<br>- In trace log search by error code and find the permission GUID:<br>Error: Server was unable to process request.<br>Error Number: </font><font color="#008000">0x80040220</font><br><font color="#000000">Error Message: SecLib::CrmCheckPrivilege failed. Returned hr = -2147220960 on UserId: e65023ae-54d1-da11-8e39-00145e3d5192 and PrivilegeId: </font><font color="#ff0000">a8ecac53-09e8-4a13-b598-8d8c87bc3d33</font><br><font color="#000000">- Identify the missing permissions by querying the permission GUID in the CRM database, as advised by Microsoft: </font><a href="http://support.microsoft.com/kb/953962">http://support.microsoft.com/kb/953962</a>.<br><font color="#000000">select Name,  * from PrivilegeBase where PrivilegeId = </font>'<font color="#ff0000">a8ecac53-09e8-4a13-b598-8d8c87bc3d33</font>'</div></div>]]></description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Viktor Bardadym</dc:creator><pubDate>Tue, 06 Oct 2009 09:37:00 GMT</pubDate><category domain="http://www.orbitone.com/en/blog/archive/tags/CRM 4.0/default.aspx">CRM 4.0</category></item><item><title>Discover HD videoconferencing</title><link>http://www.orbitone.com/en/blog/archive/2009/10/03/discover-hd-videoconferencing.aspx</link><guid>/en/blog/archive/2009/10/03/discover-hd-videoconferencing.aspx</guid><description><![CDATA[<div class="ExternalClass984850ED77864C5CB96A5C392BA25E5F"><p>Orbit One provides videoconferencing solutions based on LifeSize equipment.    <br>In this PowerPoint presentation we share our tips and guidelines.</p>  <p><a href="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/37/image_2_5AF606C0.png"><img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px" title="image" border="0" alt="image" src="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/37/image_thumb_5AF606C0.png" width="466" height="299"></a> </p>  <ul>   <li>Why videoconferencing </li>    <li>Types of videoconferencing </li>    <li>LifeSize 200 series models </li>    <li>Multiple monitors </li>    <li>Technical guidelines </li>    <li>Meeting Room adjustments </li>    <li>Additional equipment </li> </ul>  <p><a title="http://www.slideshare.net/orbitone/high-definition-videoconferencing" href="http://www.slideshare.net/orbitone/high-definition-videoconferencing">http://www.slideshare.net/orbitone/high-definition-videoconferencing</a></p></div>]]></description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Olivier Mangelschots</dc:creator><pubDate>Sat, 03 Oct 2009 21:02:36 GMT</pubDate></item><item><title>SlideShare</title><link>http://www.orbitone.com/en/blog/archive/2009/10/03/slideshare.aspx</link><guid>/en/blog/archive/2009/10/03/slideshare.aspx</guid><description><![CDATA[<div class="ExternalClass07EFBD76E50F449B90E0934F74E7CD2E"><p>Find our PowerPoint presentations on <a title="http://www.slideshare.net/orbitone" href="http://www.slideshare.net/orbitone">http://www.slideshare.net/orbitone</a></p>  <p><img src="http://press.slideshare.net/wp-content/uploads/2008/12/slideshare_550x150.png" width="344" height="94"></p>  <ul>   <li>NUnit vs MSTest </li>    <li>Continuous Integration </li>    <li>Interacting with the Exchange Web Services </li>    <li>ReportViewer Web Server Control </li>    <li>Introduction to Code Reviews </li>    <li>Office Communication Server Integration </li>    <li>Introduction and tips about Microsoft Dynamics CRM </li>    <li>Nintex - SharePoint Workflow </li> </ul>  <p><font color="#434343">More to come!</font></p></div>]]></description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Olivier Mangelschots</dc:creator><pubDate>Sat, 03 Oct 2009 15:30:39 GMT</pubDate></item><item><title>CRM Migration - Migrant’s Notes</title><link>http://www.orbitone.com/en/blog/archive/2009/09/28/crm-migrant’s-notes.aspx</link><guid>/en/blog/archive/2009/09/28/crm-migrant’s-notes.aspx</guid><description><![CDATA[<div class="ExternalClass11F07BBFEE9B4F7BB367857B1D1BB3EA">
<div><span lang="EN-US"><font color="#000000">
<p style="margin:0cm 0cm 10pt" class="MsoNormal"><span lang="EN-US"><font face="Arial"><font color="#000000" size="2">When your customer decides that his legacy CRM system is junk, and he has to move all business data to Microsoft Dynamics CRM with your help, he doesn’t expect “junk in - junk out” effect. </font></font></span></p>
<p style="margin:0cm 0cm 10pt" class="MsoNormal"><font face="Arial"><font color="#000000" size="2">What are the critical success factors and the things which need special control during migration of business data to Dynamics CRM? </font></font></font></span><span lang="EN-US"><font face="Arial"><font color="#000000"><font size="2">See further – most of them are simple but often overlooked. And missing it may lead to stopping the migration, taking “ad hack” solutions, and making the migrated data even more junk than the original ones. </font></font></font></span><p>
<h2 style="margin:10pt 0cm 0pt"><span lang="EN-US"><font face="Arial"><font color="#000000"><font size="2">Good detailed plan</font></font></font></span></h2>
<p style="margin:0cm 0cm 10pt" class="MsoNormal"><span lang="EN-US"><font face="Arial"><font color="#000000"><font size="2">As for any activity with many details and dependencies, make detailed checklist of actions to perform and things to control on preprocessing, migration and postprocessing. Use top-to-bottom approach to plan actions: start with the most general and then bring more details to each level. Identify dependencies and put the actions in correct order. </font></font></font></span></p>
<h2 style="margin:10pt 0cm 0pt"><span lang="EN-US"><font face="Arial"><font color="#000000"><font size="2">Preparation on staging environment</font></font></font></span></h2>
<p style="margin:0cm 0cm 10pt" class="MsoNormal"><span lang="EN-US"><font face="Arial"><font color="#000000"><font size="2">Use staging Dynamics CRM environment to prepare the migration. When you (and your customer) are sure that all data are correctly migrated to the staging environment, do the migration to live. Backup &amp; restore of the CRM organization database is not always an option: the restored CRM environment may not start at all. Backup &amp; restore is not applicable at all if staging and live environments (and consequently Active Directory user accounts) are located in different domains. <span> </span></font></font></font></span></p>
<p style="margin:0cm 0cm 10pt" class="MsoNormal"><span lang="EN-US"><font face="Arial"><font color="#000000"><font size="2">Keep the customizations of your staging environment identical to live as much as possible. Do not make parallel customizations in live and staging UI, even if they look identical. After such changes, further export and import of customizations between live and staging may become impossible. </font></font></font></span></p>
<h2 style="margin:10pt 0cm 0pt"><span lang="EN-US"><font face="Arial"><font color="#000000"><font size="2">No orphan records</font></font></font></span></h2>
<p style="margin:0cm 0cm 10pt" class="MsoNormal"><span lang="EN-US"><font face="Arial"><font color="#000000"><font size="2">In legacy CRM applications, records may have blank or invalid ID’s of related records. This can crash the software you use (for example, upgrade of ACT! database from an older format before migrating to MS CRM). </font></font></font></span></p>
<p style="margin:0cm 0cm 10pt" class="MsoNormal"><span lang="EN-US"><font face="Arial"><font color="#000000"><font size="2">If possible, identify and fix or delete orphan records at early stage. In old ACT! and GoldMine databases you can do it on back end in dBase files. </font></font></font></span></p>
<h2 style="margin:10pt 0cm 0pt"><span lang="EN-US"><font face="Arial"><font color="#000000"><font size="2">Permissions</font></font></font></span></h2>
<p style="margin:0cm 0cm 10pt" class="MsoNormal"><span lang="EN-US"><font face="Arial"><font color="#000000"><font size="2">Migration tools and SDK’s may require that all users, active and historical, have permissions to create, append, append to, share,… If so, before the migration create all active and historical users in Active Directory and CRM and assign System Administrator role to them. After the migration secure CRM by removal of System Administrator role. Then you can assign all records owned by historical users to<span>  </span>actual<span>  </span>users, and only then disable historical user accounts. </font></font></font></span></p>
<h2 style="margin:10pt 0cm 0pt"><span lang="EN-US"><font face="Arial"><font color="#000000"><font size="2">Control size of fields</font></font></font></span></h2>
<p style="margin:0cm 0cm 10pt" class="MsoNormal"><span lang="EN-US"><font face="Arial"><font color="#000000"><font size="2">Control that all field values fit into size limits of CRM fields. Update size limits in CRM if needed. But keep in mind that updating sizes of standard fields (like address1_line1) may not solve the problem. Instead of size limit error, the import job can produce an unspecified server error. </font></font></font></span></p>
<p style="margin:0cm 0cm 10pt" class="MsoNormal"><span lang="EN-US"><font face="Arial"><font color="#000000"><font size="2">Long values particularly happen in address fields. Consider splitting the address over several fields (address1_name, address1_line1, address1_line2 and address1_line3,…). </font></font></font></span></p>
<p style="margin:0cm 0cm 10pt" class="MsoNormal"><span lang="EN-US"><font face="Arial"><font color="#000000"><font size="2">If you use standard CRM import, you can still save the refused records “on the fly”, split the long values, and repeat the import for refused records.<span>  </span></font></font></font></span></p>
<p style="margin:0cm 0cm 10pt" class="MsoNormal"><span lang="EN-US"><font face="Arial"><font color="#000000"><font size="2"><span><img alt="Handling import errors" src="http://www.orbitone.com/en/blog/Lists/Photos/crmmigrate1.jpg"></span></font></font></font></span></p>
<p style="margin:0cm 0cm 10pt" class="MsoNormal"><span><font color="#000000" size="2" face="Arial"></font></span><span lang="EN-US"></span></p>
<h2 style="margin:10pt 0cm 0pt"><span lang="EN-US"><font face="Arial"><font color="#000000"><font size="2">No special characters in field values</font></font></font></span></h2>
<p style="margin:0cm 0cm 10pt" class="MsoNormal"><span lang="EN-US"><font face="Arial"><font color="#000000"><font size="2">(like line end characters with ASCII codes 10 and 13) </font></font></font></span></p>
<p style="margin:0cm 0cm 10pt" class="MsoNormal"><span lang="EN-US"><font face="Arial"><font color="#000000"><font size="2">Get rid of them before the import. Otherwise, sooner or later, they will make trouble. For example, if the data are imported from CSV files via standard CRM import, line breaks can break a record line into several, even if text qualifiers are used. </font></font></font></span></p>
<p style="margin:0cm 0cm 10pt" class="MsoNormal"><span lang="EN-US"><font face="Arial"><font color="#000000"><font size="2">Notepad++ is a good tool to identify them in text files (e. g. CSV).</font></font></font></span></p>
<h2 style="margin:10pt 0cm 0pt"><span lang="EN-US"><font face="Arial"><font color="#000000"><font size="2">Control business required values</font></font></font></span></h2>
<p style="margin:0cm 0cm 10pt" class="MsoNormal"><span lang="EN-US"><font face="Arial"><font color="#000000"><font size="2">Control that all business required fields are 100% populated. </font></font></font></span></p>
<h2 style="margin:10pt 0cm 0pt"><span lang="EN-US"><font face="Arial"><font color="#000000"><font size="2">Control unexpected intelligence of your tools</font></font></font></span></h2>
<p style="margin:0cm 0cm 10pt" class="MsoNormal"><span lang="EN-US"><font face="Arial"><font color="#000000"><font size="2">If you export data from Excel , or use Excel to process the data, don’t be surprised with telephone numbers like 8.61E+12 or -166.0405405, while the original numbers are 8612345678910 and +32-9/222-99-99. The first one is a rounded “approximate” phone number in scientific format (8.61 x 10<sup>12</sup>), and the second is a “calculated” phone number (have you ever dialed an approximate negative fractional phone?). Excel doesn’t have cell format for telephone numbers and treats such input as a big numeral in the first case, or as a valid formula in the second case. </font></font></font></span></p>
<p style="margin:0cm 0cm 10pt" class="MsoNormal"><span lang="EN-US"><font face="Arial"><font color="#000000"><font size="2">Solution: convert such values to text by Excel function TEXT.</font></font></font></span></p>
<h2 style="margin:10pt 0cm 0pt"><span lang="EN-US"><font face="Arial"><font color="#000000"><font size="2">Person’s names</font></font></font></span></h2>
<p style="margin:0cm 0cm 10pt" class="MsoNormal"><span lang="EN-US"><font face="Arial"><font color="#000000"><font size="2">Some systems don’t explicitly split contacts’ given names and family names. Foresee the rules which defines given names and family names in Dynamics CRM as adequate as possible. </font></font></font></span></p>
<p style="margin:0cm 0cm 10pt" class="MsoNormal"><span lang="EN-US"><font face="Arial"><font color="#000000"><font size="2">Take into account that: </font></font></font></span></p>
<ul>
<li>
<div style="margin:0cm 0cm 10pt" class="MsoNormal"><span lang="EN-US"></span><font face="Arial"><font color="#000000"><font size="2"><span lang="EN-US">both given names and family names may be multiple; (e. g. Juan Luis Gonzalez Fernandez) </span></font></font></font></div></li>
<li>
<div style="margin:0cm 0cm 10pt" class="MsoNormal"><font face="Arial"><font color="#000000"><font size="2"><span lang="EN-US"></span></font></font></font><font face="Arial"><font color="#000000"><font size="2"><span lang="EN-US">family names may have prepositions, sometimes multiple (e. g. Van Den Bogerd or de la Croix), which have to stay with the names;</span></font></font></font></div></li>
<li>
<div style="margin:0cm 0cm 10pt" class="MsoNormal"><font face="Arial"><font color="#000000"><font size="2"><span lang="EN-US"></span></font></font></font><font face="Arial"><font color="#000000"><font size="2"><span lang="EN-US">names may be accompanied by salutations, titles, military ranks<span>  </span>in various languages, sometimes multiple, (e. g. Prof. Dr. Ing. Von Hochenbalken) which have to be separated and saved to a different field; </span></font></font></font></div></li>
<li>
<div style="margin:0cm 0cm 10pt" class="MsoNormal"><font face="Arial"><font color="#000000"><font size="2"><span lang="EN-US"></span></font></font></font><font face="Arial"><font color="#000000"><font size="2"><span lang="EN-US">delimiting of the above parts may be inconsistent (space, dot with space, just dot);</span></font></font></font></div></li>
<li>
<div style="margin:0cm 0cm 10pt" class="MsoNormal"><font face="Arial"><font color="#000000"><font size="2"><span lang="EN-US"></span></font></font></font><font face="Arial"><font color="#000000"><font size="2"><span lang="EN-US">even if you would have a comprehensive dictionary of given names, in some cultures it’s different to distinct family names from given names; (for example Roger Vincent, Laurence Olivier, Marcu Matei)</span></font></font></font></div></li>
<li>
<div style="margin:0cm 0cm 10pt" class="MsoNormal"><font face="Arial"><font color="#000000"><font size="2"><span lang="EN-US"></span></font></font></font><font face="Arial"><font color="#000000"><font size="2"><span lang="EN-US">the field lastname always has to get a non-empty value, since it is business required. </span></font></font></font></div></li></ul>
<p style="margin:0cm 0cm 10pt" class="MsoNormal"><span lang="EN-US"><font face="Arial"><font color="#000000"><font size="2">A possible action plan is:</font></font></font></span></p>
<ul>
<li>
<div style="margin:0cm 0cm 10pt" class="MsoNormal"><span lang="EN-US"></span><font face="Arial"><font color="#000000"><font size="2"><span lang="EN-US">prepare the dictionary of “normalized” prepositions and the dictionary of “normalized” titles. </span></font></font></font></div></li>
<li>
<div style="margin:0cm 0cm 10pt" class="MsoNormal"><font face="Arial"><font color="#000000"><font size="2"><span lang="EN-US"></span></font></font></font><font face="Arial"><font color="#000000"><font size="2"><span lang="EN-US">prepare the script with the functions which identify and split the full name to its parts based on the most typical name format (e. g. [Titles ]Firstname Lastname). This is possible even in Excel with usage of VBA. </span></font></font></font></div></li></ul>
<h2 style="margin:10pt 0cm 0pt"><span lang="EN-US"><font face="Arial"><font color="#000000"><font size="2">Correctly treat <span> </span>“All in one” legacy contact records</font></font></font></span></h2>
<p style="margin:0cm 0cm 10pt" class="MsoNormal"><span lang="EN-US"><font face="Arial"><font color="#000000"><font size="2">Many popular contact management applications (Microsoft Outlook among them) use single record for account and contact. Other systems (like ACT! by Sage) allow limited number of multiple contact persons in one database record. The data model of Dynamics CRM is different, it uses single record per account and single record per contact. If you migrate the data from such sources to the CRM, you have to split it to two Dynamics CRM records and later to assign Parent Customer and Primary Contact relationships between them. </font></font></font></span></p>
<p style="margin:0cm 0cm 10pt" class="MsoNormal"><span lang="EN-US"><font face="Arial"><font color="#000000"><font size="2">For the original records create unique ID’s and migrate these ID’s to both account and contact records. If the data come from multiple sources, indicate the data source in the ID. Upon importing <span> </span>accounts and <span> </span>contacts, match them using unique ID’s. </font></font></font></span></p>
<p style="margin:0cm 0cm 10pt" class="MsoNormal"><span lang="EN-US"><font color="#000000" size="2" face="Arial">One account may have more than one contact. If you want to eliminate duplicate accounts, at the stage of preprocessing define primary records for obsolete accounts (if the data of accounts are identical, or you have no preferences for the primary account, you can do it automatically in Excel using formulas), and then map contacts to primary accounts. Such updates of CRM records and many other handy thongs may be done by the <a href="http://mscrmbulkupdatetool.codeplex.com/">CRM Bulk Update and Export tool</a></font></span><span lang="EN-US"><font face="Arial"><font color="#000000"><font size="2"> available on Codeplex.</font></font></font></span></p>
<p style="margin:0cm 0cm 10pt" class="MsoNormal"><span lang="EN-US"><font face="Arial"><font color="#000000"><font size="2">Complete this mapping before the users start manual hunting for duplicates. </font></font></font></span></p>
<h2 style="margin:10pt 0cm 0pt"><span lang="EN-US"><font face="Arial"><font color="#000000"><font size="2">Find the best balance for duplicate detection and merge</font></font></font></span></h2>
<p style="margin:0cm 0cm 10pt" class="MsoNormal"><span lang="EN-US"><font face="Arial"><font color="#000000"><font size="2">The right moment to merge duplicates (preprocessing, migration, or postprocessing) depends on how clean the data are. The customer may have an idea that source A is cleaner than source B. If so, import source A first and non-duplicate data from source B next. </font></font></font></span></p>
<p style="margin:0cm 0cm 10pt" class="MsoNormal"><span lang="EN-US"><font face="Arial"><font color="#000000"><font size="2">In principle, the source B can be imported first, followed by source A and update of the data with available values from the source A. Be careful with updates “per field” (like “take the value form better source if not blank, otherwise take the value from the worse source”). For example, a record from the worse source may have data in two address lines (address1_line1 and address1_line2), while the corresponding record form the better source has only address1_line1. As a result, this rule may give a mixture of lines taken from two different addresses. </font></font></font></span></p>
<p style="margin:0cm 0cm 10pt" class="MsoNormal"><span lang="EN-US"><font face="Arial"><font color="#000000"><font size="2">If after all the customer realizes that he needs company name from one source, e-mail address from another, and VAT code from the third (like a young lady form a classical comedy who searched a groom with nose of Mr. A., ears of Mr. B, and incomes of Mr. C.). If so, either let the customer to clean the data before the migration, or migrate all data, double and triple, to the CRM. CRM allows you to identify duplicates and to merge two records into one with specific selection of sections, fields from each merged records, or selection of the whole record. </font></font></font></span></p>
<p style="margin:0cm 0cm 10pt" class="MsoNormal"><span lang="EN-US"><img alt="Merge Duplicates" src="http://www.orbitone.com/en/blog/Lists/Photos/crmmigrate2.jpg"></span></p>
<p style="margin:0cm 0cm 10pt" class="MsoNormal"><span><font color="#000000" size="2" face="Arial"></font></span></p>
<p style="margin:0cm 0cm 10pt" class="MsoNormal"><span><font color="#000000" size="2" face="Arial"></font></span><span lang="EN-US"></span></p>
<p style="margin:0cm 0cm 10pt" class="MsoNormal"><span lang="EN-US"><font face="Arial"><font color="#000000"><font size="2"><img alt="Merge Duplicates" src="http://www.orbitone.com/en/blog/Lists/Photos/crmmigrate3.jpg"></font></font></font></span></p>
<p style="margin:0cm 0cm 10pt" class="MsoNormal"><span lang="EN-US"><font face="Arial"><font color="#000000"><font size="2">Out-of-the-box duplicate detection in CRM is more than basic, but you can enhance it by using calculated match names. Normalize account or contact names by: </font></font></font></span></p>
<ul>
<li>
<div style="margin:0cm 0cm 10pt" class="MsoNormal"><span lang="EN-US"></span><font face="Arial"><font color="#000000"><font size="2"><span lang="EN-US">converting them to lower case and trimming;</span></font></font></font></div></li>
<li>
<div style="margin:0cm 0cm 10pt" class="MsoNormal"><font face="Arial"><font color="#000000"><font size="2"><span lang="EN-US"></span></font></font></font><font face="Arial"><font color="#000000"><font size="2"><span lang="EN-US">converting letters with diacritics to standard Latin letters (e.g. Maïté to maite); </span></font></font></font></div></li>
<li>
<div style="margin:0cm 0cm 10pt" class="MsoNormal"><font face="Arial"><font color="#000000"><font size="2"><span lang="EN-US"></span></font></font></font><font face="Arial"><font color="#000000"><font size="2"><span lang="EN-US">removal of texts inside parentheses, like alternative spellings or comments;</span></font></font></font></div></li>
<li>
<div style="margin:0cm 0cm 10pt" class="MsoNormal"><font face="Arial"><font color="#000000"><font size="2"><span lang="EN-US"></span></font></font></font><font face="Arial"><font color="#000000"><font size="2"><span lang="EN-US">removal of punctuation marks and special characters (at this stage better to replace punctuation marks with spaces, since they delimit single words); </span></font></font></font></div></li>
<li>
<div style="margin:0cm 0cm 10pt" class="MsoNormal"><font face="Arial"><font color="#000000"><font size="2"><span lang="EN-US"></span></font></font></font><font face="Arial"><font color="#000000"><font size="2"><span lang="EN-US">removal of common abbreviations, like English Ltd, German GmbH, or French SPRL;</span></font></font></font></div></li>
<li>
<div style="margin:0cm 0cm 10pt" class="MsoNormal"><font face="Arial"><font color="#000000"><font size="2"><span lang="EN-US"></span></font></font></font><font face="Arial"><font color="#000000"><font size="2"><span lang="EN-US">removal of spaces.</span></font></font></font></div></li></ul>
<p style="margin:0cm 0cm 10pt" class="MsoNormal"><span lang="EN-US"><font face="Arial"><font color="#000000"><font size="2">The order of the above actions is important. </font></font></font></span></p>
<p style="margin:0cm 0cm 10pt" class="MsoNormal"><span lang="EN-US"><font color="#000000" size="2" face="Arial">This matching method was compared with six more sophisticated metrics used to find duplicates (<a href="http://en.wikipedia.org/wiki/Jaro-Winkler_distance">Jaro-Winkler</a></font><font color="#000000" size="2" face="Arial">, </font><font color="#000000" size="2" face="Arial"><a href="http://en.wikipedia.org/wiki/Jaro-Winkler_distance">Jaro</a></font><font color="#000000" size="2" face="Arial">, <a href="http://en.wikipedia.org/wiki/Levenshtein_distance">Levenstein</a></font><font color="#000000" size="2" face="Arial">, Monge-Elkan, <a href="http://en.wikipedia.org/wiki/Needleman-Wunsch_algorithm">Needleman-Wunch</a></font><font color="#000000" size="2" face="Arial">, <a href="http://en.wikipedia.org/wiki/Smith-Waterman_algorithm">Smith-Waterman-Gotoh</a></font><font face="Arial"><font color="#000000"><font size="2">) on the migrated business data. In 95% percent of cases it gave the same or better matches as any other method, and the results, even wrong, were much more obvious for the users. The failures of this method normally had words in different order, like “University of Antwerpen” vs. “Antwerpen University”.</font></font></font></span></p>
<p style="margin:0cm 0cm 10pt" class="MsoNormal"><span lang="EN-US"><font color="#000000" size="2" face="Arial">A <a href="http://www.orbitone.com/en/blog/archive/2009/09/08/improved-duplicate-detection-in-dynamics-crm.aspx">match name plugin</a></font><font color="#000000" size="2" face="Arial"> used for duplicate detection can be found on </font><a href="http://mscrmplugins.codeplex.com/">Codeplex</a><font face="Arial"><font color="#000000"><font size="2">. </font></font></font></span></p>
<h2 style="margin:10pt 0cm 0pt"><span lang="EN-US"><font face="Arial"><font color="#000000"><font size="2">International challenges</font></font></font></span></h2>
<p style="margin:0cm 0cm 10pt" class="MsoNormal"><span lang="EN-US"><font face="Arial"><font color="#000000"><font size="2">Control that the data prepared to import comply with your language and regional settings: </font></font></font></span></p>
<ul>
<li>
<div style="margin:0cm 0cm 10pt" class="MsoNormal"><span lang="EN-US"></span><span lang="EN-US"><font face="Arial"><font color="#000000"><font size="2">date formats: dd-MM-yyyy vs. MM-dd-yyyy. </font></font></font></span></div></li></ul>
<p style="margin:0cm 0cm 10pt" class="MsoNormal"><span lang="EN-US"><font face="Arial"><font color="#000000"><font size="2">For specific types of values in activity records third party migration tools accept only dates in English (US) format. This can make problems if in client's system the regional settings of Windows or CRM are different. If it happens, change system and CRM data formats to English US, and convert all dates in input data to this format. </font></font></font></span></p>
<ul>
<li>
<div style="margin:0cm 0cm 10pt" class="MsoNormal"><span lang="EN-US"></span><font face="Arial"><font color="#000000"><font size="2"><span lang="EN-US">letters with diacritics and non-Latin letters. </span></font></font></font></div></li></ul>
<p style="margin:0cm 0cm 10pt" class="MsoNormal"><font face="Arial"><font color="#000000"><font size="2"><span lang="EN-US"></span></font></font></font><span lang="EN-US"><font face="Arial"><font color="#000000"><font size="2">Control how your migration tool treats these characters. </font></font></font></span><span lang="EN-US"><font face="Arial"><font color="#000000"><font size="2">If you use bulk update tools, verify that their input data have Unicode format. </font></font></font></span></p>
<ul>
<li>
<div style="margin:0cm 0cm 10pt" class="MsoNormal"><span lang="EN-US"></span><font face="Arial"><font color="#000000"><font size="2"><span lang="EN-US">use of languages and geographical names. </span></font></font></font></div></li></ul>
<p style="margin:0cm 0cm 10pt" class="MsoNormal"><font face="Arial"><font color="#000000"><font size="2"><span lang="EN-US"></span></font></font></font><span lang="EN-US"><font color="#000000" size="2" face="Arial">In principle each record has to be in the language you want to communicate to the customer. But this makes use names of multilingual countries (like Switzerland or Belgium) inconsistent. As a result, validation scripts for country specific formats (like ones for telephone numbers) become more difficult. Instead, you can normalize country names to standard English names. Keep in mind that even if you use <a href="http://en.wikipedia.org/wiki/ISO_3166-1">ISO standard</a></font></span><span lang="EN-US"><font face="Arial"><font color="#000000"><font size="2">, it’s not always a perfect reference. Say, the name “Taiwan, Province of China” advised by ISO 3166-1 is an insult for Taiwanese people. </font></font></font></span></p>
<h2 style="margin:10pt 0cm 0pt"><span lang="EN-US"><font face="Arial"><font color="#000000"><font size="2">Dynamics CRM Import. </font></font></font></span></h2>
<p style="line-height:normal;margin:0cm 0cm 0pt" class="MsoNormal"><font face="Arial"><font color="#000000"><font size="2"><i><span style="color:black" lang="EN-US">If speech synthesis is comparable with getting toothpaste out of a tube, speech recognition is like trying to get the toothpaste back in. (</span></i><span lang="EN-US">Dr. J. Holmes, expert in speech processing)</span></font></font></font></p>
<p style="line-height:normal;margin:0cm 0cm 0pt" class="MsoNormal"><span lang="EN-US"><font face="Arial"><font color="#000000"><font size="2"></font></font></font></span> </p>
<p style="line-height:normal;margin:0cm 0cm 0pt" class="MsoNormal"><span lang="EN-US"><font face="Arial"><font color="#000000"><font size="2">The same is absolutely valid for Dynamics CRM export  and import. </font></font></font></span></p>
<p style="line-height:normal;margin:0cm 0cm 0pt" class="MsoNormal"><span lang="EN-US"><font face="Arial"><font color="#000000"><font size="2"></font></font></font></span> </p>
<p style="line-height:normal;margin:0cm 0cm 0pt" class="MsoNormal"><span lang="EN-US"><font face="Arial"><font color="#000000"><font size="2">Nevertheless, out-of-the-box import can be used to upload contacts from Outlook contact lists exported to Excel. Users can import the data to the CRM by building a data map between the data table in CSV format and the CRM entity attributes, and then by running an import job. Of course, you have to control that</font></font></font></span></p>
<ul>
<li>
<div style="line-height:normal;margin:0cm 0cm 0pt" class="MsoNormal"><span lang="EN-US"><font face="Arial"><font color="#000000"><font size="2">all records being imported have all business required values;</font></font></font></span></div></li>
<li>
<div style="line-height:normal;margin:0cm 0cm 0pt" class="MsoNormal"><span lang="EN-US"><font face="Arial"><font color="#000000"><font size="2">there are no duplicate records within the import list and between the import list and the CRM (active and inactive);</font></font></font></span></div></li>
<li>
<div style="line-height:normal;margin:0cm 0cm 0pt" class="MsoNormal"><span lang="EN-US"><font face="Arial"><font color="#000000"><font size="2">the CSV files have to be really COMMA-separated, since other characters (tab or semicolon) are not accepted in sample files used in manual mapping. </font></font></font></span></div></li></ul>
<p style="line-height:normal;margin:0cm 0cm 0pt" class="MsoNormal"><span lang="EN-US"><font face="Arial"><font color="#000000"><font size="2"></font></font></font></span> </p>
<p style="line-height:normal;margin:0cm 0cm 0pt" class="MsoNormal"><span lang="EN-US"><font face="Arial"><font color="#000000"><font size="2">And even after it the import will not help with lookup and picklist attributes, because the export has their values, while the import requires their ID's (GUID's for lookup values, and numeric ID's for picklist values). </font></font></font></span></p>
<p style="line-height:normal;margin:0cm 0cm 0pt" class="MsoNormal"><span lang="EN-US"><font face="Arial"><font color="#000000"><font size="2"></font></font></font></span> </p>
<p style="line-height:normal;margin:0cm 0cm 0pt" class="MsoNormal"><span lang="EN-US"><font color="#000000" size="2" face="Arial">There is still a way to <a href="http://blog.sonomapartners.com/2008/03/using-the-nativ.html">import the entities with lookup and picklist attributes</a>. (thanks to CRM guru Jim Steiger</font><font face="Arial"><font color="#000000"><font size="2">) Be careful when following it, since any deviation will stop the process. </font></font></font></span></p>
<p style="line-height:normal;margin:0cm 0cm 0pt" class="MsoNormal"><span lang="EN-US"><font face="Arial"><font color="#000000"><font size="2"></font></font></font></span> </p>
<p style="line-height:normal;margin:0cm 0cm 0pt" class="MsoNormal"><span lang="EN-US"><font face="Arial"><font color="#000000" size="2"><strong>Good log</strong></font></font></span></p>
<p style="margin:0cm 0cm 10pt" class="MsoNormal"><span lang="EN-US"><font face="Arial"><font color="#000000"><font size="2">If you run scripts which change users’ data (for example, normalizes telephone numbers), foresee that the script informs your customers about:</font></font></font></span></p>
<ul>
<li>
<div style="margin:0cm 0cm 10pt" class="MsoNormal"><span lang="EN-US"></span><font face="Arial"><font color="#000000"><font size="2"><span lang="EN-US">all changes done in the system (so that the customer can handle all information he may miss after the cleanup, like the six more phone numbers, or a comment in the same field) </span></font></font></font></div></li></ul>
<p style="text-indent:-18pt;margin:0cm 0cm 0pt 72pt" class="MsoListParagraphCxSpMiddle"><font face="Arial"><font color="#000000"><font size="2"><span lang="EN-US"><span>o<span style="line-height:normal;font-variant:normal;font-style:normal;font-weight:normal">   </span></span></span><span lang="EN-US">what type of record</span></font></font></font></p>
<p style="text-indent:-18pt;margin:0cm 0cm 0pt 72pt" class="MsoListParagraphCxSpMiddle"><font face="Arial"><font color="#000000"><font size="2"><span lang="EN-US"><span>o<span style="line-height:normal;font-variant:normal;font-style:normal;font-weight:normal">   </span></span></span><span lang="EN-US">what record</span></font></font></font></p>
<p style="text-indent:-18pt;margin:0cm 0cm 0pt 72pt" class="MsoListParagraphCxSpMiddle"><font face="Arial"><font color="#000000"><font size="2"><span lang="EN-US"><span>o<span style="line-height:normal;font-variant:normal;font-style:normal;font-weight:normal">   </span></span></span><span lang="EN-US">old value</span></font></font></font></p>
<p style="text-indent:-18pt;margin:0cm 0cm 0pt 72pt" class="MsoListParagraphCxSpMiddle"><font face="Arial"><font color="#000000"><font size="2"><span lang="EN-US"><span>o<span style="line-height:normal;font-variant:normal;font-style:normal;font-weight:normal">   </span></span></span><span lang="EN-US">new value</span></font></font></font></p>
<ul>
<li>
<div style="text-indent:-18pt;margin:0cm 0cm 0pt 36pt" class="MsoListParagraphCxSpMiddle"><font face="Arial"><font color="#000000"><font size="2"><span lang="EN-US">all suspicious data in fields which are left unchanged, </span></font></font></font></div></li>
<li>
<div style="text-indent:-18pt;margin:0cm 0cm 0pt 36pt" class="MsoListParagraphCxSpMiddle"><font face="Arial"><font color="#000000"><font size="2"><span lang="EN-US">all errors happened during processing, with specific error messages,</span></font></font></font></div></li>
<li>
<div style="text-indent:-18pt;margin:0cm 0cm 10pt 36pt" class="MsoListParagraphCxSpLast"><font face="Arial"><font color="#000000"><font size="2"><span lang="EN-US">nothing else (like changing assignment of the old value back to the field).</span></font></font></font></div></li></ul>
<p style="margin:0cm 0cm 10pt" class="MsoNormal"><span lang="EN-US"><font face="Arial"><font color="#000000"><font size="2">Since log may get long, foresee easy conversion of the log to spreadsheet or database, which will help to filter by specific type of issue, group records by owner, etc.</font></font></font></span></p>
<h2 style="margin:10pt 0cm 0pt"><span lang="EN-US"><font face="Arial"><font color="#000000"><font size="2">Good luck!</font></font></font></span></h2></div></div>]]></description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Viktor Bardadym</dc:creator><pubDate>Mon, 28 Sep 2009 17:05:00 GMT</pubDate><category domain="http://www.orbitone.com/en/blog/archive/tags/CRM 4.0/default.aspx">CRM 4.0</category></item><item><title>Creating custom commands for the Composite Application library(Prism v2)</title><link>http://www.orbitone.com/en/blog/archive/2009/09/25/creating-custom-commands-for-the-composite-application-libraryprism-v2-1.aspx</link><guid>/en/blog/archive/2009/09/25/creating-custom-commands-for-the-composite-application-libraryprism-v2-1.aspx</guid><description><![CDATA[<div class="ExternalClassECDDABB8CDD44A2C99833A55EFCAA8C4"><p>The <a href="http://msdn.microsoft.com/en-us/library/dd458809.aspx" target="_blank">Composite Application Library</a> helps architects and developers create composite Windows Presentation Foundation (WPF) and Silverlight applications. Composite applications are composed of discrete, functionally complete, pieces that work together to create a single, integrated user interface. The Composite Application Library accelerates the development of composite applications using proven design patterns to help you build these types of applications. </p>  <p>Commands are a way to handle user interface (UI) actions. They are a loosely coupled way to bind the UI to the logic that performs the action. </p>  <p>When building composite applications, presentation design patterns such as Model-View-Presenter (MVP) and Model-View-Controller (MVC) are often used to separate the UI logic from the UI layout and presentation. When implementing these patterns with Windows Presentation Foundation (WPF), the presenter or controller handles commands but lives outside the <a href="http://msdn.microsoft.com/en-us/library/ms753391.aspx">logical tree</a>. WPF-routed commands deliver command messages through UI elements in the tree, but the elements outside the tree will not receive these messages because they only propagate events up or down from the focused element or an explicitly stated target element. Additionally, the WPF-routed commands require a command handler in the code behind.</p>  <p>The Composite Application Library introduces two new commands that can be routed outside the boundaries of the logical tree and that do not require handling logic in the code behind. The commands are custom implementations of the <b>ICommand</b> interface defined by WPF, and they implement their own routing mechanism to get the command messages delivered to objects outside of the logical tree. The commands in the Composite Application Library include <strong><a href="http://msdn.microsoft.com/en-us/library/cc707894.aspx" target="_blank">DelegateCommand</a></strong> and <b>CompositeCommand</b>.</p>  <p>The command support in WPF is at this moment rather limited. Very few of the default controls support binding to a command. One of the controls that has a Command dependency property is the <strong>Button</strong>. </p>  <div id="codeSnippetWrapper" class="csharpcode-wrapper">   <br></div>  <p>If we want to execute some code on button press and we want to leverage the commanding support, we need a few things in the view model and in the XAML view:</p>  <p>1. a property for the command</p>  <div id="codeSnippetWrapper" class="csharpcode-wrapper">   <div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:96.81%;padding-right:4px;font-family:'Courier New', courier, monospace;direction:ltr;height:38px;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px" id="codeSnippetWrapper">     <pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px" id="codeSnippet"><span style="color:#0000ff">public</span> ICommand ClickCommand {get; set;} <br></pre>

    <br></div>
</div>

<p>2. Initialization code for the command (eventually in the view model’s constructor)</p>

<div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:'Courier New', courier, monospace;direction:ltr;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px" id="codeSnippetWrapper">
  <pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100.14%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;height:70px;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px" id="codeSnippet"><span style="color:#0000ff">public</span> MyConstructor()<br>{<br>  ClickCommand = <span style="color:#0000ff">new</span> DelegateCommand&lt;<span style="color:#0000ff">object</span>&gt;(OnClickCommand);<br>}<br></pre>

  <br></div>

<p>3. Command handler:</p>

<div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:'Courier New', courier, monospace;direction:ltr;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px" id="codeSnippetWrapper">
  <pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px" id="codeSnippet"><span style="color:#0000ff">private</span> <span style="color:#0000ff">void</span> OnClickCommand(<span style="color:#0000ff">object</span> argument)<br>{  <span style="color:#008000">/**/</span> }<br></pre>

  <br></div>

<p>4. and some XAML code in the view that guarantees the command will be executed on button click:</p>

<div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:'Courier New', courier, monospace;direction:ltr;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px" id="codeSnippetWrapper">
  <pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px" id="codeSnippet"><span style="color:#0000ff">&lt;</span><span style="color:#800000">Button</span> <span style="color:#ff0000">Height</span><span style="color:#0000ff">=&quot;24&quot;</span> <span style="color:#ff0000">x:Name</span><span style="color:#0000ff">=&quot;MyButton&quot;</span>  <br>        <span style="color:#ff0000">Command</span>=”{<span style="color:#ff0000">Binding</span> <span style="color:#ff0000">ClickCommand</span>}”<span style="color:#0000ff">/&gt;</span><br></pre>

  <br></div>

<p>This is straightforward if you are familiar with the M-V-VM pattern.</p>

<p>Let’s consider another scenario where we need to execute a command for the lost focus event of a TextBox. To be able to solve this in the same manner as above we would need to use the Command dependency property of the TextBox and bind a DelegateCommand to it. </p>

<p>Unfortunately, the TextBox does not accept commands by default for the lost focus event.</p>

<p>A solution to the problem is to use the <a href="http://msdn.microsoft.com/en-us/library/ms749011.aspx" target="_blank">attached properties</a> feature of WPF.</p>

<p>The goal is to create an attached property for the TextBox. The attached property’s name will also be <strong>Command</strong> and the command bound to it will handle the PreviewLostKeyboardFocus event. After we have this, we will be able to write the following code in the XAML view:</p>

<div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:'Courier New', courier, monospace;direction:ltr;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px" id="codeSnippetWrapper">
  <pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px" id="codeSnippet"><span style="color:#0000ff">&lt;</span><span style="color:#800000">UserControl</span> <span style="color:#ff0000">xmlns:Commands</span>= <span style="color:#0000ff">&quot;clr-namespace:{namespace containing the attached command class}&quot;</span><span style="color:#0000ff">&gt;</span><br>   <span style="color:#0000ff">&lt;</span><span style="color:#800000">TextBox</span> <span style="color:#ff0000">Commands:PreviewLostKeyboardFocus</span>.<span style="color:#ff0000">Command</span><span style="color:#0000ff">=&quot;{Binding MyTextBoxPreviewLostKeyboardFocus}&quot;</span><span style="color:#0000ff">/&gt;</span><br><span style="color:#0000ff">&lt;/</span><span style="color:#800000">UserControl</span><span style="color:#0000ff">&gt;</span></pre>

  <br></div>

<p>The code in the view model is identical as for the Button scenario (but with suggestive variable and method names of course):</p>

<div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:'Courier New', courier, monospace;direction:ltr;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px" id="codeSnippetWrapper">
  <pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px" id="codeSnippet"><span style="color:#0000ff">public</span> ICommand LostFocusCommand {get; set;}<br><span style="color:#0000ff">public</span> MyConstructor() <br>{<br>   ClickCommand = <span style="color:#0000ff">new</span> DelegateCommand&lt;<span style="color:#0000ff">object</span>&gt;(OnLostFocusCommand); <br>} <br><span style="color:#0000ff">private</span> <span style="color:#0000ff">void</span> OnLostFocusCommand(<span style="color:#0000ff">object</span> argument)<br>{  …  } </pre>

  <br></div>

<pre class="csharpcode"><span class="kwrd"></span><strong>Now let’s dive into the implementation of the attached CommandProperty.</strong></pre>

<div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:'Courier New', courier, monospace;direction:ltr;height:800px;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px" id="codeSnippetWrapper">
  <pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px" id="codeSnippet"><span style="color:#0000ff">public</span> <span style="color:#0000ff">class</span> PreviewLostKeyboardFocus<br>    {<br>        <span style="color:#008000">/*Dependency property for the Command attached property. </span><br><span style="color:#008000">         For the Command property to be bindable it has to be dependency property.*/</span><br>        <span style="color:#0000ff">public</span> <span style="color:#0000ff">static</span> <span style="color:#0000ff">readonly</span> DependencyProperty CommandProperty = DependencyProperty.RegisterAttached(<br>                <span style="color:#006080">&quot;Command&quot;</span>,<br>                <span style="color:#0000ff">typeof</span> (ICommand),<br>                <span style="color:#0000ff">typeof</span> (PreviewLostKeyboardFocus),<br>                <span style="color:#0000ff">new</span> PropertyMetadata(OnSetCommandCallback));<br><br>        <span style="color:#0000ff">public</span> <span style="color:#0000ff">static</span> <span style="color:#0000ff">readonly</span> DependencyProperty LostFocusCommandBehaviorProperty =<br>                DependencyProperty.RegisterAttached(<span style="color:#006080">&quot;LostFocusCommandBehavior&quot;</span>,<br>                                                    <span style="color:#0000ff">typeof</span> (TextBoxLostFocusCommandBehavior),<br>                                                    <span style="color:#0000ff">typeof</span> (PreviewLostKeyboardFocus),<br>                                                    <span style="color:#0000ff">null</span>);<br><br>        <span style="color:#008000">/*Acessor methods for the Command attached property*/</span><br>        <span style="color:#0000ff">public</span> <span style="color:#0000ff">static</span> <span style="color:#0000ff">void</span> SetCommand(TextBox textBox, ICommand command)<br>        {<br>            textBox.SetValue(CommandProperty, command);<br>        }<br><br>        <span style="color:#0000ff">public</span> <span style="color:#0000ff">static</span> ICommand GetCommand(TextBox textBox)<br>        {<br>            <span style="color:#0000ff">return</span> textBox.GetValue(CommandProperty) <span style="color:#0000ff">as</span> ICommand;<br>        }<br>       <br>        <span style="color:#008000">/*Callback executed when the Command property  is databound*/</span><br>        <span style="color:#0000ff">private</span> <span style="color:#0000ff">static</span> <span style="color:#0000ff">void</span> OnSetCommandCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)<br>        {<br>            var textBox = d <span style="color:#0000ff">as</span> TextBox;<br>            <span style="color:#0000ff">if</span> (textBox != <span style="color:#0000ff">null</span>)<br>            {<br>                TextBoxLostFocusCommandBehavior behavior = GetOrCreateBehavior(textBox,  e.NewValue <span style="color:#0000ff">as</span> ICommand);<br>            }<br>        }<br><br>        <span style="color:#008000">/*Creates the command behavior if it does not already exist*/</span><br>        <span style="color:#0000ff">private</span> <span style="color:#0000ff">static</span> TextBoxLostFocusCommandBehavior GetOrCreateBehavior(TextBox textBox, ICommand command)<br>        {<br>            var behavior = textBox.GetValue(LostFocusCommandBehaviorProperty) <span style="color:#0000ff">as</span> TextBoxLostFocusCommandBehavior;<br>            <span style="color:#0000ff">if</span> (behavior == <span style="color:#0000ff">null</span>)<br>            {<br>                behavior = <span style="color:#0000ff">new</span> TextBoxLostFocusCommandBehavior(textBox, command);<br>                textBox.SetValue(LostFocusCommandBehaviorProperty, behavior);<br>            }<br>            <span style="color:#0000ff">return</span> behavior;<br>        }<br><br>        <span style="color:#cc6633">#region</span> Nested type: TextBoxLostFocusCommandBehavior<br><br>        <span style="color:#008000">/*Wrapper for the PreviewLostKeyboardFocus  event*/</span><br>        <span style="color:#0000ff">public</span> <span style="color:#0000ff">class</span> TextBoxLostFocusCommandBehavior : CommandBehaviorBase&lt;TextBox&gt;<br>        {<br>            <span style="color:#0000ff">public</span> TextBoxLostFocusCommandBehavior(TextBox textBox, ICommand command) : <span style="color:#0000ff">base</span>(textBox)<br>            {<br>                Command = command;<br>                textBox.PreviewLostKeyboardFocus += (sender, args) =&gt; Command.Execute(<span style="color:#0000ff">new</span> PreviewLostKeyboardFocusCommandArgs<br>                                                                                          {<br>                                                                                                  Sender = (TextBox) sender,<br>                                                                                                  KeyboardFocusChangedEventArgs = args<br>                                                                                          }); <br>            }<br>        }<br><br>        <span style="color:#cc6633">#endregion</span><br>    }</pre>

  <br></div>

<p>As it’s obvious from the event wrapper class, the event forwards the sender and the event arguments to the command. So the command’s handler has access to the same data as the event itself. the <em>P<span class="kwrd"></span>r<span class="kwrd"></span>e<span class="kwrd"></span>v<span class="kwrd"></span>i<span class="kwrd"></span>e<span class="kwrd"></span>w<span class="kwrd"></span>L<span class="kwrd"></span>o<span class="kwrd"></span>s<span class="kwrd"></span>t<span class="kwrd"></span>K<span class="kwrd"></span>e<span class="kwrd"></span>y<span class="kwrd"></span>b<span class="kwrd"></span>o<span class="kwrd"></span>a<span class="kwrd"></span>r<span class="kwrd"></span>d<span class="kwrd"></span>F<span class="kwrd"></span>o<span class="kwrd"></span>c<span class="kwrd"></span>u<span class="kwrd"></span>s<span class="kwrd"></span>C<span class="kwrd"></span>o<span class="kwrd"></span>m<span class="kwrd"></span>m<span class="kwrd"></span>a<span class="kwrd"></span>n<span class="kwrd"></span>d<span class="kwrd"></span>A<span class="kwrd"></span>r<span class="kwrd"></span>g<span class="kwrd"></span>s</em>  class is a custom class used to transfer parameters:</p>

<div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:'Courier New', courier, monospace;direction:ltr;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px" id="codeSnippetWrapper">
  <pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px" id="codeSnippet"><span style="color:#0000ff">public</span> <span style="color:#0000ff">class</span> PreviewLostKeyboardFocusCommandArgs<br>{<br>    <span style="color:#0000ff">public</span> TextBox Sender { get; set; }<br>    <span style="color:#0000ff">public</span> KeyboardFocusChangedEventArgs KeyboardFocusChangedEventArgs { get; set; }} </pre>

  <br></div>

<p>The P<span class="kwrd"></span>r<span class="kwrd"></span>e<span class="kwrd"></span>v<span class="kwrd"></span>i<span class="kwrd"></span>e<span class="kwrd"></span>w<span class="kwrd"></span>L<span class="kwrd"></span>o<span class="kwrd"></span>s<span class="kwrd"></span>t<span class="kwrd"></span>K<span class="kwrd"></span>e<span class="kwrd"></span>y<span class="kwrd"></span>b<span class="kwrd"></span>o<span class="kwrd"></span>a<span class="kwrd"></span>r<span class="kwrd"></span>d<span class="kwrd"></span>F<span class="kwrd"></span>o<span class="kwrd"></span>c<span class="kwrd"></span>u<span class="kwrd"></span>s class might seem quite verbose, but this is the standard WPF way of defining attached properties that can take part in the data binding binding process.</p>

<p>Most of the code is standard and can be extracted in a R# template. The template can be downloaded <a href="http://www.orbitone.com/en/blog/documents/attachedCommand.zip" target="_blank">here</a>. </p>

<p>That’s it! </p>

<p>With just a little coding effort we can have a clean view and be able to wrap WPF event in Commands and handle the view events in the view model or controller(depending of the design approach). </p></div>]]></description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Voicu Matei</dc:creator><pubDate>Fri, 25 Sep 2009 13:54:37 GMT</pubDate></item><item><title>Format and validate phonenumbers in Dynamics CRM 4.0 Plugin</title><link>http://www.orbitone.com/en/blog/archive/2009/09/21/format-and-validate-phonenumbers-in-dynamics-crm-4-0-plugin.aspx</link><guid>/en/blog/archive/2009/09/21/format-and-validate-phonenumbers-in-dynamics-crm-4-0-plugin.aspx</guid><description><![CDATA[<div class="ExternalClass20689B475E0C4C7C9E88651270C017EF"><p>When importing data in Dynamics CRM 4.0 there is no client side code triggered, so to make sure you get phonenumbers (or anything else for that matter) in a clean format, you might want to consider creating a plugin that runs server side and generates an import failure to let the customer know some data is not valid in his imports.</p>  <p>This way the user knows when something went wrong and the correct data will still be imported. </p>  <p>To make this plugin work there is the issue of the country prefixes and areacodes that exist. Therefore it is necessary to create two new entities: Country and AreaCode.</p>  <p>The Country entity needs to contains the telephone prefix of that country (eg: belgium = 32, Netherlands = 33 …)</p>  <p>The AreaCode is contains a link to the country entity and contains the phone areacode. (eg: 9 for Ghent, Belgium …)</p>  <p>Ones this data is in CRM we can use it in our plugin through the webservice. </p>  <p>In the end the phonenumbers will be formatted in an outlook compatible format. </p>  <p>eg: +32 (9) 265.74.20</p>  <p>When using the installer inside the project on CodePlex the plugin will be registered for the create and update messages for lead, account and contact.</p>  <p> </p>  <p>You can find the plugin on CodePlex in our <a href="http://mscrmplugins.codeplex.com/" target="_blank">Dynamics CRM 4.0 Plugins</a> project</p></div>]]></description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Wim De Coninck</dc:creator><pubDate>Mon, 21 Sep 2009 14:50:00 GMT</pubDate><category domain="http://www.orbitone.com/en/blog/archive/tags/CRM 4.0/default.aspx">CRM 4.0</category><category domain="http://www.orbitone.com/en/blog/archive/tags/.NET/default.aspx">.NET</category></item><item><title>Improved Duplicate Detection in Dynamics CRM</title><link>http://www.orbitone.com/en/blog/archive/2009/09/08/improved-duplicate-detection-in-dynamics-crm.aspx</link><guid>/en/blog/archive/2009/09/08/improved-duplicate-detection-in-dynamics-crm.aspx</guid><description><![CDATA[<div class="ExternalClass8DC1031557B14BD99C71AC1D60AC9DCD"><h3>Why do I need it?</h3>  <p>We've noticed the CRM Duplicate detection doesn't allow for much creativity, you can only create Duplicate Detection Rules with the following condition: </p>  <ul>   <li>full string match </li>    <li>begins with (number of characters) </li>    <li>ends with (number of characters) </li> </ul>  <p>   <br>The problem with this is that people or companies aren't always entered in the same format. For instance if you look at our company name we would create the account with the name &quot;Orbit One&quot;. Other people might write &quot;Orbit One BVBA&quot; (the bvba part is a <a href="http://en.wikipedia.org/wiki/Types_of_business_entity">type of business entity</a>)     <br>There are some other examples that come to mind:     <br>&quot;Dell NV&quot; vs &quot;Dell&quot;     <br>&quot;HP Belgium&quot; vs &quot;HP&quot;     <br>&quot;Gaëtan&quot; vs &quot;Gaetan&quot;     <br>&quot;François&quot; vs &quot;Francois&quot;     <br>These exceptions will never be caught by the default CRM Duplicate detection.</p>  <h3>How can I fix this?</h3>  <p>We added the following attributes and filled the with data: </p>  <ul>   <li>on account =&gt; new_matchname (contains the accounts name) </li>    <li>on contact =&gt; new_matchname (contains the contacts first + lastname) </li>    <li>on lead =&gt; new_matchcontact (contains the leads first+ lastname) </li>    <li>on lead =&gt; new_matchcompany (contains the lead company name) </li> </ul>  <p>The fields are filled with a normalized name. The process is: </p>  <ul>   <li>to lower case and trim. </li>    <li>replace special characters (except parenthesis, a-z, 0-9, special characters like éèàç ..., and spaces) with empty string. </li>    <li>remove everything between the parentheses eg: &quot;HP (was Compaq)&quot; becomes &quot;HP&quot; </li>    <li>remove suffixes and prefixes that are <a href="http://en.wikipedia.org/wiki/Types_of_business_entity">type of business entity</a> </li>    <li>remove all spaces </li>    <li>replace special characters (eg: é &gt; e, à =&gt; a, ç =&gt; c, ñ =&gt; n, ...) </li> </ul>  <p>Next there need to be some new duplicate detection rules. </p>  <ul>   <li>full string match on new_matchname for contact </li>    <li>full string match on new_matchname for account </li>    <li>full string match on new_matchcontact for lead (add companyname if needed in your specific cases) </li> </ul>  <p>The current implemented <a href="http://en.wikipedia.org/wiki/Types_of_business_entity">type of business entity</a> which will be stripped are: </p>  <ul>   <li>nv </li>    <li>sa </li>    <li>vzw </li>    <li>bvba </li>    <li>cvba </li>    <li>sarl </li>    <li>sprl </li>    <li>scrl </li>    <li>nvsa </li>    <li>bv </li>    <li>llc </li>    <li>gmbh </li>    <li>ltd </li>    <li>ag </li>    <li>kt </li>    <li>og </li>    <li>vof </li>    <li>cvoa </li>    <li>commva </li>    <li>commv </li>    <li>ebvba </li>    <li>ez </li>    <li>belgium </li> </ul>  <h3>Duplicate Detection Jobs</h3>  <p>In CRM you can add duplicate detection jobs by going to Settings &gt; Data Management &gt; Duplicate detection jobs</p> <a href="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/29/image_2_63C3EBA0.png"><img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px" title="image" border="0" alt="image" src="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/29/image_thumb_63C3EBA0.png" width="459" height="227"></a>   <p>Create a new Duplicate detection job for for instance accounts. Make sure you filter on only active records. When you merge a duplicate record the record that isn’t the master record will be placed on inactive. So if you forget this filter you’ll keep getting the same duplicates ;-)</p>  <p>Once the job ran, you can see the duplicates entries.</p>  <p><a href="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/29/image_4_63C3EBA0.png"><img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px" title="image" border="0" alt="image" src="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/29/image_thumb_1_63C3EBA0.png" width="609" height="379"></a> </p>  <p>What we think is another major pain in the a$$ is that you can only merge 2 records at a time. So not really in bulk… Maybe we will come up with a solution for this later :-)</p>  <p> </p>  <p>You can find the <a href="http://mscrmplugins.codeplex.com" target="_blank">Matchname plugin on CodePlex</a>. There is an installer include so that you don’t need to worry about the plugin registration, creating the steps, …. More on this on CodePlex.</p></div>]]></description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Wim De Coninck</dc:creator><pubDate>Tue, 08 Sep 2009 17:32:00 GMT</pubDate><category domain="http://www.orbitone.com/en/blog/archive/tags/CRM 4.0/default.aspx">CRM 4.0</category><category domain="http://www.orbitone.com/en/blog/archive/tags/.NET/default.aspx">.NET</category></item><item><title>Windows 7 RC Image Deployment</title><link>http://www.orbitone.com/en/blog/archive/2009/06/18/windows-7-rc-image-deployment.aspx</link><guid>/en/blog/archive/2009/06/18/windows-7-rc-image-deployment.aspx</guid><description><![CDATA[<div class="ExternalClassA2D16ADD7F0E44A2953EB2A3D26181DF">
<div class="ExternalClass41632E3E457B48DA835E6C4EB588C9FD"><img style="width:157px;height:148px" height="228" alt="" src="http://www.orbitone.com/en/blog/Lists/Photos/_w/windows_7_logo_jpg.jpg" width="206"></div>
<div class="ExternalClass41632E3E457B48DA835E6C4EB588C9FD"><span lang="EN-GB" style="font-size:22pt;line-height:150%;font-family:'HelveticaNeueLT Std Med Cn','sans-serif'">Windows 7 RC Image Deployment</span></div>
<div class="ExternalClass41632E3E457B48DA835E6C4EB588C9FD"><span lang="EN-GB" style="font-size:22pt;line-height:150%;font-family:'HelveticaNeueLT Std Med Cn','sans-serif'"></span> </div>
<p class="MsoNormal" style="margin:0cm 0cm 6pt"><span lang="EN-GB" style="line-height:150%"><font size="2">The document attached to this blog provides instructions for implementing a basic image-based deployment of Microsoft Windows 7 RC0 operating system.</font></span></p>
<p class="MsoNormal" style="margin:0cm 0cm 6pt"><span lang="EN-GB" style="line-height:150%"><font size="2">Migrating an operating system is a major project that requires careful planning and guidance. To ease the process, Microsoft has provided a number of tools for automating Windows 7 deployments including the Windows Automated Installation Kit (WAIK). For Windows 7 Microsoft has released the Beta version of WAIK version 2.0. </font></span></p>
<p class="MsoNormal" style="margin:0cm 0cm 6pt"><span lang="EN-GB" style="line-height:150%"><font size="2">There are many guides available on the internet, but we felt they all miss some steps. Therefore we decided to share our internal documentation.</font></span></p>
<p class="MsoNormal" style="margin:0cm 0cm 6pt"><span lang="EN-GB" style="line-height:150%"><font size="2">The process for our deployment scenario includes</font></span></p>
<div class="ExternalClass41632E3E457B48DA835E6C4EB588C9FD">
<ul>
<li>
<div class="MsoNormal" style="margin:0cm 0cm 6pt"><span lang="EN-GB" style="line-height:150%"></span><span lang="EN-GB" style="line-height:150%"><font size="2">Prepare an USB stick with &quot;Windows PE&quot;</font></span></div></li>
<li>
<div class="MsoNormal" style="margin:0cm 0cm 6pt"><span lang="EN-GB" style="line-height:150%"><font size="2">Prepare a master installation</font></span></div></li>
<li>
<div class="MsoNormal" style="margin:0cm 0cm 6pt"><span lang="EN-GB" style="line-height:150%"><font size="2">Capture an install image</font></span></div></li>
<li>
<div class="MsoNormal" style="margin:0cm 0cm 6pt"><span lang="EN-GB" style="line-height:150%"><font size="2">Manually deploy an image on a single machine with ImageX</font></span></div></li></ul></div>
<p class="MsoNormal" style="margin:0cm 0cm 6pt"><span lang="EN-GB" style="line-height:150%"></span><span lang="EN-GB" style="line-height:150%"><font size="2">The document attached does not cover automated deployment of images on multiple computers using tools as ADS.</font></span></p>
<p class="MsoNormal" style="margin:0cm 0cm 6pt"><span lang="EN-GB" style="line-height:150%"> <a href="http://www.orbitone.com/en/blog/documents/Windows%207%20Deployment.pdf">Download documentation</a></span></p>
<p class="MsoNormal" style="margin:0cm 0cm 6pt"><span lang="EN-GB" style="line-height:150%"></span> </p>
<div><span lang="EN-GB" style="font-size:22pt;line-height:150%;font-family:'HelveticaNeueLT Std Med Cn','sans-serif'"></span> </div>
<div><span lang="EN-GB" style="font-size:22pt;line-height:150%;font-family:'HelveticaNeueLT Std Med Cn','sans-serif'"></span> </div>
<div> </div>
<div> </div></div>]]></description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Arne Verstraete</dc:creator><pubDate>Tue, 08 Sep 2009 13:23:00 GMT</pubDate><category domain="http://www.orbitone.com/en/blog/archive/tags/Windows 7/default.aspx">Windows 7</category></item><item><title>Synchronizing activities from Dynamics CRM 4.0 to Outlook</title><link>http://www.orbitone.com/en/blog/archive/2009/09/08/synchronizing-activities-from-dynamics-crm-4-0-to-outlook.aspx</link><guid>/en/blog/archive/2009/09/08/synchronizing-activities-from-dynamics-crm-4-0-to-outlook.aspx</guid><description><![CDATA[<div class="ExternalClass3A25CEC3F2D74BF6BE8F8B1D56010314"><p class="ExternalClassB62D4F260CD04639B0DD926C1DF8476D">The other day we did some research for a client into the synchronization behavior of Dynamics CRM for Outlook specifically when it comes to activities.</p>  <p class="ExternalClassB62D4F260CD04639B0DD926C1DF8476D">Syncing activities like: Tasks, Appointments, Phone Calls and Letters to Outlook is a powerful option in Dynamics CRM but there can be some ambiguity into what’s gets synced where and what happens when you delete items from Outlook that were previously synced to or from CRM.</p>  <p class="ExternalClassB62D4F260CD04639B0DD926C1DF8476D">These are my current activities viewed in the CRM web client. </p>  <p class="ExternalClassB62D4F260CD04639B0DD926C1DF8476D"><a href="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/27/image_2_67E280B5.png"><img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px" title="image" border="0" alt="image" src="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/27/image_thumb_67E280B5.png" width="738" height="169"></a> </p>  <p class="ExternalClassB62D4F260CD04639B0DD926C1DF8476D">Looking in my Outlook To-Do bar I get a mix of CRM activities and my own Tasks</p>  <p class="ExternalClassB62D4F260CD04639B0DD926C1DF8476D"><a href="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/27/image_4_67E280B5.png"><img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px" title="image" border="0" alt="image" src="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/27/image_thumb_1_67E280B5.png" width="268" height="546"></a> </p>  <p>As you can see from the example above not all activities get synced from CRM to Outlook. So which ones do and what is there counterpart in Outlook?</p>  <h2>Sync activities to Outlook</h2>  <div class="ExternalClassB62D4F260CD04639B0DD926C1DF8476D">   <ul>     <li>Tasks</li>      <li>Letters </li>      <li>Phone calls </li>      <li>Fax </li>   </ul> </div>  <p>→ All get synced as tasks in  Outlook.</p>  <ul>   <li>Email </li> </ul>  <p>→ Email after it’s been send gets synced as sent email but before send it doesn’t get synced to Outlook</p>  <ul>   <li>Appointments </li> </ul>  <p>→ Appointments get synced to Outlook as meeting in your Calendar.</p>  <ul>   <li>Campaign responses </li> </ul>  <p>→ Won’t show up in Outlook. </p>  <ul>   <li>Service activities</li> </ul>  <p>→ Service activities show up as meetings in Outlook</p>  <h2>Deleting items in Outlook</h2>  <p>This is all quite straightforward but when deleting items in Outlook it is not always clear what happens to the activities in CRM. Well the sync behavior is depended on the status of the activity. </p>  <ul>   <li>When an activity is completed CRM it will stay in CRM but it won’t get synced back to Outlook. </li>    <li>When deleting an activity that is not yet completed it will <strong>delete in Outlook and CRM</strong>. </li> </ul>  <p>Although it would be nice to have the email activity before send also synced to a task in Outlook the overall behavior is quite nice and keeps your work load from CRM and Outlook thightly together which I think is a real advantage over other CRM systems.</p>  <h2>Deleting items in CRM</h2>  <p>Again the behavior is depended on the status of the activity.</p>  <ul>   <li>When an activity is completed CRM it will stay in Outlook. </li>    <li>When an activity is not yet completed CRM it will be deleted from Outlook as well. </li> </ul>  <p> <strong>Some more information Microsoft written about this sync behavior:</strong></p>  <p><a href="http://rc.crm.dynamics.com/rc/regcont/en_us/OP/help/ug_ol_RecordsActivities.htm">http://rc.crm.dynamics.com/rc/regcont/en_us/OP/help/ug_ol_RecordsActivities.htm</a></p></div>]]></description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Thijs ter Beek</dc:creator><pubDate>Tue, 08 Sep 2009 10:23:00 GMT</pubDate><category domain="http://www.orbitone.com/en/blog/archive/tags/CRM 4.0/default.aspx">CRM 4.0</category></item><item><title>Microsoft Dynamics CRM Outlook Client “Signed out” when accessing webclient</title><link>http://www.orbitone.com/en/blog/archive/2009/08/28/microsoft-dynamics-crm-outlook-client-“signed-out”-when-accessing-webclient.aspx</link><guid>/en/blog/archive/2009/08/28/microsoft-dynamics-crm-outlook-client-“signed-out”-when-accessing-webclient.aspx</guid><description><![CDATA[<div class="ExternalClass5ACDFF37BBA944F8920D08D36013EDA8"><p>When you use Microsoft Dynamics CRM Outlook Client 4.0 on a computer with Internet Explorer 8 (IE8), you might have experienced unexpected “Signed Out” of your Outlook Client every time you open the CRM web interface in Internet Explorer: </p>  <p><a href="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/26/clip_image002_2_066DD245.jpg"><img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px" title="clip_image002" border="0" alt="clip_image002" src="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/26/clip_image002_thumb_345B24FD.jpg" width="244" height="83"></a> </p>  <p>You are then unable to use the CRM Outlook Client until you restart Outlook: </p>  <p><a href="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/26/clip_image004_2_345B24FD.jpg"><img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px" title="clip_image004" border="0" alt="clip_image004" src="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/26/clip_image004_thumb_345B24FD.jpg" width="730" height="37"></a> </p>  <p>First make sure you have the latest Update Rollup installed on your desktop as well as on the server. </p>  <p>Currently Update Rollup 6 is the most recent </p>  <p><a href="http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;FamilyID=79f90982-c039-41c2-af8e-3119ecf27790">http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;FamilyID=79f90982-c039-41c2-af8e-3119ecf27790</a> </p>  <p><strong>Outlook</strong></p>  <p>First correctly configure the Outlook client with the right URL settings.</p>  <p>Go to CRM &gt; Change organization in Outlook</p>  <p><a href="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/26/image_2_345B24FD.png"><img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px" title="image" border="0" alt="image" src="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/26/image_thumb_345B24FD.png" width="375" height="285"></a> </p>  <p>Choose Online service provider</p>  <p><a href="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/26/image3_345B24FD.png"><img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px" title="image" border="0" alt="image" src="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/26/image3_thumb_345B24FD.png" width="374" height="285"></a></p>  <p> </p>  <p>Url for production crm orbitone is:</p>  <p><a href="https://orbitonecrm.orbitone.com">https://orbitonecrm.orbitone.com</a></p>  <p>Go through the other steps, next, next,… finish.</p>  <p>Start Outlook and give CRM credentials. Save user name password.</p>  <p><strong></strong> </p>  <p><strong>IE</strong></p>  <p>Now start IE and go to Tools &gt; Internet Options &gt; security tab</p>  <p>Click Reset all levels to default button</p>  <p><a href="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/26/clip_image0024_345B24FD.jpg"><img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px" title="clip_image002[4]" border="0" alt="clip_image002[4]" src="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/26/clip_image0024_thumb_345B24FD.jpg" width="315" height="401"></a></p>  <p>Click Intranet zone &gt; Sites &gt; Advanced &gt; enter same URL: <a href="https://orbitonecrm.orbitone.com">https://orbitonecrm.orbitone.com</a></p>  <p><a href="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/26/clip_image00210_1F69A28A.jpg"><img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px" title="clip_image002[10]" border="0" alt="clip_image002[10]" src="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/26/clip_image00210_thumb_1F69A28A.jpg" width="386" height="224"></a></p>  <p><a href="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/26/clip_image00212_1F69A28A.jpg"><img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px" title="clip_image002[12]" border="0" alt="clip_image002[12]" src="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/26/clip_image00212_thumb_1F69A28A.jpg" width="387" height="219"></a></p>  <p>Click Intranet zone &gt; Enable Protected mode (Requires restarting Internet Explorer)</p>  <p><a href="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/26/clip_image0028_1F69A28A.jpg"><img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px" title="clip_image002[8]" border="0" alt="clip_image002[8]" src="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/26/clip_image0028_thumb_1F69A28A.jpg" width="326" height="411"></a></p>  <p>Works like a charm!</p>  <p><b><i>See also:</i></b> </p>  <p>CRM 4.0: Forced logout from Outlook CRM client when using web client    <br><a href="http://social.microsoft.com/Forums/en-US/crm/thread/4f558522-db2e-4dae-a2fa-9391af66e237">http://social.microsoft.com/Forums/en-US/crm/thread/4f558522-db2e-4dae-a2fa-9391af66e237</a> </p>  <p>User signed out involuntarily </p>  <p><a href="https://community.dynamics.com/forums/t/6853.aspx">https://community.dynamics.com/forums/t/6853.aspx</a></p></div>]]></description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Thijs ter Beek</dc:creator><pubDate>Fri, 28 Aug 2009 17:26:07 GMT</pubDate></item><item><title>Auto complete text box in Dynamics CRM 4.0</title><link>http://www.orbitone.com/en/blog/archive/2009/08/27/auto-complete-text-box-in-crm-4-0.aspx</link><guid>/en/blog/archive/2009/08/27/auto-complete-text-box-in-crm-4-0.aspx</guid><description><![CDATA[<div class="ExternalClassBE7BCF65033547B08B53A27C497FC45E"><p>We needed a drop down box in our CRM 4.0 environments for a lot of our clients. The data from the drop down should come from within CRM 4.0 to limit the dependencies to other systems. </p> <p>The cleanest way we found to do this is via an autocomplete textbox which is actually jQuery.  To make it work we needed to get data from CRM through the CRM webservice. We did this with some helper objects that we found at<a title="http://blogs.inetium.com/blogs/azimmer/archive/2009/02/01/crm-4-0-javascript-web-service-helper-objects.aspx" href="http://blogs.inetium.com/blogs/azimmer/archive/2009/02/01/crm-4-0-javascript-web-service-helper-objects.aspx">http://blogs.inetium.com/blogs/azimmer/archive/2009/02/01/crm-4-0-javascript-web-service-helper-objects.aspx</a>. These objects are created to support a .Net like language to connect to the CRM webservice.</p> <p>The next problem was an autocomplete function in JavaScript. For this we chose the functions from <a title="http://www.pengoworks.com/workshop/jquery/autocomplete.htm" href="http://www.pengoworks.com/workshop/jquery/autocomplete.htm">http://www.pengoworks.com/workshop/jquery/autocomplete.htm</a>. We changed these a bit so there is no-more CSS included, because we did not want to load this (since the look and feel of CRM won’t change (for now)) and we don’t want to screw up the CRM classes that are already in place on the form.</p> <h2>How does it stick together?</h2> <p>Finally we needed to write some plumbing code to make it work.</p> <p>In the <strong>onLoad </strong>event of the form you’ll need to add the following code: </p><pre class="csharpcode"><font size="1"><font face="Courier New"><span class="kwrd">function</span> load_script (url) 
{ 
    <span class="kwrd">var</span> x = <span class="kwrd">new</span> ActiveXObject(<span class="str">&quot;Msxml2.XMLHTTP&quot;</span>); 
    x.open(<span class="str">'GET'</span>, url, <span class="kwrd">false</span>); x.send(<span class="str">''</span>); 
    eval(x.responseText); 
    <span class="kwrd">var</span> s = x.responseText.split(/\n/); 
    <span class="kwrd">var</span> r = /^<span class="kwrd">function</span>\s*([a-z_]+)/i; 
    <span class="kwrd">for</span> (<span class="kwrd">var</span> i = 0; i &lt; s.length; i++){ 
        <span class="kwrd">var</span> m = r.exec(s[i]); 
        <span class="kwrd">if</span> (m != <span class="kwrd">null</span>) 
            window[m[1]] = eval(m[1]); 
    } 
} 

load_script(<span class="str">&quot;/Custom/ISV/jquery-1.3.2.min.js&quot;</span>);
<span class="kwrd">var</span> scriptTag1 = document.createElement(<span class="str">&quot;&lt;script src='/Custom/ISV/jquery.autocomplete.js' type='text/javascript'&gt;&quot;</span>);
<span class="kwrd">var</span> scriptTag2 = document.createElement(<span class="str">&quot;&lt;script src='/Custom/ISV/crmHelpers.js' type='text/javascript'&gt;&quot;</span>);
<span class="kwrd">var</span> scriptTag3 = document.createElement(<span class="str">&quot;&lt;script src='/Custom/ISV/ISVspecific.js' type='text/javascript'&gt;&quot;</span>);
<span class="kwrd">var</span> array = <span class="kwrd">new</span> Array();
array = document.getElementsByTagName(<span class="str">&quot;head&quot;</span>);
array[0].insertAdjacentElement(<span class="str">&quot;afterBegin&quot;</span>, scriptTag1);
array[0].insertAdjacentElement(<span class="str">&quot;afterBegin&quot;</span>, scriptTag2);
array[0].insertAdjacentElement(<span class="str">&quot;afterBegin&quot;</span>, scriptTag3);</font></font></pre>
<style>
.ExternalClassBE7BCF65033547B08B53A27C497FC45E .csharpcode, .ExternalClassBE7BCF65033547B08B53A27C497FC45E .csharpcode pre
{font-size:small;color:black;font-family:consolas, &quot;Courier New&quot;, courier, monospace;background-color:#ffffff;}
.ExternalClassBE7BCF65033547B08B53A27C497FC45E .csharpcode pre
{margin:0em;}
.ExternalClassBE7BCF65033547B08B53A27C497FC45E .csharpcode .rem
{color:#008000;}
.ExternalClassBE7BCF65033547B08B53A27C497FC45E .csharpcode .kwrd
{color:#0000ff;}
.ExternalClassBE7BCF65033547B08B53A27C497FC45E .csharpcode .str
{color:#006080;}
.ExternalClassBE7BCF65033547B08B53A27C497FC45E .csharpcode .op
{color:#0000c0;}
.ExternalClassBE7BCF65033547B08B53A27C497FC45E .csharpcode .preproc
{color:#cc6633;}
.ExternalClassBE7BCF65033547B08B53A27C497FC45E .csharpcode .asp
{background-color:#ffff00;}
.ExternalClassBE7BCF65033547B08B53A27C497FC45E .csharpcode .html
{color:#800000;}
.ExternalClassBE7BCF65033547B08B53A27C497FC45E .csharpcode .attr
{color:#ff0000;}
.ExternalClassBE7BCF65033547B08B53A27C497FC45E .csharpcode .alt
{background-color:#f4f4f4;width:100%;margin:0em;}
.ExternalClassBE7BCF65033547B08B53A27C497FC45E .csharpcode .lnum
{color:#606060;}
</style>

<style>
.ExternalClassBE7BCF65033547B08B53A27C497FC45E .csharpcode, .ExternalClassBE7BCF65033547B08B53A27C497FC45E .csharpcode pre
{font-size:small;color:black;font-family:consolas, &quot;Courier New&quot;, courier, monospace;background-color:#ffffff;}
.ExternalClassBE7BCF65033547B08B53A27C497FC45E .csharpcode pre
{margin:0em;}
.ExternalClassBE7BCF65033547B08B53A27C497FC45E .csharpcode .rem
{color:#008000;}
.ExternalClassBE7BCF65033547B08B53A27C497FC45E .csharpcode .kwrd
{color:#0000ff;}
.ExternalClassBE7BCF65033547B08B53A27C497FC45E .csharpcode .str
{color:#006080;}
.ExternalClassBE7BCF65033547B08B53A27C497FC45E .csharpcode .op
{color:#0000c0;}
.ExternalClassBE7BCF65033547B08B53A27C497FC45E .csharpcode .preproc
{color:#cc6633;}
.ExternalClassBE7BCF65033547B08B53A27C497FC45E .csharpcode .asp
{background-color:#ffff00;}
.ExternalClassBE7BCF65033547B08B53A27C497FC45E .csharpcode .html
{color:#800000;}
.ExternalClassBE7BCF65033547B08B53A27C497FC45E .csharpcode .attr
{color:#ff0000;}
.ExternalClassBE7BCF65033547B08B53A27C497FC45E .csharpcode .alt
{background-color:#f4f4f4;width:100%;margin:0em;}
.ExternalClassBE7BCF65033547B08B53A27C497FC45E .csharpcode .lnum
{color:#606060;}
</style>

<style>
.ExternalClassBE7BCF65033547B08B53A27C497FC45E .csharpcode, .ExternalClassBE7BCF65033547B08B53A27C497FC45E .csharpcode pre
{font-size:small;color:black;font-family:consolas, &quot;Courier New&quot;, courier, monospace;background-color:#ffffff;}
.ExternalClassBE7BCF65033547B08B53A27C497FC45E .csharpcode pre
{margin:0em;}
.ExternalClassBE7BCF65033547B08B53A27C497FC45E .csharpcode .rem
{color:#008000;}
.ExternalClassBE7BCF65033547B08B53A27C497FC45E .csharpcode .kwrd
{color:#0000ff;}
.ExternalClassBE7BCF65033547B08B53A27C497FC45E .csharpcode .str
{color:#006080;}
.ExternalClassBE7BCF65033547B08B53A27C497FC45E .csharpcode .op
{color:#0000c0;}
.ExternalClassBE7BCF65033547B08B53A27C497FC45E .csharpcode .preproc
{color:#cc6633;}
.ExternalClassBE7BCF65033547B08B53A27C497FC45E .csharpcode .asp
{background-color:#ffff00;}
.ExternalClassBE7BCF65033547B08B53A27C497FC45E .csharpcode .html
{color:#800000;}
.ExternalClassBE7BCF65033547B08B53A27C497FC45E .csharpcode .attr
{color:#ff0000;}
.ExternalClassBE7BCF65033547B08B53A27C497FC45E .csharpcode .alt
{background-color:#f4f4f4;width:100%;margin:0em;}
.ExternalClassBE7BCF65033547B08B53A27C497FC45E .csharpcode .lnum
{color:#606060;}
</style>

<p>As for the creation of the ISVspecific.js script I would like to link to a previous post a wrote on <a href="http://www.orbitone.com/en/blog/archive/2009/05/08/crm-client-side-validation-scripts.aspx">Client-side validation scripts</a>. In that post you can see a way to create a script paste it in CRM without changing code in the events of every field on every form.</p>
<p>The contactFormLoad function from the previous post (<a href="http://www.orbitone.com/en/blog/archive/2009/05/08/crm-client-side-validation-scripts.aspx">Client-side validation scripts</a>):</p><pre class="csharpcode"><font size="1"><font face="Courier New"><span class="kwrd">function</span> contactFormLoad(){
    <span class="kwrd">var</span> zipoptions = {
                        <span class="str">&quot;borderColor&quot;</span> : <span class="str">&quot;#6699CC&quot;</span>,
                        <span class="str">&quot;selectedColor&quot;</span> : <span class="str">&quot;#a7cdf0&quot;</span>,
                        <span class="str">&quot;background&quot;</span> : <span class="str">&quot;white&quot;</span>,
                        <span class="str">&quot;getDataCallback&quot;</span> : GetCountries 
                     };
    $(<span class="str">&quot;#address1_country&quot;</span>).autocomplete(zipoptions);
    <span class="rem">//add you other onchange scripts here</span>
}
</font></font></pre>
<style>
.ExternalClassBE7BCF65033547B08B53A27C497FC45E .csharpcode, .ExternalClassBE7BCF65033547B08B53A27C497FC45E .csharpcode pre
{font-size:small;color:black;font-family:consolas, &quot;Courier New&quot;, courier, monospace;background-color:#ffffff;}
.ExternalClassBE7BCF65033547B08B53A27C497FC45E .csharpcode pre
{margin:0em;}
.ExternalClassBE7BCF65033547B08B53A27C497FC45E .csharpcode .rem
{color:#008000;}
.ExternalClassBE7BCF65033547B08B53A27C497FC45E .csharpcode .kwrd
{color:#0000ff;}
.ExternalClassBE7BCF65033547B08B53A27C497FC45E .csharpcode .str
{color:#006080;}
.ExternalClassBE7BCF65033547B08B53A27C497FC45E .csharpcode .op
{color:#0000c0;}
.ExternalClassBE7BCF65033547B08B53A27C497FC45E .csharpcode .preproc
{color:#cc6633;}
.ExternalClassBE7BCF65033547B08B53A27C497FC45E .csharpcode .asp
{background-color:#ffff00;}
.ExternalClassBE7BCF65033547B08B53A27C497FC45E .csharpcode .html
{color:#800000;}
.ExternalClassBE7BCF65033547B08B53A27C497FC45E .csharpcode .attr
{color:#ff0000;}
.ExternalClassBE7BCF65033547B08B53A27C497FC45E .csharpcode .alt
{background-color:#f4f4f4;width:100%;margin:0em;}
.ExternalClassBE7BCF65033547B08B53A27C497FC45E .csharpcode .lnum
{color:#606060;}
</style>

<p>The <font face="Courier New">GetCountries </font>which is assigned to <font face="Courier New">getDataCallback </font>is where the CRM service queries are performed. This should be your own implementation. I have prepared some sample code that retrieves countries from a small custom entity called <font face="Courier New">new_country </font>with the attributes <font face="Courier New">new_countryid </font>and <font face="Courier New">new_name</font>.</p><pre class="csharpcode"><font size="1"><font face="Courier New"><span class="kwrd">function</span> GetCountries(partialCountry){
    <span class="kwrd">try</span>{
        <span class="kwrd">var</span> crmService = <span class="kwrd">new</span> CrmService(<span class="str">&quot;new_country&quot;</span>, LOGICAL_OPERATOR_OR);
        crmService.AddColumn(<span class="str">&quot;new_name&quot;</span>);
    
        <span class="kwrd">if</span>(partialCountry != <span class="kwrd">null</span>){
            crmService.AddFilterCondition(<span class="str">&quot;new_name&quot;</span>, partialCountry + <span class="str">&quot;%&quot;</span>, CONDITION_OPERATOR_LIKE);
        }
        <span class="kwrd">var</span> result = crmService.Fetch(20);
        
        <span class="kwrd">for</span>(<span class="kwrd">var</span> i <span class="kwrd">in</span> result.Rows)
        {
            <span class="kwrd">var</span> s= <span class="str">&quot;&quot;</span>;
            <span class="kwrd">for</span>(<span class="kwrd">var</span> j <span class="kwrd">in</span> result.Rows[i].Columns)
            {
                s += result.Rows[i].Columns[j].Value;
            }
        }
                
        <span class="kwrd">var</span> ar = <span class="kwrd">new</span> Array();
        <span class="kwrd">var</span> i = 0;
        <span class="kwrd">var</span> addvalue = <span class="kwrd">true</span>;
        <span class="kwrd">for</span> (rowsNumber <span class="kwrd">in</span> result.Rows) {
            addvalue = <span class="kwrd">true</span>;
            <span class="kwrd">var</span> newval = result.Rows[rowsNumber].GetValue(<span class="str">&quot;new_name&quot;</span>);
            <span class="kwrd">for</span>(resultRow <span class="kwrd">in</span> ar) {
                <span class="kwrd">if</span>(ar[resultRow] == newval) {
                    addvalue = <span class="kwrd">false</span>;
                    <span class="kwrd">break</span>;
                }
            }
            <span class="kwrd">if</span>(addvalue){
                ar[i] = newval;
                i++;
            }
        }
        <span class="kwrd">return</span> ar;
    }
    <span class="kwrd">catch</span>(er) {
        alert(er.message);
    }
}</font></font></pre>
<style>
.ExternalClassBE7BCF65033547B08B53A27C497FC45E .csharpcode, .ExternalClassBE7BCF65033547B08B53A27C497FC45E .csharpcode pre
{font-size:small;color:black;font-family:consolas, &quot;Courier New&quot;, courier, monospace;background-color:#ffffff;}
.ExternalClassBE7BCF65033547B08B53A27C497FC45E .csharpcode pre
{margin:0em;}
.ExternalClassBE7BCF65033547B08B53A27C497FC45E .csharpcode .rem
{color:#008000;}
.ExternalClassBE7BCF65033547B08B53A27C497FC45E .csharpcode .kwrd
{color:#0000ff;}
.ExternalClassBE7BCF65033547B08B53A27C497FC45E .csharpcode .str
{color:#006080;}
.ExternalClassBE7BCF65033547B08B53A27C497FC45E .csharpcode .op
{color:#0000c0;}
.ExternalClassBE7BCF65033547B08B53A27C497FC45E .csharpcode .preproc
{color:#cc6633;}
.ExternalClassBE7BCF65033547B08B53A27C497FC45E .csharpcode .asp
{background-color:#ffff00;}
.ExternalClassBE7BCF65033547B08B53A27C497FC45E .csharpcode .html
{color:#800000;}
.ExternalClassBE7BCF65033547B08B53A27C497FC45E .csharpcode .attr
{color:#ff0000;}
.ExternalClassBE7BCF65033547B08B53A27C497FC45E .csharpcode .alt
{background-color:#f4f4f4;width:100%;margin:0em;}
.ExternalClassBE7BCF65033547B08B53A27C497FC45E .csharpcode .lnum
{color:#606060;}
</style>

<p>As you can see in the above code block, the function takes one parameter, being the part you typed in the field you need the autocomplete functionality on. Then some fetch xml is generated by the crmHelper objects and the query is executed. This will only get 20 records as specified in the line crmService.Fetch(20).</p>
<p>The crmHelpers.js contains a method called <font face="courier new">CrmService.prototype.Fetch</font>, which is a reworked version of the <font face="courier new">CrmService.prototype.RetreiveMultiple </font>from the code of <a href="http://blogs.inetium.com/blogs/azimmer/">Andrew Zimmer</a>.</p>
<p>If you would like to use the autocomplete function on a lookup field in CRM (yes, that also works :)) you need to add “_ledit” (without the quotes) to the fieldname. Example: </p><pre class="csharpcode"><font size="1" face="Courier New">$(<span class="str">&quot;#new_countryid_ledit&quot;</span>).autocomplete(zipoptions);</font></pre><pre class="csharpcode"> </pre><pre class="csharpcode"><font face="Arial">You can download a <a href="http://www.orbitone.com/en/blog/documents/CRM40AutoCompletionExample.zip" target="_blank">complete sample</a> but don’t forget to create the new_country entity if you want to test.</font></pre></div>]]></description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Wim De Coninck</dc:creator><pubDate>Thu, 27 Aug 2009 14:50:00 GMT</pubDate><category domain="http://www.orbitone.com/en/blog/archive/tags/CRM 4.0/default.aspx">CRM 4.0</category><category domain="http://www.orbitone.com/en/blog/archive/tags/JavaScript/default.aspx">JavaScript</category><category domain="http://www.orbitone.com/en/blog/archive/tags/jQuery/default.aspx">jQuery</category></item><item><title>Adding Fluent NHibernate support for Castle Windsor’s NHibernate Integration</title><link>http://www.orbitone.com/en/blog/archive/2009/06/23/adding-fluent-nhibernate-support-for-castle-windsor’s-nhibernate-integration.aspx</link><guid>/en/blog/archive/2009/06/23/adding-fluent-nhibernate-support-for-castle-windsor’s-nhibernate-integration.aspx</guid><description><![CDATA[<div class="ExternalClassD9E6B4D81E3142E291F648DE7B122119"><h1></h1>  <p align="justify">We have used NHibernate as ORM mapper in many projects and to facilitate automatic session and transaction management we employed the <a href="http://www.castleproject.org" target="_blank">Castle Windsor</a> <a href="http://www.castleproject.org/container/facilities/trunk/nhibernate/index.html" target="_blank">NHibernate Integration facility</a>. </p>  <p align="justify">When using the Castle NHibernate Facility the configuration file for castle (<strong>castle.xml.config</strong>) looks like this:</p>  <p><a href="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/24/image_4_22EB85FD.png"><img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px" title="image" border="0" alt="image" src="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/24/image_thumb_1_22EB85FD.png" width="408" height="172"></a></p>  <p align="justify">Where the mapping assembly contains all the .hbm.xml files as embedded resources.</p>  <p align="justify">When the <a href="http://fluentnhibernate.org/" target="_blank">Fluent NHibernate</a> framework appeared we started thinking about using it in our projects. But we wanted to do this with minimal changes to the Castle configuration schema (in the above screenshot).</p>  <p align="justify">The ideal situation would be to specify an assembly containing the Fluent NHibernate mapping classes instead of the assembly containing mapping xml files.</p>  <p align="justify">In the screenshot from above you can see in the  highlighted area an <font color="#0000ff">&lt;assembly/&gt;</font> declaration. That assembly will be used by Castle NHibernate Facility’s <strong>default xml mapper. </strong></p>  <p align="justify">We would like to make it possible to specify <strong>our own mapper</strong> which will make use of Fluent NHibernate to load the mapping classes from the specified assembly.</p>  <p align="justify">As the Fluent NHibernate framework is open-source, we considered making out custom build to add the needed functionality. Next I will describe the steps needed to implement and use the custom Fluent NHibernate mapper with Castle’s NHibernate Facility.</p>  <p><font color="#000000">1. Download the necessary source files:</font> </p>  <ul>   <li><font color="#000000"><a href="http://prdownloads.sourceforge.net/castleproject/Castle-SourceCode.zip?download" target="_blank">Castle Project</a> </font> </li>    <li><font color="#000000"><a href="http://fluentnhibernate.org/downloads/fluentnhibernate-source-0.1.0.526.zip" target="_blank">Fluent NHibernate</a></font> </li> </ul>  <p><font color="#000000">2. Create a new solution including the following projects:</font> </p>  <ul>   <li><font color="#000000">Castle.Core</font> </li>    <li><font color="#000000">Castle.DynamicProxy</font> </li>    <li>Castle.Facilities.NHibernateIntegration </li>    <li>Castle.MicroKernel </li>    <li>Castle.Services.Transaction </li>    <li>Castle.Windsor </li>    <li>FluentNHibernate </li>    <li>NHibernate.Mapping.Attributes-2.0 </li> </ul>  <p><a href="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/24/image_6_22EB85FD.png"><img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px" title="image" border="0" alt="image" src="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/24/image_thumb_2_22EB85FD.png" width="256" height="147"></a></p>  <p>3. Create a new folder in the in the Castle.Facilities.NHibernateIntegration project. The project structure should look like the following: </p>  <p><a href="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/24/image_14_22EB85FD.png"><img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px" title="image" border="0" alt="image" src="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/24/image_thumb_6_22EB85FD.png" width="314" height="330"></a> </p>  <p>4. In the previously created folder add the following: </p>  <ul>   <li>     <div align="justify">An interface called <strong>INhibernateMapper</strong> This is the base for all the NHibernate mapper types. </div>   </li>    <li>     <div align="justify">A class named <strong>DefaultNHibernateMapper.</strong> </div>   </li>    <li>     <div align="justify">A class named <strong>AttributeNhibernateMapper</strong>. </div>   </li>    <li>     <div align="justify">A class named <strong>FluentNhibernateMapper</strong>. </div>      <div align="justify">The class diagram is shown below:</div>      <div> <a href="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/24/image_16_22EB85FD.png"><img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px" title="image" border="0" alt="image" src="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/24/image_thumb_7_0DFA038A.png" width="377" height="279"></a> </div>   </li> </ul>  <p>5. Implement the <strong>FluentNHibernateMapper:</strong></p>  <p align="justify"> <a href="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/24/image_18_0DFA038A.png"><img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px" title="image" border="0" alt="image" src="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/24/image_thumb_8_0DFA038A.png" width="406" height="294"></a> The RegisterAssemblies method loads the assemblies specified in the <font color="#0000ff">&lt;assembly/&gt;</font> section of the castle configuration file and registers the FluentNhibernate mapping classes with NHibernate. </p>  <p> </p>  <p align="justify">6. Expand the Castle.Facilities.NHibernateIntegration project, look for the <strong>NHibernateFacility.cs</strong> file and locate the <font color="#0000ff">protected void RegisterAssemblies(Configuration cfg, IConfiguration facilityConfig) </font><font color="#004000">method.</font> </p>  <div><a href="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/24/image_10_0DFA038A.png"><img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px" title="image" border="0" alt="image" src="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/24/image_thumb_4_0DFA038A.png" width="314" height="256"></a></div>  <p>Replace the method’s contents with the following code:</p>  <p><a href="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/24/image_26_0DFA038A.png"><img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px" title="image" border="0" alt="image" src="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/24/image_thumb_12_0DFA038A.png" width="408" height="144"></a> </p>  <p align="justify">The method tests if a mapper is declared in the <font color="#0000ff">&lt;assembly/&gt;</font> section of the castle configuration file. If yes, it will use it. If not it will use the <strong>DefaultNhibernateMapper </strong>(xml).</p>  <p> </p>  <p><strong><font size="3">Conclusion:</font></strong></p>  <p align="justify">The schema of the configuration file does not change if the preferred mapping type is xml. If the mappings are defined using FluentNHibernate then the castle configuration file transforms like the following:</p>  <p><a href="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/24/image_24_0DFA038A.png"><img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px" title="image" border="0" alt="image" src="http://www.orbitone.com/en/blog/Lists/Posts/Attachments/24/image_thumb_11_0DFA038A.png" width="410" height="141"></a> </p>  <blockquote>   <p align="justify">The extra attribute – <strong>mapper</strong>  - specifies which <strong>IHNibernateMapper</strong> implementation to use for loading the NHibernate mappings.</p>    <p align="justify">The custom mappers can be implemented in a separate assembly. But the interface (<strong>IHNibernateMapper</strong>) needs to be located the Castle.Facilities.<strong>NHibernateIntegration</strong> assembly, because the entry point for loading the NHibernate mapping assemblies is the <strong>RegisterAssemblies</strong> method in the <strong>NHibernateFacility</strong> class.</p>    <p>The full source code can be downloaded <a href="http://www.orbitone.com/en/blog/documents/CastleEverything.zip" target="_blank">here</a>.</p></blockquote></div>]]></description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Voicu Matei</dc:creator><pubDate>Tue, 23 Jun 2009 17:30:00 GMT</pubDate><category domain="http://www.orbitone.com/en/blog/archive/tags/.NET/default.aspx">.NET</category></item><item><title>Dynamics CRM4.0: Client-side validation scripts</title><link>http://www.orbitone.com/en/blog/archive/2009/02/02/crm-client-side-validation-scripts.aspx</link><guid>/en/blog/archive/2009/02/02/crm-client-side-validation-scripts.aspx</guid><description><![CDATA[<div class="ExternalClass7D38274F213D42C0A8B4D7211FDEBE01">
<div>Everybody who customized CRM in the slightest will know that adding a client side validation script on one or more fields on a form is quite tedious and repetitive work.</div>
<div> </div>
<div>Therefor we've looked a little bit deeper at the problem here at Orbit One, to be able to serve our customers quicker, better and more reliable.</div>
<div> </div>
<div>Let me try and scetch the situation in CRM to add 1 field validator. There are a few steps that you need to do.</div>
<ol>
<li>Open CRM</li>
<li>Goto Settings</li>
<li>Click on the Customization link in the menu (left side)</li>
<li>Select the entity for which you want to validate a field</li>
<li>Click Forms and Views in the new screen (again on the left side)</li>
<li>double click on the Form item</li>
<li>double click on the Field you want to validate</li>
<li>Select the tab Events</li>
<li>Click on the Edit button</li>
<li>Write your validation logic in JavaScript</li>
<li>Do not forget to enable the event with the checkbox above your validation code</li>
<li>Click the OK button</li>
<li>Click the OK button</li>
<li>Click the Save and Close button on top</li>
<li>Click the Actions button on top and select publish.</li></ol>
<p>Steps 7 through 14 are the steps you'll need to do for every field if you do the validations in bulk. </p>
<p>What we do now is the following. We add some code to the OnLoad event of the form as following:</p>
<ol>
<li>Open CRM</li>
<li>Goto Settings</li>
<li>Click on the Customization link in the menu (left side)</li>
<li>Select the entity for which you want to validate a field</li>
<li>Click Forms and Views in the new screen (again on the left side)</li>
<li>Double click on the Form item</li>
<li>Click on the Forms Properties button on the right side</li>
<li>Click on the Edit button</li>
<li>Write code here:<br>var scriptTag = document.createElement(&quot;&lt;script src='/Custom/validation.js' type='text/javascript'&gt;&quot; );<br>var array = new Array();<br>array = document.getElementsByTagName(&quot;head&quot;);<br>array[0].insertAdjacentElement(&quot;afterBegin&quot;, scriptTag);</li>
<li>Do not forget to enable the event with the checkbox above your validation code</li>
<li>Click the OK button</li>
<li>Click the OK button</li>
<li>Click the Save and Close button on top</li>
<li>Click the Actions button on top and select publish.</li></ol>
<div>Now that we have done this, lets take a look at the validation.js file. It should load every validation we have, so lets start by adding something that will make the onload of document trigger:</div>
<div><font face="Courier New">var oldOnload = document.onload;<br>if(oldOnload != undefined &amp;&amp; oldOnload != null &amp;&amp; typeof(oldOnload) == &quot;function&quot;){<br> if(crmForm.crmFormRootElem.value == &quot;contact&quot;){<br>  document.onload = function(){ oldOnLoad(); contactFormLoad(); }();<br> }<br>} else {<br> if(crmForm.crmFormRootElem.value == &quot;contact&quot;){<br>  document.onload = function(){ contactFormLoad(); }();<br> }<br>}</font></div>
<div> </div>
<div>What does this code do ??? Well, the onload function is stored in the oldOnload variable. Then we check if the oldOnload function is actually a defined, if it is not null and that the type is a function. If this is the case there already was an onload function, so we do not want to lose that one. So what happens next is we create a new document.onload function that calls the oldOnLoad and then our own onload function contactFormLoad. If there is not already an onload function for the document we just use our contactFormLoad.</div>
<div> </div>
<div>The contactFormLoad function looks like this:</div>
<div><font face="Courier New">function contactFormLoad(){<br> overloadOnChange(&quot;address1_telephone1&quot;, address1_telephone1_onchange);<br> overloadOnChange(&quot;emailaddress1&quot;, emailaddress1_onchange);<br> overloadOnChange(&quot;websiteurl&quot;, websiteurl_onchange);<br> <br> hookOnSave(contactFormSave);<br>}</font></div>
<div> </div>
<div>As you can make up from the code above, we're going to validate a phonenumber, an email address and a website url.</div>
<div> </div>
<div>Then we are going to make sure the onsave also gets triggered so all our validation logic is run at the save, just to make sure.</div>
<div> </div>
<div>The overloadOnChange method: where most of the magic happens.</div>
<div> </div>
<div><font face="Courier New">function overloadOnChange(fieldName, newOnChangeFunction){<br> if(fieldName == null) <br>  return;<br> var control = crmForm.all[fieldName];<br> if (control != null){<br>  if(typeof(newOnChangeFunction) == &quot;function&quot;){<br>   if (typeof(control.onchange) == &quot;function&quot;){<br>    if (control.onchange != null) {<br>     var oldOnChangeFunction = control.onchange;<br>     control.onchange = function() { newOnChangeFunction(); oldOnChangeFunction(); };<br>    } else {<br>     control.onchange = function(){ newOnChangeFunction(); };<br>    }<br>   } else {<br>    control.onchange = function(){ newOnChangeFunction(); };<br>   }<br>  }<br> }<br>}</font></div>
<div> </div>
<div>This is a chunck of code that can be found inside CRM itself.</div>
<div>They use this to hook the clientside code to the fields if and only if the event is enabled checkbox is checked. </div>
<div>I don't want to check every checkbox on every field I want to validate. That's way to repetitive. So in the code above we flipped the positions of our new eventhandler and there old eventhandler, so that ours is triggered before theirs. </div>
<div>This seems like good practice to us because that way we can still use the validation out of the box in CRM like everybody does, but we can also use our method... So this is actually only added value. Nothing breaks in the inner workings of CRM.</div>
<div> </div>
<div> </div>
<div>And the hookOnSave part is this:</div>
<div><font face="Courier New">function hookOnSave(onsaveFunction){<br> if (crmForm != null) {<br>  if(typeof(crmForm.onsave) == &quot;function&quot;){<br>   var oldOnsave = crmForm.onsave;<br>   if(oldOnsave != null) {<br>    crmForm.onsave = function(){ onsaveFunction(); oldOnSave(); };<br>   } else {<br>    crmForm.onsave = function(){ onsaveFunction(); };<br>   }<br>  } else {<br>   crmForm.onsave = function(){ onsaveFunction(); };<br>  }<br> }<br>}</font></div>
<div> </div>
<div>Again with the old function that's being saved and so forth and so on ... just as in the previous function we'll do our onsave trigger followed by CRM's own onsave.</div>
<div> </div>
<div>In our onsave method - contactFormSave - we trigger our functions again:</div>
<div> </div>
<div><font face="Courier New">function contactFormSave(){<br> try{<br>     TryFireOnChange(&quot;address1_telephone1&quot;);<br>     TryFireOnChange(&quot;emailaddress1&quot;);<br>     TryFireOnChange(&quot;websiteurl&quot;);<br>     event.returnValue = isFormValid();<br> }<br> catch (e) {<br>     displayError(&quot;crmForm&quot;, &quot;onsave&quot;, e.description);<br> }<br>}</font></div>
<div> </div>
<div>Followed by the TryFireOnChange. This function has been added because we've had a minor issue in migrating the script. One of the fields in our staging environment was missing in the production environment. So when the field you try to validate the field but it doesn't exist then the catch get hit and nothing happens.</div>
<div> </div>
<div><font face="Courier New">function TryFireOnChange(fieldName){<br> try {<br>  if(document.crmForm.all[fieldName] != undefined) {<br>   document.crmForm.all[fieldName].FireOnChange();<br>  }<br> }<br> catch (e){}<br>}</font></div>
<div> </div>
<div>I am not going to elaborate on the validation functions itself because this is not really the scope of this post.</div>
<div> </div>
<div> </div>
<div>The PRO's to this approach are pretty huge for us:</div>
<ul>
<li>we can migrate the validations from our staging environment to the production environment by just copying one file.</li>
<li>we can just edit the file instead of having to click a bunch of times in the CRM web interface</li>
<li>we can still do everything through the CRM web interface</li>
<li>we can manage the one file in our source control more easily and track everything better.</li></ul>
<div>I hope you enjoyed reading this, and that it makes your work a little bit easier.</div>
<div> </div>
<div> </div></div>]]></description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Wim De Coninck</dc:creator><pubDate>Fri, 08 May 2009 15:20:00 GMT</pubDate><category domain="http://www.orbitone.com/en/blog/archive/tags/CRM 4.0/default.aspx">CRM 4.0</category><category domain="http://www.orbitone.com/en/blog/archive/tags/JavaScript/default.aspx">JavaScript</category></item><item><title>Language sensitive search results in SharePoint</title><link>http://www.orbitone.com/en/blog/archive/2009/05/04/language-sensitive-search-results-in-sharepoint.aspx</link><guid>/en/blog/archive/2009/05/04/language-sensitive-search-results-in-sharepoint.aspx</guid><description><![CDATA[<div class="ExternalClass01B6DCFBBF914480AAC729B4F0C7FA66"><div class="ExternalClassB9DA4E0E9E9540E9AAC4DA6ED55CA700">   <div>  <p style="margin:0in;font-family:calibri;font-size:11pt;font-weight:bold">The Problem: </p>      <p style="margin:0in;font-family:calibri;font-size:11pt">SharePoint returns different search results when I change my browser language </p>      <p style="margin:0in;font-family:calibri;font-size:11pt">Searching for &quot;the&quot; in English will give no results because the word is ignored.  </p>      <p style="margin:0in"><img alt="Search results in English" src="http://www.orbitone.com/en/blog/Lists/Photos/search-en.png" width="411" height="97"></p>      <p style="margin:0in;font-family:calibri;font-size:11pt">Searching for &quot;the&quot; in Dutch does give results.</p>      <p style="margin:0in;font-family:calibri;font-size:11pt"> <img alt="Search results in Dutch" src="http://www.orbitone.com/en/blog/Lists/Photos/search-nl.png" width="405" height="102"></p>      <p style="margin:0in;font-family:calibri;font-size:11pt">This is a feature of SharePoint, it's not a bug. </p>      <p style="margin:0in;font-family:calibri;font-size:11pt">However, it's not always desirable behaviour. In a multi-lingual site with a variation for each language the search results should be in the language of the current variation. </p>      <p style="margin:0in;font-family:calibri;font-size:11pt">By default SharePoint will ignore the variation settings and still take the browser language. </p>      <p style="margin:0in;font-family:calibri;font-size:11pt">There are several posts with the same problem, <a href="http://blogs.microsoft.co.il/blogs/adir_ron/archive/2007/12/11/how-to-avoid-ie-language-settings-affecting-moss-search-results.aspx" target="_blank">here</a> and here<a href="http://sharepointsearch.com/cs/forums/p/6339/6473.aspx#6473" target="_blank">here</a>. The suggested solutions range from changing the browser language programmatically to creating a new masterpage with the Culture hard coded, to subclassing the search results web part and changing the Culture settings in the OnInit event. </p>      <p style="margin:0in;font-family:calibri;font-size:11pt" lang="nl-BE">Unfortunately these solutions either do not work or require a lot of work for a simple change. </p>      <p style="margin:0in;font-family:calibri;font-size:11pt;font-weight:bold">The solution: </p>      <p style="margin:0in;font-family:calibri;font-size:11pt">The Search Core Results web part has a property called &quot;SearchLanguage&quot;, which holds the locale of the search results. By default this property is null, and the locale will be inferred from the browser language</p>      <p style="margin:0in;font-family:calibri;font-size:11pt">To set this property to your language of choice, export the Search Core Results web part.</p>      <p style="margin:0in;font-family:calibri;font-size:11pt">Towards the end of the file you'll find the property QueryLanguage, which is null by default:</p>      <pre class="brush: xml; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: true; light: false; ruler: false; smart-tabs: true; tab-size: 4; toolbar: true;">&lt;property name=&quot;QueryLanguage&quot; type=&quot;string&quot; null=&quot;true&quot; /&gt;</pre>

    <pre class="brush: xml; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: true; light: false; ruler: false; smart-tabs: true; tab-size: 4; toolbar: true;"> </pre>

    <p style="margin:0in;font-family:calibri;font-size:11pt" lang="nl-BE">Change this to </p>

    <pre class="brush: xml; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: true; light: false; ruler: false; smart-tabs: true; tab-size: 4; toolbar: true;">&lt;property name=&quot;QueryLanguage&quot; type=&quot;string&quot;&gt;en-GB&lt;/property&gt;</pre>

    <pre class="brush: xml; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: true; light: false; ruler: false; smart-tabs: true; tab-size: 4; toolbar: true;"> </pre>

    <p style="margin:0in;font-family:calibri;font-size:11pt">Now import the web part back to the page and remove the old Search Core Results web part. </p>

    <p style="margin:0in;font-family:calibri;font-size:11pt">The search results will now always be in the language you chose, no matter what the browser language is.</p>
  </div>
</div></div>]]></description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Mel Gerats</dc:creator><pubDate>Mon, 04 May 2009 11:37:00 GMT</pubDate><category domain="http://www.orbitone.com/en/blog/archive/tags/SharePoint/default.aspx">SharePoint</category></item><item><title>Preserve created and modified information when importing a document in SharePoint.</title><link>http://www.orbitone.com/en/blog/archive/2009/03/28/preserve-and-created-and-modified-information-when-importing-a-document-in-sharepoint-.aspx</link><guid>/en/blog/archive/2009/03/28/preserve-and-created-and-modified-information-when-importing-a-document-in-sharepoint-.aspx</guid><description><![CDATA[<div class="ExternalClass5AAEBB50EAD442E2AAD35EEF8633A09F">
<p>I’m currently writing a web service on our SharePoint server to upload documents because one of our clients would like to migrate from a third party document management system to SharePoint. </p>
<p>This client would like to keep the legacy dates like the date of creation and the last modified date. After researching this, I still couldn’t find a way to do this. I noticed there are tools out there are able to do this so it is definitely possible.</p>
<p>So after some more trial and error I finally figured it out. And it wasn’t even that exotic, so I’d like to share how it is done.</p>
<p>When you’ve uploaded the file and checked it in you can change the dates with the following code:</p>
<style>
.ExternalClass5AAEBB50EAD442E2AAD35EEF8633A09F .cf
{font-family:courier new;font-size:8pt;color:black;background:white;}
.ExternalClass5AAEBB50EAD442E2AAD35EEF8633A09F .cl
{margin:0px;}
.ExternalClass5AAEBB50EAD442E2AAD35EEF8633A09F .cb1
{color:blue;}
.ExternalClass5AAEBB50EAD442E2AAD35EEF8633A09F .cb2
{color:#2b91af;}
.ExternalClass5AAEBB50EAD442E2AAD35EEF8633A09F .cb3
{color:#a31515;}
.ExternalClass5AAEBB50EAD442E2AAD35EEF8633A09F .cb4
{color:green;}
</style>

<div class="cf"><pre class="cl"><span class="cb1">public</span> <span class="cb1">void</span> UpdateFileDates(</pre><pre class="cl"><span class="cb1">string</span> siteCollectionUrl, <span class="cb1">string</span> site, </pre><pre class="cl"><span class="cb1">string</span> file, <span class="cb2">DateTime</span> created, <span class="cb2">DateTime</span> modified)</pre><pre class="cl">{</pre><pre class="cl">    <span class="cb1">if</span> (siteCollectionUrl == <span class="cb1">null</span>) </pre><pre class="cl">       <span class="cb1">throw</span> <span class="cb1">new</span> <span class="cb2">ArgumentNullException</span>(<span class="cb3">&quot;siteCollectionUrl&quot;</span>);</pre><pre class="cl"> </pre><pre class="cl">    <span class="cb1">using</span> (<span class="cb1">var</span> spSite = <span class="cb1">new</span> <span class="cb2">SPSite</span>(siteCollectionUrl))</pre><pre class="cl">    <span class="cb1">using</span> (<span class="cb1">var</span> web = <span class="cb1">string</span>.IsNullOrEmpty(site)</pre><pre class="cl">                        ? spSite.RootWeb</pre><pre class="cl">                        : spSite.OpenWeb(site))</pre><pre class="cl">    {</pre><pre class="cl">        <span class="cb1">var</span> spFile = web.GetFile(file);</pre><pre class="cl">        <span class="cb1">if</span> (spFile != <span class="cb1">null</span>)</pre><pre class="cl">        {</pre><pre class="cl">            spFile.CheckIn(<span class="cb3">&quot;&quot;</span>);</pre><pre class="cl">            <span class="cb1">var</span> item = spFile.Item;</pre><pre class="cl"> </pre><pre class="cl">            <span class="cb1">if</span> (item != <span class="cb1">null</span>)</pre><pre class="cl">            {</pre><pre class="cl">            item[<span class="cb3">&quot;Created&quot;</span>] = created;</pre><pre class="cl">            item[<span class="cb3">&quot;Modified&quot;</span>] = modified;</pre><pre class="cl"> </pre><pre class="cl">            spFile.CheckOut();</pre><pre class="cl">            item.Update();</pre><pre class="cl">            <span class="cb4">//When you do overwritecheckin the </span></pre><pre class="cl"><span class="cb4">	   // version doesn't change.</span></pre><pre class="cl">            spFile.CheckIn(<span class="cb3">&quot;&quot;</span>, <span class="cb2">SPCheckinType</span>.OverwriteCheckIn);</pre><pre class="cl">            }</pre><pre class="cl">        }</pre><pre class="cl">    }</pre><pre class="cl">}</pre></div></div>]]></description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Wim De Coninck</dc:creator><pubDate>Sat, 28 Mar 2009 16:49:00 GMT</pubDate><category domain="http://www.orbitone.com/en/blog/archive/tags/.NET/default.aspx">.NET</category><category domain="http://www.orbitone.com/en/blog/archive/tags/SharePoint/default.aspx">SharePoint</category></item><item><title>VMware ESX - Getting rid of disk-space hungry snapshots</title><link>http://www.orbitone.com/en/blog/archive/2009/03/09/VMware ESX - Getting rid of disk-space hungry snapshots.aspx</link><guid>/en/blog/archive/2009/03/09/VMware ESX - Getting rid of disk-space hungry snapshots.aspx</guid><description><![CDATA[<div class="ExternalClass359DDE152F2249CFA51B196B88E75169">
<div>
<div>
<p class="MsoNormal" style="margin:0cm 0cm 0pt">Getting rid of disk-space hungry snapshots on VMware Server isn't  really a push-button task and requires a bit of creativity. If you make a snapshot on a production vm in your virtual infrastructure, don't keep it much longer than a day or two at the most. The snapshot will grow automatically to a max of the original vmdk.</p>
<p class="MsoNormal" style="margin:0cm 0cm 0pt"><a href="http://virtrix.blogspot.com/2006/11/vmware-how-big-can-vm-snapshots-grow.html">http://virtrix.blogspot.com/2006/11/vmware-how-big-can-vm-snapshots-grow.html</a></p>
<p class="MsoNormal" style="margin:0cm 0cm 0pt">Remove a snapshot is easy, right? Sure.... till the task times out. </p>
<p class="MsoNormal" style="margin:0cm 0cm 0pt"><a href="http://blog.frode.org/?tag=remove-snapshot">http://blog.frode.org/?tag=remove-snapshot</a></p>
<p class="MsoNormal" style="margin:0cm 0cm 0pt">The vmdk snapshot file for the VM had grown to several GB’s. Think twice before you press the “delete all” button. When you hit that button, all the snapshots will merge into the original “flat.vmdk”-file  and afterwards all snapshots are deleted. </p>
<p class="MsoNormal" style="margin:0cm 0cm 0pt"><a href="http://www.yellow-bricks.com/2008/01/07/delete-all-snapshots/">http://www.yellow-bricks.com/2008/01/07/delete-all-snapshots/</a></p>
<p class="MsoNormal" style="margin:0cm 0cm 0pt">This action takes a while and there are a lot of strange things/problems in VirtualCenter e.g. “VirtualCenter shows no snapshot but it still exist in the ESX under the VirtualMachine directory on the datastore”, VM’s get stuck,… So before you make and remove snapshots, try to understand how a snapshot works and which files are involved:</p>
<p class="MsoNormal" style="margin:0cm 0cm 0pt"><a href="http://www.virtualizationtrainings.com/vmware-advanced-study/all-about-snapshots-in-vmware-vi3">http://www.virtualizationtrainings.com/vmware-advanced-study/all-about-snapshots-in-vmware-vi3</a><br>&lt;machine name&gt;-SnapshotX.vmsn (Where X is the number of the snapshot taken) This file stores the state of the virtual machine when the snapshot was taken.</p>
<p class="MsoNormal" style="margin:0cm 0cm 0pt">&lt;machine name&gt;-SnapshotX.vmem (Where X is the number of the snapshot taken) This file stores the state of the virtual machine memory when the snapshot was taken.</p>
<p class="MsoNormal" style="margin:0cm 0cm 0pt">&lt;machine name&gt;-n.vmdk (where n is the number of the disk image)</p>
<p class="MsoNormal" style="margin:0cm 0cm 0pt">If you want to remove snapshots, never use the snapshotmanager if you want to relax that day!</p>
<p class="MsoNormal" style="margin:0cm 0cm 0pt"><a href="http://professionalvmware.com/2009/01/19/removing-vmware-snapshots-with-a-bat-powershell-cli-rcli/">http://professionalvmware.com/2009/01/19/removing-vmware-snapshots-with-a-bat-powershell-cli-rcli/</a></p>
<p class="MsoNormal" style="margin:0cm 0cm 0pt">Snapshots get stuck, like glue, to a running VM, and despite your best effort to delete them, they won’t go away. Like in-laws, they stick around, a bit longer than is pleasant. If a snapshot has not been removed cleanly on the first try, you may want to create a new snapshot first (just to make sure the system knows there IS a snapshot present) before using the methods below.</p>
<p class="MsoNormal" style="margin:0cm 0cm 0pt">Here are a few ways of getting rid of the ones that don’t want to go away:</p>
<p class="MsoNormal" style="margin:0cm 0cm 0pt"><strong>From the Service Console (ESX)</strong></p>
<p class="MsoNormal" style="margin:0cm 0cm 0pt">[root@esx esx:storage1]# vmware-cmd ./VMname/VMname.vmx removesnapshots removesnapshots() = 1</p>
<p class="MsoNormal" style="margin:0cm 0cm 0pt"><strong>From PowerShell</strong></p>
<p class="MsoNormal" style="margin:0cm 0cm 0pt">PS C:\&gt; get-vm VMname* | get-snapshot | Remove-Snapshot -Confirm:$false</p>
<p class="MsoNormal" style="margin:0cm 0cm 0pt"><strong>Using the rCLI</strong></p>
<p class="MsoNormal" style="margin:0cm 0cm 0pt">Install RCLI on a virtualcenter machine</p>
<p class="MsoNormal" style="margin:0cm 0cm 0pt">Probably you get an error about a library: <a href="http://theether.net/kb/100062">http://theether.net/kb/100062</a> </p>
<p class="MsoNormal" style="margin:0cm 0cm 0pt">add “C:\Program Files\VMware\VMware VI Remote CLI\Perl\bin” to path environments</p>
<p class="MsoNormal" style="margin:0cm 0cm 0pt">C:\Program Files\VMware\VMware VI Remote CLI\bin&gt;vmware-cmd.pl -H esx -U root –P  password /vmfs/volumes/esx:storage1/VMname/VMname.vmx removesnapshots removesnapshot () = 1</p>
<p class="MsoNormal" style="margin:0cm 0cm 0pt"><strong>Using the Perl Toolkit</strong></p>
<p class="MsoNormal" style="margin:0cm 0cm 0pt">./snapshotmanager.pl –server your.vc.host –operation removeall –vmname some.bad.vm</p>
<p class="MsoNormal" style="margin:0cm 0cm 0pt">I used the Perl Toolkit (it’s installed with RCLI):</p>
<p class="MsoNormal" style="margin:0cm 0cm 0pt">C:\Program Files\VMware\VMware VI Remote CLI\Perl\apps\vm&gt;snapshotmanager.pl -server EsxServer.arfyes.com -operation removeall -vmname VMname</p>
<p class="MsoNormal" style="margin:0cm 0cm 0pt">Enter username: root<br>Enter password:</p>
<p class="MsoNormal" style="margin:0cm 0cm 0pt">Warning: depending on the size of the snapshot, it may take a LONG while for them to go away! You can get an idea of how long it’s going to take by looking at how large the snapshots are with ls -lh and note the size of your largest snapshots. </p></div></div></div>]]></description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Lieven Meys</dc:creator><pubDate>Mon, 09 Mar 2009 13:07:00 GMT</pubDate><category domain="http://www.orbitone.com/en/blog/archive/tags/VMware/default.aspx">VMware</category></item><item><title>Dynamics CRM 4.0 tool - Bulk update / export to csv</title><link>http://www.orbitone.com/en/blog/archive/2009/02/27/crm-4-0-tool-bulk-update-export-to-csv.aspx</link><guid>/en/blog/archive/2009/02/27/crm-4-0-tool-bulk-update-export-to-csv.aspx</guid><description><![CDATA[<div class="ExternalClass71F97F7200064B89947BB64FEC92CBBD"><div><p>One of our customers recently asked to do an update on their instance of the microsoft CRM 4.0 platform.</p>

<p>The goal was to change the current Country Picklist to a lookup field which points to a new_country entity.</p>

<p>The new_country entity contains a few translations of the countries in different languages like english, dutch and french, and the ISO codes for each country.</p>

<p>Try to update that in CRM 4.0. So we start looking. The first thing I came across was the MSCRM 4.0 Bulk Data Export Tool</p>

<p>This tool allows you to export data generated by an advanced find view to a CSV file which you can later on import in CRM 4.0 trhough an update job. So I started playing around with it.</p>

<p>The major issue for me is that with that tool I couldn’t get the lookup field to be populated. I tried a bunch of different things like “account,E52B43A8-5FC6-4934-A5A3-96B2983EE140″ or just the “E52B43A8-5FC6-4934-A5A3-96B2983EE140″ but nothing seemed to work.</p>

<p>So I decided to create a new tool that basically does what i want, without creating an import job. Everything is done through the CRM SDK.</p>

<p>A few things I thought are very cool:
<ul>
    <li>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.</li>
    <li>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.</li>
    <li>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.</li>
    <li>It allows you to choose the Authentication type. You can connect to CRM with Active Directory, SPLA, Passport (this last one I haven’t been able to test so if anybody has a CRM with passport please let me know)</li>
</ul></p>

<p>It is still a work in progress but it does the job quite nice already so try it out.<br>
<a href="http://mscrmbulkupdatetool.codeplex.com/">The CRM Bulk Update / Export Tool</a></p>

<p>I hope it helps some of you in your daily (or not so daily) tasks. <br>I know it saved a colleague of mine about 80% of his time for only one case, and I consider that a big improvement.</p></div></div>]]></description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Wim De Coninck</dc:creator><pubDate>Fri, 27 Feb 2009 19:54:00 GMT</pubDate><category domain="http://www.orbitone.com/en/blog/archive/tags/.NET/default.aspx">.NET</category><category domain="http://www.orbitone.com/en/blog/archive/tags/CRM 4.0/default.aspx">CRM 4.0</category></item><item><title>Public website for EU Issue Tracker</title><link>http://www.orbitone.com/en/blog/archive/2009/02/27/public-website-for-eu-issue-tracker.aspx</link><guid>/en/blog/archive/2009/02/27/public-website-for-eu-issue-tracker.aspx</guid><description><![CDATA[<div class="ExternalClass9B536B5B2BCD487CB138ABBFFBDBBB72"><div><img alt="EU Issue Tracker" src="http://www.orbitone.com/en/blog/Lists/Photos/screenshot-euissuetracker-website.JPG"></div>
<div> </div>
<div>Today we have launched the new website for EU Issue Tracker, the online service to anticipate, monitor and manage EU Legislation &amp; Policy. </div>
<div> </div>
<div>The site is completely developed using Microsoft SharePoint, and integrates with data from the back-end databases.</div>
<div> </div>
<div><a href="http://www.orbitone.com/en/clients/Pages/eu-issue-tracker.aspx">Have a look</a>!</div>
<div> </div>
<div> </div></div>]]></description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Olivier Mangelschots</dc:creator><pubDate>Fri, 27 Feb 2009 19:10:00 GMT</pubDate><category domain="http://www.orbitone.com/en/blog/archive/tags/SharePoint/default.aspx">SharePoint</category></item><item><title>Microsoft TechDays in Belgium, 10-12 March 2009</title><link>http://www.orbitone.com/en/blog/archive/2009/02/16/microsoft-techdays-in-belgium-10-12-march-2009.aspx</link><guid>/en/blog/archive/2009/02/16/microsoft-techdays-in-belgium-10-12-march-2009.aspx</guid><description><![CDATA[<div class="ExternalClassD8AE738E9FBA4EBB93D6A7D3543FB0EA">
<div>
<p class="MsoNormal" style="margin:0cm 0cm 0pt;vertical-align:top;line-height:normal"><span lang="EN-GB" style="font-size:8.5pt;color:black;font-family:'Verdana','sans-serif'">Almost there... As a yearly habit, we are going to TechDays to meet friends, enjoy the food and shape our knowledge.</span></p>
<p class="MsoNormal" style="margin:0cm 0cm 0pt;vertical-align:top;line-height:normal"><span lang="EN-GB" style="font-size:8.5pt;color:black;font-family:'Verdana','sans-serif'">During 3 days, in 60 technical sessions, Microsoft promises a deep-dive on existing and future technologies.</span></p>
<p class="MsoNormal" style="margin:0cm 0cm 10pt"><span lang="EN-GB" style="font-size:8.5pt;color:black;line-height:115%;font-family:'Verdana','sans-serif'">Mel, Tom, Voicu, Wim DC, Wim R, Lieven, Arne and Olivier will be there. See you in Antwerp!</span></p></div>
<div><img alt="TechDays 2009" src="http://www.orbitone.com/en/blog/Lists/Photos/techdays-120x240ani.gif"><br></div>
<div><a href="http://www.microsoft.com/belux/techdays">http://www.microsoft.com/belux/techdays</a></div></div>]]></description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Olivier Mangelschots</dc:creator><pubDate>Mon, 16 Feb 2009 07:50:00 GMT</pubDate><category domain="http://www.orbitone.com/en/blog/archive/tags/TechDays/default.aspx">TechDays</category></item><item><title>Orbit One @ European SharePoint Best Practices Conference</title><link>http://www.orbitone.com/en/blog/archive/2009/02/11/orbit-one-european-sharepoint-best-practices-conference.aspx</link><guid>/en/blog/archive/2009/02/11/orbit-one-european-sharepoint-best-practices-conference.aspx</guid><description><![CDATA[<div class="ExternalClass0B7CAB2DB3154E9B8AA25025F85384F3"><p>From <strong>6 to 8 April</strong> there is a very interesting <strong>conference in</strong> <strong>London</strong>.</p>
<p><img alt="" src="http://www.orbitone.com/en/blog/Lists/Photos/SharePointBestPractices.jpg"></p>
<p>Some very known speakers will be there: Joel Oleson, Andrew Connell, Ben Curry, Bob Fox, Eric Schupps, John Timney, … </p>
<p>The same conference was organized in San Diego, California begin February 2009.<br><br>They promise it's not a typical &quot;blabla&quot; conference, the point is to go beyond introductions and focus on <strong>best practices gathered by on-the-field experience</strong>. </p>
<p><em>Agenda <a href="http://www.sharepointbestpractices.co.uk/Agenda.html"><font color="#0000cc">http://www.sharepointbestpractices.co.uk/Agenda.html</font></a><br></em></p>
<p>From Joel's blog: </p>
<p><img alt="Joel Oleson" src="http://www.orbitone.com/en/blog/Lists/Photos/Joel%20Oleson.jpg"></p>
<p><em>&quot;I think the main difference that really stands out to me on this conference vs other SharePoint conferences is the prescriptive nature of the content, with the real world, case study and experience based emphasis. Speakers are grilled on making sure you cover the true WHY and not focus so much on HOW TO. The content is scrubbed to encourage depth and thought in WHY something should be done or not done.&quot; </em></p>
<p><span style="font-size:14pt"><strong><font color="#5b5454">Orbit One will be there! </font></strong></span></p>
<p>Viktor, Mel, Rik, Bart and Olivier will join the conference in London. Are you coming too? <br><a href="mailto:olivier@orbitone.com"> Let us know </a> so we can have a beer!<br></p>
<div></div></div>]]></description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Olivier Mangelschots</dc:creator><pubDate>Wed, 11 Feb 2009 13:39:00 GMT</pubDate><category domain="http://www.orbitone.com/en/blog/archive/tags/SharePoint/default.aspx">SharePoint</category></item><item><title>New portal www.iec-iab.be has been launched</title><link>http://www.orbitone.com/en/blog/archive/2009/02/27/new-portal-www-iec-iab-be-has-been-launched.aspx</link><guid>/en/blog/archive/2009/02/27/new-portal-www-iec-iab-be-has-been-launched.aspx</guid><description><![CDATA[<div class="ExternalClass613B1F79190F48ADB5E2BA19CA2E4716">
<div><img alt="IAB" src="http://www.orbitone.com/SiteCollectionImages/Project%20Logos/Large/IAB-Big.jpg"></div>
<div> </div>
<div>On February 3rd, 2009 we have proudly launched a new website portal for the Institute of Accountants and Tax Consultants.</div>
<div> </div>
<div>This large SharePoint portal has a public section and a password protected zone with information for the Institute members and internships.</div>
<div> </div>
<div>Microsoft Dynamics CRM 4.0 is used as the central members' directory. It's integrated with SharePoint to provide an automated user account and permission management service.</div>
<div> </div>
<div><a href="http://www.orbitone.com/en/clients/Pages/IEC-IAB.aspx"><strong>Check it out</strong></a>!</div></div>]]></description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Olivier Mangelschots</dc:creator><pubDate>Wed, 04 Feb 2009 18:55:00 GMT</pubDate><category domain="http://www.orbitone.com/en/blog/archive/tags/SharePoint/default.aspx">SharePoint</category><category domain="http://www.orbitone.com/en/blog/archive/tags/CRM 4.0/default.aspx">CRM 4.0</category></item><item><title>Unit testing SharePoint</title><link>http://www.orbitone.com/en/blog/archive/2008/11/25/unit-testing-sharepoint.aspx</link><guid>/en/blog/archive/2008/11/25/unit-testing-sharepoint.aspx</guid><description><![CDATA[<div class="ExternalClassA768E9533E00415D9B45FABC3B48B197"><p>It was previously impossible to mock/fake a SharePoint server which ruled out a full TDD approach or writing unit tests. </p>
<p>Typemock are offering their new product for <a href="http://www.typemock.com/sharepointpage.php?utm_source=sp_bb&amp;utm_medium=blog_4sp&amp;utm_campaign=sp_bb">unit testing SharePoint</a> called Isolator for SharePoint, for a special introduction price. it is the only tool that allows you to <a href="http://www.elilopian.com/2008/11/24/isolator-for-sharepoint-free-license/">unit test SharePoint</a> without a SharePoint server. To learn more <a href="http://www.typemock.com/sharepointpage.php?utm_source=sp_bb&amp;utm_medium=blog_4sp&amp;utm_campaign=sp_bb">click here</a>.</p>
<p><strong>The first 50 bloggers </strong>who blog this text in their blog and tell us about it, will get a <font color="#ff0000">Full Isolator license, Free</font>. for rules and info <a href="http://www.elilopian.com/2008/11/24/isolator-for-sharepoint-free-license/">click here</a>.</p></div>]]></description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Tom Pester</dc:creator><pubDate>Tue, 25 Nov 2008 09:32:00 GMT</pubDate></item><item><title>Windows Vista image deployment</title><link>http://www.orbitone.com/en/blog/archive/2008/11/19/windows-vista-image-deployment.aspx</link><guid>/en/blog/archive/2008/11/19/windows-vista-image-deployment.aspx</guid><description><![CDATA[<div class="ExternalClassF0B302E0FF1F456AA43CE796ED53C1F5">
<div><img alt="Windows Vista" src="http://www.orbitone.com/en/blog/images/windows-vista-logo.jpg"></div>
<div>Migrating an Operating System is a major project that requires careful planning and guidance. To ease the process, Microsoft has provided a number of tools for automating Vista deployments including the Windows Automated Installation Kit (WAIK), the Microsoft Deployment Toolkit 2008 (MDT), Windows Deployment Services (WDS) and the new User State Migration Tool.</div>
<div>There are many guides available on the internet, but we felt they all miss some steps. Therefore we decided to share our internal documentation. The process for our deployment scenario includes: </div>
<ul>
<li>Prepare an USB stick with “Windows PE Boot Disk”</li>
<li>Prepare and capture an image (ImageX)</li>
<li>Manually deploy an image on a single machine (ImageX)</li></ul>
<div>This document does not cover automated deployment of images on multiple computers using tools as ADS.</div>
<div> </div>
<div><a href="http://www.orbitone.com/en/blog/documents/Windows-Vista-Deployment.pdf">download documentation</a> (pdf)<br></div></div>]]></description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Lieven Meys</dc:creator><pubDate>Wed, 19 Nov 2008 09:55:00 GMT</pubDate><category domain="http://www.orbitone.com/en/blog/archive/tags/Vista/default.aspx">Vista</category></item><item><title>jQuery and Microsoft SharePoint</title><link>http://www.orbitone.com/en/blog/archive/2008/11/14/using-jquery-in-sharepoint.aspx</link><guid>/en/blog/archive/2008/11/14/using-jquery-in-sharepoint.aspx</guid><description><![CDATA[<div class="ExternalClass485B4EC24B644B648C157DF712997195">
<p><font size="3"><strong>what is jQuery?</strong></font></p>
<p>jQuery is a lightweight open source JavaScript library (only 15kb in size). </p>
<p>Just recently Microsoft and Nokia announced they will support the JQuery library in their products! Initially they wil integrate it in Visual Studio and use within Microsoft's ASP.NET AJAX framework and ASP.NET MVC Framework. </p>
<p>I'm currently integrating jQuery in MOSS 2007 sites. A first examples is our <a href="http://www.orbitone.com/EN/CLIENTS">client pages</a>. I will soon post some tips.  </p>
<p>
<table style="display:inline;font-size:1em;border-collapse:collapse">
<tbody>
<tr>
<td class="ms-rtetablecells" style="vertical-align:top">
<div><img alt="SharePoint" src="http://www.orbitone.com/en/blog/images/microsoft-office-sharepoint-logo.jpg"></div></td>
<td class="ms-rtetablecells" style="vertical-align:top">
<div><img alt="JQuery" src="http://www.orbitone.com/en/blog/images/jQuery-logo.gif"></div></td></tr></tbody></table></p></div>]]></description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Bart De Jonge</dc:creator><pubDate>Sun, 16 Nov 2008 17:05:00 GMT</pubDate><category domain="http://www.orbitone.com/en/blog/archive/tags/jQuery/default.aspx">jQuery</category><category domain="http://www.orbitone.com/en/blog/archive/tags/SharePoint/default.aspx">SharePoint</category></item><item><title>VASCO Digipass and Juniper SSL VPN</title><link>http://www.orbitone.com/en/blog/archive/2008/11/16/vasco-digipass-and-juniper-ssl-vpn.aspx</link><guid>/en/blog/archive/2008/11/16/vasco-digipass-and-juniper-ssl-vpn.aspx</guid><description><![CDATA[<div class="ExternalClass9AC4955B97254F5496B6BE1A27C390C4">
<div>Some weeks ago I planned to add Digipass token authentication to a Juniper SSL VPN appliance. I expected the configuration to be quite simple. But it took me several hours of digging into the VACMAN Middleware guides, and testing several scenario's before I got it right.</div>
<div> </div>
<div><img alt="VASCO Digipass Go 3" src="http://www.orbitone.com/en/blog/Lists/Photos/vasco_digipass.gif"></div>
<div><br>I decided to make it easier for you! This document can help you get your project up-and-running quickly. Remember that I made choices in this document that might not be the best ones for your situation.</div>
<div><br>This step-by-step guide describes how to:</div>
<ul>
<li>Install Vasco Middleware on your server</li>
<li>Assign Digipass tokens</li>
<li>Configure the policies</li>
<li>Configure Juniper Secure Access SSL VPN</li>
<li>Test configuration and troubleshoot</li></ul>
<div>
<p> <a title="" href="http://www.orbitone.com/en/blog/documents/VASCO-Digipass-Configuration-Juniper-SSL-VPN.pdf"><img class="ms-asset-icon" src="http://www.orbitone.com/_layouts/IMAGES/pdf16.gif" border="0"> VASCO-Digipass-Configuration-Juniper-SSL-VPN.pdf</a></p></div></div>]]></description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Olivier Mangelschots</dc:creator><pubDate>Sun, 16 Nov 2008 16:49:00 GMT</pubDate><category domain="http://www.orbitone.com/en/blog/archive/tags/Digipass/default.aspx">Digipass</category><category domain="http://www.orbitone.com/en/blog/archive/tags/Juniper/default.aspx">Juniper</category></item><item><title>Exchange webservice: Creating a distribution list</title><link>http://www.orbitone.com/en/blog/archive/2008/11/19/Exchange-webservice-Creating-a-distribution-list.aspx</link><guid>/en/blog/archive/2008/11/19/Exchange-webservice-Creating-a-distribution-list.aspx</guid><description><![CDATA[<div class="ExternalClass654285B029E8479CA32ED0A63DAD4DA7">
<p><span>Hello again,<br><br>Today I would like to look into creating a Distribution List through the Exchange Webservice. This is not as straight forward as creating a contact, but it should work none the less. According to <a title="Microsoft Press Inside Microsoft® Exchange Server 2007 Web Services" href="http://safari.oreilly.com/9780735623927/pref02" target="_blank">this book</a> and the documentation found on the internet, it is not possible to accomplish this. But there is a way around. Lets take the scenic route to create a Distribution List J</span> </p>
<p><span>Take a look at the code in the previous post. You can see that - in the method to create the contact - a CreateItemType is instantiated. If you look at the Items property of that variable you can see that the it expects an NonEmptyArrayOfAllItemsType which again has an Items Property. In that property we can store any ItemType we want except a Distribution List, as you can see <a title="CreateItem Operation" href="http://msdn.microsoft.com/en-us/library/aa563797(EXCHG.80).aspx" target="_blank">here</a>. But if we can not insert the DistributionList in a CreateItem, then how the f* are we going to get it to the exchange server. Well we are going to create an ItemType (base class) and use that to set all the properties needed so that exchange and outlook recognizes the Item as a distribution list. Because an ItemType is the base class, it is not provided with any of the properties we need to create a distribution list. That is where the Extended Properties come in handy. Everything needs to be set through those properties.</span> </p>
<p><span>Here are some links with more information on the properties:</span> </p>
<p>
<ul>
<li><a title="MS-OXOCNTC" href="http://msdn.microsoft.com/en-us/library/cc463907(EXCHG.80).aspx" target="_blank">[MS-OXOCNTC]: Contact Object Protocol Specification</a></li>
<li><a title="MS-OXPROPS" href="http://msdn.microsoft.com/en-us/library/cc433490(EXCHG.80).aspx" target="_blank">[MS-OXPROPS]: Exchange Server Protocols Master Property List Specification</a></li></ul>
<p>
<p><span>And you can also still use OutlookSpy which was linked in the previous post.<br>Now for some code.<br>The first thing I'd like to do is declare the path to extended field variables and set them to point to the properties we're going to use. I'll name them all starting with ptef so we can get the quickly through intellisense.</span> </p>
<p><span style="font-size:7.5pt;font-family:'Courier New'"><span style="color:blue">private static </span><span style="color:#2b91af">PathToExtendedFieldType </span><span style="color:black">ptefDisplayName = </span><br><span style="color:blue">   new </span><span style="color:#2b91af">PathToExtendedFieldType</span><br><span style="color:black">{</span><br><span style="color:black">  PropertyTag = </span><span style="color:#a31515">&quot;0x3001&quot;</span><span style="color:black">,</span><br><span style="color:black">  PropertyType = </span><span style="color:#2b91af">MapiPropertyTypeType</span><span style="color:black">.String</span><br><span style="color:black">};</span><br><br><span style="color:blue">private static </span><span style="color:#2b91af">PathToExtendedFieldType </span><span style="color:black">ptefDistributionListName = </span><br><span style="color:blue">   new </span><span style="color:#2b91af">PathToExtendedFieldType</span><br><span style="color:black">{</span><br><span style="color:black">  PropertyId = 0x8053,</span><br><span style="color:black">  PropertyIdSpecified = </span><span style="color:blue">true</span><span style="color:black">,</span><br><span style="color:black">  DistinguishedPropertySetId = </span><span style="color:#2b91af">DistinguishedPropertySetType</span><span style="color:black">.Address,</span><br><span style="color:black">  DistinguishedPropertySetIdSpecified = </span><span style="color:blue">true</span><span style="color:black">,</span><br><span style="color:black">  PropertyType = </span><span style="color:#2b91af">MapiPropertyTypeType</span><span style="color:black">.String</span><br><span style="color:black">};</span><br><br><span style="color:blue">private static </span><span style="color:#2b91af">PathToExtendedFieldType </span><span style="color:black">ptefFileUnder = </span><br><span style="color:blue">   new </span><span style="color:#2b91af">PathToExtendedFieldType</span><br><span style="color:black">{</span><br><span style="color:black">  PropertyId = 0x8005,</span><br><span style="color:black">  PropertyIdSpecified = </span><span style="color:blue">true</span><span style="color:black">,</span><br><span style="color:black">  DistinguishedPropertySetId = </span><span style="color:#2b91af">DistinguishedPropertySetType</span><span style="color:black">.Address,</span><br><span style="color:black">  DistinguishedPropertySetIdSpecified = </span><span style="color:blue">true</span><span style="color:black">,</span><br><span style="color:black">  PropertyType = </span><span style="color:#2b91af">MapiPropertyTypeType</span><span style="color:black">.String</span><br><span style="color:black">};</span><br><br><span style="color:blue">private static </span><span style="color:#2b91af">PathToExtendedFieldType </span><span style="color:black">ptefMembers = </span><br><span style="color:blue">   new </span><span style="color:#2b91af">PathToExtendedFieldType</span><br><span style="color:black">  {</span><br><span style="color:black">  PropertyId = 0x8055,</span><br><span style="color:black">  PropertyIdSpecified = </span><span style="color:blue">true</span><span style="color:black">,</span><br><span style="color:black">  DistinguishedPropertySetId = </span><span style="color:#2b91af">DistinguishedPropertySetType </span><span style="color:black">.Address,</span><br><span style="color:black">  DistinguishedPropertySetIdSpecified = </span><span style="color:blue">true</span><span style="color:black">,</span><br><span style="color:black">  PropertyType = </span><span style="color:#2b91af">MapiPropertyTypeType</span><span style="color:black">.BinaryArray</span><br><span style="color:black">};</span><br><br><span style="color:blue">private static </span><span style="color:#2b91af">PathToExtendedFieldType </span><span style="color:black">ptefOneOffMembers = </span><br><span style="color:blue">   new </span><span style="color:#2b91af">PathToExtendedFieldType </span><br><span style="color:black">{</span><br><span style="color:black">  PropertyId = 0x8054,</span><br><span style="color:black">  PropertyIdSpecified = </span><span style="color:blue">true</span><span style="color:black">,</span><br><span style="color:black">  DistinguishedPropertySetId = </span><span style="color:#2b91af">DistinguishedPropertySetType</span><span style="color:black">.Address,</span><br><span style="color:black">  DistinguishedPropertySetIdSpecified = </span><span style="color:blue">true</span><span style="color:black">,</span><br><span style="color:black">  PropertyType = </span><span style="color:#2b91af">MapiPropertyTypeType</span><span style="color:black">.BinaryArray</span><br><span style="color:black">};</span> </span></p>
<p><span>Let's take a look at these PathToExtendedFieldTypes:</span> 
<ul>
<li>ptefDisplayName: The name of the Distribution List</li>
<li>ptefDistributionListName: The name of the Distribution List</li>
<li>ptefFileUnder: Must be the same as the name of the Distribution List</li>
<li>ptefMembers: <span>The members extended property: This i a list of EntryIds of the objects corresponding to the members of the personal distribution list. Members of the personal distribution list can be other distribution lists, electronic addresses contained in a contact, global address list users or distribution lists, or one-off e-mail addresses. The format of each EntryId MUST be either a one-off EntryId or a Wrapped Entry Id. When setting this property, be sure to ensure its total size is less than 15,000 bytes. Since this property is a BinaryArray type it expects a string Array of Base64 strings. More info can be found in the Protocol Specifications on the MSDN site.</span></li>
<li>ptefOneOffMembers: <span>The property specifies the list of one-off EntryIds corresponding to the members of the personal distribution list. These one-off EntryIds encapsulate display names and e-mail addresses of the personal distribution list members. For each entry in this property, there should be an entry in the Members property. The size of this property must also be less than 15,000 bytes. Since this property is a BinaryArray type it expects a string Array of Base64 strings.</span></li></ul><br><span>How the member entry id and the one off member entry id strings are built can also be found in the protocol specifications.<br>I'll show you how I created the Member Entry Id:<br>First off you'll need the ItemType of the contact we created in the previous post. To do that we can use the FindItemMethod or simply return the ItemType in the previous posts CreateContact method. So let us refactor that method a little bit:</span> 
<p>
<p><span style="font-size:7.5pt;font-family:'Courier New'"><span style="color:blue">private static </span><span style="color:#2b91af">ContactItemType </span><span style="color:black">CreateContact(</span><span style="color:blue">string </span><span style="color:black">pGivenName, </span><span style="color:blue">string </span><span style="color:black">pSurname, </span><span style="color:#2b91af">Gender </span><span style="color:black">pGender, </span><span style="color:blue">string </span><span style="color:black">pTitle)</span><br><span style="color:black">{</span><br><span style="color:#2b91af">  ContactItemType </span><span style="color:black">retval = </span><span style="color:blue">null;</span><br><span style="color:#2b91af">  ContactItemType </span><span style="color:black">contact = </span><span style="color:blue">new </span><span style="color:#2b91af">ContactItemType</span><span style="color:black">();</span><br><span style="color:black">  contact.GivenName = pGivenName;</span><br><span style="color:black">  contact.Surname = pSurname;</span><br><span style="color:black">  contact.DisplayName = contact.Subject = pGivenName + </span><span style="color:#a31515">&quot; &quot;</span><span style="color:black"> + pSurname;</span><br><span style="color:black">  contact.EmailAddresses = </span><span style="color:blue">new </span><span style="color:#2b91af">EmailAddressDictionaryEntryType</span><span style="color:black">[1];</span><br><span style="color:#2b91af">  EmailAddressDictionaryEntryType </span><span style="color:black">email1 = </span><br><span style="color:blue">    new </span><span style="color:#2b91af">EmailAddressDictionaryEntryType</span><span style="color:black">();</span><br><span style="color:black">  email1.Key = </span><span style="color:#2b91af">EmailAddressKeyType</span><span style="color:black">.EmailAddress1;</span><br><span style="color:black">  email1.Value = </span><span style="color:#a31515">&quot;testUser@example.com&quot;</span><span style="color:black">;</span><br><span style="color:black">  contact.EmailAddresses[0] = email1;</span><br><span style="color:black">  contact.ExtendedProperty = </span><span style="color:blue">new </span><span style="color:#2b91af">ExtendedPropertyType</span><span style="color:black">[2];</span><br><span style="color:#2b91af">  ExtendedPropertyType </span><span style="color:black">gender = </span><span style="color:blue">new </span><span style="color:#2b91af">ExtendedPropertyType</span><span style="color:black">();</span><br><span style="color:black">  gender.ExtendedFieldURI = </span><span style="color:blue">new </span><span style="color:#2b91af">PathToExtendedFieldType</span><span style="color:black">();</span><br><span style="color:black">  gender.ExtendedFieldURI.PropertyTag = </span><span style="color:#a31515">&quot;0x3a4d&quot;</span><span style="color:black">;</span><br><span style="color:black">  gender.ExtendedFieldURI.PropertyType = </span><span style="color:#2b91af">MapiPropertyTypeType</span><span style="color:black">.Short;</span><br><span style="color:black">  gender.Item = ((</span><span style="color:blue">int</span><span style="color:black">)pGender).ToString();</span><br><span style="color:#2b91af">  ExtendedPropertyType </span><span style="color:black">title = </span><span style="color:blue">new </span><span style="color:#2b91af">ExtendedPropertyType</span><span style="color:black">();</span><br><span style="color:black">  title.ExtendedFieldURI = </span><span style="color:blue">new </span><span style="color:#2b91af">PathToExtendedFieldType</span><span style="color:black">();</span><br><span style="color:black">  title.ExtendedFieldURI.PropertyTag = </span><span style="color:#a31515">&quot;0x3a45&quot;</span><span style="color:black">;</span><br><span style="color:black">  title.ExtendedFieldURI.PropertyType = </span><span style="color:#2b91af">MapiPropertyTypeType</span><span style="color:black">.String;</span><br><span style="color:black">  title.Item = pTitle;</span><br><span style="color:black">  contact.ExtendedProperty[0] = gender;</span><br><span style="color:black">  contact.ExtendedProperty[1] = title;</span><br><span style="color:#2b91af">  CreateItemType </span><span style="color:black">createItem = </span><span style="color:blue">new </span><span style="color:#2b91af">CreateItemType</span><span style="color:black">();</span><br><span style="color:black">  createItem.Items = </span><span style="color:blue">new </span><span style="color:#2b91af">NonEmptyArrayOfAllItemsType</span><br><span style="color:black">    { <br>      Items = </span><span style="color:blue">new</span><span style="color:black">[] { contact }<br>    };</span><br><span style="color:#2b91af">  DistinguishedFolderIdType </span><span style="color:black">folder = </span><br><span style="color:blue">    new </span><span style="color:#2b91af">DistinguishedFolderIdType</span><span style="color:black">();</span><br><span style="color:black">  folder.Id = </span><span style="color:#2b91af">DistinguishedFolderIdNameType</span><span style="color:black">.contacts;</span><br><span style="color:#2b91af">  TargetFolderIdType </span><span style="color:black">targetFolder = </span><span style="color:blue">new </span><span style="color:#2b91af">TargetFolderIdType</span><span style="color:black">();</span><br><span style="color:black">  targetFolder.Item = folder;</span><br><span style="color:black">  createItem.SavedItemFolderId = targetFolder;</span><br><span style="color:blue">  var </span><span style="color:black">response = esb.CreateItem(createItem);</span><br><span style="color:rgb(0,128,0)">  //There is only one item in the createItem <br>  //so the line below should work in this case</span><br><span style="color:blue">  if </span><span style="color:black">(response.ResponseMessages.Items[0].ResponseClass == </span><br><span style="color:#2b91af">      ResponseClassType</span><span style="color:black">.Success)</span><br><span style="color:black">  {</span><br><span style="color:#2b91af">    ItemInfoResponseMessageType </span><span style="color:black">rmt = <br>      (</span><span style="color:#2b91af">ItemInfoResponseMessageType</span><span style="color:black">)response.ResponseMessages.Items[0];</span><br><span style="color:black">    retval = (</span><span style="color:#2b91af">ContactItemType</span><span style="color:black">)rmt.Items.Items[0];</span><br><span style="color:black">  }</span><br><span style="color:blue">  return </span><span style="color:black">retval;</span><br><span style="color:black">}</span> </span></p>
<p><span>To create a Distribution List with members you will need to find the EntryId when all we have is the ItemId and we want it in a Hex format. To achieve this I want to use the ConvertId Method on the ExchangeServiceBinding. The convertId Method accepts a ConvertIdType as a parameter. The ConvertIdType properties that are used here are the sourceIds and the destinationFormat. They kinda speak for themselves.<br><br>Lets take a look at some code again.</span> </p>
<p><span style="font-size:7.5pt;font-family:'Courier New'"><span style="color:blue">private static string </span><span style="color:black">CreateMemberEntryId(</span><span style="color:#2b91af">ItemType </span><span style="color:black">item)</span><br><span style="color:black">{</span><br><span style="color:blue">  byte</span><span style="color:black">[] retval = </span><span style="color:blue">new byte</span><span style="color:black">[0];</span><br><span style="color:blue">  string </span><span style="color:black">WrappedEntryIDPrefix = </span><br>      <span style="color:#a31515">&quot;00000000C091ADD3519DCF11A4A900AA0047FAA4C3&quot;</span><span style="color:black">;</span><br><span style="color:#2b91af">  ConvertIdType </span><span style="color:black">convertReq = </span><span style="color:blue">new </span><span style="color:#2b91af">ConvertIdType</span><span style="color:black">();</span><br><span style="color:black">  convertReq.DestinationFormat = IdFormatType.HexEntryId;</span><br><span style="color:black">  convertReq.SourceIds = </span><span style="color:blue">new</span><span style="color:black">[]</span><br><span style="color:black">  {</span> <span style="color:blue">     new </span><span style="color:#2b91af">AlternateIdType</span><span style="color:black">()</span><br><span style="color:black">     {</span><br><span style="color:black">        Format = </span><span style="color:#2b91af">IdFormatType</span><span style="color:black">.EntryId,</span><br><span style="color:black">        Id = item.ItemId.Id</span><br><span style="color:black">     }</span><br><span style="color:black">  };</span><br><span style="color:blue">  try</span><br><span style="color:black">  {</span><br><span style="color:#2b91af">    ConvertIdResponseType </span><span style="color:black">response = esb.ConvertId(convertReq);</span><br><span style="color:#2b91af">    ArrayOfResponseMessagesType </span><span style="color:black">aormt = response.ResponseMessages;</span><br><span style="color:#2b91af">    ResponseMessageType</span><span style="color:black">[] rmta = aormt.Items;</span><br><span style="color:blue">    foreach </span><span style="color:black">(</span><span style="color:#2b91af">ConvertIdResponseMessageType </span><span style="color:black">resp </span><span style="color:blue">in </span><span style="color:black">rmta)</span><br><span style="color:black">    {</span><br><span style="color:blue">      if </span><span style="color:black">(resp.ResponseClass == </span><span style="color:#2b91af">ResponseClassType</span><span style="color:black">.Success)</span><br><span style="color:black">      {</span><br><span style="color:#2b91af">        ConvertIdResponseMessageType </span><span style="color:black">cirmt = resp;</span><br><span style="color:#2b91af">        AlternateIdType </span><span style="color:black">myId = (cirmt.AlternateId </span><span style="color:blue">as</span><span style="color:#2b91af"> AlternateIdType</span><span style="color:black">);</span><br><span style="color:blue">        if </span><span style="color:black">(myId != </span><span style="color:blue">null</span><span style="color:black">)</span><br><span style="color:black">        {</span><br><span style="color:rgb(0,128,0)">        //Strip the last 48 bytes (96 chars) <br>        //this is actually the folderId.</span><br><span style="color:rgb(0,128,0)">        //Strip the first 7 bytes.</span><br><span style="color:rgb(0,128,0)">        //then remove 1 byte right after the actual entryId (40 bytes)</span><br><span style="color:rgb(0,128,0)">        //then the ChangeKey follows (in the rest of the string).</span><br><span style="color:#2b91af">           StringBuilder </span><span style="color:black">sb = </span><span style="color:blue">new </span><span style="color:#2b91af">StringBuilder</span><span style="color:black">();</span><br><span style="color:black">           sb.Append(WrappedEntryIDPrefix);</span><br><span style="color:black">           sb.Append(</span><span style="color:#a31515">&quot;00000000&quot;</span><span style="color:black">);</span><br><span style="color:black">           sb.Append(myId.Id.Substring(14, 84));</span><br><span style="color:black">           sb.Append(myId.Id.Substring(100, myId.Id.Length - 196));</span><br><span style="color:black">           retval = sb.ToString().ToByteArray();</span><br><span style="color:black">        }</span><br><span style="color:black">      }</span><br><span style="color:blue">      else if </span><span style="color:black">(resp.ResponseClass == </span><span style="color:#2b91af">ResponseClassType.Error</span><span style="color:black">)</span><br><span style="color:black">      {</span><br><span style="color:rgb(0,128,0)">      //TODO error Logging</span><br><span style="color:black">      }</span><br><span style="color:blue">      else</span><br><span style="color:black">      {</span><br><span style="color:rgb(0,128,0)">      //TODO warning logging</span><br><span style="color:black">      }</span><br><span style="color:black">    }</span><br><span style="color:black">  }</span><br><span style="color:blue">  catch </span><span style="color:black">(</span><span style="color:#2b91af">Exception </span><span style="color:black">e)</span><br><span style="color:black">  {</span><br><span style="color:rgb(0,128,0)">    //TODO error logging</span><br><span style="color:black">  }</span><br><span style="color:blue">  return </span><span style="color:#2b91af">Convert</span><span style="color:black">.ToBase64String(retval);</span><br><span style="color:black">}</span><br></span></p>
<p><span>You can see in previous code block that there is some comment:<br>Strip the last 48 bytes (96 chars) - this is actually the folderId.<br>Strip the first 7 bytes.<br>Then remove 1 byte right after the actual entryId (40 bytes)<br>Then the ChangeKey follows (in the rest of the string).<br><br>Don't pay to much attention to this for the moment. If you want more information about this check out <a title="MS-OXOCNTC" href="http://msdn.microsoft.com/en-us/library/cc463907(EXCHG.80).aspx" target="_blank">[MS-OXOCNTC]: Contact Object Protocol Specification</a>. The WrappedEntryIDPrefix is a fixed string except the last 2 characters. What it stands for you see in the protocol specification but in the MS-OXOMSG pdf.<br><br>They represent a bit settings which specifies what kind of email address the entry id is going to be. So if you change that you could be talking about another distribution list for instance.<br><br>We are going to use this MemberEntryId and Members extended property of a distribution list. As said before we'll need the OneOffMembers entry's also so we can put them in the same position as the MemberEntryId. The OneOffMembers entry is a bit less complicated.</span> </p>
<p><span style="font-size:7.5pt;font-family:'Courier New'"><span style="color:blue">private static string </span><span style="color:black">CreateOneOffMemberEntryId(</span><span style="color:#2b91af">ContactItemType </span><span style="color:black">contact)</span><br><span style="color:black">{</span><br><span style="color:blue">  var </span><span style="color:black">retval = </span><span style="color:blue">new </span><span style="color:#2b91af">List&lt;</span><span style="color:blue">byte</span><span style="color:black">&gt;();</span><br><span style="color:blue">  var </span><span style="color:black">flags = </span><span style="color:#2b91af">Encoding</span><span style="color:black">.Unicode.GetBytes(</span><span style="color:#a31515">&quot;&quot;</span><span style="color:black">);</span><br><span style="color:blue">  var </span><span style="color:black">version = </span><span style="color:#2b91af">Encoding</span><span style="color:black">.Unicode.GetBytes(</span><span style="color:#a31515">&quot;&quot;</span><span style="color:black">);</span><br><span style="color:blue">  var </span><span style="color:black">pad = </span><span style="color:#2b91af">Encoding</span><span style="color:black">.Unicode.GetBytes(</span><span style="color:#a31515">&quot;&quot;</span><span style="color:black">);</span><br><span style="color:blue">  var </span><span style="color:black">muid = </span><span style="color:blue">new byte[]</span><br><span style="color:black">  {</span><br><span style="color:black">    0x81, 0x2b, 0x1f, 0xa4, 0xbe,</span><br><span style="color:black">    0xa3, 0x10, 0x19, 0x9d, 0x6e,</span><br><span style="color:black">    0x00, 0xdd, 0x01, 0x0f, 0x54, 0x02</span><br><span style="color:black">  };</span><br><span style="color:blue">  var </span><span style="color:black">wFlags = </span><span style="color:blue">new byte</span><span style="color:black">[] {0x01, 0x90};</span><br><span style="color:blue">  var </span><span style="color:black">first = </span><span style="color:#2b91af">Encoding</span><span style="color:black">.Unicode.GetBytes(contact.Subject + </span><span style="color:#a31515">&quot;(&quot; </span><span style="color:black">+ contact.EmailAddresses[0].Value + </span><span style="color:#a31515">&quot;)&quot;</span><span style="color:black">);</span><br><span style="color:blue">  var </span><span style="color:black">middle = </span><span style="color:#2b91af">Encoding</span><span style="color:black">.Unicode.GetBytes(</span><span style="color:#a31515">&quot;UNKNOWN&quot;</span><span style="color:black">);</span><br><span style="color:blue">  var </span><span style="color:black">last = </span><span style="color:#2b91af">Encoding</span><span style="color:black">.Unicode.GetBytes(contact.EmailAddresses[0].Value);</span><br><span style="color:black">  retval.AddRange(flags);</span><br><span style="color:black">  retval.AddRange(muid);</span><br><span style="color:black">  retval.AddRange(version);</span><br><span style="color:black">  retval.AddRange(wFlags);</span><br><span style="color:black">  retval.AddRange(first);</span><br><span style="color:black">  retval.AddRange(pad);</span><br><span style="color:black">  retval.AddRange(middle);</span><br><span style="color:black">  retval.AddRange(pad);</span><br><span style="color:black">  retval.AddRange(last);</span><br><span style="color:black">  retval.AddRange(pad);</span><br><span style="color:blue">  return </span><span style="color:#2b91af">Convert</span><span style="color:black">.ToBase64String(retval.ToArray());</span><br><span style="color:black">}</span><br></span></p>
<p><span>Here we only need some actual strings from the contact to create the One Off Members entry. All the values except for wFlags, first, middle and last have fixed values. The wFlags should be changed to 0x8001 if you want to specify a distribution list. So it should read like this:</span> </p>
<p><span style="font-size:7.5pt;font-family:'Courier New'"><span style="color:blue">var </span><span style="color:black">wFlags = </span><span style="color:blue">new byte</span><span style="color:black">[] {0x01, 0x80};</span><br><span style="color:blue">var </span><span style="color:black">first = </span><span style="color:#2b91af">Encoding</span><span style="color:black">.Unicode.GetBytes(distributionlist.Subject);</span><br><span style="color:blue">var </span><span style="color:black">middle = </span><span style="color:#2b91af">Encoding</span><span style="color:black">.Unicode.GetBytes(</span><span style="color:#a31515">&quot;MAPIPDL&quot;</span><span style="color:black">);</span><br><span style="color:blue">var </span><span style="color:black">last = </span><span style="color:#2b91af">Encoding</span><span style="color:black">.Unicode.GetBytes(</span><span style="color:#a31515">&quot;Unknown&quot;</span><span style="color:black">);</span><br></span></p>
<p><span>Now to actually create a distribution list with members we'll need to create an Item that has all the correct Extended Properties:</span> </p>
<p><span style="font-size:7.5pt;font-family:'Courier New'"><span style="color:blue">private static void </span><span style="color:black">CreateDistributionList(</span><span style="color:blue">string </span><span style="color:black">name, </span><span style="color:blue">string </span><span style="color:black">description, </span><span style="color:#2b91af">ContactItemType </span><span style="color:black">contact)</span><br><span style="color:black">{</span><br><span style="color:#2b91af">  ItemType </span><span style="color:black">list = </span><span style="color:blue">new </span><span style="color:#2b91af">ItemType</span><span style="color:black">();</span><br><span style="color:black">  list.ItemClass = </span><span style="color:#a31515">&quot;IPM.DistList&quot;</span><span style="color:black">;</span><br><span style="color:black">  list.Subject = name;</span><br><span style="color:black">  list.Body = </span><span style="color:blue">new </span><span style="color:#2b91af">BodyType </span><br><span style="color:black">   { BodyType1 = </span><span style="color:#2b91af">BodyTypeType</span><span style="color:black">.Text, <br>   Value = description };</span><br><span style="color:#2b91af">  List</span><span style="color:black">&lt;</span><span style="color:blue">string</span><span style="color:black">&gt; members = </span><span style="color:blue">new </span><span style="color:#2b91af">List</span><span style="color:black">&lt;</span><span style="color:blue">string</span><span style="color:black">&gt;();</span><br><span style="color:#2b91af">  List</span><span style="color:black">&lt;</span><span style="color:blue">string</span><span style="color:black">&gt; oneOffMembers = </span><span style="color:blue">new </span><span style="color:#2b91af">List</span><span style="color:black">&lt;</span><span style="color:blue">string</span><span style="color:black">&gt;();</span><br><span style="color:black">  members.Add(CreateMemberEntryId(contact));</span><br><span style="color:black">  members.Add(CreateOneOffMemberEntryId(contact));</span><br><span style="color:#2b91af">  List</span><span style="color:black">&lt;</span><span style="color:#2b91af">ExtendedPropertyType</span><span style="color:black">&gt; eProps = </span><br><span style="color:blue">    new </span><span style="color:#2b91af">List</span><span style="color:black">&lt;</span><span style="color:#2b91af">ExtendedPropertyType</span><span style="color:black">&gt;();</span><br><span style="color:black">  eProps.Add(</span><span style="color:blue">new </span><span style="color:#2b91af">ExtendedPropertyType</span><br><span style="color:black">  {</span><br><span style="color:black">    ExtendedFieldURI = ptefDisplayName,</span><br><span style="color:black">    Item = name</span><br><span style="color:black">  });</span><br><span style="color:black">  eProps.Add(</span><span style="color:blue">new </span><span style="color:#2b91af">ExtendedPropertyType</span><br><span style="color:black">  {</span><br><span style="color:black">    ExtendedFieldURI = ptefDistributionListName,</span><br><span style="color:black">    Item = name</span><br><span style="color:black">  });</span><br><span style="color:black">  eProps.Add(</span><span style="color:blue">new </span><span style="color:#2b91af">ExtendedPropertyType</span><br><span style="color:black">  {</span><br><span style="color:black">    ExtendedFieldURI = ptefFileUnder,</span><br><span style="color:black">    Item = name</span><br><span style="color:black">  });</span><br><span style="color:black">  eProps.Add(</span><span style="color:blue">new </span><span style="color:#2b91af">ExtendedPropertyType</span><br><span style="color:black">  {</span><br><span style="color:black">    ExtendedFieldURI = ptefMembers,</span><br><span style="color:black">    Item = </span><span style="color:blue">new </span><span style="color:#2b91af">NonEmptyArrayOfPropertyValuesType</span><br><span style="color:black">    {</span><br><span style="color:black">      Items = members.ToArray()</span><br><span style="color:black">    }</span><br><span style="color:black">  });</span><br><span style="color:black">  eProps.Add(</span><span style="color:blue">new </span><span style="color:#2b91af">ExtendedPropertyType</span><br><span style="color:black">  {</span><br><span style="color:black">    ExtendedFieldURI = ptefOneOffMembers,</span><br><span style="color:black">    Item = </span><span style="color:blue">new </span><span style="color:#2b91af">NonEmptyArrayOfPropertyValuesType</span><br><span style="color:black">  {</span><br><span style="color:black">    Items = oneOffMembers.ToArray()</span><br><span style="color:black">  }</span><br><span style="color:black">  });</span><br><span style="color:black">  list.ExtendedProperty = eProps.ToArray();</span><br><span style="color:black">}</span></span></p>
<p><span style="font-size:7.5pt;font-family:'Courier New'"><span style="color:black"></span><strong><font color="#ff0000">UPDATE</font></strong></span></p>
<p><font color="#000000">I recently noticed that their are some errors in the CreateMemberEntryId. The best method is to retrieve the contact from the exchange store and ask for the entryId in the extended properties. In my experience this has much more performance and the created WrappedEntryId is correct. So the code will be more like following:</font></p>
<div style="font-size:7.5pt;background:white;color:black;font-family:Courier New"><span style="color:blue">private</span> <span style="color:blue">string</span> GetMemberEntryId(<span style="color:#2b91af">ItemType</span> item, <span style="color:#2b91af">EmailAddressKeyType</span> emailAddressKey)<br>    {<br>      <span style="color:blue">if</span> (item == <span style="color:blue">null</span>) <br><span style="color:blue">        throw</span> <span style="color:blue">new</span> <span style="color:#2b91af">ArgumentNullException</span>(<span style="color:#a31515">&quot;item&quot;</span>);<br> <br>      <span style="color:blue">string</span> WrappedEntryIDPrefix = <span style="color:blue">null</span>;<br>      <span style="color:blue">if</span> (item <span style="color:blue">is</span> <span style="color:#2b91af">ContactItemType</span>)<br>      {<br>        <span style="color:blue">switch</span> (emailAddressKey)<br>        {<br>          <span style="color:blue">case</span> <span style="color:#2b91af">EmailAddressKeyType</span>.EmailAddress2:<br>            WrappedEntryIDPrefix = <span style="color:#a31515">&quot;D3&quot;</span>;<br>            <span style="color:blue">break</span>;<br>          <span style="color:blue">case</span> <span style="color:#2b91af">EmailAddressKeyType</span>.EmailAddress3:<br>            WrappedEntryIDPrefix = <span style="color:#a31515">&quot;E3&quot;</span>;<br>            <span style="color:blue">break</span>;<br>          <span style="color:blue">default</span>:<br>            WrappedEntryIDPrefix = <span style="color:#a31515">&quot;C3&quot;</span>;<br>            <span style="color:blue">break</span>;<br>        }<br>      }<br>      <span style="color:blue">if</span> (item <span style="color:blue">is</span> <span style="color:#2b91af">DistributionListType</span>) <br>        WrappedEntryIDPrefix = <span style="color:#a31515">&quot;B4&quot;</span>;<br> <br>      WrappedEntryIDPrefix = <span style="color:#a31515">&quot;00000000C091ADD3519DCF11A4A900AA0047FAA4&quot;</span> + WrappedEntryIDPrefix;<br>      <span style="color:blue">var</span> retval = WrappedEntryIDPrefix + <br>         <span style="color:#2b91af">Convert</span>.FromBase64String(item.ExtendedProperty<br>         [item.ExtendedProperty.Length - 1].Item<br>         .ToString()).ToMyString();<br>      <span style="color:blue">return</span> <span style="color:#2b91af">Convert</span>.ToBase64String(retval.ToByteArray());<br>    }<br></div><br>The ToMyString() extension method: <br>
<div style="font-size:7.5pt;background:white;color:black;font-family:Courier New"><span style="color:blue">public</span> <span style="color:blue">static</span> <span style="color:blue">string</span> ToMyString(<span style="color:blue">this</span> <span style="color:blue">byte</span>[] bytes)<br>    {<br>      <span style="color:#2b91af">StringBuilder</span> sb = <span style="color:blue">new</span> <span style="color:#2b91af">StringBuilder</span>();<br> <br>      bytes.ForEach(b =&gt; sb.Append(b.ToString(<span style="color:#a31515">&quot;X&quot;</span>).PadLeft(2,<span style="color:#a31515">'0'</span>).ToUpper()));<br> <br>      <span style="color:blue">return</span> sb.ToString();<br>    }</div>
<div style="font-size:7.5pt;background:white;color:black;font-family:Courier New"> </div><span>
<p><strong><font color="#ff0000">UPDATE 2:</font></strong></p>
<p><font color="#000000">Microsoft recently released the <a href="http://support.microsoft.com/kb/952580">Update Rollup 4 for Exchange Server 2007 Service Pack 1 </a></font></p>
<p>In this document you will see a link that directs you to the <a href="http://support.microsoft.com/kb/957133/">description of improvements in functionality that occur in Exchange Web Services operations</a></p>
<p>It reads: When you use this operation, it returns items that do not have a strong schema type as &quot;messages&quot; instead of as &quot;items.&quot;</p>
<p>From this we can deduce that the code above has to change a bit. In the createDistributionList we used an ItemType. This has to change to a MessageType. An other thing we need to set is the MessageDispositionType to the CreateItem. This will be SaveOnly in most cases (especially when we are talking about distribution lists).</p>
<p> </p></span>
<p><span>As you can probably see in the code this is not ready to ship...<br><br>There is alot more exception handling to be done and so forth, but in order to keep this document a bit more to the point I've skipped those parts.</span> </p></div>]]></description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Wim De Coninck</dc:creator><pubDate>Mon, 06 Oct 2008 14:50:00 GMT</pubDate><category domain="http://www.orbitone.com/en/blog/archive/tags/.NET/default.aspx">.NET</category><category domain="http://www.orbitone.com/en/blog/archive/tags/Exchange webservice/default.aspx">Exchange webservice</category><category domain="http://www.orbitone.com/en/blog/archive/tags/Visual Studio/default.aspx">Visual Studio</category></item><item><title>Exchange webservice: Adding a contact</title><link>http://www.orbitone.com/en/blog/archive/2008/11/19/Exchange-webservice-adding-a-contact.aspx</link><guid>/en/blog/archive/2008/11/19/Exchange-webservice-adding-a-contact.aspx</guid><description><![CDATA[<div class="ExternalClass76D5FEED3BD14BF09E3C08164FE7A9C9">
<p><span>During the past 2 weeks or so I've been experimenting with the Exchange Webservice (in Exchange 2007 SP1).</span> </p>
<p><span>I've been trying to create a contact in the contacts folder of a user (testuser). I came accross some problems while trying to accomplish this. Specifically when I tried to set properties that are actually used by Outlook (client properties) and which are not necessarily used by Exchange 2007. But you can still access and even create properties all you want. Lets kick this blog off with the basics of working with the ews (Exchange WebService).</span> </p>
<p><span>Some ground work:</span> </p>
<ul>
<li>Create a new console app. 
<li>Add the Web Reference to your Exchange Webservice (eg.: http://myMailServer/ews/Exchange.Asmx) and lets name it ExchangeService.</li>
<li>Add the using to the ExchangeService</li></li></ul>
<p><span>Now we can go and add a private member</span> </p>
<p><span style="font-size:7.5pt;font-family:'Courier New'"><span style="color:blue">private static</span> <span style="color:#2b91af">ExchangeServiceBinding</span> <span style="color:black">esb;</span> </span></p>
<p><span>Initialize the ExchangeServiceBinding. You can insert credentials here in case of a https connection as seen in the example below.</span> </p>
<p><span style="font-size:7.5pt;font-family:'Courier New'"><span style="color:black">esb = </span><span style="color:blue">new </span><span style="color:#2b91af">ExchangeServiceBinding</span><br><span style="color:black">{</span><br><span style="color:black">   Credentials = </span><span style="color:blue">new </span><span style="color:#2b91af">NetworkCredential</span><br><span style="color:black">   {</span><br><span style="color:black">      Domain = </span><span style="color:#a31515">&quot;example.com&quot;</span><span style="color:black">,</span><br><span style="color:black">      UserName = </span><span style="color:#a31515">&quot;testUser&quot;</span><span style="color:black">,</span><br><span style="color:black">      Password = </span><span style="color:#a31515">&quot;p455w0rd&quot;</span><br><span style="color:black">   },</span><br><span style="color:black">   Url = </span><span style="color:#a31515">https://192.168.2.143/EWS/Exchange.asmx</span><br><span style="color:black">};</span><br><span style="color:black">esb.RequestServerVersionValue = </span><span style="color:blue">new </span><span style="color:#2b91af">RequestServerVersion</span><span style="color:black">();</span><br><span style="color:black">esb.RequestServerVersionValue.Version = </span><br><span style="color:#2b91af">   ExchangeVersionType</span><span style="color:black">.Exchange2007_SP1;</span> </span></p>
<p><span>As you can see in above code you need to set the server version, please do not ommit these 2 lines. If you do your code probably won't work. In some cases you will get an error like this: </span></p>
<p><span>System.Web.Services.Protocols.SoapException: The request is valid but does not specify the correct server version in the RequestServerVersion SOAP header. Ensure that the RequestServerVersion SOAP header is set with the correct RequestServerVersionValue.</span></p>
<p><span>Now that we have the base of the application we can start concentrating on creating a contact, so we're going to create a method that does just that for us.</span></p>
<p><span style="font-size:7.5pt;font-family:'Courier New'"><span style="color:blue">private static void </span><span style="color:black">CreateContact (</span><span style="color:blue">string </span><span style="color:black">givenName, </span><span style="color:blue">string </span><span style="color:black">surname)</span><br><span style="color:black">{</span><br><span style="color:blue">  var</span><span style="color:black"> contact = </span><span style="color:blue">new </span><span style="color:#2b91af">ContactItemType</span><span style="color:black">();</span><br><span style="color:black">  contact.GivenName = givenName;</span><br><span style="color:black">  contact.Surname = surname;</span><br><span style="color:black">  contact.DisplayName = contact.Subject = givenName + </span><span style="color:#a31515">&quot; &quot;</span><span style="color:black"> + surname;</span><br><span style="color:black">  contact.EmailAddresses = </span><span style="color:blue">new </span><span style="color:#2b91af">EmailAddressDictionaryEntryType</span><span style="color:black">[1];</span><br><span style="color:blue">  var </span><span style="color:black">email1 = </span><span style="color:blue">new </span><span style="color:#2b91af">EmailAddressDictionaryEntryType</span><span style="color:black">();</span><br><span style="color:black">  email1.Key = </span><span style="color:#2b91af">EmailAddressKeyType</span><span style="color:black">.EmailAddress1;</span><br><span style="color:black">  email1.Value = </span><span style="color:#a31515">&quot;testUser@example.com&quot;</span><span style="color:black">;</span><br><span style="color:black">  contact.EmailAddresses[0] = email1;</span><br><span style="color:blue">  var </span><span style="color:black">createItem = </span><span style="color:blue">new </span><span style="color:#2b91af">CreateItemType</span><span style="color:black">();</span><br><span style="color:black">  createItem.Items = </span><span style="color:blue">new </span><span style="color:#2b91af">NonEmptyArrayOfAllItemsType</span><br><span style="color:black">    {</span><br><span style="color:black">       Items = </span><span style="color:blue">new</span><span style="color:black">[] { contact }</span><br><span style="color:black">    };</span><br><span style="color:blue">  var </span><span style="color:black">folder = </span><span style="color:blue">new </span><span style="color:#2b91af">DistinguishedFolderIdType</span><span style="color:black">();</span><br><span style="color:black">  folder.Id = </span><span style="color:#2b91af">DistinguishedFolderIdNameType</span><span style="color:black">.contacts;</span><br><span style="color:blue">  var </span><span style="color:black">targetFolder = </span><span style="color:blue">new </span><span style="color:#2b91af">TargetFolderIdType</span><span style="color:black">();</span><br><span style="color:black">  targetFolder.Item = folder;</span><br><span style="color:black">  createItem.SavedItemFolderId = targetFolder;</span><br><span style="color:blue">  var </span><span style="color:black">response = esb.CreateItem(createItem);</span><br><span style="color:black">}</span> </span></p>
<p><span>You'll see the contact being created in you testUser's contacts folder.<br>If you don't fill out the DisplayName, the contact will complain about it in outlook when you open the contact and then close it without editing anything. Outlook will try to save the contact item although we did not change anything.</span> </p>
<p><span>This was fairly easy to achieve, but just try to fill out all the contact's porperties you need. You'll soon find out that you need to use Extended Properties, because not all the properties are available on the ContactItemType type. I'll show you how to add 2 Extended Properties. Firstly the Gender of the contact and secondly the Title. Insert following somewhere before the instantiation of the CreateItemType createItem.</span> </p>
<p><span style="font-size:7.5pt;font-family:'Courier New'"><span style="color:black">contact.ExtendedProperty = </span><span style="color:black"> </span><span style="color:blue">new</span><span style="color:black"> </span><span style="color:#2b91af">ExtendedPropertyType</span><span style="color:black">[2];</span><br><span style="color:blue">var </span><span style="color:black">gender = </span><span style="color:blue">new </span><span style="color:#2b91af">ExtendedPropertyType</span><span style="color:black">();</span><br><span style="color:black">gender.ExtendedFieldURI = </span><span style="color:blue">new </span><span style="color:#2b91af">PathToExtendedFieldType</span><span style="color:black">();</span><br><span style="color:black">gender.ExtendedFieldURI.PropertyTag = </span><span style="color:#a31515">&quot;0x3a4d&quot;</span><span style="color:black">;</span><br><span style="color:black">gender.ExtendedFieldURI.PropertyType = </span><span style="color:#2b91af">MapiPropertyTypeType</span><span style="color:black">.Short;</span><br><span style="color:black">gender.Item = </span><span style="color:#a31515">&quot;1&quot;</span><span style="color:black">;</span><br><span style="color:blue">var </span><span style="color:black">title = </span><span style="color:blue">new </span><span style="color:#2b91af">ExtendedPropertyType</span><span style="color:black">();</span><br><span style="color:black">title.ExtendedFieldURI = </span><span style="color:blue">new </span><span style="color:#2b91af">PathToExtendedFieldType</span><span style="color:black">();</span><br><span style="color:black">title.ExtendedFieldURI.PropertyTag = </span><span style="color:#a31515">&quot;0x3a45&quot;</span><span style="color:black">;</span><br><span style="color:black">title.ExtendedFieldURI.PropertyType = </span><span style="color:#2b91af">MapiPropertyTypeType</span><span style="color:black">.String;</span><br><span style="color:black">title.Item = </span><span style="color:#a31515">&quot;Dr.&quot;</span><span style="color:black">;</span><br><span style="color:black">contact.ExtendedProperty[0] = gender;</span><br><span style="color:black">contact.ExtendedProperty[1] = title;</span><br></span></p>
<p><span>As you can see both these Extended Properties have a PropertyTag. This is not always the case. In other properties you'll need to use the PropertyId and DistinguisedPropertyId, but we'll see samples of that in a later post in which I am going to discuss how you need to create a DistributionList with the contact created here as the only member.</span> </p>
<p><span>The Property Tags and Ids can be found in the pdf's concerning the <a title="exchange protocols on msdn" href="http://msdn.microsoft.com/en-us/library/cc425499(EXCHG.80).aspx" target="_blank">exchange protocol on MSDN</a> or through a nice tool that helped me alot these past weeks: <a title="OutlookSpy" href="http://www.dimastr.com/outspy/" target="_blank">OutlookSpy</a>.</span></p>
<p><span>That's it for now. I hope it was clear and helpfull in some way. If you have questions or remarks, do not hesitate to post a comment.</span> </p></div>]]></description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Wim De Coninck</dc:creator><pubDate>Thu, 25 Sep 2008 16:05:00 GMT</pubDate><category domain="http://www.orbitone.com/en/blog/archive/tags/.NET/default.aspx">.NET</category><category domain="http://www.orbitone.com/en/blog/archive/tags/Visual Studio/default.aspx">Visual Studio</category><category domain="http://www.orbitone.com/en/blog/archive/tags/Exchange webservice/default.aspx">Exchange webservice</category></item><item><title>OAuth for authorization</title><link>http://www.orbitone.com/en/blog/archive/2008/07/22/post-5.aspx</link><guid>/en/blog/archive/2008/07/22/post-5.aspx</guid><description><![CDATA[<div class="ExternalClassAB212333502542B195ED23A82A518F9B">
<div>
<p>What OpenID is for authentication is OAuth for authorization. So much for the probably over simplified intro.</p>
<p>The OAuth protocol is getting some momentum but is currently not so &quot;big&quot; as OpenID. Still, it's being mentioned more and more.</p>
<p>A use case scenario :<br>OAuth is defined as a “an open protocol to allow secure API authentication in a simple and standard method”. Don’t be tempted to think that OAuth implies “open authentication”. It doesn’t. It is closer to “open authorization”. Let’s say you are registering as a delegate on a conference website. With OAuth it is possible for the conference website to automatically add the event to your google calendar or yahoo calendar with your consent (assuming google and yahoo support OAuth). How does it work ? Well, once you decide to let the conference website add an event to your google calendar, you get redirected to google. On google , you explicitly authorize the conference website to modify your calendar. After this authorization, the conference website will have permission to modify your calendar data.</p>
<p>More info<br><a href="http://portalzone.blogspot.com/2007/12/openid-oauth-complimentary-or-competing.html">http://portalzone.blogspot.com/2007/12/openid-oauth-complimentary-or-competing.html</a></p>
<p><a href="http://oauth.net/">http://oauth.net</a></p></div></div>]]></description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Bart De Jonge</dc:creator><pubDate>Tue, 22 Jul 2008 16:57:00 GMT</pubDate><category domain="http://www.orbitone.com/en/blog/archive/tags/OpenID/default.aspx">OpenID</category><category domain="http://www.orbitone.com/en/blog/archive/tags/OAuth/default.aspx">OAuth</category></item><item><title>.NET 3.5, Visual Studio and TFS SP1 released</title><link>http://www.orbitone.com/en/blog/archive/2008/07/22/NET-3.5-released.aspx</link><guid>/en/blog/archive/2008/07/22/NET-3.5-released.aspx</guid><description><![CDATA[<div class="ExternalClass21CF9EBDE5EE4E0F97527CDEF8D3C626">
<div>This includes among other things : </div>
<ul>
<li>The Entity Framework </li>
<li>ADO.NET Data Services</li>
<li>Dynamic Data</li></ul>
<div>Good to know : SQL Server 2008 requires VS 2008 SP1 to be installed (if VS is already present on the machine)</div>
<div> </div>
<div>Practical info about the upgrades</div>
<div><a href="http://blogs.msdn.com/bharry/archive/2008/08/11/vs-vsts-tfs-net-3-5-sp1-is-shipping.aspx">http://blogs.msdn.com/bharry/archive/2008/08/11/vs-vsts-tfs-net-3-5-sp1-is-shipping.aspx</a></div>
<div> </div>
<div>More info about what is included in the service pack:</div>
<ul>
<li><a href="http://blogs.msdn.com/webdevtools/archive/2008/08/11/web-development-updates-in-visual-studio-2008-sp1.aspx">http://blogs.msdn.com/webdevtools/archive/2008/08/11/web-development-updates-in-visual-studio-2008-sp1.aspx</a></li>
<li><a href="http://oakleafblog.blogspot.com/2008/08/joys-of-installing-visual-studio-2008.html">http://oakleafblog.blogspot.com/2008/08/joys-of-installing-visual-studio-2008.html</a></li>
<li><a href="http://weblogs.asp.net/guybarrette/archive/2008/08/07/sql-server-2008-requires-vs-20008-sp1.aspx">http://weblogs.asp.net/guybarrette/archive/2008/08/07/sql-server-2008-requires-vs-20008-sp1.aspx</a></li>
<li><a href="http://blogs.msdn.com/scothu/archive/2008/08/11/dynamic-data-rtm-is-released.aspx">http://blogs.msdn.com/scothu/archive/2008/08/11/dynamic-data-rtm-is-released.aspx</a></li>
<li><a href="http://blogs.microsoft.co.il/blogs/bursteg/archive/2008/08/11/Download-VS2008-SP1-Net-Framework-35-SP1.aspx">http://blogs.microsoft.co.il/blogs/bursteg/archive/2008/08/11/Download-VS2008-SP1-Net-Framework-35-SP1.aspx</a></li></ul></div>]]></description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Bart De Jonge</dc:creator><pubDate>Tue, 22 Jul 2008 16:56:00 GMT</pubDate><category domain="http://www.orbitone.com/en/blog/archive/tags/.NET/default.aspx">.NET</category><category domain="http://www.orbitone.com/en/blog/archive/tags/Team Foundation Server/default.aspx">Team Foundation Server</category><category domain="http://www.orbitone.com/en/blog/archive/tags/Visual Studio/default.aspx">Visual Studio</category></item><item><title>SQL Server 2008 is ready</title><link>http://www.orbitone.com/en/blog/archive/2008/07/22/SQL-Server-2008-is-ready.aspx</link><guid>/en/blog/archive/2008/07/22/SQL-Server-2008-is-ready.aspx</guid><description><![CDATA[<div class="ExternalClass3CC376C38E1F4122AEC623258FB862EB">SLQ Server is RTM = Release To Manufacturing which means only the CD has to be pressed and packaged. It can already be downloaded from MDDN</div>
<div class="ExternalClass3CC376C38E1F4122AEC623258FB862EB"> </div>
<div class="ExternalClass3CC376C38E1F4122AEC623258FB862EB">New features that I think are worth mentioning :</div>
<div class="ExternalClass3CC376C38E1F4122AEC623258FB862EB">
<ul>
<li><strong>Resoure governer<br></strong>Example : users get 70% of the CPU time, the rest 30%. This means that when no users are active the rest gets 100% CPU time. Only when the 2 groups are avtive at the same time Resoure Governer will kick in and devide the CPU time<br></li>
<li><strong>IntelliSense when typing sql<br></strong>... Finaly. <br></li>
<li><strong>Change Tracking<br></strong>Example: An external site wants to subscribe to events. By using Change Tracking you can sent only the updates/delete/creates that happen agter the last synchronisation. In the past you have to program this all yourself, now this is not necessary anymore.</li></ul></div>
<p> </p>]]></description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Bart De Jonge</dc:creator><pubDate>Tue, 22 Jul 2008 10:29:00 GMT</pubDate><category domain="http://www.orbitone.com/en/blog/archive/tags/SQL Server/default.aspx">SQL Server</category></item></channel></rss>