in

DotNetDeveloper

Bits o this Bits o that

MS Dynamics CRM

Blogging about Microsoft Dynamics CRM or MSCRM for short :) Add to Technorati Favorites
  • Adding case resolution types to case resolution form

     not having done this before on our installation this took me a few minutes to figure out.

    obviously as its a drop down field its a picklist which needs editing but it's not in the Case/Incident resolution entity.

    The picklist can actually be found within the Case entity.

    If you select the Status Code entity and change the state dropdown from the right of the screen from Active to Resolved you will see the text list will change to show the Case Resolution picklist.

     

  • Workflows and Working Days

    Hi on a few posts on the MS CRM dynamics forum I commented on a solution for working out due dates taking into account weekends and holidays etc.

    This is the solution I came up with which has been working for the last x months without any issues (as far as i'm aware). This is based on the task entity creation event and basically picks up the Creation Date and the Due date and calculates the difference between them and then changes the due date (assuming a user inputs the number of days till the task should be completed which will generate a due date automatically - could be tweaked I know) to be a working date taking into account any company / official holidays (if rules have been entered into the Business Closures entity Settings > Business Closures). The code should be transferable between many implementations but is used very specifically at the moment as above.

    As far as I am aware it has been tested quite thouroughly with exception to the Business Closures which our company don't use at the moment.

    These belong in my case within a workflow assembly (maybe called WorkflowAssembly.DLL like mine) and are used within the workflow manager.

    /// <summary>
    ///  Change Due Date used by workflow required by task.
    /// </summary>
    /// <param name="caller">string</param>
    /// <param name="creationDate">DateTime</param>
    /// <param name="dueDate">DateTime</param>
     /// <returns>DateTime</returns>
    public DateTime ChangeDueDate(string caller, DateTime creationDate, DateTime dueDate)
    {
            XmlDocument xDoc = new XmlDocument();
            xDoc.LoadXml(caller);
            XmlNodeList nodes = xDoc.SelectNodes("caller/userid");

            if (nodes.Count > 0)
            {
               // setup service
               using (CrmService service = CrmSdkProxy.InstantiateService(new Guid(nodes[0].InnerXml.ToString())))
               {
                    // get difference between duedate and creation date
                    TimeSpan ts = dueDate - creationDate;

                    return ReturnWorkingDate(creationDate, ts.Days, service);
               }
            }

             // if theres any problems return standard due date.
            return dueDate;
    }

    /// <summary>
    /// Accepts a date,number of days to skip and a crmservice instance
    /// </summary>
    /// <param name="date">DateTime</param>
    /// <param name="numberOfWorkingDays">Integer</param>
    /// <param name="service">CRMService</param>
    /// <returns>DateTime</returns>
    public DateTime ReturnWorkingDate(DateTime date, int numberOfWorkingDays, CrmService service)
    {
        while (numberOfWorkingDays > 0)
        {
            date = date.AddDays(1);
            // if today is not a day included in the business closure calendar or else move on a day
            if (IsBusinessWorkingDay(date, service))
            {
                // if today is not saturday or sunday else move on a day
                if (!IsWeekend(date))
                {
                    // this is a working day
                    numberOfWorkingDays--;
                }
            }
        }

        // returns the date advanced by x number of working days
        return date;

    }

     

    private static bool IsBusinessWorkingDay(DateTime dueDate, CrmService service)
    {
        // setup working variables
        bool workingDay = true;
        string guidString = string.Empty;

        // create fetchxml
        StringBuilder fetchXML = new StringBuilder();
        fetchXML.Append("<fetch mapping='logical'>");
        fetchXML.Append("<entity name='calendar'>");
        fetchXML.Append("<attribute name='calendarid'/>");
        fetchXML.Append("<filter type='and'>");
        fetchXML.Append(" <condition attribute='isshared' operator='eq' value='1'/>");
        fetchXML.Append("</filter>");
        fetchXML.Append("<filter type='and'>");
        fetchXML.Append(" <condition attribute='name' operator='eq' value='Business Closure Calendar'/>");
        fetchXML.Append("</filter>");
        fetchXML.Append("</entity>");
        fetchXML.Append("</fetch>");

        // perform fetch
        string returnXML = service.Fetch(fetchXML.ToString());

        // setup xml document for return xml
        XmlDocument xDoc = new XmlDocument();
        xDoc.LoadXml(returnXML);
        XmlNodeList nodes = xDoc.SelectNodes("resultset/result/calendarid");

        // if theres a calendar returned from the fetch then handle it
        if (nodes.Count > 0)
        {
            // get Business closures calendar Guid
            guidString = nodes[0].InnerXml.ToString();

            // create calendar Guid
            Guid calGuid = new Guid(guidString);

            // return all calendar columns for this calendar (just need calendarrules)
            calendar cal = (calendar)service.Retrieve(EntityName.calendar.ToString(), calGuid, new AllColumns());

            // for each rule within the calendarrules collection
            foreach (calendarrule cl in cal.calendarrules)
            {
                // Convert start and end date to DateTime
                DateTime holStartDate = Convert.ToDateTime(cl.effectiveintervalstart.Value.ToString());
                DateTime holEndDate = Convert.ToDateTime(cl.effectiveintervalend.Value.ToString());

                // check if the date passed in is within the startdate / enddate of holidays via rules
                if (DateTime.Compare(dueDate, holStartDate) > 0 && DateTime.Compare(dueDate, holEndDate) < 0)
                {
                    workingDay = false;
                }
            }
        }


        return workingDay;
    }

     

    private static bool IsBusinessWorkingDay(DateTime dueDate, CrmService service)
    {
        // setup working variables
        bool workingDay = true;
        string guidString = string.Empty;

        // create fetchxml
        StringBuilder fetchXML = new StringBuilder();
        fetchXML.Append("<fetch mapping='logical'>");
        fetchXML.Append("<entity name='calendar'>");
        fetchXML.Append("<attribute name='calendarid'/>");
        fetchXML.Append("<filter type='and'>");
        fetchXML.Append(" <condition attribute='isshared' operator='eq' value='1'/>");
        fetchXML.Append("</filter>");
        fetchXML.Append("<filter type='and'>");
        fetchXML.Append(" <condition attribute='name' operator='eq' value='Business Closure Calendar'/>");
        fetchXML.Append("</filter>");
        fetchXML.Append("</entity>");
        fetchXML.Append("</fetch>");

        // perform fetch
        string returnXML = service.Fetch(fetchXML.ToString());

        // setup xml document for return xml
        XmlDocument xDoc = new XmlDocument();
        xDoc.LoadXml(returnXML);
        XmlNodeList nodes = xDoc.SelectNodes("resultset/result/calendarid");

        // if theres a calendar returned from the fetch then handle it
        if (nodes.Count > 0)
        {
            // get Business closures calendar Guid
            guidString = nodes[0].InnerXml.ToString();

            // create calendar Guid
            Guid calGuid = new Guid(guidString);

            // return all calendar columns for this calendar (just need calendarrules)
            calendar cal = (calendar)service.Retrieve(EntityName.calendar.ToString(), calGuid, new AllColumns());

            // for each rule within the calendarrules collection
            foreach (calendarrule cl in cal.calendarrules)
            {
                // Convert start and end date to DateTime
                DateTime holStartDate = Convert.ToDateTime(cl.effectiveintervalstart.Value.ToString());
                DateTime holEndDate = Convert.ToDateTime(cl.effectiveintervalend.Value.ToString());

                // check if the date passed in is within the startdate / enddate of holidays via rules
                if (DateTime.Compare(dueDate, holStartDate) > 0 && DateTime.Compare(dueDate, holEndDate) < 0)
                {
                    workingDay = false;
                }
            }
        }


        return workingDay;
    }

    now that the above code has been compiled into a your workflow assembly to utilise the assembly you also need to add the function to the workflow config file which is located at C:\Program Files\Microsoft CRM\Server\bin\assembly

    <method name="Change Due Date"
       assembly="WorkflowAssembly.dll" typename="WorkflowAssembly.DateTimeFunctions"
       methodname="ChangeDueDate" timeout="7200"
       group="Date and time functions">
       <parameter name="Caller" datatype="caller"/>
       <parameter name="Creation Date" datatype="datetime" />
       <parameter name="DueDate" datatype="datetime" />
       <result datatype="datetime"/>
      </method>

    Open up the file and and paste the above into it. Basically its just a function definition which shows which class/methods within the dll are used and what parameters are expected.

    Once you've copied over the DLL to C:\Program Files\Microsoft CRM\Server\bin\assembly and edited the workflow.config file within the same location reset IIS and the MSCRM Workflow Service.

    Now if all is going well when you go into Workflow Manager and select the workflow you wish to use this functionality in. ( I used this in a task workflow which when the task was created automatically would change the due date to a working day x days in the future).

    Goto insert action --> Call Assembly --> Date Time Functions --> Change Due Date and select the function

    Figure 1

    Figure 1

    Click on the newly created function within the workspace and a new screen will popup (as per Figure 2). Double click the parameter called Creation Date and populate (as shown in figure 3), repeat for due date.

    Figure 2

    Figure 2

    Figure 2

    Figure 3

     

    Well its my longest post yet and may well not be very clear (rushed it out in work) so if you have any questions or need anything clarifying give me a shout. Hopefully it will help somebody.

  • The Underlying connection was closed: Unable to connect to the remote server

    Had this tip sent to me earlier not sure what the original source is but it works so im passing it on. 

    The Underlying connection was closed: Unable to connect to the remote server this error is a problem due to running out of TCP ports. You can minimize or eliminate this problem by setting the following registry keys on the Microsoft CRM Server(s). This is typically seen in scenarios with Microsoft CRM when the server is under high user load or more typically when it is under high load from a Bulk import or a Microsoft CRM SDK application that is importing thousands of records into the application. Note that these are both REGDWORD Keys and the values should be set as decimal values.

     HKLM\Software\CurrentControlSet\Services\TCPIP\Parameters

    Create a new REGDWORD value named MaxUserPort with a value of 65534.

    Also create a new REGDWORD value named TcpTimedWaitDelay with a value of 30. What this means is that we now have a total of 65534 TCP ports available and that they will recycle for use again after 30 seconds. This compares to the default of 5000 ports and a TcpTimedWaitDelay default of 240 (4 min).

     

    Posted Mar 24 2009, 09:32 AM by Steve with no comments
    Filed under:
  • Microsoft CRM 5.0 Features

    If you're interested to know what will be the key features of the future Microsoft Dynamics CRM 5.0, originally pulled from Simon Hutson's post and now removed.

     finally found this listed on Stefano Demiliani's Site

    Remember that the next Microsoft CRM version is actually planned for release late 2009/early 2010 (there's not a codename now), so this is a really first preview.

    This is the Simon's feature list (cross posted here):

    New Features For End Users

    • Enhanced Navigation - I guess it was inevitable, but CRM5 uses the same "Fluent UI" (aka the Ribbon) as Office 2007. This new "command bar" replaces the CRM 4.0 "tool bars" at the top of each page, and is context sensitive. In addition, the "command bar" is fully customizable and you can add your own buttons much like you can with ISV.Config file today.
      CRM5 Ribbon (Account)
      CRM5 Ribbon (Contact)
      Incidentally, something that isn't discussed but appears on the ribbon is the "Add to Queue" command, from which I can only surmise that you will be add any entity (including custom entities) to a Queue.
    • Single Page Forms - The form model in CRM 4.0 made use of tabs to divide a form into multiple pages. In CRM5 tabs are displayed in the same way as section, with each form just having a single, scrolling page. As you can see from the navigation page of an Account entity, tabs are now displayed as a series of "quick access" navigation shortcuts under the "Information" link.
      CRM5 Tabs
    • Data Filtering - One often requested feature is the ability to filter data in grids, much like Excel. Now you can navigate to the "DataView", click the "Filter" command, and you can perform your own in-line filtering.
      CRM5 Data Filtering
      Again, although not explicitly stated, it looks as though you can quickly save your filters as a View, as well as setting your own Default View.
    • In-line Visualizations - Although not Business Intelligence in the true sense of the phrase, CRM5 allows you to visualize numeric data using in-line charts. This is not SQL Server Reporting Services, but looks very much like the .NET charting solution from Dundas.
      CRM5 In-Line Visualizations
      The charts themselves are drill-through enabled and you can select a number of different chart formats such as Bar, Column, Funnel, Line, Pie & Scatter.
    • Team Ownership - Entities in CRM 4.0 were either User Owned or Organisation Owned. Now Team Owned entities are added in CRM5, and integrated into the role-based security model.
    • Native SharePoint Integration - Integration with Windows SharePoint Services for document management, which includes site and document library provisioning, document metadata, item security, and check-in/check-out capabilities.
    • Unstructured Relationships - The next generation of "set regarding" and "relationship roles" functionality, allowing you to define ad-hoc relationships between any two entities.

    New Features For Administrators

    • Flexible Form Layout - We now have much more flexibility in how forms are laid out, for example, we can position sections side-by-side, as well as field labels on top, left or right of each field. Best of all, we can now configure "In-Line Sub-Grids" for child records, so a combination of IFrames & JScript is no longer required to make this work.
      CRM5 Form Layout
    • Filtered Lookups - One of the most requested features has finally made it into the product. Whilst customizing the form, you can choose a pre-defined view or better still you can filter by a related lookup on the same form.
      CRM5 Filtered Lookups
    • Form Headers & Footers - Now that all tabs, sections and fields appear on a single, scrolling form, it is quite possible the form will get become quite long and you will end up scrolling up and down more often to find the information you require. In order to make the most commonly required visible at all times, you can now place these fields in a header or footer so that they will always be displayed regardless of the scrolling.
    • Solution Management - With CRM 4.0, you had to implement a manual process when customizing your solution, to make sure that you didn't overwrite previous customizations, or disrupt any 3rd party ISV solutions. In CRM5 we had now added the concept of solutions.
      CRM5 Customizations - Solutions
      A solution is a defined set of entity customizations, workflows, e-mail templates, security roles, plug-ins etc. that can be managed as a single unit. Each solution is version controlled so presumably your can have multiple versions of the same solution installed, and roll-back to a previous version if necessary.
      You can also define solution dependencies where one solution can only be installed if another solution is also installed. For example, you might have a base solution for your whole organisation, with a departmental specific solution built on top of it.
      CRM5 Solutions - Publishers
      Namespace collision is avoided by defining publishers, with each publisher having a unique namespace. This avoids the common issue where the default namespace "new_" is used for all customizations, leading to potential namespace conflicts.
      One final plus point is that you can now specify which attributes will be exported as part of a solution, rather than having no choice but to export the whole entity.
    • Multiple Option Sets - Otherwise known as "Global Picklists", you can define these at the solution level, and re-use them across multiple entities.
    • Drag & Drop Form Editor - One of the most time consuming customization tasks in CRM 4.0 is the form design. Every time you want to add, remove or re-position tabs, sections and attributes, you have to go through a multi-click process. With CRM5, you can now drag and drop all elements of a form, speeding up the process considerably
      CRM5 Drag & Drop Form Editor
    • Audit - Although not explicitly mentioned during the sessions, I spotted an "auditing" setting on the attribute designer form, allowing you to turn auditing on or off.
      CRM5 Audit

    New Features For Developers

    • Custom Code Sandbox - There is a new server role for running custom plug-in code and custom workflow activities without requiring full trust. This means that it will be possible to run custom code in the CRM Online environment and achieve true parity between On-Premise, Partner-Hosted and Microsoft-Hosted deployments.
    • Plug-In Transaction Support - In CRM 4.0 you could register a plug-in to run either before (pre-event) or after (post-event) the CRM platform operation. However, you were not able to run as part of the transaction itself, so you had to right your own compensation logic in the event the CRM platform operation failed. CRM5 addresses this limitation, and you can now choose to register you plug-in as part of the platform operation. The CRM5 plug-in registration tool has been modified to support this.
      CRM5 Plug-In Transaction Support
    • Automatic Plug-In Profiling - CRM5 will keep track of how a plug-in is executing, what resources it consumes, if it is causing unexpected exceptions and whether or not it is violating security constraints. If a particular plug-in fails a number of times it is automatically disabled from executing, helping to maintain system integrity.

    I want to add here only that also the CRM Workflow side will be improved a lot and the WF usage will be extended.

    Do you remember how many times we've asked the Team to have filtered lookups? So natural request I think... In CRM 5.0 we'll have this feature!!

    I have also a personal request: I hope on improvements regarding data import and data migration. CRM 4.0 helps a lot on data migration but it's not always so easy to migrate large amount of data from a custom system to CRM (due to the import processes that sometimes are "freezing").

  • MS CRM - Automatically sharing an entity

    This functionality is not supported by Microsoft CRM, to share an entity automatically you have a few options callouts or workflows.

    I've included some working code (inner workings mostly pasted from the sdk) for a postcreate callout which automatically shares an account, which should point you in the right direction. 

    Ideally you would wrap in a try / catch to deal with any exceptions.

    public override void PostCreate(CalloutUserContext userContext, CalloutEntityContext entityContext, string postImageEntityXml)
      {

       // Create the Crm Service
       CrmService service = new CrmService();
       service.Credentials = System.Net.CredentialCache.DefaultCredentials;
       service.CallerIdValue = new CallerId();
       service.CallerIdValue.CallerGuid = userContext.UserId;

       // Create the SecurityPrincipal object.
       SecurityPrincipal principal = new SecurityPrincipal();

       // Set the properties of the SecurityPrincipal object.
       principal.Type = SecurityPrincipalType.Team;
       // PrincipalId is the guid of the user or team you want to have access.
       principal.PrincipalId = new Guid("XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX");

       // Create the PrincipalAccess object.
       PrincipalAccess principalAccess = new PrincipalAccess();

       // Set the properties of the PrincipalAccess object.
       principalAccess.Principal = principal;
       // Give the principal access as required.
       principalAccess.AccessMask = AccessRights.ReadAccess;
       // Create the target object for the request.
       TargetOwnedAccount target = new TargetOwnedAccount();

       // EntityId is the GUID of the account you want to share
       target.EntityId = entityContext.InstanceId;

       // Create the request object.
       GrantAccessRequest grant = new GrantAccessRequest();

       // Set the properties of the request object.
       grant.PrincipalAccess = principalAccess;
       grant.Target = target;

       // Execute the request.
       GrantAccessResponse granted = (GrantAccessResponse)service.Execute(grant);
      }

  • 80040204 - Failed to start process

    Whilst looking into issues with some workflows not working and not even appearing within the workflow monitor, I spotted this error within the event viewer on the server.

     Failed to start process 'blah blah process' for object (119,{xxxxxxxx-xxxx-xxxx-xxxxxxxx}),Caller is 'blah blah'. Error code 80040204.

    Essentially we had been playing with our security permissions the previous week and had removed the account from SQLAccessGroup if you re-add it and then restart the workflow service you should now find the workflows re-appear.

     just to add the 2 groups you need your account to be in is PrivUserGroup and SQLAccessGroup.

  • MSCRM - Finding an entity type code

    Microsoft have a naming convention for entity codes which you can find on the net

    However what if you want to find out a code for a custom entity?

    This is the simple solution I use.

    1. Goto Settings > Customization  and choose your entity
    2. Click Forms and Views and double click on the main form
    3. Click Form Properties > On Load Event and then click edit
    4. Paste the following code into the text area       alert("type code: " + crmForm.ObjectTypeCode);
    5. Tick the Event is enabled tickbox and click OK and on the next screen OK again.
    6. On the top menu select Preview > Create Form
    7. Now you get a nice popup box with your entity type code
    8. Make sure you quit without saving.

     

  • MSCRM Workflow Assembly Error 80070005 Acess Denied

    I've recently come across this error message (8005005) whilst copying some new workflows to my Test Server.

    This was shown in the Workflow Monitor when I tried to run any workflows which relied on a response from any custom workflow assembly file methods.

    After checking that the CRM workflow service had the correct file permissions (I was using network service). I then added the same permissions to the to the workflow assembly. then I restarted the workflow service.

    This problem then cleared up

  • Update Rollup 3 is available for Microsoft Dynamics CRM 3.0 - AGAIN!

    Microsoft have re-released rollup 3 for mscrm with loads of bug fixes

    you can find out more information and get the files here

  • MS Crm Callout, Calculation total incident / activity time

    This callout calculates how much time has been spent on activities within an incident.

    First thing I did was customise the incident entity to include an incident total time field which I made read only to protect the data.
    Now all we need is a callout to total up the total time of the incidents.
    I based this callout on incident resolution and created the following code.

    using System;
    using System.Collections;
    using System.Diagnostics;
    using System.Globalization;
    using System.Reflection;
    using System.Xml;
    using System.IO;
    using System.Security.Principal;
    using Microsoft.Crm.Callout;
    using Microsoft.Win32;


    namespace DotNetDeveloper.Callout
    {
    /// <summary>
    /// Summary description for CaseResolutionCallout.
    /// </summary>
    public class CaseResolutionCallout : CrmCalloutBase
    {
    #region constructors
    /// <summary>
    /// empty constructor
    /// </summary>
    public CaseResolutionCallout()
    {}
    #endregion
    #region Public Methods
    /// <summary>
    /// PreCalloutReturnValue
    /// </summary>
    /// <param name="userContext"></param>
    /// <param name="entityContext"></param>
    /// <param name="newStateCode"></param>
    /// <param name="newStatusCode"></param>
    /// <param name="errorMessage"></param>
    /// <returns></returns>
    public override PreCalloutReturnValue PreSetState(CalloutUserContext userContext, CalloutEntityContext entityContext, ref int newStateCode, ref int newStatusCode, ref string errorMessage)
    {
    // only do this for Incident resolution
    if (newStateCode == 1)
    {
     try
     {
     // setup impersonation
     using (CrmService service =  new CrmService())
     {
      service.Credentials = System.Net.CredentialCache.DefaultCredentials;
       service.CallerIdValue = new CallerId();
       service.CallerIdValue.CallerGuid = userContext.UserId;
       // get total time spent on case
       CalculateTotalTimeIncidentRequest req = new CalculateTotalTimeIncidentRequest();
       req.IncidentId = new System.Guid(entityContext.InstanceId.ToString());
       CalculateTotalTimeIncidentResponse resp = (CalculateTotalTimeIncidentResponse)service.Execute(req);
       // update the case
       incident inc = new incident();
       inc.incidentid = new Key();
       inc.incidentid.Value = new Guid(entityContext.InstanceId.ToString());
       inc. totalincidenttime = resp.TotalTime.ToString();
       service.Update(inc);
      }
     }
     catch (Exception ex)
     {
      // error handling code
     }
    }
    return PreCalloutReturnValue.Continue;
    }
    #endregion
    }
    }

    Obviously you need to add a reference to the base callout class and also to the MSCRM Service.
    Associated Callout.Config.xml code
    <callout entity="incident" event="PreSetState">
    <subscription assembly="DotNetDeveloper.Callout.dll" class="DotNetDeveloper.Callout.CaseResolutionCallout"></subscription>
    </callout>

    Ok that done, upon running this callout you will find that the callout should works as expected and populate the totalincidenttime.
    One activity I would test more than others would be the appointment activity, as the method provided by Microsoft calculates the incorrect totaltime for appointments ( I came across the problem and solution and posted about it in this earlier post here .

  • MSCRM Actual Duration time wrong

    I came across this problem whilst working on generating the total non activity time within an incident. (this post if your interested) and though i'd just post a little bit on this to complement my other post.

     Anyway essentially the problem lies when you view the Resolve Case dialog box in Microsoft Dynamics CRM 3.0, an incorrect total time is displayed for the billable time. For example, the Actual Duration field displays the default value of 30 minutes. Additionally, I noticed this when I calculated the total time spent on an incident by using the Microsoft CrmService Web service, the CalculateTotalTimeIncident message returns an incorrect total time of 30 minutes.

    There are a couple of documented workarounds for this problem, the one i used was as below

    • Include Actual Duration,Actual Start and Actual end in your entity form(hide if you wish)
    • Enable the OnSave event and add the following code into it.

                crmForm.all.actualdurationminutes.DataValue =
                crmForm.all.scheduleddurationminutes.DataValue;
                crmForm.all.actualstart.DataValue = crmForm.all.scheduledstart.DataValue;
                crmForm.all.actualend.DataValue = crmForm.all.scheduledend.DataValue;

    • Save and then publish the customisation

     hopefully this will be of some use to you

     

     

     

  • MSCRM Update Rollup 3 Released (then Unreleased)

    It appears Microsoft released there Microsoft Dynamics CRM 3.0 Update Rollup 3 on the 17th March 2008 with the following statement

     "The Microsoft CRM Sustained Engineering team has released Microsoft Dynamics CRM 3.0 Update Rollup 3 on Monday, March 17th. Update Rollup 3 is a well tested, cumulative set of updates for Microsoft Dynamics CRM Server 3.0"

    perhaps it was't as well tested as it should have been as sometime between then and now it appears they have unreleased it due to complications when when opening an existing Service Activity and clicking on the Customers field to drill down to the Customer information the following error is received:

    "Record is Unavailable. 

    The record that you are requesting is currently unavailable.  Either the record was not found or you do not have sufficient security permissions to view it."

     for now the important thing to remember is DO NOT INSTALL UPDATE ROLLUP 3

    Microsoft are working on a fix for the fix and until they re-release this i'd strongly recommend not downloading it(assuming you can find it)

  • MS CRM Security Permissions Sharing and Teams

    Initially a Users permissions are allocated to them via there Role usually allocated by a System Administrator.

    This level of permissions is the height of there powers, they cannot have any more access then that offered by there Role.

    However they can have diminished powers, based on the there membership of a Team.

    A User ‘s team is literally as it sounds a group of people, there is no permissions given to a team at all however there is permissions given to objects which are shared with a team.

    If a Team is allocated an Opportunity and no further permission modifiers were placed on the Opportunity then the permissions used would be the default role permissions.

    for example: User 1 is in a role that allows them to Read Opportunities and User 2 does not have a role which allows them to see Opportunities then only User1 can see the Opportunity.

    If however further upon sharing an object with your Team a User decides not to allow you permission to write to an object for example, then regardless of your role permissions you will not be able to write to that particular object.

    A Team Example

    User A works in a Finance Department and Has READ & WRITE Access to a Custom Entity called “Finance” which stores the finance details of an Account. He also has READ rights to Account

    User B works in a Customer Service Department and has READ, WRITE & DELETE Access to The Account Entity and READ rights to the Finance Entity.

    Both are in Team A

    User C also works in the Customer Service Department within my company; however he is a new starter within the company and as such hasn’t had much training as he is a Customer Service Agent he has exactly the same role as User B, with exactly the same permissions.

    As a new starter we have put him a separate Team (Team B) which means he gets extra supervision to do his job. We can move him to Team A when were happy he knows what he’s doing.

    I share my Account with Team A and B as below

    MS CRM Object Sharing

    User A: Has access to Read our Firm role, but they really have no need to add anything to the Account Entity and so there role restricts this. They do however have access to Read and Write to the Finance Entity.

    User B: Can Read the Account and can Write Account details and if he so wishes can DELETE. User B does not have access via his role to read our custom Finance entity.

    User C: Has had the Account shared with them as he’s in Team B, maybe he will get a call regarding the Account.He can UPDATE the Account also but as a new member of staff he has been restricted delete access to these Accounts. User C also does not have access via his role to Read our custom Finance entity

    It’s a simplistic example but it does offer an example of what Teams can be used for

    More information on Sharing.

    The Security Options for sharing are as follows with a brief description.

    Read: specifies the right to read an object

    Write: specifies the right to write to an object

    Delete:  obvious

    Append: not so obvious, this gives the user rights to append the object to another object or append another object to this object.

    Assign: specifies the right to assign this object to another security principle (User or Team).

    Share: specifies the right to share this with other Teams or Users.

    You can share, Custom Entities ,Invoices , Orders , Quotes , Marketing Lists ,Contacts , Accounts, Opportunities, Leads ,Campaigns & Contracts.

    There may be some more but that’s a fairly full list. Sharing for some or all of these entities can of course be enabled / disabled through Roles.

     

  • Microsoft Dynamics CRM 4.0 RTM VPC

     Microsoft have just released a new VPC with Dynamics 4.0 RTM on

    The RTM VPC Contains the following:

    • Microsoft Dynamics CRM 4.0 (RTM)
    • Microsoft Dynamics CRM Desktop Client
    • Microsoft Dynamics CRM SDK
    • Microsoft Windows Server 2003 R2 Enterprise Edition (SP2)
    • Microsoft SQL Server 2005
    • Internet Explorer 7
    • Microsoft Office Professional 2007
    • Microsoft Office SharePoint Server 2007
    • Microsoft Performance Point Server
    • Microsoft Office Communication Server
    • Microsoft Visual Studio 2005
    • POP3 E-Mail Services (No Exchange)
    • English, French, German, Danish and Dutch Language packs

    This partner-ready download includes account and contact trial data and is ready to be populated with locale-specific data via the associated demonstration tool. Once complete, please copy the Demonstration tool to the virtual machine, and follow the instructions to populate activity, opportunity and other entity data and e-mails in Outlook. Refer to the demonstration documentation for detailed information.

    Originally posted on "A Freaky Dynamics CRM Blog"

  • MS CRM Permissions - Useful Tip

    I'm currently looking into CRM permissions within my current company (more informative post to follow) and often have to look into permissions issue's as the CRM user's cannot delete or amend various activities etc.

    The first bit of involvement I have is to ask them to open up the properties for the offending object and see what it is they have permissions to use.

    You can find the properties section within the file > menu on the top left of your entity.

    This will bring up a similar screen to this one.

    MSCRM Entity Properties / Permissions

    CRM object Properties

    The ticked permissions are obviously the ones you have access to do, In my case I have system admin on my development machine at the moment so I have access to everything but you get the idea Smile

     

More Posts Next page »
DotNetDeveloper.co.uk
Powered by Community Server (Non-Commercial Edition), by Telligent Systems