Tag Archives: Dynamics 365
Why blank locked fields won’t let you save the record – Quote ID example
So, I struggled some time in trying to make something just work as it was supposed to work. And for no conscious reason, I was able to figure out why. As to why my Quote wouldn’t save and auto generate the usual Quote ID? It kept asking me to enter it! Problem OOB, Quote ID is locked and is auto-generated when you save the record. Instead, I got this And asks me to enter Quote in the field again. Ideally, if you have a required field locked, you can save it and the form won’t force you. But, nothing would work. After much hassle, I finally noticed the culprit lying in plain sight. Let’s look at why this was happening. Culprit This happened because the same field was on the Business Process Flow and was unlocked That was the issue. As a part of the requirement, I had put it there, but either didn’t lock it or shouldn’t be there. I just removed it since it wasn’t a big deal and things were fine now. Hope this helps you! 🙂
Show selective entities in Activity Party List in D365 Activities
Out-of-the-box, D365 Activity Party List field, say, Appointment’s Required/Optional Attendees fields lets you choose among multiple Activity Party enabled entities when you want to select records. And perhaps you don’t even want users to select what’s not relevant. Let’s look at how we can show only the required entities in the selection list. Before that, if you want to check how you can enable custom entities for the Activity Party, you can refer this post of mine – Enable entity for Party List selection in Appointment Hide entities from the Activity Party List field This can be achieved by writing a simple JS code and calling it onLoad of the Appointment form where the Party List field exists. Let’s say you only want to show the entities Lead and Contact in the Required Attendees Party List field Here’s the JS code that goes on the onLoad function of the Appointment form // JavaScript source code oAppointmentFormCustomization = { filterRequiredAttendees: function () { Xrm.Page.getAttribute(“requiredattendees”).setLookupTypes([“lead”,”contact”]); } }; And call the method filterRequiredAttendees onLoad as below The Appointment’s Required Attendees field will show only the entities you provided in the setLookupTypes([“lead”,”contact”]); Hope this helps!
Shortcut to Settings from Unified Interface: D365
If you’re spending time looking and wondering that you always need to go to the app switcher to go the Settings from the Unified Interface, you need to do the following – Once you are in the Unified Interface, click on the Gear icon next to the help icon on top-right corner as shown below and click Advanced Settings – Right on the next tab, Settings with the classic UI is shown – And there’s nothing else on the SiteMap. Hope this helps!
Assign your D365 records but keep access as well
Introduction: At times, you are asked to assign certain CRM records to other users and you just have to do it as a part of the process. But let’s face it, you still wonder what might have happened to the record after you assigned it to them but your security roles won’t let you access those. There’s a general D365 setting for this too! You can share your D365 records with other but still retain rights to yourself so keep track of what happened with those later on System Settings: Navigate to Settings > Administration > System Settings In General tab, look for the Setting where it reads as ‘Set whether reassigned records are shared with the original owner’ (quite self-explanatory) Assign Record and check Share Rights: Now, assigning a records from Priyesh to John as shown below – Priyesh would still have rights to the record. Check the Share status of the same. The record will be owner by John but will be shared with Priyesh too. Hope this is helpful!
Send Custom Emails using SendGrids API
Introduction: In this blog we will demonstrate how to send custom emails using SendGrids API. Scenario: If we want to send custom emails to customers stored in Dynamics 365 with different email body for every customer based on their data stored in CRM, it is not possible to do so by using the normal Email Editor as it has some limitations while displaying dynamic content. One way of doing this is by creating a console app which will use SendGrids API to send out custom emails for every customer. Pre-Requisites: Visual Studio SendGrid Account Implementation: Step 1: For this demonstration we will see how to send out a mail to a single email. First we create a Console App in Visual Studio Step 2: Once the Project is created Right Click on the Project and select Manage Nuget Packages Browse to the latest Nuget packages and install SendGrid package Step 3: Next we have to create an API Key in SendGrid. Just give a name for a key and Click on Create Key which will generate a unique key. Store this key which will be used in the Code Step 4: Below is the Code to send email: using SendGrid; using SendGrid.Helpers.Mail; using System.Threading.Tasks; namespace SendGridConsoleApp { class Program { static void Main(string[] args) { string sendGridAPIKey = “EnterKeyHere”; Execute(sendGridAPIKey).Wait(); } static async Task Execute(string _apiKey) { var client = new SendGridClient(_apiKey); var from = new EmailAddress(“test@gmail.com”, “From UserName”); var subject = “MAIL Send Through SendGrid”; var to = new EmailAddress(“test@gmail.com”, “To UserName”); var plainTextContent = “Example PlainText”; var htmlContent = @”<!DOCTYPE html><html><head><style> table { border-collapse: collapse; width: 100%; } th, td { text-align: left; padding: 8px; } tr:nth-child(even){background-color: #f2f2f2 } th { background-color: #4CAF50; color: white; } </style></head><body><h2>Important Details</h2> <table><tr> <th>Firstname</th> <th>Lastname</th> <th>Email Address</th></tr> <tr><td>Peter</td><td>Griffin</td><td>pgriffin@gmail.com</td></tr> <tr><td>Lois</td><td>Griffin</td><td>Lois@gmail.com</td></tr><tr> <td>Joe</td><td>Swanson</td><td>joe@gmail.com</td> </tr><tr><td>Cleveland</td><td>Brown</td> <td>clev@gmail.com</td></tr></table></body></html>”; var msg = MailHelper.CreateSingleEmail(from, to, subject, plainTextContent, htmlContent); var response = await client.SendEmailAsync(msg); }}} Step 5: Once the Console App is run the email is send below shown is the sample of the Email sent While running this for multiple customers we can create different HTML body content for each customer and pass it to the CreateSingleEmail function.This approach can also be used to send bulk emails to customers.
Keep access to Assigned records in D365
Introduction: At times, you are asked to assign certain CRM records to other users and you just have to do it as a part of the process. But let’s face it, you still wonder what might have happened to the record after you assigned it to them but your security roles won’t let you access those. There’s a general D365 setting for this too! You can share your D365 records with other but still retain rights to yourself so keep track of what happened with those later on Setting: Navigate to Settings > Administration > System Settings In General tab, look for the Setting where it reads as ‘Set whether reassigned records are shared with the original owner’ (quite self-explanatory) Assign Record and check Share Rights: Now, assigning a records from Priyesh to John as shown below – Priyesh would still have rights to the record. Check the Share status of the same. The record will be owner by John but will be shared with Priyesh too.
D365 Unified Interface: Enabling embedded legacy dialogs
Introduction: Quite simply put, some of the embedded dialogs like the Advanced Find, Merge Records, Assign & Edit record windows which are not by default visible on the Unified Client Like when you multi-select records, you can’t see the typical Merge, Edit buttons on the ribbon. Here’s how you enable them. System Settings: In your Web Application’s system settings, you have an option under general where you can enable these buttons in the Unified Interface. Now, you can retain those buttons in the Unified Interface as well. Have a great time exploring Unified Interface!
Calculated Currency Field doesn’t support Min or Max values
Introduction: This is an observation I made when one of our clients wanted to have a limit on the calculated fields. Let’s say, a lower limit of the currency field that is expected to throw an error (or somehow not allow) the currency going in negative values for a calculated field. Observation: Now, I want to keep the Minimum Value as $0. I’ll keep the Minimum value as 0 so that when I can make it as Calculated Field, the Minimum Value gets locked by $0 I’ve entered. See screenshot below: But, as soon as I make it as Calculated Field and click on Save, this happens- It still appears that I will save it as 0 But, it creates the field, locks the minimum field and then defaults it back to the original minimum value. Bottom line: We cannot have our own Minimum Value on the Calculated Currency fields. But however, I found that this is allowed for other calculated fields. Like the Whole Number.
Delegating Time Entries in D365 PSA
Overview: Often you miss doing your time entries in PSA for the work done and go on a leave! You either then need to just struggle to find a system and do it yourself or raise some other kind of request to make sure billing is done right. But, you can delegate time entries to a colleague and it is all taken care of. Assigning Delegates in PSA: In Project Service, you can see the entity Delegates. In this entity, all you need to do is create a Delegate record as shown below You can either delegate a fellow resource for Time Entries or for the Expense entries. In this case, I’ll let Somesh make Time Entries on my behalf and hence make him my Delegate in PSA for a week on which I’m on PTO. Entering Time Entries as Delegates: Now, looking at Somesh’s angle, if he has needs to make time entries on my behalf. He would need to go to Time Entries, then he will need to look at the ribbon for his name and change the user to Priyesh Wagh. Once the other user is selected, their Timesheet appears and all the time entries by the other user appear. Here, Somesh can make time entries just as he would usually do for himself and they would actually be registered for the Resource Priyesh Wagh.
