Category Archives: Dynamics CRM
Filter Gallery based on lookup field (Combo Box) on EditForm
Introduction: In this blog, we will learn how to filter Gallery based on Combo Box which is on different form. Use Case: We have a requirement where there is a lookup field (Price List) on the Editform (Data Source: Quote Project Price List). When there is data in the lookup field the Gallery (Data Source: Role Price) should be filtered. Steps: 1. We have an Screen which is divided into two parts:(Edit Form + Gallery) a. Quote Project Price List Edit Form. b. Gallery with Role Price data source. 2. Add field into the Editable Grid (Gallery). 3. The Lookup Field on the EditForm is PRICE LIST on which the gallery is suppose to be filtered. 4. To filter the Gallery set the Items property of the Gallery to the following formula, Item property: Set Gallery.Item = Filter(‘Gallery Data Source’, ‘GalleryFieldName’.Name = ‘Form Lookup Field Name(Combo Box)’.Selected.Name) For eg: GalleryRolePrice.Item=Filter(‘Role Prices’, ‘Price List’.Name=PriceListLookup.Selected.Name) 5. Output of the screen, The Gallery is not visible as the Lookup Field (Price List) is not selected. 6. After selecting the Lookup Field (Price List), the gallery is visible and also filtered on the basis of the selected field. 7. In this way the Gallery will get Filtered on the basis of the Lookup field on the EditForm.
Share Story :
Add lookup fields in an editable grid using PowerApps
Introduction: We had a requirement where we wanted to show the editable grid in power apps. The fields which are suppose to show are of string, decimal and lookup. Other data type was easy to display but we find difficulties in showing the lookup value. In this blog, we will learn how to add lookup fields(combo box) into the editable grid and also save it in Dynamics 365 CRM. Steps: 1. Insert Gallery : Insert a new gallery – Insert > Gallery > Blank Vertical Add Data Source to the Gallery Go to Properties > Click Data Source you want. 2. Add Combo Box input control in the PowerApps Grid. I have added 3 Combo Box input control inside the Grid, 2 text box, 1 is currency field in the data source and a Save icon. 3. For each Combo Box input box: Item Property: Set ComboBox.Item = Choices([@’Data Source’].<Field Name>) For eg: RoleComboBoxRP_1.Item = Choices([@’Role Prices’].Role) DefaultSelectedItems property: Set ComboBox.DefaultSelectedItems = ThisItem.<Field Name> For eg: RoleComboBoxRP_1.DefaultSelectedItems = ThisItem.Role 4. For each text input box: Default property: Set TextInput.Default = ThisItem.<Field Name> For eg: DescriptionRP_1.Default = ThisItem.Description Note: Do not forget to set the <DefaultSelectedItems> properties or else the value wont be visible in the grid. 5. To Save the changed value into the Data source, set the Save Icon to the following: OnChange property: Set SaveIcon.OnChange = Patch(DataSource, ThisItem, { <fieldName>: TextInput.Text, <fieldName>:ComboBoxName.Selected, <fieldName>:Value(CurrencyTextInput.Text) }) For eg: SaveRP_1.OnChange = Patch([@’Role Prices’], ThisItem, { Role : RoleComboBoxRP_1.Selected, ‘Resourcing Unit’:ResourcingUnitComboBoxRP_1.Selected, Unit:UnitComboBoxRP_1.Selected, Description:DescriptionRP_1.Text, Price:Value(PriceRP_1.Text) }) 6. The Output Screen. 7. The changed Lookup value. If you click the Save Icon the changed values will be saved. In this way we can change the Lookup values and also Save the changed value in the Dynamics 365 CRM.
Share Story :
Post Entity and its Relationship with Lead Entity
Problem Statement: We have a recent requirement, where we had to make an SSRS report that will display the latest post against a Lead. Post as an Entity is not visible in customization, also in advance find of Lead, we do not have any related attributes from post. This makes it difficult to generate the query. Solution: When we check the relationship between lead and POST, we find the below The entity named Post regarding is not present in customization and neither is visible in Advanced Find. If we check the advanced find for posts, we will not find any field that is providing related details of lead. But if we go to edit columns and check the available columns, we will get a column named regarding. We can use the below XML Query to generate our SSRS Report. Conclusion: Some entities like POST,POST regarding and their attributes are hidden in CRM. Metadata Document Generator in XRM Toolbox can be used to view these hidden entities and fields. You can refer my blog Find hidden entities in CRM using metadata document generator from XRM Toolbox to know how to use Metadata Document Generator in XRM Toolbox.
Share Story :
How to use Expand Query in MS Flows
Introduction This blog explains how to use Expand Query (N:1 Relationship) in the Common Data Service List Records Connector. Steps to be followed: Initialize Variable of type string. Using Expand in list RecordsExpand Query: cf_Project($select=cf_projectname,cf_projectabbreviation) Here cf_Project is the Schema Name of Project Lookup field on location entity. Pass the field names of the project entity that you want. Here I have passed cf_projectname and cf_projectabbreviation. Result of list record: You can see we get Project value in the below format to use this we have to parse the JSON. “cf_Project”: “{\r\n \”cf_projectname\”: \”Client Commercial\”,\r\n \”cf_projectabbreviation\”: \”CC\”,\r\n \”cf_pmtrackerid\”: \”3b576605-9c82-e911-a839-000d3a07f695\”\r\n}” Retrieving Project Values. Use “Apply to each” to get the value of the Project. Pass “Value” of “List Records” from Dynamic Content in “Select an output from previous steps” Now Set the Value in the “Project” variable which we had initialized earlier. Go To Expression and type: items(‘Apply_to_each’)[‘cf_Project’] Note: Here “cf_Project” is what we had retrieved in the output of ‘list records’. Make sure you pass this value correctly. “cf_Project“: “{\r\n \”cf_projectname\”: \”Client Commercial\”,\r\n \”cf_projectabbreviation\”: \”CC\”,\r\n \”cf_pmtrackerid\”: \”3b576605-9c82-e911-a839-000d3a07f695\”\r\n}” Result of Project Variable: Parsing JSON. Use “Parse JSON” action Add “Project Variable” in Content from “Dynamic Content” Click on “Generate from sample” to generate JSON Schema Enter sample JSON payload and click on done. { “cf_projectname”: “Test Project”, “cf_projectabbreviation”: “TR”, “cf_pmtrackerid”: “3b576605-9c82-e911-a839-000d3a07f695” } It will generate a JSON Schema automatically. Using Project Values. After parsing Json successfully you can use the values of the project entity field. You can use “Compose” to get and check the value. Enter “cf_projectname” in “Compose” inputs. OutputEntire FLOW: NOTE: You can add multiple expand queries in List Record:Query: cf_Project($select=cf_projectname,cf_projectabbreviation),cf_ParentLocationId($select=cf_name)
Share Story :
Calculated Field in Dynamic 365 CE
Introduction In this blog we will see how to use Calculated field. Use Case : Its common requirement of Project to set calculated date to specific date field by adding or Subtracting the no. of days. Implementation : Step 1: Let say we have date field in an Account Entity. Step 2: Create one more date field with data type as date with field type as calculated field. Select field type -> Calculated -> Edit Step 3: Click on Edit. and add condition. In this scenario , I want to add 3 days to the selected date which is date created field. So the condition is if current entity date created field contains data And then add action. Save and close Result :
Share Story :
Convert Email Body from HTML format to Text
Introduction: We had a requirement , wherein when an Email is received a Case will be created in CRM and the body of the email will be set the description of the case. However we faced a problem because the Email body was in HTML format so we have to convert it and set it as the description. Solution: We have to write a plugin in which just take the HTML part of the email and eliminate every HTML tags so that we can get the Text part of the body. Steps: Register the plugin in PostOperation PipeLine Stage and in Asynchronous Mode. First, get the body of Email in a String variable and call the function. string description = currentRecord.GetAttributeValue<string>(Email.ATTR_DESCRIPTION); string actualDescription = StripHTML(description); 3.Then write a function to convert all the HTML Tags in the following way. private static string StripHTML(string source) { try { string result; // Remove HTML Development formatting // Replace line breaks with space // because browsers inserts space result = source.Replace(“\r”, ” “); // Replace line breaks with space // because browsers inserts space result = result.Replace(“\n”, ” “); // Remove step-formatting result = result.Replace(“\t”, string.Empty); // Remove repeating spaces because browsers ignore them result = System.Text.RegularExpressions.Regex.Replace(result, @”( )+”, ” “); // Remove the header (prepare first by clearing attributes) result = System.Text.RegularExpressions.Regex.Replace(result, @”<( )*head([^>])*>”, “<head>”, System.Text.RegularExpressions.RegexOptions.IgnoreCase); result = System.Text.RegularExpressions.Regex.Replace(result, @”(<( )*(/)( )*head( )*>)”, “</head>”,System.Text.RegularExpressions.RegexOptions.IgnoreCase); result = System.Text.RegularExpressions.Regex.Replace(result,”(<head>).*(</head>)”, string.Empty,System.Text.RegularExpressions.RegexOptions.IgnoreCase); // remove all scripts (prepare first by clearing attributes) result = System.Text.RegularExpressions.Regex.Replace(result,@”<( )*script([^>])*>”, “<script>”,System.Text.RegularExpressions.RegexOptions.IgnoreCase); result = System.Text.RegularExpressions.Regex.Replace(result,@”(<( )*(/)( )*script( )*>)”, “</script>”,System.Text.RegularExpressions.RegexOptions.IgnoreCase); //result = System.Text.RegularExpressions.Regex.Replace(result, //@”(<script>)([^(<script>\.</script>)])*(</script>)”, //string.Empty, // System.Text.RegularExpressions.RegexOptions.IgnoreCase); result = System.Text.RegularExpressions.Regex.Replace(result,@”(<script>).*(</script>)”, string.Empty,System.Text.RegularExpressions.RegexOptions.IgnoreCase); // remove all styles (prepare first by clearing attributes) result = System.Text.RegularExpressions.Regex.Replace(result, @”<( )*style([^>])*>”, “<style>”,System.Text.RegularExpressions.RegexOptions.IgnoreCase); result = System.Text.RegularExpressions.Regex.Replace(result,@”(<( )*(/)( )*style( )*>)”, “</style>”,System.Text.RegularExpressions.RegexOptions.IgnoreCase); result = System.Text.RegularExpressions.Regex.Replace(result,”(<style>).*(</style>)”, string.Empty,System.Text.RegularExpressions.RegexOptions.IgnoreCase); // insert tabs in spaces of <td> tags result = System.Text.RegularExpressions.Regex.Replace(result,@”<( )*td([^>])*>”, “\t”,System.Text.RegularExpressions.RegexOptions.IgnoreCase); // insert line breaks in places of <BR> and <LI> tags result = System.Text.RegularExpressions.Regex.Replace(result,@”<( )*br( )*>”, “\r”,System.Text.RegularExpressions.RegexOptions.IgnoreCase); result = System.Text.RegularExpressions.Regex.Replace(result, @”<( )*li( )*>”, “\r”,System.Text.RegularExpressions.RegexOptions.IgnoreCase); // insert line paragraphs (double line breaks) in place // if <P>, <DIV> and <TR> tags result = System.Text.RegularExpressions.Regex.Replace(result,@”<( )*div([^>])*>”, “\r\r”,System.Text.RegularExpressions.RegexOptions.IgnoreCase); result = System.Text.RegularExpressions.Regex.Replace(result,@”<( )*tr([^>])*>”, “\r\r”,System.Text.RegularExpressions.RegexOptions.IgnoreCase); result = System.Text.RegularExpressions.Regex.Replace(result,@”<( )*p([^>])*>”, “\r\r”,System.Text.RegularExpressions.RegexOptions.IgnoreCase); // Remove remaining tags like <a>, links, images, // comments etc – anything that’s enclosed inside < > result = System.Text.RegularExpressions.Regex.Replace(result,@”<[^>]*>”, string.Empty,System.Text.RegularExpressions.RegexOptions.IgnoreCase); // replace special characters: result = System.Text.RegularExpressions.Regex.Replace(result, @” “, ” “,System.Text.RegularExpressions.RegexOptions.IgnoreCase); result = System.Text.RegularExpressions.Regex.Replace(result,@”•”, ” * “,System.Text.RegularExpressions.RegexOptions.IgnoreCase); result = System.Text.RegularExpressions.Regex.Replace(result,@”‹”, “<“,System.Text.RegularExpressions.RegexOptions.IgnoreCase); result = System.Text.RegularExpressions.Regex.Replace(result,@”›”, “>”,System.Text.RegularExpressions.RegexOptions.IgnoreCase); result = System.Text.RegularExpressions.Regex.Replace(result,@”™”, “(tm)”,System.Text.RegularExpressions.RegexOptions.IgnoreCase); result = System.Text.RegularExpressions.Regex.Replace(result, @”⁄”, “/”,System.Text.RegularExpressions.RegexOptions.IgnoreCase); result = System.Text.RegularExpressions.Regex.Replace(result,@”<”, “<“,System.Text.RegularExpressions.RegexOptions.IgnoreCase); result = System.Text.RegularExpressions.Regex.Replace(result,@”>”, “>”,System.Text.RegularExpressions.RegexOptions.IgnoreCase); result = System.Text.RegularExpressions.Regex.Replace(result,@”©”, “(c)”,System.Text.RegularExpressions.RegexOptions.IgnoreCase); result = System.Text.RegularExpressions.Regex.Replace(result,@”®”, “(r)”,System.Text.RegularExpressions.RegexOptions.IgnoreCase); // Remove all others. result = System.Text.RegularExpressions.Regex.Replace(result,@”&(.{2,6});”, string.Empty,System.Text.RegularExpressions.RegexOptions.IgnoreCase); // for testing // System.Text.RegularExpressions.Regex.Replace(result, //this.txtRegex.Text,string.Empty, // System.Text.RegularExpressions.RegexOptions.IgnoreCase); // make line breaking consistent result = result.Replace(“\n”, “\r”); // Remove extra line breaks and tabs: // replace over 2 breaks with 2 and over 4 tabs with 4. // Prepare first to remove any whitespaces in between // the escaped characters and remove redundant tabs in between line breaks result = System.Text.RegularExpressions.Regex.Replace(result,”(\r)( )+(\r)”, “\r\r”,System.Text.RegularExpressions.RegexOptions.IgnoreCase); result = System.Text.RegularExpressions.Regex.Replace(result, “(\t)( )+(\t)”, “\t\t”,System.Text.RegularExpressions.RegexOptions.IgnoreCase); result = System.Text.RegularExpressions.Regex.Replace(result,”(\t)( )+(\r)”, “\t\r”,System.Text.RegularExpressions.RegexOptions.IgnoreCase); result = System.Text.RegularExpressions.Regex.Replace(result, “(\r)( )+(\t)”, “\r\t”,System.Text.RegularExpressions.RegexOptions.IgnoreCase); // Remove redundant tabs result = System.Text.RegularExpressions.Regex.Replace(result,”(\r)(\t)+(\r)”, “\r\r”,System.Text.RegularExpressions.RegexOptions.IgnoreCase); // Remove multiple tabs following a line break with just one tab result = System.Text.RegularExpressions.Regex.Replace(result,”(\r)(\t)+”, “\r\t”,System.Text.RegularExpressions.RegexOptions.IgnoreCase); // Initial replacement target string for line breaks string breaks = “\r\r\r”; // Initial replacement target string for tabs string tabs = “\t\t\t\t\t”; for (int index = 0; index < result.Length; index++) { result = result.Replace(breaks, “\r\r”); result = result.Replace(tabs, “\t\t\t\t”); breaks = breaks + “\r”; tabs = tabs + “\t”; } // That’s it. return result; } catch { //MessageBox.Show(“Error”); return source; } } 4. This is the Output. This is the Test Email that is been send to test. This is the email that is received in the Dynamics 365 CRM. This is the Case which is created. The description of the Case is the same as the Email
Share Story :
Create An Editable Grid View In PowerApps
Introduction: In this blog, we will learn how we can create an editable Grid View in PowerApps. Steps: 1.Set up a gallery in your Powerapps. Insert a new gallery – Insert > Gallery > Vertical 2.Add Data Source to the Gallery you added. Go to Properties > Click Data Source you want. 3.Delete the Label from the Gallery. 4.Add Text input control in the PowerApps Grid. I have added 3 Text input control inside the Grid. 5. For each text input box: Set TextInput.Default = ThisItem.<fieldName> For eg: TextInput1.Default = ThisItem.Description 6.The output screen after adding the Default property. 7. You can change the field here. 8. To Save the changed value into the Data source, set the following: Set TextInput.OnChange = Patch(Products, ThisItem, { <fieldName>: TextInput.Text }) This will change and save the value into the CRM.
Share Story :
Find hidden entities in CRM using Metadata Document generator from XRM ToolBox
Problem Statement: I had a requirement where I needed to check the fields on the Entity POST, however in CRM customization, I could not find the entity POST though it was visible in advanced Find. Solution: To view all the data related to any hidden field, you can use the Metadata Generator in XRM Toolbox Connect to your environment on XRM Toolbox. Search for Metadata Document Generator In Metadata Document Generator: Retrieve Entities and languages Select the entity you want to generate metadata for and enter the file path of the excel document where the data needs to be stored. Generate Document 4. Open the document, you will be able to see all the data related to the Entity. Conclusion: XRM Toolbox- Metadata Generator is helpful in case the entity cannot be viewed in CRM.
Share Story :
How to map Signature field into Word template
Introduction : As we know , signature field with pen control can not be mapped directly into word template. This blog will explain how to map signature field into word template. Implementation : Steps to Add Signature Field Step 1 : Create signature Field with data type multiple line of text and maximum length 15000 Step 2: Then in the field properties -> control -> select Pen Control and Add. In word template ,signature field will map as a text field which contains base 64 separated by comma. As shown below. Steps for resolution: Step 1 : To map signature field in picture format in word template , create new field signature text with data type multiple line of text and maximum length 1048576. Step 2 : Write plugin. Plugin will trigger on create of record and update of signature field. Plugin Explanation : Plugin will retrieve the value of signature and separate ” data:image/png;base64 ” string followed by “,” (comma) and save remaining text in newly created signature text field. Plugin Registration: Register a plugin on create and update of account entity 2.Plugin Code void SignatureUpdate(Entity account) { tracingService.Trace(“postmsg : ” + account); string signaturetext = string.Empty; string attributeToUpdate = string.Empty; Entity AccountUpdate = null; try { AccountUpdate = new Entity(); AccountUpdate.Id = account.Id; AccountUpdate.LogicalName = account.LogicalName; if (account.Contains(“new_signature”) && account[“new_signature”] != null) { signaturetext = account.GetAttributeValue<string>(“new_signature”); attributeToUpdate = “new_signaturetext”; AccountUpdate = ProcessSignature(signaturetext, AccountUpdate, attributeToUpdate); } service.Update(AccountUpdate); } catch (Exception) { throw; } } public Entity ProcessSignature(string signaturetext, Entity Account, string attribute) { //to split base64 and remaining text string[] substring = signaturetext.Split(‘,’); Account[attribute] = substring[1]; return Account; } 3. build the code and update assembly and trigger a plugin And upload this template . Result :
Share Story :
How to create AX (D365 F&0) Connection in SSIS
Introduction: Creating a Connection is one of the first Steps during integration of data. While performing Integration with AX or more specifically Dynamics 365 for Finance and Operations create a connection using the following steps. Step 1: Right Click on Connection Managers and click on New Connection Manager. Choose the Dynamics CRM option. Step 2: Choose the SOAP 2011 Option for Service Endpoint option. Step 3: Choose the Online Federation for Authentication Type option. Step 4: In the CRM Discovery Option copy the endpoint address from Settings > Customizations > Developer Resources > Copy Endpoint Address. Step 5: Paste this in CRM Discovery Section. Enter the Username and Password of your CRM account. Step 6: Choose the required organization from the dropdown. Step 7: Click on Test Connection and then OK after successful testing. Conclusion: Thus we have successfully created a connection with Dynamics CRM and we can now Integrate data using it a source /destination.
