tag:blogger.com,1999:blog-77635532490792455852024-03-13T02:19:58.720-07:00Steve Endow - The BlogSteve Endow is a Microsoft MVP who works with Microsoft Dynamics 365 Business Central, Azure, .NET, SQL Server, and Power Platform<br>
<br>
<b>Dynamics 365 BC Resources List:</b>
<a href="https://steveendow.link/bcresources">steveendow.link/bcresources</a>
<br>
OR: <a href="https://bit.ly/bcresources">bit.ly/bcresources</a>Steve Endowhttp://www.blogger.com/profile/03950475674093020502noreply@blogger.comBlogger99125tag:blogger.com,1999:blog-7763553249079245585.post-82372480204314470812024-03-04T10:50:00.000-08:002024-03-04T10:51:55.036-08:00How many digits can a Business Central Amount field actually support?<p> by Steve Endow</p><p><br /></p><p>(If anyone has a technical explanation for the discrepancy between the Docs and the BC behavior, let me know!)</p><p><br /></p><p>On Sunday night, as I am prone to do, I was testing something obscure in Business Central Online.</p><p>I was checking to see how many digits were supported in a "currency" field, aka an Amount field. Different numeric fields will have different limitations, but I was specifically interested in the limits of currency amounts.</p><p>For instance, if I needed to create a transaction in Venezuelan Bolivars, could Business Central handle a large number of Bolivars? And could it also handle a large number of Bolivars with "cents"?</p><p></p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEgZj4YgKsiGAwuZOFyFr1DzfwGylFnquND9QR9gImrdk2Q9x7iYwDzaLfXUEp6mR7jh9anbCS2Y8DejTsQzOBRRBozPI3jxjxAxCd1U-B9nMC5F_kJoKComNSANWNdINeWMMuYW7gXAR1C8uXQyjd50BugCkJGYd1UvPrPmXDCbfmzVHTEJzoPa79bnYCKw" style="margin-left: auto; margin-right: auto;"><img data-original-height="179" data-original-width="671" height="106" src="https://blogger.googleusercontent.com/img/a/AVvXsEgZj4YgKsiGAwuZOFyFr1DzfwGylFnquND9QR9gImrdk2Q9x7iYwDzaLfXUEp6mR7jh9anbCS2Y8DejTsQzOBRRBozPI3jxjxAxCd1U-B9nMC5F_kJoKComNSANWNdINeWMMuYW7gXAR1C8uXQyjd50BugCkJGYd1UvPrPmXDCbfmzVHTEJzoPa79bnYCKw=w400-h106" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">500,000 US Dollars is approximately 1.8 trillion Bolivars, give or take</td></tr></tbody></table><br /><br />So I entered a really big number in Business Central and saw this error:<p></p><p></p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEiTCKM7zMyJPi4ZppN7v9bvWC_AlW7xrLCjVCInhOmi-H95DFdvzvlcZ47sFc4ETK6hVVg5IqpHxvu2SKmUKk303pPS9mwIqCsFUB6Qw4aUgp7IaM4ZV61AtaDzIs_tTd_SVHIkCBJslRGoFzIYmUOdoaYe6i1ADemDP9uttYde9WSwuAuCZ1MX5jrhG1YJ" style="margin-left: auto; margin-right: auto;"><img alt="" data-original-height="229" data-original-width="351" height="209" src="https://blogger.googleusercontent.com/img/a/AVvXsEiTCKM7zMyJPi4ZppN7v9bvWC_AlW7xrLCjVCInhOmi-H95DFdvzvlcZ47sFc4ETK6hVVg5IqpHxvu2SKmUKk303pPS9mwIqCsFUB6Qw4aUgp7IaM4ZV61AtaDzIs_tTd_SVHIkCBJslRGoFzIYmUOdoaYe6i1ADemDP9uttYde9WSwuAuCZ1MX5jrhG1YJ" width="320" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Type Decimal</td></tr></tbody></table><br />So I learned that the data type is Decimal. I can never remember the maximum data type values, so I searched for "Business Central decimal data type", which led me to this page:<p></p><span><a name='more'></a></span><p><a href="https://learn.microsoft.com/en-us/dynamics365/business-central/dev-itpro/developer/methods-auto/decimal/decimal-data-type">https://learn.microsoft.com/en-us/dynamics365/business-central/dev-itpro/developer/methods-auto/decimal/decimal-data-type</a></p><p>This page claims "The maximum safe value that will work on all Business Central versions of is +/- 999,999,999,999,999.99". I'll refer to this value as 15+2--a total of 17 digits.</p><p>Note that the article does say "maximum safe value", and doesn't actually indicate the maximum Amount that the Business Central Online application supports.</p><p>So I then tried to enter an Amount value of 15+2. And something odd happened.</p><p></p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEh6vZEKjSPt8ywv7nw244xstjqRW4xxFwcFpsZbE2hLJf567Ip7pLRskn8iNcjkhi1EdN6C8qElY5pPpZ-pN7oiWzBzlWd5aHgBbigrFD7XCMjkLKPiXgXdn2WXYi7U_kF67Y0UCWgsa1BAKNZkC5F1pWAr2X0_3P5v8NSIdlNcIFMa6eSlOAH7BKLYNKT6" style="margin-left: auto; margin-right: auto;"><img alt="" data-original-height="424" data-original-width="464" height="240" src="https://blogger.googleusercontent.com/img/a/AVvXsEh6vZEKjSPt8ywv7nw244xstjqRW4xxFwcFpsZbE2hLJf567Ip7pLRskn8iNcjkhi1EdN6C8qElY5pPpZ-pN7oiWzBzlWd5aHgBbigrFD7XCMjkLKPiXgXdn2WXYi7U_kF67Y0UCWgsa1BAKNZkC5F1pWAr2X0_3P5v8NSIdlNcIFMa6eSlOAH7BKLYNKT6" width="263" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">15+2 is rounded to 15+0</td></tr></tbody></table><br />Wait, what?<p></p><p>As soon as I tabbed off the field, it rounded 5.67 to 6.00. </p><p>After testing in a few different Amount fields, it appears that the actual maximum value for a standard Business Central Amount field is a total of 15 digits. So either 15+0 or 14+1 or 13+2.</p><p>I have not yet looked into the code to see what is causing the discrepancy between the theoretical maximum value of the Decimal data type and the practical value of the typical Amount field.</p><p>It could be that there is a default max value on Amount fields. Or it could be some type of data type conversion between the database table field and the UI field. Not sure yet.</p><p>For my particular use case, I suspect that an Amount of 13+2 will be sufficient. If someone is dealing with 1.8 trillion Venezuelan Bolivars, I'm guessing they won't be looking at the decimals, and will at least round to the nearest thousand.</p><p>But this seemed like an obscure oddity, so I thought I would share my Sunday evening learning.</p><p><br /></p><p style="background-color: white; color: #444444; font-family: Arimo; font-size: 15.4px;"><i style="font-family: arimo;">Steve Endow is a Microsoft MVP in Los Angeles. He works with Dynamics 365 Business Central and related technologies.</i></p><div style="background-color: white; color: #444444; font-family: Arimo; font-size: 15.4px;"><i style="font-family: arimo; font-size: 15.4px;">You can also find him on </i><i style="font-family: arimo; font-size: 15.4px;"><a href="https://www.blogger.com/blog/post/edit/7763553249079245585/5039226310633470520#" style="color: #2288bb; text-decoration-line: none;">Twitter</a> and <a href="https://www.blogger.com/blog/post/edit/7763553249079245585/5039226310633470520#" style="color: #2288bb; text-decoration-line: none;">YouTube</a>,</i><i style="font-family: arimo; font-size: 15.4px;"> or through these links: <a href="https://links.steveendow.com/" style="color: #2288bb; text-decoration-line: none;" target="_blank">links.steveendow.com</a></i> </div><p><br /></p><p><br /></p><p><br /></p><p><br /></p>Steve Endowhttp://www.blogger.com/profile/03950475674093020502noreply@blogger.com0tag:blogger.com,1999:blog-7763553249079245585.post-47138002056305710752024-02-22T17:44:00.000-08:002024-03-04T10:50:33.149-08:00Filter by Date Range with Business Central Web API v2.0 - OData date filter syntax<p>by Steve Endow</p><p>I just spent 10 minutes trying to figure out the proper syntax for date filtering with Business Central Web API v2.0 endpoints, so I am documenting it here for future reference.</p><p>I don't regularly work with BC Web APIs these days, so when I have to dig back into them every 3-6 months, I'm almost always rusty and have a hard time remembering the URL format and the OData filter syntax used by Business Central Web APIs.</p><p>Today I was trying to filter the results returned from the generalLedgerEntries endpoint. If I try to call that endpoint without a filter, Postman gives me an error because it is returning too much data.</p><p></p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEjFjDA4v04bv0NiZ_9ETvCajUGsO-3yQMDiXAVd84lDN7gkROo-a8cq9y6c_3gtwqfR6fbbSy5ligNh35en-Xo0CcKF8sLceSLvGSaOdqoeBtJVTCHN2-CRl8S5seqLuCrbApAVcma2FKKaisB3un_8MJ73A4QSeM4GvcnTt8wZlBh2fFLQ9nm9eoipXbOY" style="margin-left: auto; margin-right: auto;"><img alt="" data-original-height="359" data-original-width="810" height="178" src="https://blogger.googleusercontent.com/img/a/AVvXsEjFjDA4v04bv0NiZ_9ETvCajUGsO-3yQMDiXAVd84lDN7gkROo-a8cq9y6c_3gtwqfR6fbbSy5ligNh35en-Xo0CcKF8sLceSLvGSaOdqoeBtJVTCHN2-CRl8S5seqLuCrbApAVcma2FKKaisB3un_8MJ73A4QSeM4GvcnTt8wZlBh2fFLQ9nm9eoipXbOY=w400-h178" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">The body of this response was too large to be saved</td></tr></tbody></table><br /><p></p><p>Fine, let's filter based on postingDate. But I don't remember the OData filter syntax. Unfortunately, the OData documentation has ZERO examples of filtering by date.<span></span></p><a name='more'></a><p></p><p>When I search for OData filter examples using dates, I see samples for other applications that look like this:</p><p></p><blockquote><span style="font-family: courier;">$filter=postingDate ge datetime'2022-01-01T00:00:00.000' and postingDate le datetime'2022-12-31T00:00:00.000'</span></blockquote><p></p><p>Let me save you some time: This OData filter format does NOT work with Business Central Web APIs. </p><p>Here is the format to filter by date on a Business Central Web API v2.0 endpoint:</p><p></p><blockquote><span style="font-family: courier;">generalLedgerEntries/?$filter=postingDate ge 2021-01-01 and postingDate le 2022-12-31</span></blockquote><p></p><p><br /></p><p>Here's what it looks like in Postman:</p><p></p><div style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEhftD0ltxE8YBkpIQ9RaqHTkwUnaEcHJu1bSZdv-4qdDQfLnDuz0iFn56bENzEttddn6OVXlKM016I4p-VMLB5lZHXhOuOZz0Tvrc-ddImDjTc4o_ZHqB2UzJ8VThNdMN0v3Ie80jecvxZ2wY7olAU7q0MDwWEjYknkkrIATqbQMiojiHKRLrPgvQh4nwou"><img alt="" data-original-height="332" data-original-width="1088" height="122" src="https://blogger.googleusercontent.com/img/a/AVvXsEhftD0ltxE8YBkpIQ9RaqHTkwUnaEcHJu1bSZdv-4qdDQfLnDuz0iFn56bENzEttddn6OVXlKM016I4p-VMLB5lZHXhOuOZz0Tvrc-ddImDjTc4o_ZHqB2UzJ8VThNdMN0v3Ie80jecvxZ2wY7olAU7q0MDwWEjYknkkrIATqbQMiojiHKRLrPgvQh4nwou=w400-h122" width="400" /></a></div><br /><br /><p></p><p>And here is a sample encoded URL:</p><p></p><blockquote><span style="font-family: courier;">https://api.businesscentral.dynamics.com/v2.0/<tenant>/Sandbox1/api/v2.0/companies(<guid>)/generalLedgerEntries/?%24filter=postingDate%20ge%202021-01-01%20and%20postingDate%20le%202022-12-31</span></blockquote><p></p><p><br /></p><p>Key points:</p><p></p><ol style="text-align: left;"><li>Prefix the filter with ?</li><li>Standard Odata filter operators like gt and ge do work</li><li>Do not put apostrophes or quotes around the date values</li><li>Do not use any date conversion functions to format the date value</li></ol><p></p><p><br /></p><p style="background-color: white; color: #444444; font-family: Arimo; font-size: 15.4px;"><i style="font-family: arimo;">Steve Endow is a Microsoft MVP in Los Angeles. He works with Dynamics 365 Business Central and related technologies.</i></p><div style="background-color: white; color: #444444; font-family: Arimo; font-size: 15.4px;"><i style="font-family: arimo; font-size: 15.4px;">You can also find him on </i><i style="font-family: arimo; font-size: 15.4px;"><a href="https://www.blogger.com/blog/post/edit/7763553249079245585/5039226310633470520#" style="color: #2288bb; text-decoration-line: none;">Twitter</a> and <a href="https://www.blogger.com/blog/post/edit/7763553249079245585/5039226310633470520#" style="color: #2288bb; text-decoration-line: none;">YouTube</a>,</i><i style="font-family: arimo; font-size: 15.4px;"> or through these links: <a href="https://links.steveendow.com/" style="color: #2288bb; text-decoration-line: none;" target="_blank">links.steveendow.com</a></i> </div>Steve Endowhttp://www.blogger.com/profile/03950475674093020502noreply@blogger.com0tag:blogger.com,1999:blog-7763553249079245585.post-72939977711021971112023-06-01T14:04:00.001-07:002023-06-01T14:07:21.693-07:00Business Central Simple Tip #5: Comment Lines, Standard Text Codes, and Extended Text<p>by Steve Endow</p><p>(Thanks to <a href="https://twitter.com/KristenHosman" target="_blank">Kristen Hosman</a> for showing me this feature!)</p><p><br /></p><p>Business Central has a very cool feature that allows you to add text Comments to transaction lines. I'm excited about it because I don't believe we had an equivalent feature in the Dynamics GP world.</p><p>The feature appears to be well designed and implemented in Business Central, but the official MS documentation on the elements of the features are limited, so I don't think the docs to the feature justice.</p><p>There are 3 elements to the overall "feature" in Business Central:</p><p>1. Comment Line Type</p><p>2. Standard Text Codes</p><p>3. Extended Text</p><p><br /></p><p><b><u>Comment Lines</u></b></p><p>When entering a transaction in Business Central, such as a Sales Invoice, the Line "Type" field can be set to "Comment". You can then manually enter comment text in the line Description field. This is the simplest option for ad-hoc comment lines, but the Description field is limited to 100 characters, so if you need more than 100 characters, you would need to add multiple Comment lines.</p><span><a name='more'></a></span><p><br /></p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFQ1AnpZdPCL-gPJgwgHaa326kg5QhFN8RXCAs_Wo62SywAVSIzWjG0ZvxWHypHBcmE0a9t--iH2Jl3AweMfuYEiw1DE4uNQQJuHIS0uSt0uVGo7goH-f9H3Y11o1dOt77nKQksaJ5X106-CeAmwmJnDBPwq0csV8oVA4Y6PzPTnEb4oY44SrJ-JWxvQ/s683/Comment1.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="236" data-original-width="683" height="138" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFQ1AnpZdPCL-gPJgwgHaa326kg5QhFN8RXCAs_Wo62SywAVSIzWjG0ZvxWHypHBcmE0a9t--iH2Jl3AweMfuYEiw1DE4uNQQJuHIS0uSt0uVGo7goH-f9H3Y11o1dOt77nKQksaJ5X106-CeAmwmJnDBPwq0csV8oVA4Y6PzPTnEb4oY44SrJ-JWxvQ/w400-h138/Comment1.jpg" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Comment Line Type</td></tr></tbody></table><p><br /></p><div><b><u>Standard Text Codes</u></b></div><div><br /></div><div>If you have documents that consistently use standard lines of text, you can use Standard Text Codes. These codes are pre-defined Comments that you can select from the item No. field on a line. This could be used to consistently add text lines for short messages about service charges, delivery details, supplemental item information, holiday messages, etc.</div><div><br /></div><div>The Standard Text "Code" can be up to 20 characters, and the Description value is still limited to 100 characters.</div><div><br /></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBpaRCkabUuGh-L1XlXz791efsVQalMNI-x-ypn5tuVq0_CUdjDWd5ZVPFOxtz_OSl1qJJxmR7VZTJzI1nOIHH3ufaJ0bBShl7ojxmy1J5BMqquU6v2wsD1E-lI--MqMYn4dIROcMqyOI8XK-B68l6eodjvWC7aW8HOruAjgQfv1sztw-kt1FnUXi64w/s748/Comment2.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="428" data-original-width="748" height="229" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBpaRCkabUuGh-L1XlXz791efsVQalMNI-x-ypn5tuVq0_CUdjDWd5ZVPFOxtz_OSl1qJJxmR7VZTJzI1nOIHH3ufaJ0bBShl7ojxmy1J5BMqquU6v2wsD1E-lI--MqMYn4dIROcMqyOI8XK-B68l6eodjvWC7aW8HOruAjgQfv1sztw-kt1FnUXi64w/w400-h229/Comment2.jpg" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Select Standard Text Code on Comment line</td></tr></tbody></table><div><br /></div><div><br /></div><div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXaXCMHpG7IuH2AHzPPI8rBc0_BeDsU22dXEtjReB2GSTpxdHz4FVLZu20yX6823dYRnXqkkMRvTCi7cMO4FuPb9C-w6kIhOlCe7YcVIk9JUKpy9Sm2jFHFQKXWsPRq2Y6DRroPKkrB9sqsWij-slpHdqbewyRi_-F0objsOGkBiMrfSSOImhijAK4Tw/s865/Comment3.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="563" data-original-width="865" height="260" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXaXCMHpG7IuH2AHzPPI8rBc0_BeDsU22dXEtjReB2GSTpxdHz4FVLZu20yX6823dYRnXqkkMRvTCi7cMO4FuPb9C-w6kIhOlCe7YcVIk9JUKpy9Sm2jFHFQKXWsPRq2Y6DRroPKkrB9sqsWij-slpHdqbewyRi_-F0objsOGkBiMrfSSOImhijAK4Tw/w400-h260/Comment3.jpg" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Standard Text Codes</td></tr></tbody></table><br /><br /></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinySua8iE6OtFVIMSSKqAhd43G1l4jqBiQm-qkd-NRsiwMjiFiwv6C7W35RN6JPOsI4bK1yKiqbv0uAmljP1HcsOKUyWkL6MfGNo1fQRvqtphyyNZzoQqSx2PvufaynvCWcni5xFC67BBJFh02tZSmRUtLbSEWRCCr2TyzsIM_cQBMgw_FaLzA1M-tfw/s670/Comment4.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="216" data-original-width="670" height="129" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinySua8iE6OtFVIMSSKqAhd43G1l4jqBiQm-qkd-NRsiwMjiFiwv6C7W35RN6JPOsI4bK1yKiqbv0uAmljP1HcsOKUyWkL6MfGNo1fQRvqtphyyNZzoQqSx2PvufaynvCWcni5xFC67BBJFh02tZSmRUtLbSEWRCCr2TyzsIM_cQBMgw_FaLzA1M-tfw/w400-h129/Comment4.jpg" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Standard Text Code used on Comment Line</td></tr></tbody></table><br /><div><br /></div><div><b><u>Extended Text</u></b></div><div><br /></div><div>What if you need to regularly add more than 100 characters of comment text, or need to add several standard lines of comment text to a document?</div><div><br /></div><div>This is where Extended Text comes in. Extended Text allows you to define one or more lines that are associated with a single Standard Text Code. When you choose a Standard Text Code, all applicable Extended Text comments will be added as comment lines.</div><div><br /></div><div>But there's more!</div><div><br /></div><div>Extended Text objects can be associated with a specific Language Code, can be "effective dated" (start and end date), and you can select which document types the Extended Text will apply to.</div><div><br /></div><div>THIS IS AWESOME. The language, effective dates, and document types make Extended Text a really powerful way to save time and add consistent messaging to your documents.</div><div><br /></div><div> <table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4Bw9S9T2Cj3Yp212zpVXptkp2JiPwvEjuGyI1h89MGdPC7CWx5rG5shSLoe-4KwZZn6E-0oN4kgYcJTwo8u1HSVZSo-jxdg7lBL5-XcfoEzTks6pcFWdhAowo_JhItxNFZWNou2r8WTNjcyrv5wvismVVHycEInoR9YnitfUmsx6p01wa_kEb25rZNw/s753/Comment5.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="336" data-original-width="753" height="179" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4Bw9S9T2Cj3Yp212zpVXptkp2JiPwvEjuGyI1h89MGdPC7CWx5rG5shSLoe-4KwZZn6E-0oN4kgYcJTwo8u1HSVZSo-jxdg7lBL5-XcfoEzTks6pcFWdhAowo_JhItxNFZWNou2r8WTNjcyrv5wvismVVHycEInoR9YnitfUmsx6p01wa_kEb25rZNw/w400-h179/Comment5.jpg" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Extended Text menu on Standard Text Codes list</td></tr></tbody></table><br /></div><div><br /></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkIk5oObyA5ArnC8O_BR3w2M3s2PD71cAnE1c1gSXHWi3VPvtnc-YwQDIWsuah0G8aDesPlPCCXz0ZfjDT-WHmgG5G5EtMzbAFChN00PsdsT2ewjpvgHgb8Nyjl9fBQCo9oW0-N3Dr5nkNuAMqm0vxWYZVEuRg6PG7AYeCDH8ssD6H9_4VL8kV0wruaQ/s1007/Comment6.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="1007" data-original-width="774" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkIk5oObyA5ArnC8O_BR3w2M3s2PD71cAnE1c1gSXHWi3VPvtnc-YwQDIWsuah0G8aDesPlPCCXz0ZfjDT-WHmgG5G5EtMzbAFChN00PsdsT2ewjpvgHgb8Nyjl9fBQCo9oW0-N3Dr5nkNuAMqm0vxWYZVEuRg6PG7AYeCDH8ssD6H9_4VL8kV0wruaQ/w308-h400/Comment6.jpg" width="308" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Extended Text configuration options</td></tr></tbody></table><br /><br /><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisK2KxZBbA0d-giwKGZk8E6V1w0mU6OwmXh5qM8LkhqzYPMB5AZp2LYXcYxVZf37JY0jUPYNjtZgB0TLIcY2mRN_VOxksc4YGNv_qfVQ3TYSJp6Ja6dousiRyBuxHR6mv5iR2J_XU3IJojriLRfP3YBMJ3-TiDha1wblqOexo-Ap9C0d7jKtRV7Ni9ow/s677/Comment7.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="412" data-original-width="677" height="244" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisK2KxZBbA0d-giwKGZk8E6V1w0mU6OwmXh5qM8LkhqzYPMB5AZp2LYXcYxVZf37JY0jUPYNjtZgB0TLIcY2mRN_VOxksc4YGNv_qfVQ3TYSJp6Ja6dousiRyBuxHR6mv5iR2J_XU3IJojriLRfP3YBMJ3-TiDha1wblqOexo-Ap9C0d7jKtRV7Ni9ow/w400-h244/Comment7.jpg" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Extended Text lines added by selecting a single Standard Text Code</td></tr></tbody></table><br /><div><br /></div><div>Comment lines and Standard Text Codes are handy, but I think that Extended Text offers a more powerful solution for consistent comment lines on documents.</div><div><br /></div><div><br /></div><div>What are some interesting or clever uses of Comments, Standard Text Codes, and Extended Text?</div><div><br /></div><div><br /></div><p style="background-color: white; color: #444444; font-family: Arimo; font-size: 15.4px;"><i style="font-family: arimo;">Steve Endow is a Microsoft MVP in Los Angeles. He works with Dynamics 365 Business Central and related technologies.</i></p><div><i style="color: #444444; font-family: arimo; font-size: 15.4px;">You can also find him on </i><i style="color: #444444; font-family: arimo; font-size: 15.4px;"><a href="https://www.blogger.com/blog/post/edit/7763553249079245585/5039226310633470520#" style="color: #2288bb; text-decoration-line: none;">Twitter</a> and <a href="https://www.blogger.com/blog/post/edit/7763553249079245585/5039226310633470520#" style="color: #2288bb; text-decoration-line: none;">YouTube</a>,</i><i style="color: #444444; font-family: arimo; font-size: 15.4px;"> or through these links: <a href="https://links.steveendow.com/" style="color: #2288bb; text-decoration-line: none;" target="_blank">links.steveendow.com</a></i> </div><div><br /></div>Steve Endowhttp://www.blogger.com/profile/03950475674093020502noreply@blogger.com0tag:blogger.com,1999:blog-7763553249079245585.post-40887282765219059342023-03-05T11:42:00.007-08:002023-03-05T22:38:46.321-08:00Documentation. Documentation? Documentation!<p>by Steve Endow</p><p>How do you create your documentation? </p><p>When do you create your documentation?</p><p>Who in your organization creates your documentation? Who doesn't?</p><p>Does anybody actually read your documentation? How do you know?</p><p>Do you specifically budget for documentation in your projects? How much?</p><p>Are your customers reluctant to pay for documentation?</p><p>Can your documentation keep up with your software releases? Do you maintain detailed release notes?</p><p>Do you methodically and consistently update your documentation over time? </p><p><br /></p><p><b>Update:</b> (based on a <a href="https://twitter.com/eHougaard/status/1632512965445554176?s=20" rel="nofollow" target="_blank">response from Erik Hougaard</a> on Twitter)</p><p>Do you create instructional videos or video tutorials as part of your documentation? If so, how do you consistently record, edit, store, publish, and index such videos? Do you have public and private (e.g. customer specific) videos? If so, how do you handle publishing videos for those different audiences?</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwO8xlow0UozMaLj5XmT91sSxoXcNJ6ppUUcd7XxDHaCNfIUW4y4LBdU-LusF7rEnpqYPRe-Tgi_Pc0steJbbMnpiK_LxGbJetoky6nHAFOBYiGHwIpPScSXbgQjly8c8di8I2WCleGSPyQnohUoP-mTlb98yqBXRhLYarbyDsh_N-C64COf2anM35EA/s526/UserManual.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="505" data-original-width="526" height="307" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwO8xlow0UozMaLj5XmT91sSxoXcNJ6ppUUcd7XxDHaCNfIUW4y4LBdU-LusF7rEnpqYPRe-Tgi_Pc0steJbbMnpiK_LxGbJetoky6nHAFOBYiGHwIpPScSXbgQjly8c8di8I2WCleGSPyQnohUoP-mTlb98yqBXRhLYarbyDsh_N-C64COf2anM35EA/s320/UserManual.jpg" width="320" /></a></div><p>By now I'm sure you are excited beyond belief, as there are few topics more glamorous than "documentation". </p><p><br /></p><p><b><u>Is it read?</u></b></p><p>Over the last 20 years, I've worked with over 700 customers. I've documented business processes, business procedures, ERP training guides, user manuals, customization specifications, integration designs, data mappings, installation guides, and software user manuals.<span></span></p><a name='more'></a><p></p><p>After all of this experience, I'd humbly submit that I'm fairly good at writing documentation. I've been using a customized MS Word template for my documentation for over 20 years. That Word template has worked well for me all these years, and it has been a better solution than anything else I've seen used at my customers. </p><p>Over the years I've also made a few observations about documentation.</p><p>My assessment is that most documentation is never read. Especially process and procedure documentation. In my experience, the customer requests it, spends a lot of money having it written, and it's almost never read or updated again. Customer-specific training manuals probably take second place. Detailed guides are written, users become familiar with the software, the docs collect dust, and by the time a new employee is hired and needs the guides, the docs are obsolete.</p><p>The last 13 years, I've sold and supported ISV software for Microsoft Dynamics GP, and more recently for Dynamics 365 Business Central. Based on my experience in this role, my observation is that installation guides and software manuals seem to get the most attention of all of the documentation I've written. Amazingly, some customers actually read installation guides and user manuals.</p><p>Unfortunately, I don't have any data on how many customers read my product documentation (foreshadowing). I'm guessing it's around 10%, but perhaps it's as high as 20%, at best. Dynamics Partners and Customers routinely request a support call to walk through the installation process instead of reading the installation instructions in the documentation. And when it comes to configuration issues and error messages, very few partners and customers even read the information on an error message or dialog, let alone check the documentation, before submitting a support ticket.</p><p><br /></p><p><b><u>How do you document?</u></b></p><p>If my estimate of 10-20% utilization is even remotely accurate, I would argue that this metric dictates how I should create and maintain my documentation.</p><p>If relatively few partners and customers are reading a PDF, should I spend money on a commercial documentation solution? Do I really need a fancy documentation publishing "pipeline"? Would the additional cost and effort of online documentation be justified? </p><p>Should I spend many precious hours on an elaborate documentation process that creates arguably "better" documentation?</p><p>How valuable is expensive, beautiful, feature rich documentation if only 20% of users ever use it? Will such fancy documentation be utilized any more than a basic PDF? </p><p>And if it is more complex to create and maintain, and if complexity means that fewer employees can update and maintain the documentation, thus creating a bottleneck for documentation, can that additional cost and burden be justified?</p><p>If I use a simple Word documentation template that anyone in my company can easily use with zero additional training, presumably that simplicity has a value of its own?</p><p>At the moment, I can only guess how many customers read my PDF documentation. One potential benefit of web-based documentation might be telemetry and metrics. If web-based docs allow me to easily see how many users utilize the documentation, which pages are viewed, and which are not, that could be valuable. But if that telemetry costs thousands of dollars and results in complexity that limits the number of employees who can maintain our documentation, is that trade off worth the benefit? </p><p><br /></p><p><b><u>Fancy Tools!</u></b></p><p>"You should use this free open source documentation platform that depends on these other libraries that read modified Markdown language, which then gets checked into into GitHub, where a pipeline runs to generate static web pages that are then published to a web site. It's the best!"</p><p>No. Nope. Absolutely not. </p><p>I want a brand new junior consultant to be able to quickly and easily create and update documentation for a PTE, a custom report, or an integration field mapping. I want my developer to be able to quickly update release notes, or a non-technical senior consultant to emphasize a valuable application feature in our documentation. If I need train employees to use Markdown and a "pipeline" to create or update documentation, that's a non-starter.</p><p>"You should use this super fancy commercial documentation platform that has incredible functionality! It's the best!" Yes, it does look nice, but... (checks price) ... it's $1,000 per month! PER. MONTH. Maybe that pricing makes sense for a $200 million company, but it's definitely too expensive for me.</p><p>There might be a few low cost commercial tools that could meet my needs, but I'm going to have to review them to see what they offer and how we might integrate them into our business.</p><p>My overall concern is that many people focus so much on the tool that they may not be critically evaluating the cost / benefit equation. Maybe your business is all highly technical developers who can easily work with GitHub pipelines. Maybe your company values beautiful, rich documentation that justifies the effort to develop fancy templates. And maybe your company needs internal documentation for 500 users, in which case perhaps $1,000 per month is a bargain.</p><p>But again, given my experience with documentation, I'm not convinced that an elaborate documentation solution will provide more value than a simple one, given my current needs.</p><p><br /></p><p><b><u>Update: Lights, Camera, Action!</u></b></p><p><a href="https://twitter.com/eHougaard/status/1632512965445554176?s=20" rel="nofollow" target="_blank">Erik Hougaard posted a great reply</a> on Twitter. He shared that he now primarily creates <b>videos</b> instead of written documentation. This is a very interesting idea that I forgot about. I have done a few product tutorial videos, but I don't usually think of video when a customer or user asks for documentation or instructions. </p><p>I think it's a great idea, as recording a 1-3 minute video could potentially be much more convenient and effective than writing a 2-3 page step by step instructional document. </p><p><a href="https://twitter.com/DmitryKatson/status/1632570387774193667?s=20" rel="nofollow" target="_blank">Dmitry Katson shared</a> that he's also switched to video tutorials instead of written documentation:</p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjul6SjzVS41z-DiuTTkS7cfprDr61xFqgZax9DRICnIjqo-opHr8Ny4MSnDobcA2i6_CxsCJoaglgDvlBFxDuoNm4ICA7n4GF-7khH2SDuQsWAWjhp8_4bCXc2sWdkOtmEjzlXCABXHKHAuLbaUY4pAoE_TvIQlcofeASWxxfHbVE3cie4zL-zebmukA/s679/DocumentationDmitry.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="206" data-original-width="679" height="121" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjul6SjzVS41z-DiuTTkS7cfprDr61xFqgZax9DRICnIjqo-opHr8Ny4MSnDobcA2i6_CxsCJoaglgDvlBFxDuoNm4ICA7n4GF-7khH2SDuQsWAWjhp8_4bCXc2sWdkOtmEjzlXCABXHKHAuLbaUY4pAoE_TvIQlcofeASWxxfHbVE3cie4zL-zebmukA/w400-h121/DocumentationDmitry.jpg" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">No more written documentation: Video only</td></tr></tbody></table><br /><p>This is truly fascinating. When I wrote this blog post, I didn't even think of video. So to learn that both Erik and Dmitry have essentially fully replaced their written documentation with videos was a big surprise to me.</p><p><br /></p><p>Questions that come to mind about video content:</p><p>1. How do you produce consistent, high quality videos? (with high quality audio) Not every employee will be able to do this. Or do you even need high quality? Are impromptu recordings on a laptop with a headset sufficient for these short videos?</p><p>2. Is more than one person in your organization able to produce such videos? i.e. can the process scale?</p><p>3. What video format (intro, outro, logos, overlays, graphics, etc.) do you use? </p><p>4. How do you publish the videos? If they are public videos for apps, presumably YouTube would work, but what about customer-specific videos for a PTE or process tutorial that cannot be posted publicly? How do you host those videos, index them, and make them available to end users? </p><p>Dmitry shared that he hosts the videos on Vimeo, while <a href="https://twitter.com/eHougaard/status/1632537603076677633?s=20" rel="nofollow" target="_blank">Erik noted that he will just record a Teams meeting</a> and post it in SharePoint.</p><p>Truly fascinating!</p><p><br /></p><p><b><u>A Journey</u></b></p><p>So I don't have any conclusions at this point, other than I'm sensing that it may not be easy to select a documentation solution that will replace MS Word. </p><p>At the moment, I *think* I would like to have a solution that lets us publish docs to our web site. This would avoid having to maintain and distribute PDFs, would facilitate updates to centralized docs, and it may allow us to gather metrics on usage of the docs pages.</p><p>But will such a solution work for our software products, Business Central customer per-tenant-extensions, and customer-specific user guides or documentation? Or would we have to use different tools for different situations?</p><p>It will require some research to answer those questions. </p><p><br /></p><p style="background-color: white; color: #444444; font-family: Arimo; font-size: 15.4px;"><i style="font-family: arimo;">Steve Endow is a Microsoft MVP in Los Angeles. He works with Dynamics 365 Business Central and related technologies.</i></p><p style="background-color: white; color: #444444; font-family: Arimo; font-size: 15.4px;"><i style="font-family: arimo;">You can also find him on </i><i style="font-family: arimo;"><a href="https://www.blogger.com/blog/post/edit/7763553249079245585/5039226310633470520#" style="color: #2288bb; text-decoration-line: none;">Twitter</a> and <a href="https://www.blogger.com/blog/post/edit/7763553249079245585/5039226310633470520#" style="color: #2288bb; text-decoration-line: none;">YouTube</a>,</i><i style="font-family: arimo;"> or through these links: <a href="https://links.steveendow.com/" style="color: #2288bb; text-decoration-line: none;" target="_blank">links.steveendow.com</a></i></p>Steve Endowhttp://www.blogger.com/profile/03950475674093020502noreply@blogger.com0tag:blogger.com,1999:blog-7763553249079245585.post-78990413481504342012023-01-19T10:06:00.003-08:002023-01-19T10:06:59.518-08:00Business Central Simple Tip #4: Exporting Leading Zeroes to Excel and then CSV- It works fine!<p>by Steve Endow</p><p><i>This may seem obvious to some, but I've learned through many painful lessons that unless I actually test a scenario and see for myself that it works exactly as desired, it can be dangerous to make assumptions about software functionality and offer promises to customers...</i></p><p><br /></p><p>ERP users regularly need to export data to CSV files, and then send or use those CSV files somewhere else. </p><p>A common problem with working with CSV files is that leading zeroes can sometimes be removed by Excel. This typically occurs when a user opens an existing CSV file, makes a change, and then saves the CSV file. During that CSV editing process, Excel will typically remove all leading zeroes from field values.</p><p>A customer recently asked us to create a custom file export to send to their bank. They need a list of payments created in Business Central, as well as all of the purchasing invoices that were paid by that payment--essentially a remittance file.</p><p>To keep things simple at first, we're looking to create a custom Business Central List Page that has all of the fields the customer needs for their bank. A user can then just click on the Open in Excel action from the list page to save the data to a file.</p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwPc4f5kNvVcpYU1jv-e_PBFNeUfjJvJQS2abkyC5SeuF_C9UDlOWuw_p5BQTsBIx-mzt-d9nsp1AdAdCS442YCqaXbyhpcjRhS4kw_PlZY2EC_nJ86Oi_t-uO2bFq_DAOnpKXuUzjBo2dKl55Iay00lrA-48B0jcH9OaP8E1gFhWTsSZPUaVkiCMoOw/s206/BCTip4-1.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="206" data-original-width="196" height="206" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwPc4f5kNvVcpYU1jv-e_PBFNeUfjJvJQS2abkyC5SeuF_C9UDlOWuw_p5BQTsBIx-mzt-d9nsp1AdAdCS442YCqaXbyhpcjRhS4kw_PlZY2EC_nJ86Oi_t-uO2bFq_DAOnpKXuUzjBo2dKl55Iay00lrA-48B0jcH9OaP8E1gFhWTsSZPUaVkiCMoOw/s1600/BCTip4-1.jpg" width="196" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Open in Excel from a List Page</td></tr></tbody></table><br /><p><span></span></p><a name='more'></a>The user can then open the Excel file and Save As to a CSV file. It's a few manual steps for now, but we can always automate the process in the future if necessary.<p></p><p>When we considered the idea of using Open in Excel, and then Save As CSV, one immediate concern I had was retaining leading zeroes on field values. </p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAxW7B73zSrAzCicjC2RGv7Q95cp0zf-GlsM8gPiTkkyK57himlk-L4b3ZnRd1fvO3DgpTanTJOju11RwQus5n3PQK3_2Q7sC_HhgXc_81TIG3pqfm6GthMrHAzl4KgiTRWOUn4iD7tIGrtW9TROnve_zljWNDQIUd3yjNQJmbfvEysLpEowAxVRBkdA/s622/BCTip4-1b.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="334" data-original-width="622" height="215" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAxW7B73zSrAzCicjC2RGv7Q95cp0zf-GlsM8gPiTkkyK57himlk-L4b3ZnRd1fvO3DgpTanTJOju11RwQus5n3PQK3_2Q7sC_HhgXc_81TIG3pqfm6GthMrHAzl4KgiTRWOUn4iD7tIGrtW9TROnve_zljWNDQIUd3yjNQJmbfvEysLpEowAxVRBkdA/w400-h215/BCTip4-1b.jpg" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Those Pesky Leading Zeroes</td></tr></tbody></table><br /><p>Sure enough, the customer had Vendor Numbers and Vendor Invoice Numbers with leading zeroes. And US ZIP Codes can also have leading zeroes. So I wanted to make sure that the Open in Excel -> Save to XLSX -> Open Excel file -> Save as CSV process retained all of the leading zeroes.</p><p>In short: Yes, all of the leading zeroes are retained when you use Business Central Open in Excel.</p><p>I created a test Vendor Number "00010" with a ZIP Code of "01122". From the Business Central Vendors list page, I clicked Open in Excel, then saved the XLSX file.</p><p>When I open the XLSX file in Excel, the leading zeroes are retained.</p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEio-XKaLmKjAD2HcGmUgetC9quQ1X_jSv-vQ12pLdMtMXEjqqSO_ZKOlce1D6b8lZPwmO7iH5ny64BO0aRv0Hz9aj_PN3EypiklwMTvtoMZPAurwqdTpTjh14aghHYB1DHUCTrjgouYG077Db9eDHLz-n2tRTxJcQzwBO4HXawKLZ8PGXY9Xd1859mFqA/s452/BCTip4-2.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="199" data-original-width="452" height="176" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEio-XKaLmKjAD2HcGmUgetC9quQ1X_jSv-vQ12pLdMtMXEjqqSO_ZKOlce1D6b8lZPwmO7iH5ny64BO0aRv0Hz9aj_PN3EypiklwMTvtoMZPAurwqdTpTjh14aghHYB1DHUCTrjgouYG077Db9eDHLz-n2tRTxJcQzwBO4HXawKLZ8PGXY9Xd1859mFqA/w400-h176/BCTip4-2.jpg" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Leading Zeroes Are Retained in the XLSX File</td></tr></tbody></table><br /><p>You can see the small triangle indicators in the upper left corner of the No. and ZIP Code cells indicating a formatting warning.</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQY9Fo-ZnrOU7LCQ-Yug1SBiCmecLxWHtHAmp1OeA8Oli7aT14se1qtH1Dvgz9ZLYftToVgePfdtUvZ6qKoF_7LYccaj14ICT1D_tlrAyc5xlFoUxYrhi1Lq6WgcDZPIjf3vaU-5AgqJjXqymmPasdzAeyxJt7jEZe57QznZ9Qqb1xvlxnBx-EqZfllA/s383/BCTip4-3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="329" data-original-width="383" height="344" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQY9Fo-ZnrOU7LCQ-Yug1SBiCmecLxWHtHAmp1OeA8Oli7aT14se1qtH1Dvgz9ZLYftToVgePfdtUvZ6qKoF_7LYccaj14ICT1D_tlrAyc5xlFoUxYrhi1Lq6WgcDZPIjf3vaU-5AgqJjXqymmPasdzAeyxJt7jEZe57QznZ9Qqb1xvlxnBx-EqZfllA/w400-h344/BCTip4-3.jpg" width="400" /></a></div><br /><p>The warning confirms that the column contains "Number Stored as Text", and Excel is eagerly wanting to convert those columns to numbers. Thankfully, it does keep the values as Text, thus retaining the leading zeroes.</p><p>But what happens if we do Save As CSV? Will Excel behave and properly output the values as text?</p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_2h2l3dPYBIgNDP9oMoOk8tAB1Xw7c_RX7r0kB0b_BxfyRmyt2l2VVVhutfwbkh26Pk4-FbY3H30lRAISZXOBU1g59N6LBFBSN2IGVRd0dAS-rszjMFl5A_Yd-6gQ740U4PUqJctn35F18p6pTKCPwSVMoTfwixop4zGQefo28EAZ7dQhMncKa8vJYw/s447/BCTip4-4.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="136" data-original-width="447" height="121" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_2h2l3dPYBIgNDP9oMoOk8tAB1Xw7c_RX7r0kB0b_BxfyRmyt2l2VVVhutfwbkh26Pk4-FbY3H30lRAISZXOBU1g59N6LBFBSN2IGVRd0dAS-rszjMFl5A_Yd-6gQ740U4PUqJctn35F18p6pTKCPwSVMoTfwixop4zGQefo28EAZ7dQhMncKa8vJYw/w400-h121/BCTip4-4.jpg" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Will The Zeroes Save???</td></tr></tbody></table><br />Thankfully, yes, Excel does faithfully save the leading zeroes to the CSV file.<div><br /></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMxIKIm5W0AEMiyCGjEGUaKHAAYkt1AUdPCTTiCHwt67bnf_m5ZeyfMgmHblVJinehgXtNJPBmhMgiJV3GxTnEaW6Bc4XAs0IzQc4ri6ozfEh4DDjga2CbFl9KzBFya1GBDTx_QVOwDDDXIXX8vmG2Zig2E6uYNOhSU1Prb8ZH23asmlB45cOuaBmYeQ/s981/BCTip4-5.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="187" data-original-width="981" height="76" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMxIKIm5W0AEMiyCGjEGUaKHAAYkt1AUdPCTTiCHwt67bnf_m5ZeyfMgmHblVJinehgXtNJPBmhMgiJV3GxTnEaW6Bc4XAs0IzQc4ri6ozfEh4DDjga2CbFl9KzBFya1GBDTx_QVOwDDDXIXX8vmG2Zig2E6uYNOhSU1Prb8ZH23asmlB45cOuaBmYeQ/w400-h76/BCTip4-5.jpg" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Leading Zeroes!</td></tr></tbody></table><br /><div>After performing this test, I was happy to confirm for myself that leading zeroes survived the journey from Open in Excel, all the way through to Save as CSV.</div><div><br /></div><div>Despite this good news, we will still need to warn the customer that they cannot open the resulting CSV file in Excel to edit it, as that will remove the leading zeroes. In this particular case, the customer should never be editing the file, so that should not be a concern.</div><div><br /></div><div><br /></div><div><p style="background-color: white; color: #444444; font-family: Arimo; font-size: 15.4px;"><i style="font-family: arimo;">Steve Endow is a Microsoft MVP in Los Angeles. He works with Dynamics 365 Business Central and related technologies.</i></p><p style="background-color: white; color: #444444; font-family: Arimo; font-size: 15.4px;"><i style="font-family: arimo;">You can also find him on </i><i style="font-family: arimo;"><a href="https://www.blogger.com/blog/post/edit/7763553249079245585/5039226310633470520#" style="color: #2288bb; text-decoration-line: none;">Twitter</a> and <a href="https://www.blogger.com/blog/post/edit/7763553249079245585/5039226310633470520#" style="color: #2288bb; text-decoration-line: none;">YouTube</a>,</i><i style="font-family: arimo;"> or through these links: <a href="https://links.steveendow.com/" style="color: #2288bb; text-decoration-line: none;" target="_blank">links.steveendow.com</a></i></p></div>Steve Endowhttp://www.blogger.com/profile/03950475674093020502noreply@blogger.com0tag:blogger.com,1999:blog-7763553249079245585.post-37104976861886361052023-01-17T17:17:00.006-08:002023-01-18T14:27:22.186-08:00Business Central Simple Tip #3: Those Role Center "Square Things" - Cues and Action Tiles<p>by Steve Endow</p><p>I was recently researching those "square things" that are displayed on the Business Central Role Center "home" page.</p><p>You know, the square things:</p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUq3MiIC0llbOlR3RNohBaCaiGojTTglxpfYKLyRVoWtlwtnOpDXGEIfu2_-Roo_S7JNN9-XzTMHzpx8lPYKVgrLIMdNMc6wbj3T3Xr80FvjE4tPuncGpg_isvEHHQjXstivZD1HjIAhc_CwA3Z_RTd5AGo-rtYaHEvIiMvoP8Q7lg5aADLYle8Ssjqw/s909/BCTip3-1.png" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="442" data-original-width="909" height="195" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUq3MiIC0llbOlR3RNohBaCaiGojTTglxpfYKLyRVoWtlwtnOpDXGEIfu2_-Roo_S7JNN9-XzTMHzpx8lPYKVgrLIMdNMc6wbj3T3Xr80FvjE4tPuncGpg_isvEHHQjXstivZD1HjIAhc_CwA3Z_RTd5AGo-rtYaHEvIiMvoP8Q7lg5aADLYle8Ssjqw/w400-h195/BCTip3-1.png" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">"Square Things"</td></tr></tbody></table><br /><p>After searching my memory, I recalled they were called "Cues". As in they provide a visual "cue" with information.</p><p>But when I started to research them and how I could create a custom Cue, found an article that mentioned both "Cues" and "Action Tiles".</p><p>What?<span></span></p><a name='more'></a><p></p><p><a href="https://learn.microsoft.com/en-us/dynamics365/business-central/dev-itpro/developer/devenv-cues-action-tiles" target="_blank">This BC Docs page</a> provides this definition for "Cue":</p><blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px;"><p style="text-align: left;"><i>A Cue provides a visual representation of aggregated business data, like the number of open sales invoices. Cues are interactive, meaning that <u>you can select the Cue to drill down to data or open another page, run code, and more</u>. Cues display data that is contained in a table field. This data can be raw data or calculated data.</i></p></blockquote><p>It provides this definition for "Action Tile":</p><blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px;"><p style="text-align: left;"><i>Action tiles promote an action or operation to the user on the Role Center. Action tiles act as <u>links that run a task or operation</u>. For example, an action tile could open another page, start a video, target another resource or URL, or run code. They'll arrange on the workspace just like that use the normal layout.</i></p></blockquote><p><br /></p><p>In the screen shot above, is the gray square thing a Cue? Or are the dark teal square things Cues?</p><p>Apparently <u>both</u> the gray and teal square things are all Cues. Huh. So, what is an Action Tile?</p><p>Looking closer at the screen shot on the BC Docs page, it looks like Action Tiles are the small square light teal things on the right.</p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXPD3xuCbL7V-B2f_8jNDJRlJg9yLDkIkY4Jm7jMtIGbIkbynjRsf_iKv3-mFRw_mLCZogvC4C3CW3uuComMGosUKuOW_2hdCZJtXqYiBecjExbBSK1Q5tm36N87FoSIfncI6oLJXN1B6xxptoPvVvo-8yGgIcndAXDK48pafz3LD-hd-kOo1rxAlzRQ/s1181/BCTip3-2.png" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="509" data-original-width="1181" height="173" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXPD3xuCbL7V-B2f_8jNDJRlJg9yLDkIkY4Jm7jMtIGbIkbynjRsf_iKv3-mFRw_mLCZogvC4C3CW3uuComMGosUKuOW_2hdCZJtXqYiBecjExbBSK1Q5tm36N87FoSIfncI6oLJXN1B6xxptoPvVvo-8yGgIcndAXDK48pafz3LD-hd-kOo1rxAlzRQ/w400-h173/BCTip3-2.png" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Cues on the Left. Action Tiles on the Right.</td></tr></tbody></table><br /><p>I don't see any Action Tiles on the Business Manager Role Center page, so I switched to the Accountant Role, which has two Action Tiles--both of which look like a "Play" style button. Do they play videos?</p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVQm9wr2etS46doCAo4WkFCMo2LCg3FHPUneodw2LmaH3NC67BpS2SFSKxT7CjpzH_PI0_JRhXS28E_152rBi2MHChhe9x-fUiwO5LD0WenqCA1B5tyTtGERZZaElDmCbI3duma7_APstqh-nSMHc_52WJjSKW9aqwnt2LXzhobCrbjjy6pqliWeDsDQ/s922/BCTip3-3.png" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="426" data-original-width="922" height="185" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVQm9wr2etS46doCAo4WkFCMo2LCg3FHPUneodw2LmaH3NC67BpS2SFSKxT7CjpzH_PI0_JRhXS28E_152rBi2MHChhe9x-fUiwO5LD0WenqCA1B5tyTtGERZZaElDmCbI3duma7_APstqh-nSMHc_52WJjSKW9aqwnt2LXzhobCrbjjy6pqliWeDsDQ/w400-h185/BCTip3-3.png" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Are these Action Tiles?</td></tr></tbody></table><br /><p>If I click on "Play Getting Started", it opens a Welcome dialog. Uh, okay. So I guess "Play" here means "launch a wizard window"?</p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9FNR3FlAOSl0nUq3aa4iW9Yl20px6dKLUvu7vYJ44XODqCQIsA-rt1LRxddCpqYuygAEKcsmCuA6hOrdDBFRH5Dofgq0SBwiLlD69UqQ10-ogSfeoKyllVFFfh8vm2PpdrEAOgGRb40t1yAq3T4lXgM6xiD3keMKxSxkvS5sMdBzkODvBCOgSjj-2_A/s826/BCTip3-4.png" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="826" data-original-width="684" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9FNR3FlAOSl0nUq3aa4iW9Yl20px6dKLUvu7vYJ44XODqCQIsA-rt1LRxddCpqYuygAEKcsmCuA6hOrdDBFRH5Dofgq0SBwiLlD69UqQ10-ogSfeoKyllVFFfh8vm2PpdrEAOgGRb40t1yAq3T4lXgM6xiD3keMKxSxkvS5sMdBzkODvBCOgSjj-2_A/w331-h400/BCTip3-4.png" width="331" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Play Getting Started</td></tr></tbody></table><br /><p>I looked through all of the other Roles in my demo Business Central Online environment, and these are the only two Action Tiles I could find.</p><p>So it seems that there aren't many examples. </p><p>The Docs page mentions that Action Tiles can be used to allow a user to create a new document. But, um, Role Center pages can also have actions in the upper right that allow the user to create a new document. So that doesn't seem like the best use of Action Tiles.</p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxrlniDLu6lBxydxEsJW67xGn1hww3DxC8y5yIhfP0xFc7xiUyffOTjikJ3ZO2VUfTuL34J-6DsqZmt2m9fjLkkvNv2HHXmbcqJhFB8MPQ0OPAT3f6fIsOyvDthVni3DVSvzQOxpuIy9i_dAkH2xlZZM4iYzAs3kM0LNNGQixVCG-w8_lUbwwC78D5oQ/s1088/BCTip3-5.png" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="385" data-original-width="1088" height="141" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxrlniDLu6lBxydxEsJW67xGn1hww3DxC8y5yIhfP0xFc7xiUyffOTjikJ3ZO2VUfTuL34J-6DsqZmt2m9fjLkkvNv2HHXmbcqJhFB8MPQ0OPAT3f6fIsOyvDthVni3DVSvzQOxpuIy9i_dAkH2xlZZM4iYzAs3kM0LNNGQixVCG-w8_lUbwwC78D5oQ/w400-h141/BCTip3-5.png" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Role Center Actions</td></tr></tbody></table><br /><p>So I can't think of any compelling uses for Action Tiles off the top of my head--but maybe someone has found a creative use for them.</p><p>It looks like it's pretty easy to add custom Cues and Action Tiles with AL code, but so far, I haven't found a way to add new Cues or Action Tiles through the Business Central Online user interface.</p><p>If you know of a way to add Cues or Action Tiles through the web interface, let me know!</p><p><br /></p><p style="background-color: white; color: #444444; font-family: Arimo; font-size: 15.4px;"><i style="font-family: arimo;">Steve Endow is a Microsoft MVP in Los Angeles. He works with Dynamics 365 Business Central and related technologies.</i></p><p style="background-color: white; color: #444444; font-family: Arimo; font-size: 15.4px;"><i style="font-family: arimo;">You can also find him on </i><i style="font-family: arimo;"><a href="https://www.blogger.com/blog/post/edit/7763553249079245585/5039226310633470520#" style="color: #2288bb; text-decoration-line: none;">Twitter</a> and <a href="https://www.blogger.com/blog/post/edit/7763553249079245585/5039226310633470520#" style="color: #2288bb; text-decoration-line: none;">YouTube</a>,</i><i style="font-family: arimo;"> or through these links: <a href="https://links.steveendow.com/" style="color: #2288bb; text-decoration-line: none;" target="_blank">links.steveendow.com</a></i></p><p style="background-color: white; color: #444444; font-family: Arimo; font-size: 15.4px;"><br /></p>Steve Endowhttp://www.blogger.com/profile/03950475674093020502noreply@blogger.com2tag:blogger.com,1999:blog-7763553249079245585.post-64860734016677120342022-12-29T08:55:00.003-08:002023-01-04T11:01:45.344-08:00Business Central Simple Tip #2: Update AppSource Appsby Steve Endow<div><br /></div><div>(There is some technical background involved in this Simple Tip, so if I got any details wrong or missed something that is important, please let me know).</div><div><br /></div><div><br /></div><div>Today's Business Central Simple Tip comes from the book <a href="https://www.packtpub.com/product/administrating-microsoft-dynamics-365-business-central-online/9781803234809" rel="nofollow" target="_blank">Administrating Microsoft Dynamics 365 Business Central Online</a> by Andrey Baludin.</div><div><br /></div><div>It relates to "AppSource Apps" that are installed in your Business Central Online Environment. If you have Andrey's book, turn to page 46, and look for the heading "Apps and sessions".<br /><br /></div><div>He provides instructions on how to navigate in the Business Central Admin Center to the "Manage Apps" page. The Manage Apps page lets you see a list of apps that are installed in that particular Environment.</div><div><br /></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDnokqn7LNWadRB6hz2tIsbokcdAsHuYPgBVqbkt8ekCrM-N8aIFDpRA-Yp1Lqkw-XBx85X49Wm97oOpzjLzb9UOEaxne4voOah_ANuMLeJ30a0WnKaenVA-niw9gUNsO9KXKBOMwZ4c5Asckx0XHiyb19j9VeFih5sbHYTZckLl5s4LVlX4avwBA1Ug/s569/BCTip2-1.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="384" data-original-width="569" height="270" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDnokqn7LNWadRB6hz2tIsbokcdAsHuYPgBVqbkt8ekCrM-N8aIFDpRA-Yp1Lqkw-XBx85X49Wm97oOpzjLzb9UOEaxne4voOah_ANuMLeJ30a0WnKaenVA-niw9gUNsO9KXKBOMwZ4c5Asckx0XHiyb19j9VeFih5sbHYTZckLl5s4LVlX4avwBA1Ug/w400-h270/BCTip2-1.jpg" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Business Central Admin Center - Manage Apps Page</td></tr></tbody></table><br /><span><a name='more'></a></span><div><br /></div><div>For background, Business Central AppSource Apps are installed separately in each <b><u>Environment</u></b>. For example, you can install Erik Hougaard's <a href="https://appsource.microsoft.com/en-us/product/dynamics-365-business-central/PUBID.hougaard-4699382%7CAID.designer%7CPAPPID.4c032704-5c36-4480-b710-29e8565568bc?tab=Overview" rel="nofollow" target="_blank">Simple Object Designer</a> app in your Sandbox environment, without installing it in your Production Environment. This allows you to evaluate or test apps before deploying them to production.</div><div><br /></div><div>What if you find a small bug in an AppSource App, the ISV fixes the bug, and then they release a new version to AppSource? </div><div><br /></div><div>Unfortunately, after the new app version is released in AppSource, you will not receive any notifications. (If someone knows of a way to enable such alerts, please let me know!) You will need to remember to open the Business Central Admin Center, select the appropriate Environment, and then look on the Manage Apps page.</div><div><br /></div><div>When you view the list of installed apps, you should see that the ISV application has a new version number listed in the "Latest Available Version" column.</div><div><br /></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgztm2JG7GroQNhRPUMYXHTikXcxtBHesAe1Amo5slXy7SBpjH2N-rTknJFL2DutFSPj2MYq81mlU597BIxToinMvCNm-o3TCEzF5svPBD0fMgnkCssTkgvuPOOG2VXLUYEvVcjikqC7j_XFIinsgapavu2yAKSWOjdmT9ACQIXNAVUolbOsbsbb4-kGw/s800/BCTip2-2.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="343" data-original-width="800" height="171" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgztm2JG7GroQNhRPUMYXHTikXcxtBHesAe1Amo5slXy7SBpjH2N-rTknJFL2DutFSPj2MYq81mlU597BIxToinMvCNm-o3TCEzF5svPBD0fMgnkCssTkgvuPOOG2VXLUYEvVcjikqC7j_XFIinsgapavu2yAKSWOjdmT9ACQIXNAVUolbOsbsbb4-kGw/w400-h171/BCTip2-2.jpg" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">New Blue Dragonfly App Is Available</td></tr></tbody></table><br /><div>This screen shot shows apps installed in my Sandbox2 Environment. Notice that I currently have version 2.0.173.0 of the Blue Dragonfly Recurring Billing app, and that version 2.1.9.0 is the Latest Available Version.</div><div><br /></div><div><i>Side Note: When a new version of an AppSource App is released, Business Central will not automatically install it for you. If you want to install the new version immediately, you will need to do it through the Admin Center. However, if you wait until the next 'major' release of Business Central (e.g. v21 -> v22), Microsoft will <u>attempt</u> to install the latest version of AppSource Apps in your <b><u>Production</u></b> Environment during that version upgrade. (I think I got that right--if there is something I missed, let me know).</i></div><div><br /></div><div>In this case, I want to upgrade to version 2.1.9.0 of Blue Dragonfly Recurring Billing in my Sandbox2 Environment. But notice that the blue link on the left says "Action required". What is that about?</div><div><br /></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0HUQq1u-Md7X-dxB5WvroktpjbfV7NPcF02RHgyPKVSVpN9C1pPcD7OXf74r7jf7uvG40SjL9oN5rIDTseO65x48nujpnBXFZ693GBwK41xdNuYOWAeC6DOKNVhE76-bsdqY8uInAOE7QSRF0IFwEpFUFv_pFo33QpfMeaQsdvf-cDKyH9LmehheFMw/s429/BCTip2-3.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="402" data-original-width="429" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0HUQq1u-Md7X-dxB5WvroktpjbfV7NPcF02RHgyPKVSVpN9C1pPcD7OXf74r7jf7uvG40SjL9oN5rIDTseO65x48nujpnBXFZ693GBwK41xdNuYOWAeC6DOKNVhE76-bsdqY8uInAOE7QSRF0IFwEpFUFv_pFo33QpfMeaQsdvf-cDKyH9LmehheFMw/w320-h300/BCTip2-3.jpg" width="320" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">App Version Dependency Requirement</td></tr></tbody></table><br /><div>If I click on the "Action required" link, I see a notification that version 2.1.9.0 cannot be installed because this new version requires a newer version of the Blue Dragonfly Registration app. The Recurring Billing app has a dependency on a newer version of the Registration app, so I must first update the Registration app.</div><div><br /></div><div>You can manually update the dependencies individually, or you can let Business Central upgrade them for you.</div><div><br /></div><div>If I click on the oddly phrased "Update to the latest" button, I see this dialog.</div><div><br /></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEha00S8PYFs6f6NpJ_ptOr-HpK316cBlG3rf1qHFC42vxeokNY-OKDc_FbHB2Whdt2V6B8Oug1ApELp9DHSTyNPcqMi1FigE2AHBYZVeAnHiA3uHeW9AW2fpcvq6JjA8QrPLb4j11BEa4AHProi_vBcl_RXCxertYJIiTWMqriTqXIci7vKbo3KqSkCew/s461/BCTip2-4.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="331" data-original-width="461" height="230" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEha00S8PYFs6f6NpJ_ptOr-HpK316cBlG3rf1qHFC42vxeokNY-OKDc_FbHB2Whdt2V6B8Oug1ApELp9DHSTyNPcqMi1FigE2AHBYZVeAnHiA3uHeW9AW2fpcvq6JjA8QrPLb4j11BEa4AHProi_vBcl_RXCxertYJIiTWMqriTqXIci7vKbo3KqSkCew/s320/BCTip2-4.jpg" width="320" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Automatically update dependencies</td></tr></tbody></table><br /><div><br /></div><div>Business Central is offering to update the dependencies first, and then update the app. Once I click Yes, Business Central starts the update process.</div><div><br /></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEipINpTDo5-rIjnxZ_wB0L_YL4huma6QRtj0-XhatpoXhaMhXuBhJIxcBzavpzuo5Axpn9UFU6_HT58TVA7inLzmBAxwG--L48iHYpRUn51kYMqu_MC9xpQYPRejn6odcrgJFICuTohhznPOlj9D_-5xNnSYpKS0CeZNZdDml9wW5T1vA761W3ZKJDNeQ/s556/BCTip2-5.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="100" data-original-width="556" height="73" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEipINpTDo5-rIjnxZ_wB0L_YL4huma6QRtj0-XhatpoXhaMhXuBhJIxcBzavpzuo5Axpn9UFU6_HT58TVA7inLzmBAxwG--L48iHYpRUn51kYMqu_MC9xpQYPRejn6odcrgJFICuTohhznPOlj9D_-5xNnSYpKS0CeZNZdDml9wW5T1vA761W3ZKJDNeQ/w400-h73/BCTip2-5.jpg" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">App Updates in Progress</td></tr></tbody></table><br /><div>And after a minute or so, if I refresh the apps list, I see that both apps were updated.</div><div><br /></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUX8YkxY8JDZG9e3Vgh9pEijCa7MYO7UusNmYD2wx_XjwXoSoQg0-TR5R6BHi6_2acQhL_mLzwHBy3DeX3eJ1LvKnB7GiwsvsNvpLN8Gl59A0muHfEmRfSwCQuRqy2p419OvW5OGu4AEQ1s6Wt8mqtjclf0ZSJrt64Cg5cbOPPQkyVlmzyCrlAASzdgw/s589/BCTip2-6.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="106" data-original-width="589" height="73" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUX8YkxY8JDZG9e3Vgh9pEijCa7MYO7UusNmYD2wx_XjwXoSoQg0-TR5R6BHi6_2acQhL_mLzwHBy3DeX3eJ1LvKnB7GiwsvsNvpLN8Gl59A0muHfEmRfSwCQuRqy2p419OvW5OGu4AEQ1s6Wt8mqtjclf0ZSJrt64Cg5cbOPPQkyVlmzyCrlAASzdgw/w400-h73/BCTip2-6.jpg" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Up to date!</td></tr></tbody></table><br /><div><br /></div><div>As you can see, this is a fairly simple process, but is a task that is performed through the Business Central Admin Center, and not within the Business Central application itself.</div><div><br /></div><div><br /></div><div><b><u>Should you test an update in a Sandbox Environment first?</u></b></div><div><br /></div><div>Yes. Definitely. Update in a Sandbox with a recent copy of Production to make sure the update installs successfully. Then perform some basic tests to confirm the app works as expected, any known bugs are fixed, and any new features work as expected, etc.</div><div><br /></div><div><br /></div><div><b><u>Should you regularly update AppSource Apps?</u></b></div><div><br /></div><div>My personal opinion is that unless you are aware of a specific reason to upgrade (a bug you are seeing, or a specific feature you want), I would not regularly update AppSource Apps. If you see a new ISV app version available, I would contact the ISV and ask them about the new version, and ask them if you should update.</div><div><br /></div><div><br /></div><div><b><u>Should you update AppSource Apps after hours or during a maintenance window?</u></b></div><div><br /></div><div>I am open to input on this one, but based on what I've learned about Business Central so far, I would personally recommend having all users log out of Business Central Online before updating apps. There may be some cases where an app update won't affect user activity, but given the number of things that can potentially change during an app update, I think it is safest to schedule a maintenance window where users will be out of the system. The updates typically only take a few minutes, so it should not be too inconvenient to schedule a brief maintenance window for app updates.</div><div><br /></div><div><br /></div><div><br /></div><div>I hope that tip was informative. If you don't have a copy of Andrey's book, <a href="https://www.packtpub.com/product/administrating-microsoft-dynamics-365-business-central-online/9781803234809" rel="nofollow" target="_blank">Administrating Microsoft Dynamics 365 Business Central Online</a>, I recommend it. It's a practical, hands-on guide for performing Business Central Online admin tasks.</div><div><div><br /></div><div><br /></div><div><p style="background-color: white; color: #444444; font-family: Arimo; font-size: 15.4px;"><i style="font-family: arimo;">Steve Endow is a Microsoft MVP in Los Angeles. He works with Dynamics 365 Business Central and related technologies.</i></p><p style="background-color: white; color: #444444; font-family: Arimo; font-size: 15.4px;"><i style="font-family: arimo;">You can also find him on </i><i style="font-family: arimo;"><a href="https://www.blogger.com/blog/post/edit/7763553249079245585/5039226310633470520#" style="color: #2288bb; text-decoration-line: none;">Twitter</a> and <a href="https://www.blogger.com/blog/post/edit/7763553249079245585/5039226310633470520#" style="color: #2288bb; text-decoration-line: none;">YouTube</a>,</i><i style="font-family: arimo;"> or through these links: <a href="https://links.steveendow.com/" style="color: #2288bb; text-decoration-line: none;" target="_blank">links.steveendow.com</a></i></p></div></div>Steve Endowhttp://www.blogger.com/profile/03950475674093020502noreply@blogger.com0tag:blogger.com,1999:blog-7763553249079245585.post-72483450802067399542022-12-28T07:46:00.001-08:002023-01-04T11:02:12.654-08:00Business Central Simple Tip #1: List Page Search<p>by Steve Endow</p><p>This morning I opened Jeremy Vyska's <a href="https://sparebrained.com/your-first-20-hours-with-microsoft-dynamics-365-business-central/" rel="nofollow" target="_blank">Your First 20 Hours with Business Central</a> book to see what I could learn.</p><p>As I was scrolling through the PDF with my signature Short Attention Span (tm), glancing at the pages, I happened to notice a note.</p><p>I don't know why my pre-coffee brain happened to notice this particular note, but I saw that it used the interesting combination of words like "Search", "magic", and "more slowly".</p><p>Wait, what is this about? What Search? </p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitxxS4riTCYni5u5Xpdz4nx6PX1lTYzAmsfp7azdDfd4jYslcbuKkgPSXJQDGVJkycsGeCRTPf1IKIMG2--Sf1egwKsOx5dnr71DK6nGB4bvVWCuZGRII2pzQlSLMQ-HXX4OrZ-sO1Mqf7-rPU9jUeFKBWUh_mw8_vLyb9aTlyTd6quPr6VJUfAZuJ_w/s661/First20Hours01a.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="355" data-original-width="661" height="215" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitxxS4riTCYni5u5Xpdz4nx6PX1lTYzAmsfp7azdDfd4jYslcbuKkgPSXJQDGVJkycsGeCRTPf1IKIMG2--Sf1egwKsOx5dnr71DK6nGB4bvVWCuZGRII2pzQlSLMQ-HXX4OrZ-sO1Mqf7-rPU9jUeFKBWUh_mw8_vLyb9aTlyTd6quPr6VJUfAZuJ_w/w400-h215/First20Hours01a.jpg" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">A Note About Search Performance</td></tr></tbody></table><br /><p>So I scroll up to see what he's talking about there, and I see that it's referring to the Search function on the List page.</p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYh6MyZIYzeTcNpk1JrRZN0m9jrY41U5s0CVDgRZdyT1MOvUsESKG5HZDhUBuPmEyPVO76OCIz-mZJ56Uks8bZhUoIsq334pRB6t7nUmJjvUOBFvxeNPHuAPjCcwb5fF3Tm1WxtJmyq_rn_a3p1M0cOTMp_KMhLs4pLvkFIJo-NPR4a8P6Ze_A4jyaAA/s796/First20Hours01d.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="618" data-original-width="796" height="310" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYh6MyZIYzeTcNpk1JrRZN0m9jrY41U5s0CVDgRZdyT1MOvUsESKG5HZDhUBuPmEyPVO76OCIz-mZJ56Uks8bZhUoIsq334pRB6t7nUmJjvUOBFvxeNPHuAPjCcwb5fF3Tm1WxtJmyq_rn_a3p1M0cOTMp_KMhLs4pLvkFIJo-NPR4a8P6Ze_A4jyaAA/w400-h310/First20Hours01d.jpg" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">List Page Search Field</td></tr></tbody></table><br /><p><span></span></p><a name='more'></a>I know this feature is blindingly obvious for anyone who has used Business Central for 5 minutes, but if you know how many different things I normally working on, 99% of which have nothing to do with actually using the Business Central application, you will excuse me for never having used the List Box Search.<p></p><p>So, today's Business Central Simple Tip: If you're viewing a Business Central List page and it has oodles of records, like the Item List Page, it can be difficult to scroll through and find a specific item:</p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtwXno6_kzKn7cIETRxouG_PvmLiqY4pfxPmS9IXRAdoo3bL54Lknjx1rHkZXUpdws4Gp9LeIp1lUfX29y-TgJQCl-JCSqVd5mU7gznrmnSkXAdLCwS_v1Awv-tZ3tlYBJIek3O5N9ngJhIIwF1u2w9OIdWOW9257tvLeYUD0yGbKGJg6bWPvELJu8ow/s816/First20Hours01b.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="816" data-original-width="774" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtwXno6_kzKn7cIETRxouG_PvmLiqY4pfxPmS9IXRAdoo3bL54Lknjx1rHkZXUpdws4Gp9LeIp1lUfX29y-TgJQCl-JCSqVd5mU7gznrmnSkXAdLCwS_v1Awv-tZ3tlYBJIek3O5N9ngJhIIwF1u2w9OIdWOW9257tvLeYUD0yGbKGJg6bWPvELJu8ow/w380-h400/First20Hours01b.jpg" width="380" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Item List Page</td></tr></tbody></table><br /><p>But. using the handy dandy List Page Search function that Jeremy's book just taught me about, I can type something into the Search field and the page will (semi) instantly filter the list of items! I don't even have to click anything or press tab or enter!</p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEixUZhgFF5wOpbGiQ9StT6gipHWQnBz0FHZTGj9sf1ouFwQiZlvYHIzT4EK5sGcPpTeGm83HXPrwANnJs0F04ay3WJ-y1DD_rc6gB4rmwbdT1CixzZrZ8wgH6_JXAWm9eHho98VhmtN9IvlV_f7eYhmkHeBvLk8E654e7UjJ6THM7PIvN9Vfwi5gfngVA/s679/First20Hours01c.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="250" data-original-width="679" height="148" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEixUZhgFF5wOpbGiQ9StT6gipHWQnBz0FHZTGj9sf1ouFwQiZlvYHIzT4EK5sGcPpTeGm83HXPrwANnJs0F04ay3WJ-y1DD_rc6gB4rmwbdT1CixzZrZ8wgH6_JXAWm9eHho98VhmtN9IvlV_f7eYhmkHeBvLk8E654e7UjJ6THM7PIvN9Vfwi5gfngVA/w400-h148/First20Hours01c.jpg" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Instantly Search on a List Page</td></tr></tbody></table><br /><p>That's kinda cool. It may seem obvious or minor, but for an end user that is looking for specific records dozens of times a day, it would be a huge benefit.</p><p>And that is your Business Central Simple Tip for today!</p><p>Although this is a neat tip, I do realize that the point of the note was to warn me that the Search function performance may not be optimal. It recommends trying Filters, which can be applied to specific columns. Maybe that will be Simple Tip #2?</p><p>Anyway, if you don't have Jeremy's book <a href="https://sparebrained.com/your-first-20-hours-with-microsoft-dynamics-365-business-central/" rel="nofollow" target="_blank">Your First 20 Hours with Business Central</a>, go grab a copy!</p><p><br /></p><p style="background-color: white; color: #444444; font-family: Arimo; font-size: 15.4px;"><i style="font-family: arimo;">Steve Endow is a Microsoft MVP in Los Angeles. He works with Dynamics 365 Business Central and related technologies.</i></p><p style="background-color: white; color: #444444; font-family: Arimo; font-size: 15.4px;"><i style="font-family: arimo;">You can also find him on </i><i style="font-family: arimo;"><a href="https://www.blogger.com/blog/post/edit/7763553249079245585/5039226310633470520#" style="color: #2288bb; text-decoration-line: none;">Twitter</a> and <a href="https://www.blogger.com/blog/post/edit/7763553249079245585/5039226310633470520#" style="color: #2288bb; text-decoration-line: none;">YouTube</a>,</i><i style="font-family: arimo;"> or through these links: <a href="https://links.steveendow.com/" style="color: #2288bb; text-decoration-line: none;" target="_blank">links.steveendow.com</a></i></p><p><br /></p>Steve Endowhttp://www.blogger.com/profile/03950475674093020502noreply@blogger.com0tag:blogger.com,1999:blog-7763553249079245585.post-88377351154264277702022-12-27T14:30:00.005-08:002023-01-04T11:02:48.332-08:00My New Criteria for a Password Manager<p>December 27, 2022</p><p>by Steve Endow</p><p></p><div style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5S9zxivUhA02_brMaUc4ADkg6g4X7_skA8Wvd606Ia0DYX39QPdcEw2tYuK6VdbztBU3fOBCOh1whvJ41rr4_TGXOzMDTXAjnN4gd8bjS-qaksXWVZOIQXcqoSWUW3DYtdIMHuv9o9i3MGDXE7fAHZHI_YxRXW0q-VPFUjBzDvZ4NiThkT3RreGeZDg/s848/password-security1.jpg"><img border="0" data-original-height="374" data-original-width="848" height="176" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5S9zxivUhA02_brMaUc4ADkg6g4X7_skA8Wvd606Ia0DYX39QPdcEw2tYuK6VdbztBU3fOBCOh1whvJ41rr4_TGXOzMDTXAjnN4gd8bjS-qaksXWVZOIQXcqoSWUW3DYtdIMHuv9o9i3MGDXE7fAHZHI_YxRXW0q-VPFUjBzDvZ4NiThkT3RreGeZDg/w400-h176/password-security1.jpg" width="400" /></a></div><div class="separator" style="clear: both; text-align: center;"><br /></div><p></p><p>On December 22, 2022, <a href="https://blog.lastpass.com/2022/12/notice-of-recent-security-incident/" rel="nofollow" target="_blank">LastPass disclosed</a> that they had discovered that an attacker had copied a backup of customer "vault data" following a cyberattack and data breach that occurred in August 2022.</p><p>Aside from the obvious bad news, I initially learned of two interesting things about LastPass that I never would have thought to consider when evaluating password managers.</p><p>1. While web site username and password values are encrypted, the <a href="https://hackernoon.com/psa-lastpass-does-not-encrypt-everything-in-your-vault-8722d69b2032" rel="nofollow" target="_blank">URL for the web site entry is not encrypted by LastPass</a>. I believe this poses a security risk for LastPass users.</p><p>2. Prior to 2018, <a href="https://blog.lastpass.com/2013/02/lastpass-2-0-20-released-for-all-browsers-featuring-an-automated-security-score/" rel="nofollow" target="_blank">LastPass used 5,000 iterations</a> in the <a href="https://support.lastpass.com/help/about-password-iterations-lp030027" rel="nofollow" target="_blank">key derivation process</a>. In 2018, <a href="https://palant.info/2022/12/23/lastpass-has-been-breached-what-now/" rel="nofollow" target="_blank">they increased that</a> to 100,100 iterations. Even if you don't know what key derivation iterations are, just make note of that significant change. From what I've read, <a href="https://palant.info/2022/12/23/lastpass-has-been-breached-what-now/" rel="nofollow" target="_blank">older vaults were not automatically upgraded</a> to the more secure configuration. In theory, this means that vaults created prior to the 2018 upgrade are potentially more vulnerable to brute force password cracking.</p><span><a name='more'></a></span><p><br /></p><p>While not a technical detail, I also read about an additional concern:</p><p>LastPass <a href="https://palant.info/2022/12/23/lastpass-has-been-breached-what-now/" rel="nofollow" target="_blank">did not require users to have strong(er) master passwords</a> over time. For example, a customer who signed up in 2016 might have had a master password less than 12 characters. When LastPass increased the minimum master password length to 12 characters, existing users were not required to increase the length of their master password. So customers with weaker master passwords are potentially at higher risk of having their stolen vault accessed through brute force password cracking. </p><p><br /></p><p><b><u>Blind Trust, No More</u></b></p><p>After learning about these details, I realized that I knew next to nothing about my password manager. I blindly assumed it safely encrypted my data, but I had never actually investigated any of the details of the security of my password manager and the company that provides the software and cloud hosting for synchronization.</p><p>I suspect I am not alone.</p><p>As a result of the LastPass breach, I have attempted to dig into the details of how several password managers actually encrypt data and their security practices. As a result of this research, I have new criteria for evaluating password managers.</p><p><br /></p><p><b><u>You're Shopping Wrong</u></b></p><p>Many (most?) people shop for a password manager by reading "reviews" that claim to tell you "The Best Password Manager in 2022". They then read blog posts claiming to compare Password Manager A vs. Password Manager B. They show a list of "features" with green check marks and list the pricing plans.</p><p>Those sources can be helpful for understanding basic features and pricing, but in my experience, they do not tell you anything meaningful about the true security of the password managers or the companies selling them.</p><p>"But the article says they use AES! That's MILITARY GRADE encryption!"</p><p>The information provided by such articles and "reviews" should only be the first step in your search for a password manager. They are almost never comprehensive, and I suspect many are not objective--with affiliate links or other questionable marketing links.</p><p><br /></p><p><b><u>Unwarranted Loyalty</u></b></p><p>If you've ever mentioned the name of a password manager on the Internet, you've invariably seen the proud replies:</p><p>"I use Super Crypto Vault because its the best."</p><p>"I've been using Top Secrets Manager Platinum--my whole family uses it and it's swell!"</p><p>"My company uses Mega Cipher Enterprise. It's got ALL the neat features."</p><p>And, of course, there were presumably folks who, prior to August 2022, would have chimed in with, "I love LastPass! It works great!" I'm assuming that loyalty for LastPass has faded a bit in December 2022.</p><p>While I understand the desire to like something you've used for years, that you're familiar with, and that you've trusted, I would caution you to avoid blind loyalty.</p><p>Evaluate the product based on specific criteria and objective information. </p><p>Here are my new criteria as of December 2022.</p><p><br /></p><p><b><u>1. Does it have the features I need so that I can use it effectively?</u></b> </p><p>Most of the popular <u>commercial</u> password managers have the features I need. Some have one or two unique features, some work slightly differently. If you actually test 3 or 4 of these password managers, you'll see that they are all very similar in functionality, and you have to choose based on one or two unique requirements or features or quirks, or perhaps a more economical subscription option.</p><p>I mention "use it effectively" because I regularly encounter people who insist that KeePass is the best password manager because it is open source. If they are technical, they might say "PBKDF2 is insecure! You should be using Argon!". But if you look into the effort required to configure KeePass to function like a modern commercial hosted password manager, it quickly becomes clear that it would be unusable for the average person.</p><p>My criteria regarding such complexity in password managers: If my wife and kids can't use it, it isn't an option for me or my company. I am willing to accept PBKDF2 with 200,000 iterations in exchange for convenience.</p><p><br /></p><p><b><u>2. What is NOT encrypted?</u></b></p><p>When I researched the LastPass vault breach, I learned that LastPass does not encrypt web site URLs. This came as a surprise to me.</p><p>I read that the URLs are not encrypted to allow LastPass to display the logo of the web site next to each password entry. </p><p>By storing unencrypted web site URLs in vault entries, each LastPass user can be associated with every web site in their vault. I believe this poses a significant security risk to users. They are now targets for phishing, password resets, 2FA fatigue attacks, and account compromise. Since full customer contact information was also stolen in the LastPass data breach, attackers now have a comprehensive profile of every LastPass user. They could be targeted for years to come.</p><p>Based on this lesson, I want my password manager to encrypt <u>everything</u> I type into it. If the vault is copied during a data breach, I want it to expose as little information as possible.</p><p>I've discovered that finding an example of the actual data stored in a password vault is quite difficult. I will be researching how to find this information.</p><p>I found this thread that showed a purported example of the data from a BitWarden vault. You can see plain text metadata, but all sensitive fields appear to be encrypted.</p><p><a href="https://www.reddit.com/r/Bitwarden/comments/zuxdwc/does_bitwarden_encrypt_all_fields/" rel="nofollow" target="_blank">https://www.reddit.com/r/Bitwarden/comments/zuxdwc/does_bitwarden_encrypt_all_fields/</a></p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3QMHpPL3A77VKDscMaDUP7KNgZP7kzPz5Cum0hyCMuxEy7k0K3eF0Kb8mcRAigUVElMgvJsk0aEHbRSVHOw517PvWMDKisZeYGDz7014zKRrS5iI9c0pysn7h62CrFfwhZlaJ-kSqkOJo_7uZTTQNGj-IZ4OnDRin19nwn9_PCgEYsoRiBn622P1t2Q/s887/BitWardenEntry.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="887" data-original-width="552" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3QMHpPL3A77VKDscMaDUP7KNgZP7kzPz5Cum0hyCMuxEy7k0K3eF0Kb8mcRAigUVElMgvJsk0aEHbRSVHOw517PvWMDKisZeYGDz7014zKRrS5iI9c0pysn7h62CrFfwhZlaJ-kSqkOJo_7uZTTQNGj-IZ4OnDRin19nwn9_PCgEYsoRiBn622P1t2Q/w249-h400/BitWardenEntry.jpg" width="249" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">BitWarden Vault Entry</td></tr></tbody></table><p><br /></p><p><b><u>3. Encryption Algorithm and Parameters</u></b></p><p>I can understand that most people aren't familiar with encryption algorithms, and ideally, they shouldn't have to be. But after learning that LastPass previously used only 5,000 iterations for key derivation, I realized that I probably needed to pay attention to that detail when shopping for a password manager.</p><p>I tried to look for information on the encryption details for my current (old) password manager. First, it was difficult to find, which wasn't a good sign. When I finally found the "security whitepaper", I was disappointed. The whitepaper was published in October 2018. This is the first red flag--the security documentation has not been updated in 4 years. </p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjjNcEWtpKZiab2Ylub0h-WZnm1W290N_RTw_dk-z06gAo1dgziMDi6MLU59X2xUt6c3oVOFUjfMom-6JRGlfLxrmaP6C78FUkPTBTFmSHrUmm2U4gNnO_HHRZNytPWSKdbsPb1ET1pLSmKGJGSDqSq8pkIOxGKnSPTkQ15AhrX1a8fifWFKngUCoO_mA/s687/RFEncryption.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="227" data-original-width="687" height="132" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjjNcEWtpKZiab2Ylub0h-WZnm1W290N_RTw_dk-z06gAo1dgziMDi6MLU59X2xUt6c3oVOFUjfMom-6JRGlfLxrmaP6C78FUkPTBTFmSHrUmm2U4gNnO_HHRZNytPWSKdbsPb1ET1pLSmKGJGSDqSq8pkIOxGKnSPTkQ15AhrX1a8fifWFKngUCoO_mA/w400-h132/RFEncryption.jpg" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">No Cipher Mode and 4,000 iterations</td></tr></tbody></table><br /><p>The document simply states that the "AES-256 algorithm" is used. It doesn't have any mention of CBC or GCM cipher mode. I don't necessarily care which cipher mode they use, but the fact that it isn't even mentioned in the security whitepaper concerns me. When I read the security whitepapers of other password managers, the cipher mode is explicitly and clearly documented, and some papers explain why they chose that particular cipher.</p><p>The other, larger concern was the mention of 4,000 iterations for key derivation. As of August 2016, <a href="https://cryptosense.com/blog/parameter-choice-for-pbkdf2">NIST guidelines recommended a minimum of 10,000 iterations</a>. That was 2 full years before my vendor's whitepaper was written or last updated. After reading this "security whitepaper", I knew I had to find a new password manager.</p><p>While reviewing the encryption documentation for a few password managers, I learned that <a href="https://support.1password.com/1password-security/#encryption" rel="nofollow" target="_blank">1Password</a> and <a href="https://docs.keeper.io/enterprise-guide/keeper-encryption-model" rel="nofollow" target="_blank">Keeper</a> use AES-GCM, while <a href="https://bitwarden.com/help/what-encryption-is-used/" rel="nofollow" target="_blank">BitWarden</a> and <a href="https://www.dashlane.com/download/whitepaper-en.pdf" rel="nofollow" target="_blank">Dashlane</a> use AES-CBC. The GCM cipher mode appears to have some potential benefits, but I will need to learn more to understand why 1Password and Keeper chose CGM.</p><p><br /></p><p><b><u>4. Documented Security Audits</u></b></p><p>Review the security audits for the password manager software and vendor. This should be easy to find in a web search. If you can't find the information easily, I would be concerned.</p><p>Examples:</p><p> <a href="https://support.1password.com/security-assessments/" rel="nofollow" target="_blank">https://support.1password.com/security-assessments/</a></p><p> <a href="https://bitwarden.com/help/is-bitwarden-audited/" rel="nofollow" target="_blank">https://bitwarden.com/help/is-bitwarden-audited/</a></p><p> <a href="https://keepass.info/help/kb/trust.html" rel="nofollow" target="_blank">https://keepass.info/help/kb/trust.html</a></p><p> <a href="https://www.keepersecurity.com/security.html?s=compliance" rel="nofollow" target="_blank">https://www.keepersecurity.com/security.html?s=compliance</a></p><p><br /></p><p>Actually read the security audits and assessments. Even if you don't understand any of the technical details, you will quickly get a feel for the nature of the audit and how comprehensive it was.</p><p>For example, skim through this "Web-based components" security report for 1Password from April-May 2022 by Recurity Labs:</p><p> <a href="https://bucket.agilebits.com/security/378.2101-Recurity_Labs-Report-B5-v1.0.pdf" rel="nofollow" target="_blank">https://bucket.agilebits.com/security/378.2101-Recurity_Labs-Report-B5-v1.0.pdf</a></p><p>Notice the "testing notes" provided by AgileBits to the security reviewer. Very impressive.</p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNrxvnBxx_WtDquXYJtrc2iC1W67ECx4UCgcR-JMNBIykmQAAkAD6jRmB-8b1t5YjHxeAuWdnpveXya_Q4JkcPGPsnWHjFaVjXd6-WXCiB1fGTK4A3SSPrCAw0wC2Dti4AxjdhYCWtBdFRJ-Wg07gbObh-FawH-RKi6DVMncb7p2xzXlKjn2D85LhgAA/s620/1PTestingNote.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="372" data-original-width="620" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNrxvnBxx_WtDquXYJtrc2iC1W67ECx4UCgcR-JMNBIykmQAAkAD6jRmB-8b1t5YjHxeAuWdnpveXya_Q4JkcPGPsnWHjFaVjXd6-WXCiB1fGTK4A3SSPrCAw0wC2Dti4AxjdhYCWtBdFRJ-Wg07gbObh-FawH-RKi6DVMncb7p2xzXlKjn2D85LhgAA/w400-h240/1PTestingNote.jpg" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">1Password is highlighting complexities that may be vulnerable</td></tr></tbody></table><br /><p>Compare the security audit information from 1Password, BitWarden, KeePass, and Keeper and I think you'll quickly make an assessment. Even if you don't understand a single technical detail, you should notice a difference in openness and comprehensiveness.</p><p>I searched for security audits for my old password manager and couldn't find anything. Red flag.</p><p>I searched for audit information for another popular commercial password manager and also couldn't find a single published security audit. Red flag.</p><p><br /></p><p><b><u>5. SOC 2 Certification</u></b></p><p>I know very little about SOC Certification, but I found that <a href="https://1password.com/soc/" rel="nofollow" target="_blank">1Password</a> and <a href="https://bitwarden.com/compliance/#third-party-security-audits" rel="nofollow" target="_blank">BitWarden</a> both provide information about their SOC Certifications. Keeper <a href="https://www.keepersecurity.com/security.html?s=compliance" rel="nofollow" target="_blank">mentions SOC 2 compliance</a>, but does not appear to have a dedicated page for their certification.</p><p>BitWarden touts both SOC 2 and SOC 3 Certifications, but <a href="https://linfordco.com/blog/soc-2-vs-soc-3/" rel="nofollow" target="_blank">according to this blog post</a>, it seems that SOC 2 Certification is more comprehensive, and is the one that matters, of the two.</p><p>I was unable to find any mention of SOC Certification for my old password manager or another popular password manager.</p><p>I cannot yet assess the actual value of the SOC 2 Certification, but I'm assuming it's a costly process that companies undertake in order to actually improve their security posture, and not a perfunctory "vanity audit".</p><p><br /></p><p><b><u>Things Change</u></b></p><p>Just because you find a password manager that meets your needs and satisfies your security criteria today, I would not make it your "forever" password manager. Assume that you will need to re-evaluate your password manager in 1-4 years to confirm it's still a good choice, and see if another option might better fit your criteria.</p><p>My old password manager was a #1 "Editor's Choice" pick when I started using it in 2008. It clearly has not kept up with the increasing security risks in 2022.</p><p>If my new password manager stops doing audits and penetration tests in 2 years, I may need to find a new solution. It's a hassle to change password managers, but I now recognize that I can't assume that my data will be kept safe indefinitely in a particular password manager.</p><p>And I need to be aware of changes related to password management security. If new risks are found in AES that require a change to my master password or encryption settings, I'll need to be aware of that, and be open to potential hassle of having to change my encryption settings. If new security guidelines are release that recommend a new key derivation process, I may need to re-encrypt my vault based on new settings. Hopefully my password manager informs me of these changes.</p><p><br /></p><p style="background-color: white; color: #444444; font-family: Arimo; font-size: 15.4px;"><i style="font-family: arimo;">Steve Endow is a Microsoft MVP in Los Angeles. He works with Dynamics 365 Business Central and related technologies.</i></p><p style="background-color: white; color: #444444; font-family: Arimo; font-size: 15.4px;"><i style="font-family: arimo;">You can also find him on </i><i style="font-family: arimo;"><a href="https://www.blogger.com/blog/post/edit/7763553249079245585/5039226310633470520#" style="color: #2288bb; text-decoration-line: none;">Twitter</a> and <a href="https://www.blogger.com/blog/post/edit/7763553249079245585/5039226310633470520#" style="color: #2288bb; text-decoration-line: none;">YouTube</a>,</i><i style="font-family: arimo;"> or through these links: <a href="https://links.steveendow.com/" style="color: #2288bb; text-decoration-line: none;" target="_blank">links.steveendow.com</a></i></p><p style="background-color: white; color: #444444; font-family: Arimo; font-size: 15.4px;"><br /></p>Steve Endowhttp://www.blogger.com/profile/03950475674093020502noreply@blogger.com0tag:blogger.com,1999:blog-7763553249079245585.post-17621619200053631492022-12-18T18:05:00.028-08:002023-03-20T12:18:44.700-07:00Improving Personal Email Security<p>by Steve Endow</p><p>Last week I discovered that my personal information was included in 2 massive data breaches in under 24 hours.</p><p>This was the last straw for me.</p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTIxO90tmoCKOsrM6NcjUR_F3lo_wFGXaD_p1WvAT_HOwTXOOmnOWQN3lol1fZ6jVb7g66t192nlrpov7c-K3eRyqP92gU4HoF-SuYKBun6Cx9Vt4RaTigzSYErQC5V5aCN2dsmPPSjuSC9XDdhzK1ZQq5r-k6uT3iNG-XYyMoiDnkjEaoM5yUug48Fw/s597/Pwned.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="282" data-original-width="597" height="189" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTIxO90tmoCKOsrM6NcjUR_F3lo_wFGXaD_p1WvAT_HOwTXOOmnOWQN3lol1fZ6jVb7g66t192nlrpov7c-K3eRyqP92gU4HoF-SuYKBun6Cx9Vt4RaTigzSYErQC5V5aCN2dsmPPSjuSC9XDdhzK1ZQq5r-k6uT3iNG-XYyMoiDnkjEaoM5yUug48Fw/w400-h189/Pwned.jpg" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Yet Another Data Breach</td></tr></tbody></table><p><br /></p><p><b><u>Background</u></b></p><p>Data breaches aren't new, and have unfortunately become so common that I don't think they garner any more than an eye roll or a shrug these days. Here is just a partial list of breaches that occurred in 2022. I happen to know that December 2022 is missing several significant entries. And this doesn't include all of the shady data brokers who buy and sell your data constantly.</p><p><a href="https://tech.co/news/data-breaches-2022-so-far">https://tech.co/news/data-breaches-2022-so-far</a></p><p>I don't see data breaches decreasing any time soon, and I assume that we will continue to see an increasing number of breaches in coming years. It's going to get far worse before it gets better.</p><p>So what does this have to do with email?</p><p>The problem is that several of these breaches have included my "personal" email address. <span></span></p><a name='more'></a><p></p><p>So what's the problem with that?</p><p>Unfortunately, several sites use email address as the username for their site login, or for password resets, or as an additional layer of verification. So I can expect brute force attacks on the sites. And attacks on my email account. And password reset attempts. And lots of email phishing. And more spam.</p><p>My personal email address has become like my Social Security number. On it's own, an SSN is a pretty meaningless, useless number. But when it becomes tied with your identity, and is used to authenticate you, it becomes valuable. Email has long been a vector for spam and phishing, but it has now become a proxy for identity.</p><p>With these two recent breaches, I realized that my email address has become a security risk. By using my personal email on dozens of web sites and apps and services, it has been tied to my identity and to several web sites and services that I've used over several years. Want to perform <a href="https://www.crowdstrike.com/cybersecurity-101/osint-open-source-intelligence/" rel="nofollow" target="_blank">OSINT</a> on Steve? Just scan 15 recent massive data breaches to find his email, name, phone, address, and who knows what else.</p><p>Now we can attack that email account, and bang against a bunch of widely used web sites to see if we can attack his accounts and attempt password resets. If you're skeptical at all about this, trust me--this process is <u>trivially</u> easy for an experienced cybersecurity expert or malicious 'hacker'. I have no question that my 12 year old Security Intern could follow a simple set of instructions to attack my accounts. Just listen to a few episodes of the <a href="https://darknetdiaries.com/" rel="nofollow" target="_blank">Darknet Diaries podcast</a> to hear how astonishingly easy it is for pros to compromise accounts. It happens routinely every day in penetration tests and red team exercises. Every. Single. Day.</p><p>So what is the answer?</p><p>I don't know if it's THE answer, but one answer is to use unique email addresses for EVERY account or web site or login. Every. Single. Web site.</p><p>The understandable reaction is: "That's insane! How can you possibly use a different email address for every web site???"</p><p>Let me explain...</p><p><br /></p><p><b><u>Old School</u></b></p><p>I was aware of the concept of using variations of an email address, such as steve+netflix@emailcompany.com. The plus sign has been supported by many email services for many years. This is often recommended as a way to determine which web site leaked or sold your data to a spammer.</p><p>I've also been informed that some providers support periods anywhere in the email address, such as steve.netflix@emailcompany.com, where this address resolves to steve@emailcompany.com.</p><p>There are two problems with these techniques. First, it's trivially easy to determine your "real" email address and then target you or your logins. Second, you can't usually stop spam or phishing email sent to steve+netflix once the email gets published in a breach. </p><p>Thankfuly, there is a new method.</p><p>There are now services that let you generate as many random email address "aliases" as you want, and all of those email "aliases" can point to any "real" email address you want. </p><p><br /></p><p><b><u>The Password Analogy</u></b></p><p>I would never publicly share any of my passwords. That seems obvious.</p><p>But is it any more acceptable to publicly share my username? "Hey everyone, my username for Mega Bank of The East is steve@emailcompany.com!" That's literally what happens every time I send an email from my personal email account. And now that several of my email addresses have been in multiple data breaches, those addresses can be used on any web site that uses email as the username. </p><p>After these recent data breaches, I realized that my email address is nearly as important as my password. It's 50% of my login on some web sites. Why shouldn't I attempt to improve the security of those usernames?</p><p>And how do I manage my passwords? With a password manager. I generate a unique, complex, random password for every web site. I never re-use the same password on any two sites. And I don't know a single password for any web site or login! I couldn't tell you my the password for a single bank, credit card, subscription, or ecommerce web site. Everything is managed by my password manager.</p><p>So why would I re-use the same email address on dozens of web sites?</p><p>Well, because it's a major hassle to create a new email address for every web site. And a major hassle to manage them. </p><p>It <u>used</u> to be a major hassle. Just as I can easily generate and manage unique random passwords for every single web site, I can now easily generate a unique random email address for every single web site. </p><p><br /></p><p><b><u>Modernization</u></b></p><p>Based on a quick search, I found two services that offer "email alias" management. </p><p><a href="https://simplelogin.io/" rel="nofollow" target="_blank">SimpleLogin</a></p><p><a href="https://anonaddy.com/" rel="nofollow" target="_blank">AnonAddy</a></p><p>After reading a few reviews of the two services, I chose to try SimpleLogin. It seemed to offer a more comprehensive solution that would better fit my needs.</p><p>(I later learned that <a href="https://proton.me/mail/pricing?product=mail" rel="nofollow" target="_blank">Proton Mail</a> includes a free SimpleLogin subscription with their Proton Mail Unlimited plan, so that made SimpleLogin the easy choice for me.)</p><p>Just as you use a password manager to generate and store hundreds of unique random passwords so that you never re-use passwords, SimpleLogin generates and stores unique random email aliases so that you never re-use an email address. Think of the email aliases as random usernames that individually have zero meaning or value.</p><p>Install the SimpleLogin browser plugin and mobile app and a new random email address is just one click away.</p><p>Any time an email is sent to one of the alias addresses, it is immediately forwarded to any email account that you choose.</p><p>Just as my password manager stores my unique random password for a site, it can also store the random unique email for the site. SimpleLogin also makes it very easy to quickly find an existing alias. </p><p><br /></p><p><b><u>How does it work?</u></b></p><p>Once you setup an account on SimpleLogin, you can use one of their several generic domain names, or add your own custom domains. </p><p>Click on the browser plugin and it will suggest an alias based on the web site URL--or you can generate a completely random address using words or a GUID. You can click on the drop down to choose their domain or one of your custom domains.</p><p><b>NOTE: I highly recommend setting up at least one custom domain and using that for any important email aliases. See "Dependency Risk" below for more info.</b></p><p><b><br /></b></p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglWK3l8UiUqihyiNN-EqI6e3CXNR3S11hxfxmiw_wP_M4DfM98YvgmIINTLkZ4D3dxSYUH2NJNSVMMZB6kDgxMMzvvbosY_MmXn-AnXsJ6ee0FXh9FEFiW-QnvlUxlV1Zp_A1xV5KcphDoHA9qpA8JhcQ_PfbgpPux8LOEp_pG7yeCUSP0bAlrroHNIQ/s463/SimpleLogin1.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="209" data-original-width="463" height="180" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglWK3l8UiUqihyiNN-EqI6e3CXNR3S11hxfxmiw_wP_M4DfM98YvgmIINTLkZ4D3dxSYUH2NJNSVMMZB6kDgxMMzvvbosY_MmXn-AnXsJ6ee0FXh9FEFiW-QnvlUxlV1Zp_A1xV5KcphDoHA9qpA8JhcQ_PfbgpPux8LOEp_pG7yeCUSP0bAlrroHNIQ/w400-h180/SimpleLogin1.jpg" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Browser Plugin Generates Random Alias<br /><br /></td></tr></tbody></table><p>Then just paste that email address in the web site.</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPtIiWobqygmmqbZ_XouUkFi-fwLzAkKZIXFwcQ6-jy8oZ0VjKWZ9RnTjnijcBvHVYXjAVZ0wINfLWkuoObWIfVYmOXFN5zWQv5yblZYDQVst2aabAcxgbRlZX3a5Im-Bi1byYfOWRP6kGUatSMDOiu0VwYvBfhx2qRC7LU--wRmgdgFUrAMP2qUnUdw/s638/WikipediaSample1.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="638" data-original-width="530" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPtIiWobqygmmqbZ_XouUkFi-fwLzAkKZIXFwcQ6-jy8oZ0VjKWZ9RnTjnijcBvHVYXjAVZ0wINfLWkuoObWIfVYmOXFN5zWQv5yblZYDQVst2aabAcxgbRlZX3a5Im-Bi1byYfOWRP6kGUatSMDOiu0VwYvBfhx2qRC7LU--wRmgdgFUrAMP2qUnUdw/w333-h400/WikipediaSample1.jpg" width="333" /></a></div><br /><p>SimpleLogin then tracks that alias and makes it easy to manage and monitor the alias.</p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilABfXDqk3Pks09-57nEkRIgz9pwlML6-fnRbCx5rvPdXmWA29ldNytMBQLXqt8USMFuMOv3cKFZDPgQHprqN9pGaUdtSf6C4xPqfhhqO1F7i4SWehlm0iGXDrpDJ1VGI6qFfmlC7Urzrqlibcse92eyLdkFhPiYmsqmrj2-vdBAqNw7asG9ovvRZ4Jw/s781/SimpleLogin2.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="781" data-original-width="607" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilABfXDqk3Pks09-57nEkRIgz9pwlML6-fnRbCx5rvPdXmWA29ldNytMBQLXqt8USMFuMOv3cKFZDPgQHprqN9pGaUdtSf6C4xPqfhhqO1F7i4SWehlm0iGXDrpDJ1VGI6qFfmlC7Urzrqlibcse92eyLdkFhPiYmsqmrj2-vdBAqNw7asG9ovvRZ4Jw/w311-h400/SimpleLogin2.jpg" width="311" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Random alias is just like a random password</td></tr></tbody></table><br /><br /><div>Once you have your SimpleLogin account configured, it is <u>incredibly</u> easy to use.</div><div><br /></div><div>Today I updated 40 accounts with email aliases. Every time I get a new message in my old personal email account, I'll update that account with an alias. Every time I login to a web site, I'll make sure it's using an alias.</div><div><br /></div><div>It will probably take a few weeks to retrofit most of my active accounts. I probably have hundreds of old logins or accounts that I no longer use, so those will probably take a while to update or close.<br /><p><br /></p><p><b><u>Interesting Benefits</u></b></p><p>Using a unique email address for <u>every single</u> web site produces some interesting benefits.</p><p>1. You never have to share your "actual" email address. You can use email aliases for everything. 100% of the time. Never, ever give out your "real" email address again. </p><p>2. You can route any alias to any email Inbox. Want some aliases going to Gmail, others going to Proton Mail, and others going to a work address? No problem.</p><p>3. Data breaches and phishing are limited to one alias. Every email alias you generate is a throw away value. Data breach at Uber? No problem, generate a new alias, update your Uber account, and disable the old alias. Spam coming to your PayPal alias? Generate a new alias and update your PayPal account--no more spam. Someone tries to phish you at your "patreon.4zat8u@aliasemail.xyz" alias? Just another throw away alias.</p><p>4. Your email address is no longer your identity. Nobody will ever need to know what your "real" email address is. Your Inbox address will no longer be fixed or sacred. You will literally never need to use your "real" email address. Even you won't need to know your "real" email address, as you will never share it with anyone. Your "real" email account will be no more valuable to you than any random password in your password manager. You will just login to some email account and see all of the email that is forwarded to that particular Inbox. It won't matter what the address is to that Inbox.</p><p>5. Your email aliases are disconnected from your email Inbox. If you want to change email providers right now, how long would it take you to update the email address on all of your accounts? Online banking, streaming, subscriptions, newsletters, ecommerce sites, utilities, etc. Once you are setup on SimpleLogin, you can enter the address of a new "Inbox" and one click later, all of your email is sent to that new Inbox. You could literally use a new "real" email address every month with a single click without changing a single account on a web site. </p><p>6. No more spam. In theory, if I use an alias for every single web site or service, I will never have any spam. If I start getting spam on my DoorDash or Substack alias, I can easily update my account with a new alias and disable the old alias. Spam no longer goes directly to my Inbox. It must go through a unique alias, which will identify the source, and can be easily turned off.</p><p><br /></p><p><b><u>It doesn't have to be perfect</u></b></p><p>"But what about _____?" you may ask.</p><p>Sure, I'm assuming there are some loopholes or limitations I haven't yet encountered. But compared to the alternative that I'm living with now, this is a huge improvement.</p><p><br /></p><p><b><u>Won't it be a hassle and one more thing to maintain?</u></b></p><p>I don't think it will be any harder than generating and managing unique complex passwords.</p><p>The one situation that will have more friction is when a human is involved.</p><p>Receptionist at my dentist: "What email address should we send the bill to?"</p><p>Me: Send it to dentist.a6q9y@mymailalias.cc</p><p>Receptionist: "Uh, what?"</p><p>People are so used to Gmail or Yahoo or Hotmail personal email addresses that a custom domain will cause some confusion. </p><p>Today I had to email someone to use an alias for a newsletter. He replied, "Did you type that address correctly? It ends in .co? Is that right? Did I miss a character?"</p><p>Fortunately, those IRL situations are not very common, and when they do arise, the SimpleLogin mobile app makes it very easy to create a new custom alias on the fly.</p><p><br /></p><p>March 20, 2023 UPDATE: Using SimpleLogin has been seamless and has not been a hassle at all. I just click the SimpleLogin browser extension, generate a new random email alias, copy it, and then paste it into the web site that is asking for an email address. The new alias is active immediately, and I can receive verification emails from the web site to confirm the address without any delay. Other than creating new aliases, I haven't had to do any other maintenance or spend any additional time thinking about it.</p><p><br /></p><p><b><u>Replies</u></b></p><p>But what about replies? If I receive an email sent to alias postmates.4ztt9@myemailalias.xyz and need to reply, won't the reply expose my "real" email address?</p><p>They've thought of that.</p><p>Somehow, I don't yet know how, the reply will be routed through SimpleLogin so that it appears to be sent from the alias email address. So my "real" email address should not be exposed. But, that does mean that recipients may see "dentist.a6z9y" as the sender, rather than "steve", so I need to look into whether I can adjust that to be something like "Steve Endow <dentist.a6z9y@mymailalias.cc>"</p><p>Also, it does appear that the reply header will include some strange information, such as references to a random address, like "sallysmith_at_gmail_com_ddkhlrldlcwldow@simplelogin.co". </p><p><br /></p><p>UPDATE: I think figured out how the replies work.</p><p>When someone sends an email to me at pizzahut.t57lw@mymailalias.xyz, SimpleLogin creates an alias for the *sender* email address. The sender email address looks something like "customerservice_at_pizzahut_com_smucgrcouz@simplelogin.co". When I reply to the email, it is sent to that @simplelogin.co "sender alias" address. That allows SimpleLogin to receive the email, strip out my "real" email address, and replace it with pizzahut.t57lw@mymailalias.xyz.</p><p>So SimpleMail is intercepting my inbound emails and relaying them to me, and it is also intercepting my outbound emails and relaying them to the recipient.</p><p>That would seem to add a layer of complexity to what is normally a relatively simple process, but it does seem to work, and it obviously provides some value.</p><p><br /></p><p>CAVEAT: Given how replies work, if I need to initiate an email to someone, I first have to create a "Contact", which will generate an email "alias" for the recipient.</p><p><a href="https://simplelogin.io/docs/getting-started/send-email/">https://simplelogin.io/docs/getting-started/send-email/</a></p><p>This is obvious not a typical step when sending an email. It also means that sending an email to a new recipient requires 2 steps: Create a SimpleLogin Contact associated with the alias I want to use, then save that contact in Proton Mail. </p><p>It also means I have to be more careful--I can't just fire off an email directly from Proton Mail--that would expose my "real" inbox address. That's going to take some practice, but fortunately most of my personal email is inbound--order confirmations, newsletters, etc.</p><p><br /></p><p><b><u>Spam Blocking</u></b></p><p>I'm assuming that Proton Mail and SimpleLogin know what they are doing regarding avoiding spam blocking, and that their SMTP servers are able to reliably deliver my outbound email. But I'll have to see how it goes.</p><p>I've had a few of my emails from nearly every free and paid email service get blocked at some point--likely due to content rather than the sending server or address--so I will just have to keep an eye on it.</p><p><br /></p><p><b><u>No more free email accounts</u></b></p><p>As part of my email security upgrade, I'm eliminating all free email accounts. Nothing is free, so I'm now explicitly paying for a secure email service. </p><p>I registered 6 new domains that I can use for aliases and "real" email. I then signed up for Proton Mail Unlimited, as they are one of the more popular "secure" email providers. The Proton Mail subscription is cheaper than most streaming services, so I'm happy to pay for it.</p><p>I then linked my SimpleLogin account to my Proton Mail account, which gave me a free SimpleLogin Premium subscription--making the Proton Mail Unlimited subscription a bargain.</p><p>At this moment, I literally have no idea what the "real" email address is for my Proton Mail account. I simply don't know what it is without looking it up. But it no longer matters. That "email address" is no longer meaningful. At all. It's just a generic "inbox" where my email shows up. I login and see my email, regardless of address or alias. </p><p>Tomorrow I could change the email address associated with my "inbox", and with a single click in SimpleLogin, all of my email will flow to the new inbox. </p><p>It's a very strange experience to realize that I no longer have a "personal" email address. I just have email aliases that magically route email to an arbitrary inbox.</p><p><br /></p><p><b><u>Dependency Risk</u></b></p><p>I am definitely putting heavy reliance on SimpleLogin for all of this. Alias creation, management, routing, and SMTP is handled by SimpleLogin. If they have an issue, there goes my email. If they go out of business, I'll be scrambling to find a replacement.</p><p>In theory, these risks exist with any email service, including Gmail, which apparently <a href="https://nypost.com/2022/12/10/google-gmail-servers-experiencing-outages/" rel="nofollow" target="_blank">recently had issues</a>. </p><p><b>UPDATE:</b> After thinking about how to mitigate this risk, I realized that I would only need to change my MX DNS records to a new SMTP service, and then setup a "catch all" email address. All of the email sent to my custom domains setup on SimpleLogin would be routed to the new SMTP provider. This could all be done easily in an hour or two.</p><p>This contingency plan should work for all custom domains I have setup on SimpleLogin. However, if you use one of the non-custom default SimpleLogin domains (simplelogin.com, 8alias.com, slmail.me, etc.), then those alias would not be routed to your new SMTP service. You would have to change your email for to any web sites where you used aliases with those default domains.</p><p><br /></p><p>March 30, 2023 UPDATE: ProtonMail makes it very easy to designate a catch all email address for each custom domain you have setup. So if I ever had an issue with SimpleLogin, I would just need to update my MX records and setup the catch all address. Very simple.</p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4fg4ehPSdSMFBlJQABSf_neHrEHekGomhSisdLhOr9WdGie2xeuUscQPnMAro-cxos39-0I3Hywxce9sadiK6g0WEgpPX_FBZSxEM6Ly_ukzg2DC6Hk0XAt3j36yvclwNvYlNeJwlqKo7ooxWfEY4_uxeZi_IFXxTufulgJ5NGf2VVdmamhKMts3h3Q/s785/ProtonCatchAll.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="635" data-original-width="785" height="259" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4fg4ehPSdSMFBlJQABSf_neHrEHekGomhSisdLhOr9WdGie2xeuUscQPnMAro-cxos39-0I3Hywxce9sadiK6g0WEgpPX_FBZSxEM6Ly_ukzg2DC6Hk0XAt3j36yvclwNvYlNeJwlqKo7ooxWfEY4_uxeZi_IFXxTufulgJ5NGf2VVdmamhKMts3h3Q/s320/ProtonCatchAll.jpg" width="320" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Designate a Catch All Address in ProtonMail</td></tr></tbody></table><br /><p><br /></p><p><b><u>Credit Reporting Confusion?</u></b></p><p>In the United States, we have a few large "credit reporting" corporations. These "credit agencies" ostensibly provide "consumer credit reports" that facilitate consumer lending in the United States. </p><p>In order to provide consumer credit scores and reports, these companies collect staggering amounts of highly detailed information on US consumers. That includes email addresses.</p><p>While I don't know that email address, or any contact info, is used in the calculation of a consumer's credit score, or any assessment of their credit worthiness, it is likely used to track consumer accounts. Bank accounts, credit card accounts, mortgages, cell phone accounts, etc. </p><p>If I use tmobile.g34yt@mymailalias.xyz for a T-Mobile account, then apply for an airline miles credit card account using american.p29gt2@mymailalias.xyz, and then get a car loan using creditunion.3wit4@mymailalias.xyz, ultimately, I will potentially have dozens of email addresses submitted to the major credit agencies.</p><p>I don't know if this will cause any complications.</p><p>I've seen my full credit report, including every piece of data that the agencies have on me--literally hundreds of pages or jibberish, and I've seen several incorrect spellings of my name, incorrect addresses, incorrect employers, etc. I'm assuming that my new random email aliases will just be added to that pile, with little consequence for me.</p><p>But if you are a young US resident or are trying to build credit in the US, this may be a consideration or risk factor.</p><p><br /></p><p><b><u>Theoretical</u></b></p><p>I just set all of this up over the last 2 days, so I'm still learning. So far, other than the friction with silly humans and potential weirdness with replies, I haven't had a single issue. But I assume that I'll find some weird scenario or some technical quirk that will represent an issue or limitation with this setup.</p><p>If you know of any limitations or issues, please post a comment below and let me know.</p><p><br /></p><p><b><u>Is this overkill?</u></b></p><p>"Steve, you're being paranoid. Just use 'plus' email addresses with a Gmail account. That's plenty good enough."</p><p>Why am I going this route? I met someone who works for one of the largest software companies in the world. He does security analysis, penetration testing, and red teaming. He knows the risks. He sees the hacks and compromises every day. He exploits vulnerabilities, OPSEC mistakes, and uses OSINT as part of his job. </p><p>He is the one who mentioned that he uses this email alias technique for all of his personal accounts--which sent me down this path. He knows that using email aliases adds another layer of security to his OPSEC. He knows that aliases make OSINT more difficult. Is he being paranoid? Is this security expert foolishly wasting his time with aliases? </p><p>This technique isn't for everyone--it's a bit technical, a bit cumbersome, and probably more than the average consumer can handle. But it's not particularly difficult for me.</p><p>Another interpretation is that you don't have to achieve "perfect" OPSEC and security--you just need to have enough OPSEC and security to be a more difficult target than everyone else. ("You don't have to outrun the bear...") If a hacker can compromise dozens of accounts with shared email addresses and no 2FA, they'll have plenty of victims and won't bother trying to attack accounts with unique email aliases and unique complex passwords and 2FA and FIDO. Or they'll just use social engineering to completely bypass account passwords, or find a software security vulnerability to breach the network of the service provider. In which case I tried...</p><p><br /></p><p><b><u>Friends and Family</u></b></p><p>A question I had while setting all this up: Should I use aliases with friends and family?</p><p>I'm not concerned about hiding my email from friends or family, but it is possible that an email account of a friend or family member could be compromised, thus exposing my "real" inbox address in a data breach. That compromised account then sends out phishing and spam emails to every address in the inbox and address book.</p><p>I see such email account breaches <u>regularly</u> with companies I work with, but I don't recall it happening to a friend's personal email account.</p><p>It's easy enough to create a single alias "friends@mymailalias.xyz" for friends, and "fam@mymailalias.xyz". My family knows I'm a supergeek, so they'll just roll their eyes and humor me. My friends will just confirm their belief that I'm a bit weird, but I don't think they'll have a problem with it. But...</p><p><br /></p><p><b><u>The Hard Part</u></b></p><p>Things get tedious if you are trying to completely hide your "real" inbox address. If you never, ever want to share that with anyone, the issue is not the email aliases you'll need to create--it's literally one click or even zero clicks with SimpleLogin (you can setup all sorts of generic addresses).</p><p>The issue is with outbound emails that you send to a new recipient. If I want to hide my "real" inbox address, it looks like I have to create a "reverse alias" on SimpleLogin. This is an alias email address I send to that both identifies which outbound alias I want to use, as well as the email recipient.</p><p>If that's kinda confusing, well, yes, it's kinda confusing. If you use SimpleLogin and set one up, it's just a few clicks and makes sense, but it's not easy to explain.</p><p>Once I setup those reverse aliases, I then need to copy that address, which will look like:</p><p>"doctor at medicalgroup.com" <doctor_at_medicalgroup_com_atosu4@simplelogin.co></p><p>I then need to make sure that I use that alias whenever I send an email to the doctor.</p><p>And more importantly, if I want to <u>never</u> expose my real email, it means that I will <u>always</u> have to send emails to reverse aliases. Always. 100%. No mistakes. I could never send directly to a real email address from my real inbox address.</p><p>That sounds like a hassle. And the chances of me maintaining that level of discipline is zero. Fortunately, for my use case and threat model, I don't think I need that level of caution.</p><p>But if I do eventually start getting spam sent directly to my "real" inbox, I will be annoyed, so I'll see how it goes.</p><p><br /></p><p><b><u>UPDATE: It Will Keep Happening</u></b></p><p>I wrote this blog post on December 18, 2022.</p><p>4 days later, the LastPass password manager service disclosed a significant customer data breach. A threat actor accessed a LastPass cloud storage repository that included backups of customer "vault" files and <u>full customer contact information</u>.</p><p><a href="https://blog.lastpass.com/2022/12/notice-of-recent-security-incident/">https://blog.lastpass.com/2022/12/notice-of-recent-security-incident/</a></p><p></p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEjgbN7IRk9HCLGUQX3akCSUkkHgv-FRaBqgMOD1LsVXPmXPeXSR9mtWlct3aV2cKrd3bhSW8K3orRyYWNeJWd4xuQcepmzETelcOl1eSIIzV86K5x7BM6ZJ3haywMkKWA9zCjT2kIFJKGROld09khVhiX2V40m6Y8Fn4SlWV9Ge5r2wNtKL512Hu2w5Ng" style="margin-left: auto; margin-right: auto;"><img alt="" data-original-height="180" data-original-width="645" height="111" src="https://blogger.googleusercontent.com/img/a/AVvXsEjgbN7IRk9HCLGUQX3akCSUkkHgv-FRaBqgMOD1LsVXPmXPeXSR9mtWlct3aV2cKrd3bhSW8K3orRyYWNeJWd4xuQcepmzETelcOl1eSIIzV86K5x7BM6ZJ3haywMkKWA9zCjT2kIFJKGROld09khVhiX2V40m6Y8Fn4SlWV9Ge5r2wNtKL512Hu2w5Ng=w400-h111" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Yet Another Data Breach</td></tr></tbody></table><br />The threat actor now has a valuable shopping list of email accounts, and full contact information that can help them compromise accounts, perform password resets, and use in new phishing campaigns.<p></p><p>And it gets better (worse?). LastPass intentionally <u>does not encrypt web site addresses</u> in password vaults. So in addition to the threat actor knowing <b>your name, your email, phone number, billing address, and IP addresses</b>, they also know every web site for which you have a login.</p><p>The attackers can now attempt password guessing and password resets on those accounts. If they have an exploit to access email accounts or can perform password resets on email accounts, that's a gold mine.</p><p>Web sites have made our email addresses an essential part of security. An email address has become a proxy for our identity. Email is used for some logins. Email is used for password resets. Email is used for account "verification". If an attacker knows the single email address that someone has used across 30 different web sites, I'm assuming they are a much more lucrative target than someone who has taken the time to use a different email address for every web site.</p><p><br /></p><p><b><u>UPDATE: January 30, 2023</u></b></p><p>I have now created 170 email aliases through SimpleLogin.</p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgn9e53SXgO5JQKzxxeI3TW9Eicop6sdTgLQa_JUkDMCYX-AnvC7s2is8MMjeXpoFIv4Wf4D0rJFtppNl1rFn5uLjQ6CjNdSMd1AWtV7EU-F4vgS22K6RrC45g5dHkS0vaCEWZlIvOMsGuAK9Fnapqn_a2_JfnrUBWpVScpnioDvNbwPUZkKjgLizzpMQ/s300/2023-01-30%20SimpleLogin.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="237" data-original-width="300" height="237" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgn9e53SXgO5JQKzxxeI3TW9Eicop6sdTgLQa_JUkDMCYX-AnvC7s2is8MMjeXpoFIv4Wf4D0rJFtppNl1rFn5uLjQ6CjNdSMd1AWtV7EU-F4vgS22K6RrC45g5dHkS0vaCEWZlIvOMsGuAK9Fnapqn_a2_JfnrUBWpVScpnioDvNbwPUZkKjgLizzpMQ/s1600/2023-01-30%20SimpleLogin.jpg" width="300" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">170 Email Aliases</td></tr></tbody></table><br /><p>SimpleLogin has been very easy and convenient to use and I haven't had any issues with the service itself, or email delivery.</p><p>A few things I've observed and learned as I've switched over to email aliases.</p><p>1. Some sites do not allow you to change the email address for your account. This seems absurd, but they exist. If you want to change your email, you can try to contact the web site or company. In one case, a support rep was able to manually change my email in their system. Another web site I contacted had no ability to change the email address--they told me I had to cancel the account and create a new one under the new email address. This is absurd, but they are the exception.</p><p>2. It seems that changing your email on many web sites automatically opts you back in to marketing email. I've seen this on many web sites--after switching over to an email alias, I immediately started receiving marketing junk mail from them on the new address, even though I did not opt in when I changed my email. So expect to unsubscribe to several marketing lists as you migrate.</p><p>3. Some companies use third party services that require separate logins. For example, the cybersecurity certification organization (ISC)² has an account management system on its own web site where you register to be a member, take training, or pursue a certification. But they use a hosted platform called BrightTalk for webinars and CPE programs--and that site requires a separate registration. (ISC)² then uses yet another web site, Credly, to provide "badges" and certifications. Credly requires its own account, and forced me to use the same email that I used on (ISC)² in order to claim a badge. Not surprisingly, Credly is presumably looking to attest to the certifications provided by (ISC)², so they want to try and link to my (ISC)² identity via email address.</p><p>So that's one company requiring 3 different logins, where I'm using 2 different email aliases. The clear expectation is that a normal human would use their work email for all 3 web sites, thus linking all 3 accounts. And providing all 3 services with user tracking across sites, marketing lists they can sell to third parties and spam shops, and all serving as fodder for future data breaches. Lovely. I don't yet know if using the aliases will cause any complications if I do get certifications--will those certs be tied to an email address that can't easily be changed? I will eventually find out. It seems that Credly does let me add an email address, but I don't yet know if I can completely change my default email and remove an old alias, while also updating my (ISC)² email alias.</p><p>4. I have not yet formally transitioned "friends and family" to aliases--everything from parent teacher conference scheduling, or sending news articles to friends. I've continued to use my work email or one of my free email accounts for convenience. I hope to eventually figure out a simple way of managing aliases for those situations, but those are less critical for me at the moment.</p><p><br /></p><p style="background-color: white; color: #444444; font-family: Arimo; font-size: 15.4px;"><i style="font-family: arimo;">Steve Endow is a Microsoft MVP in Los Angeles. He works with Dynamics 365 Business Central and related technologies.</i></p><p style="background-color: white; color: #444444; font-family: Arimo; font-size: 15.4px;"><i style="font-family: arimo;">You can also find him on </i><i style="font-family: arimo;"><a href="https://www.blogger.com/blog/post/edit/7763553249079245585/5039226310633470520#" style="color: #2288bb; text-decoration-line: none;">Twitter</a> and <a href="https://www.blogger.com/blog/post/edit/7763553249079245585/5039226310633470520#" style="color: #2288bb; text-decoration-line: none;">YouTube</a>,</i><i style="font-family: arimo;"> or through these links: <a href="https://links.steveendow.com/" style="color: #2288bb; text-decoration-line: none;" target="_blank">links.steveendow.com</a></i></p><p style="background-color: white; color: #444444; font-family: Arimo; font-size: 15.4px;"><br /></p></div>Steve Endowhttp://www.blogger.com/profile/03950475674093020502noreply@blogger.com0tag:blogger.com,1999:blog-7763553249079245585.post-81278062023075117322022-07-27T17:11:00.004-07:002022-07-27T17:11:37.288-07:00Disable The Annoying Dialog After Posting in Business Central<p>by Steve Endow</p><p>Why does this dialog appear by default after EVERY document posting in Business Central?</p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5_7Fp4kfAkke7SCrLA2zC4xiJSa7ep9Bu_WG0_Z288etsAfcPUxlHhtgbLSAMCj1FkGIVIlcVoXXFr3g2kX0baOGYjVLFYCx4nHTdNVh2DnkbnY1mAnbpQpuRB6mtog2v8-GI2ArF60wPB9yGCIr8gS1KbQu-65-floc6GpOj30OHGUP7TSu5YA49TQ/s543/PostingDialog1.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="222" data-original-width="543" height="164" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5_7Fp4kfAkke7SCrLA2zC4xiJSa7ep9Bu_WG0_Z288etsAfcPUxlHhtgbLSAMCj1FkGIVIlcVoXXFr3g2kX0baOGYjVLFYCx4nHTdNVh2DnkbnY1mAnbpQpuRB6mtog2v8-GI2ArF60wPB9yGCIr8gS1KbQu-65-floc6GpOj30OHGUP7TSu5YA49TQ/w400-h164/PostingDialog1.jpg" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">This is an annoying dialog</td></tr></tbody></table><br /><p>I was recently on a call with my colleague <a href="https://twitter.com/TanyaTessTeam" target="_blank">Tanya Henderson</a> to review some accounts payable payment processes in Business Central.</p><p>After I posted a purchasing invoice, she told me to click No on this useless dialog, saying that she has to train all of her customers to click no, and she wished she could get rid of it. </p><p>Can this dialog be turned off? If not, can a PTE suppress it after posting?</p><p>Challenge accepted!<span></span></p><a name='more'></a><p></p><p>I don't know anything about that dialog or how it works, so I started my research by looking at the BC code to look for clues.</p><p>Since I always have a local copy of the <a href="https://github.com/StefanMaron/MSDyn365BC.Code.History" target="_blank">BC Code History repository</a> by <a href="https://twitter.com/StefanMaron" target="_blank">Stefan Maron</a>, I opened File Explorer and navigated to BaseApp -> Source -> Base Application and found the PurchaseInvoice.Page.al file.</p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkXHzfevi4gJZFydAKUck1_PLjn77LtBLC8M8NYniLI9ztyJLyCYxCPFWtKxWrJv3GZNNMWvuGy5jJG58GP14dv1i3paUs9G9E_JDB6GMEf_H4gbn6I1JvUrTa0en22HvzLP7Z890rEW4RxLxGCfrd9Z3SXnVAGpAy66On5h2hAkkdcn5Pbq6kdARplA/s641/PostingDialog2.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="156" data-original-width="641" height="98" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkXHzfevi4gJZFydAKUck1_PLjn77LtBLC8M8NYniLI9ztyJLyCYxCPFWtKxWrJv3GZNNMWvuGy5jJG58GP14dv1i3paUs9G9E_JDB6GMEf_H4gbn6I1JvUrTa0en22HvzLP7Z890rEW4RxLxGCfrd9Z3SXnVAGpAy66On5h2hAkkdcn5Pbq6kdARplA/w400-h98/PostingDialog2.jpg" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Purchase Invoice Page Located</td></tr></tbody></table><br /><p>I opened that AL file in VS Code and searched for "the invoice is posted". And there we see the message defined as a Label variable.</p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimZ7tGoiTw3gO8AezLNZHZmS4mnxeAf1v_GGPI0-vhwsE-dvMukCQGMsEMbSgfMIuepbsm2wIfZuLfvHreFkRq2PRSzx8kpMOh1P020zPYm_tmE9W1tkH2qjF88sRpzVbh48J5wTA9DG4kyqBtUnGWNfjRnvlvQ7tnk1vAloUavGf7f9PY1A8rHCrJSQ/s866/PostingDialog3.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="368" data-original-width="866" height="170" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimZ7tGoiTw3gO8AezLNZHZmS4mnxeAf1v_GGPI0-vhwsE-dvMukCQGMsEMbSgfMIuepbsm2wIfZuLfvHreFkRq2PRSzx8kpMOh1P020zPYm_tmE9W1tkH2qjF88sRpzVbh48J5wTA9DG4kyqBtUnGWNfjRnvlvQ7tnk1vAloUavGf7f9PY1A8rHCrJSQ/w400-h170/PostingDialog3.jpg" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">A Clue</td></tr></tbody></table><br /><p>I then searched for OpenPostedPurchaseInvQst. What do we have here?</p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2mF0iz_e80OqiCmL12y1fBg0DPPOa_ApdDXpdHw0DBm3rtIHdLRqW3_sMjNqe_aWqr5viKyLb5PA9FIU4cXFsxoX1Ghw5dWjbjWgPQGs272NXqp6IZ1RtEEZm4nqRH5eE0ajgXEb7Jrn577O0HVwBWePJ-p4O7trVh3gTmsc_ggAYl0CnpvAOhx7mlw/s993/PostingDialog4.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="315" data-original-width="993" height="127" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2mF0iz_e80OqiCmL12y1fBg0DPPOa_ApdDXpdHw0DBm3rtIHdLRqW3_sMjNqe_aWqr5viKyLb5PA9FIU4cXFsxoX1Ghw5dWjbjWgPQGs272NXqp6IZ1RtEEZm4nqRH5eE0ajgXEb7Jrn577O0HVwBWePJ-p4O7trVh3gTmsc_ggAYl0CnpvAOhx7mlw/w400-h127/PostingDialog4.jpg" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">So it's optional?</td></tr></tbody></table><br /><p>That appears to be a procedure that looks like the dialog is optional. "if InstructionMgt.ShowConfirm()" seems to imply it's checking something to see if it should display the confirmation dialog.</p><p>But what is InstructionMgt? I don't know. Back to Stefan's BC Code History repo!</p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMY-LAE1SpZMQbFcYLpCmI9GaDO-vPaLMlJd1IXxxQdA3ws48mqxmP8m59MiTtDVXA6Bnew_ufwIFaiC7a0wIlEa-GqDsRW6VXy_p_ahz0flwBB7A0cGBXIA2AeqpRaIN7xw5QeMQp3WZ5BIgkaURGqnji0kiwFspf0UXYEI9jpJ6qAR2fkqcwcvD5Pg/s534/PostingDialog5.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="123" data-original-width="534" height="93" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMY-LAE1SpZMQbFcYLpCmI9GaDO-vPaLMlJd1IXxxQdA3ws48mqxmP8m59MiTtDVXA6Bnew_ufwIFaiC7a0wIlEa-GqDsRW6VXy_p_ahz0flwBB7A0cGBXIA2AeqpRaIN7xw5QeMQp3WZ5BIgkaURGqnji0kiwFspf0UXYEI9jpJ6qAR2fkqcwcvD5Pg/w400-h93/PostingDialog5.jpg" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Getting warmer...</td></tr></tbody></table><br /><p>The InstructionMgt codeunit was more difficult to interpret--I didn't understand exactly what it was doing, or how it was doing it. But as I scrolled through the Codeunit.al file, I noticed some clues.</p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNiGELSm0vejV1ezVpDeD-w1RL2lL1cCJr7FloYE1jcbSj6tsILDAvXf25oolqoCkU1LLc1AGKvWe8xvYFPsRi3VWYk0AGBZcC8WnagozfqDMhedAgyIyWB_ZqhMJC7r7ZC-MAsTvp4uUt_XvKV3NRGfYPvOyk96jGWtGdwHSgcwQpfMv2aZXgtFvLKg/s646/PostingDialog6.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="518" data-original-width="646" height="321" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNiGELSm0vejV1ezVpDeD-w1RL2lL1cCJr7FloYE1jcbSj6tsILDAvXf25oolqoCkU1LLc1AGKvWe8xvYFPsRi3VWYk0AGBZcC8WnagozfqDMhedAgyIyWB_ZqhMJC7r7ZC-MAsTvp4uUt_XvKV3NRGfYPvOyk96jGWtGdwHSgcwQpfMv2aZXgtFvLKg/w400-h321/PostingDialog6.jpg" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">UserPreference Record</td></tr></tbody></table><br /><p>I saw these procedures that referenced a UserPreference record. That sounds promising.</p><p>But I am still pretty new to Business Central, so I didn't know what "User Preferences" are, or where they are.</p><p>I knew about the "My Settings" menu, so that's where I started to search.</p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgmKyKl8lwletx4creXX-0eVMyArbweQQ1Cfw2DaM2dDI_eT5AIIlN0X89OIF1jc6ok3i0O8Wg9RHoFVoAK87ZvZjmcsfOOHAVhTgcwGNgdGnfdmF3hO0HcAL3Dt5Ytjw-HwJ0Sn6rMAX8saj4y9nHVa8U1SiCse8AclL_Xx6RO63IBpXJQDOZwYuYkg/s331/PostingDialog7.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="331" data-original-width="329" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgmKyKl8lwletx4creXX-0eVMyArbweQQ1Cfw2DaM2dDI_eT5AIIlN0X89OIF1jc6ok3i0O8Wg9RHoFVoAK87ZvZjmcsfOOHAVhTgcwGNgdGnfdmF3hO0HcAL3Dt5Ytjw-HwJ0Sn6rMAX8saj4y9nHVa8U1SiCse8AclL_Xx6RO63IBpXJQDOZwYuYkg/s320/PostingDialog7.jpg" width="318" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Start with My Settings</td></tr></tbody></table><br /><p>Well, nothing obvious, but what is this "Notifications" option? </p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZItdvLVJ3bL--jlpRlhC15i4upP_NmAR4PJzR1dGvt-MDm7Gitkvh33JBkfom0mj2jEzxsP3x7TqVrpC8HORfGCFzT6QnsjxBZ4ZL8qhdlFKDLmVTkKrwthRj5PbxNIzKmttbSirVGvqE20SfVkHT55NYcC6rpIKzpQLj5aboOCxbDcaUXhliJJq-QQ/s596/PostingDialog8.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="385" data-original-width="596" height="259" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZItdvLVJ3bL--jlpRlhC15i4upP_NmAR4PJzR1dGvt-MDm7Gitkvh33JBkfom0mj2jEzxsP3x7TqVrpC8HORfGCFzT6QnsjxBZ4ZL8qhdlFKDLmVTkKrwthRj5PbxNIzKmttbSirVGvqE20SfVkHT55NYcC6rpIKzpQLj5aboOCxbDcaUXhliJJq-QQ/w400-h259/PostingDialog8.jpg" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Notifications?</td></tr></tbody></table><br /><p>Whoa. That's quite a list. But the names of the notifications look promising.</p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOLjKIXpgMnIfu2hb1SsRhnHhaP26QVNjOkQasRhs5KvYe2tj0Y-tl13BrNrhg_dJIuW-e7jC-j2B55G9OMf5dnXMlVkiK_asHdQOJL7LLpttlGQxq0m907RK99p9r9VoF_aE2pE8NmsXneIAhxOHcvbYWSHNJahwWWqsz3YA6kW3-GPzHtYw7FmnVPg/s728/PostingDialog9.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="728" data-original-width="656" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOLjKIXpgMnIfu2hb1SsRhnHhaP26QVNjOkQasRhs5KvYe2tj0Y-tl13BrNrhg_dJIuW-e7jC-j2B55G9OMf5dnXMlVkiK_asHdQOJL7LLpttlGQxq0m907RK99p9r9VoF_aE2pE8NmsXneIAhxOHcvbYWSHNJahwWWqsz3YA6kW3-GPzHtYw7FmnVPg/w360-h400/PostingDialog9.jpg" width="360" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Lots Of Notifications</td></tr></tbody></table><br />Let's try to search for "posting"...<div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWffyn17XtHz9lkn8RA7YJuFsSR6cYN3xKGThkjkIp_6AWKe7FoEHNC7JA-QNLnB4RFmEEZzyXRzLOW7qb6eQZ-K6zZ2b9uCad6Uw6hIlkw2azsTs1RGZ2_l0p5KssvgVWbNxMA-DxmjgoH4jQ7MNj9ZGGVwGyF6bhAavB7UNMgw81hqraPKFJZ4aH6Q/s568/PostingDialog10.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="301" data-original-width="568" height="213" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWffyn17XtHz9lkn8RA7YJuFsSR6cYN3xKGThkjkIp_6AWKe7FoEHNC7JA-QNLnB4RFmEEZzyXRzLOW7qb6eQZ-K6zZ2b9uCad6Uw6hIlkw2azsTs1RGZ2_l0p5KssvgVWbNxMA-DxmjgoH4jQ7MNj9ZGGVwGyF6bhAavB7UNMgw81hqraPKFJZ4aH6Q/w400-h213/PostingDialog10.jpg" width="400" /></a></div><br /><div>Well, this one looks promising: "Confirm after posting documents"</div><div><br /></div><div>Let's see what happens when that Notification is UNchecked.</div><div><br /></div><div>I then posted a new purchase invoice...and no more annoying "Do you want to open the posted invoice?" dialog!</div><div><br /></div><div>Based on what I'm seeing in the Instruction Mgt codeunit, it looks like the "after posting" dialog is controlled exclusively by the "user preference" notification setting--meaning that it must be disabled for every user.</div><div><br /></div><div>I haven't found any clues in the code to indicate that the dialog can be disabled by company--which would be nice.</div><div><br /></div><div>I also didn't see anything to indicate that the dialog can be disabled for certain modules or document type. So it appears that turning off this notification will disable the "after posting" dialog for ALL document types.</div><div><br /></div><div>So you may need to ask users whether they ever want to view any posted documents after posting.</div><div><br /></div><div>If you have any other info or tips related to this "after posting" dialog, or a way to manage these notifications for all users in a company, post a comment below!</div><div><br /></div><div><br /><p style="background-color: white; color: #444444; font-family: Arimo; font-size: 15.4px;"><i style="font-family: arimo; font-size: 15.4px;">Steve Endow is a Microsoft MVP in Los Angeles. He works with Dynamics 365 Business Central and related technologies.</i></p><p style="background-color: white; color: #444444; font-family: Arimo; font-size: 15.4px;"><i style="font-family: arimo; font-size: 15.4px;">You can also find him on </i><i style="font-family: arimo; font-size: 15.4px;"><a href="https://www.blogger.com/blog/post/edit/7763553249079245585/5039226310633470520#" style="color: #2288bb; text-decoration-line: none;">Twitter</a> and <a href="https://www.blogger.com/blog/post/edit/7763553249079245585/5039226310633470520#" style="color: #2288bb; text-decoration-line: none;">YouTube</a>,</i><i style="font-family: arimo; font-size: 15.4px;"> or through these links: <a href="https://links.steveendow.com/" style="color: #2288bb; text-decoration-line: none;" target="_blank">links.steveendow.com</a></i></p></div>Steve Endowhttp://www.blogger.com/profile/03950475674093020502noreply@blogger.com0tag:blogger.com,1999:blog-7763553249079245585.post-52455004137220391472022-05-20T13:26:00.004-07:002022-05-20T13:26:54.161-07:00Exploring Business Central Custom Table Indexes<p>by Steve Endow</p><p>In <a href="https://blog.steveendow.com/2022/05/business-central-custom-fields-and.html" target="_blank">my last post</a>, I poked around in SQL to see what custom fields looked like in the database for a Business Central table extension.</p><p>While looking into fields, I happened to notice the table index that is automatically created for the table extension.</p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNTI92o8gU6IARCFgrZozIKrVtxAga4vPlefMYo8yVAQDsxbIUolNaStCiKK3J3Cdj7vpsIV-L3D-C4Z_CtDGEBnipsIRiQ8oCo-eprN9tSMW1XLnRcy3oV6CqbXzr00qgmTUdNRpm919Emi-Zcm9Wu5SEM6mSXpPEWe7WDAmR4-ZLQqGa7bVrQjN-Gw/s556/Index1.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="201" data-original-width="556" height="145" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNTI92o8gU6IARCFgrZozIKrVtxAga4vPlefMYo8yVAQDsxbIUolNaStCiKK3J3Cdj7vpsIV-L3D-C4Z_CtDGEBnipsIRiQ8oCo-eprN9tSMW1XLnRcy3oV6CqbXzr00qgmTUdNRpm919Emi-Zcm9Wu5SEM6mSXpPEWe7WDAmR4-ZLQqGa7bVrQjN-Gw/w400-h145/Index1.jpg" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Automatic Table Extension Index</td></tr></tbody></table><br /><p>If we look at this index, we see it is a Clustered Unique index for the "No_" field only.</p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGLB19qovCSi7rsH31AuCH7jS3MtANT9ZZ_smU7eeAqlhlscaqy_Rh6vipcuxWEh_h5LDCWGf1tFqlbWy3xLpTMgswA93bm0N91KaXcras3pVYTABB4xYxae5vLlk7xZsIvt6D6HPdi_GSetVCk1RHcW1g9i_qUHkAKiryC-bmlAHZXVgUS8yx0RKjvw/s844/Index2.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="485" data-original-width="844" height="230" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGLB19qovCSi7rsH31AuCH7jS3MtANT9ZZ_smU7eeAqlhlscaqy_Rh6vipcuxWEh_h5LDCWGf1tFqlbWy3xLpTMgswA93bm0N91KaXcras3pVYTABB4xYxae5vLlk7xZsIvt6D6HPdi_GSetVCk1RHcW1g9i_qUHkAKiryC-bmlAHZXVgUS8yx0RKjvw/w400-h230/Index2.jpg" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Default Clustered Index on Table Extension</td></tr></tbody></table><br /><p>Why is this default index created automatically? This <a href="https://docs.microsoft.com/en-us/dynamics365/business-central/dev-itpro/developer/devenv-table-keys" target="_blank">Table Keys docs page</a> briefly mentions the default Clustered Index on table extensions.<span></span></p><a name='more'></a><p></p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDsO0ws_d5mzQZRJivUjEU59Z30WKbUNfmbd3IlnApNZGAzZi2Y87Rg-ornyVpwJ7LJlcie4TqNp3_zxPhHSZfhUntFil_xhwz5PS8CXR5f7n6RFN6AqeWtJoU9m3BwKOGxriG09yAWTJ0XGPmqRDzwFP7qNbFJPYiSfPoCl9AGwB-3OoyvZjpayFd_A/s685/Index3.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="492" data-original-width="685" height="288" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDsO0ws_d5mzQZRJivUjEU59Z30WKbUNfmbd3IlnApNZGAzZi2Y87Rg-ornyVpwJ7LJlcie4TqNp3_zxPhHSZfhUntFil_xhwz5PS8CXR5f7n6RFN6AqeWtJoU9m3BwKOGxriG09yAWTJ0XGPmqRDzwFP7qNbFJPYiSfPoCl9AGwB-3OoyvZjpayFd_A/w400-h288/Index3.jpg" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Table Extensions Inherit the Primary Key of their Base Table</td></tr></tbody></table><br />If we look at the Customer base table, we see the matching primary key, which is also for the "No_" field.<div><br /></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdm3J8xNpj3gWynCga0xH8wTwlNpeHOsWqmyg4BnKpLWCRdemEyF3wLFZGjleKNeW5esAaiQqwiMJ0xuFsLOQyD3nHcPI5WCqDrF7vLwhpwvRjGJ7Yqd42DNDXRkVTEQzqZgOa_Qcavu7aw3uuTRRzjw4Alh3lCIyZgOvNVNyG6I5NvAKXS0FY4EbfJg/s979/Index4.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="687" data-original-width="979" height="281" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdm3J8xNpj3gWynCga0xH8wTwlNpeHOsWqmyg4BnKpLWCRdemEyF3wLFZGjleKNeW5esAaiQqwiMJ0xuFsLOQyD3nHcPI5WCqDrF7vLwhpwvRjGJ7Yqd42DNDXRkVTEQzqZgOa_Qcavu7aw3uuTRRzjw4Alh3lCIyZgOvNVNyG6I5NvAKXS0FY4EbfJg/w400-h281/Index4.jpg" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Base Table Primary Key</td></tr></tbody></table><br /><div>So this makes sense. The Table Extension uses the same primary key, facilitating a JOIN and indexed lookups against the table extension.</div><div><br /></div><div>The <a href="https://docs.microsoft.com/en-us/dynamics365/business-central/dev-itpro/developer/devenv-table-keys" target="_blank">Table Keys doc page</a> reminds us there can only be one Primary Key and one Clustered Index on a table, but we can add secondary keys--additional indexes--on the database table that is created for our BC table extension.</div><div><br /></div><div>This can be done in AL using the "keys" keyword.</div><div><br /></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzhVX_waN2TV-OaOk5fSce6XzAt-RxrRsosla61qZQRQ_7GO2mDjXf3G7yUu-Ilq_XISgKFCaNeL-G-NlQwKkUN4SGAMtokys4kcPYlzbYlnG65o7BjbiPtKu8hQBQk68DUGCbhsIwRqfSd_FZFjXk0Y5kcVNhytIweGOz996I9h8bKcZft0vZsyfllA/s465/Index5.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="343" data-original-width="465" height="295" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzhVX_waN2TV-OaOk5fSce6XzAt-RxrRsosla61qZQRQ_7GO2mDjXf3G7yUu-Ilq_XISgKFCaNeL-G-NlQwKkUN4SGAMtokys4kcPYlzbYlnG65o7BjbiPtKu8hQBQk68DUGCbhsIwRqfSd_FZFjXk0Y5kcVNhytIweGOz996I9h8bKcZft0vZsyfllA/w400-h295/Index5.jpg" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Create Keys in AL Table Extension</td></tr></tbody></table><br /><div><br /></div><div>You can create multiple keys using the "key" keyword. Each key has a name, and a comma delimited list of fields that will be part of the table index.</div><div><br /></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKKYjYYrG-KisJt7gLfiJhF6sydUVURQ1JWGbowBqA-KCmJO6ad3HbIaAieYEIhVT8KjxnlEaSf1Fx8JpegCRZCCoP9OGbyTiu5yI7heIRVQlKCBhqMtZVTuSH0AAHy7ia0gbXS4qdqSSu7PpcA5pVetb6m1-v_HBtIyXdAe6-zT095uX7hv6QXSYuMg/s681/Index6.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="516" data-original-width="681" height="303" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKKYjYYrG-KisJt7gLfiJhF6sydUVURQ1JWGbowBqA-KCmJO6ad3HbIaAieYEIhVT8KjxnlEaSf1Fx8JpegCRZCCoP9OGbyTiu5yI7heIRVQlKCBhqMtZVTuSH0AAHy7ia0gbXS4qdqSSu7PpcA5pVetb6m1-v_HBtIyXdAe6-zT095uX7hv6QXSYuMg/w400-h303/Index6.jpg" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Defining Table Keys in AL</td></tr></tbody></table><br /><div>My example is for a Table Extension, which inherits a primary key from its base table. But note that if you create an independent custom table, the first key you define will be the primary key.</div><div><br /></div><div>So in my example above, I defined a secondary key creatively called "testkey". I added TestDate and TestInteger as fields to that new index.</div><div><br /></div><div><br /></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3yLX0XTtIQRE4PEQJdoBVQBKnNyQZFhvsYnwrzjSMcc3snSjmZWjswvee6YtxJZT3NCSjDiuLetYH9MUZSpPPihQY2rErPpWYLEbw_02MZr7CEz8BH73EYaZ2PU-eYdJKqT3Q0Aqsr4aTrVBzzvKf-hsn0uwJ67gjnklmsR5NKIoMLEtH0Q84Qes59g/s559/Index8.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="222" data-original-width="559" height="159" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3yLX0XTtIQRE4PEQJdoBVQBKnNyQZFhvsYnwrzjSMcc3snSjmZWjswvee6YtxJZT3NCSjDiuLetYH9MUZSpPPihQY2rErPpWYLEbw_02MZr7CEz8BH73EYaZ2PU-eYdJKqT3Q0Aqsr4aTrVBzzvKf-hsn0uwJ67gjnklmsR5NKIoMLEtH0Q84Qes59g/w400-h159/Index8.jpg" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Table Extension Secondary Key: Unique Non-Clustered Index</td></tr></tbody></table><br />The AL code will automatically create a non-clustered SQL index on the extension table.<div><br /><div>Wait a minute--that's a Unique index. I can imagine many scenarios where data stored in a table extension will not be unique for all records. So what if I want a non-unique index?</div><div><br /></div><div>I looked at the documentation for the Business Central <a href="https://docs.microsoft.com/en-us/dynamics365/business-central/dev-itpro/developer/properties/devenv-unique-property" target="_blank">Unique index property</a>, and found this note:</div><div><br /></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBgjRYO_-v0CnaJxNYv3hwf1CLUY_6TLSCq6kFyVH-AieSqgKSAYHWu_EnXMcJXE-xzCFnUN4KVODtOQ7xFTOpq27gHPlVGChHC-RUp_O-_FxkPiWspndPV4Ngj_DswtVqPplPznc8i4auY8mA7I02zcYMFkTQR_CZoqAIGEl6jXmfaMa6GjfDgAHR5g/s691/Index9.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="469" data-original-width="691" height="271" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBgjRYO_-v0CnaJxNYv3hwf1CLUY_6TLSCq6kFyVH-AieSqgKSAYHWu_EnXMcJXE-xzCFnUN4KVODtOQ7xFTOpq27gHPlVGChHC-RUp_O-_FxkPiWspndPV4Ngj_DswtVqPplPznc8i4auY8mA7I02zcYMFkTQR_CZoqAIGEl6jXmfaMa6GjfDgAHR5g/w400-h271/Index9.jpg" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">"The Unique property isn't supported in table extension objects"</td></tr></tbody></table><br /><div>This says that the Unique property isn't supported in table extensions--and the default value for Unique is True. So any indexes you add to a table extension will be Unique. Period.</div><div><br /></div><div>But wait--what if I have a table extension to store a "Customer Region" field--and I have dozens of customers with a region value of "West". If I want to add an index to my Customer table extension that includes Customer Region, it needs to allow duplicate values.</div><div><br /></div><div>So how can the additional indexes all be unique? This didn't make any sense.</div><div><br /></div><div>So I tried entering a few test records to see what happened.</div><div><br /></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLG2ZQzhgkPQyqHI_3Vr18v9AT4_mfEslouM6FLrm09V6U4olvyq9TDtiz2fb1dRVIxrtDeqVsiZGsN5n5Uc38s-_zpX9_RlxSCPKvArr6ZpH9avz7VF6G2Uhyzfniuof33tl7fJbLiLCKdgYtv1Aq77O7zKUWamJLI6ge0y6x0UmKmcl81JggjMjsaw/s1644/Index11.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="616" data-original-width="1644" height="150" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLG2ZQzhgkPQyqHI_3Vr18v9AT4_mfEslouM6FLrm09V6U4olvyq9TDtiz2fb1dRVIxrtDeqVsiZGsN5n5Uc38s-_zpX9_RlxSCPKvArr6ZpH9avz7VF6G2Uhyzfniuof33tl7fJbLiLCKdgYtv1Aq77O7zKUWamJLI6ge0y6x0UmKmcl81JggjMjsaw/w400-h150/Index11.jpg" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Same Table Extension field values in two different records</td></tr></tbody></table><br /><div>I entered the same values in a few table extension fields on two different records. I waited for an error. But nothing happened. I entered the values in the fields, and the values were saved.</div><div><br /></div><div>Huh.</div><div><br /></div><div>I opened the index details and found the answer. (<a href="https://twitter.com/greatscott000/status/1527725598281441280" target="_blank">Todd Scott on Twitter</a> also explained this just as I found the answer)</div><div><br /></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFrLnpMvhy-BNq7xIvvbC8MIeu_oNPmPDuc3zA3YEhsfqjh6vBGrGadL5-XdO6Zu1R6XpYwDMNSKSrCcpgpzNgBjNjVXBbHupDhnJou9Zqp1uqSWWRzlfWHPwU1sdCZbfXvqMuYHNxrB8LD99aVQDYceBTirZRswwKr9OAQqIWKW4t81mm8pcUEL-eAQ/s497/Index10.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="277" data-original-width="497" height="223" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFrLnpMvhy-BNq7xIvvbC8MIeu_oNPmPDuc3zA3YEhsfqjh6vBGrGadL5-XdO6Zu1R6XpYwDMNSKSrCcpgpzNgBjNjVXBbHupDhnJou9Zqp1uqSWWRzlfWHPwU1sdCZbfXvqMuYHNxrB8LD99aVQDYceBTirZRswwKr9OAQqIWKW4t81mm8pcUEL-eAQ/w400-h223/Index10.jpg" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">The primary key field is added to the additional indexes</td></tr></tbody></table><br /><div>When the new index is created, the primary key from the 'base' table is included in the index. So even if I have the same value for TestDate and TestInteger, having the No_ field in the index makes each entry unique.</div><div><br /></div><div><br /></div><div><b><u>Included Columns</u></b></div><div><br /></div><div>While doing this research on Business Central indexes, I wondered about Included Columns. This is a very cool feature of SQL Server indexes that allows you to include some additional fields in your index to reduce separate lookups outside of the index.</div><div><br /></div><div>If you are familiar with a "covering index", the value of Included Columns should be pretty obvious. It offer the benefits of a "wider" index with less index overhead--since the included columns are not "keys" in the index.<br /><p>Support for Included Columns was <a href="https://docs.microsoft.com/en-us/dynamics365-release-plan/2021wave2/smb/dynamics365-business-central/performance-support-included-columns-keys" target="_blank">added to Business Central in October 2021</a> through the use of <a href="https://docs.microsoft.com/en-us/dynamics365/business-central/dev-itpro/developer/properties/devenv-includedfields-property" target="_blank">the IncludedFields keyword</a>.</p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiAa5EgG8VuXN3iRKZT2QMhlRWDboJuLYXHkNHeF3zlK64y2W9qLNZlwb8vnLujs-84kYL2CuTD4_jzSuXdnxfZuLuqafLG05ny0fCi7PGyt1bjURPA2Zej2NR2NhqF9PbSaKuEVSttuvkMNIT14qTZk-awv8pKKzoTE_S-wAnGtIFk4xKi6N4OD8Qdqw/s370/Index12.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="310" data-original-width="370" height="335" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiAa5EgG8VuXN3iRKZT2QMhlRWDboJuLYXHkNHeF3zlK64y2W9qLNZlwb8vnLujs-84kYL2CuTD4_jzSuXdnxfZuLuqafLG05ny0fCi7PGyt1bjURPA2Zej2NR2NhqF9PbSaKuEVSttuvkMNIT14qTZk-awv8pKKzoTE_S-wAnGtIFk4xKi6N4OD8Qdqw/w400-h335/Index12.jpg" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">IncludedFields property = SQL Index Included Columns</td></tr></tbody></table><br /><p>If you are creating custom tables or table extensions in Business Central, I highly recommend understanding SQL Server indexes and basics of index optimization.</p><p>SQL Server performance optimization and index optimization is an entire career, so I don't expect any ERP developer to be an expert, but you should at least understand the theory of SQL indexes, how they work, and how to generally improve query performance using indexes.</p><p><br /></p><p style="background-color: white; color: #444444; font-family: Arimo; font-size: 15.4px;"><i style="font-family: arimo; font-size: 15.4px;">Steve Endow is a Microsoft MVP in Los Angeles. He works with Dynamics 365 Business Central and related technologies.</i></p><p style="background-color: white; color: #444444; font-family: Arimo; font-size: 15.4px;"><i style="font-family: arimo; font-size: 15.4px;">You can also find him on </i><i style="font-family: arimo; font-size: 15.4px;"><a href="https://www.blogger.com/blog/post/edit/7763553249079245585/5039226310633470520#" style="color: #2288bb; text-decoration-line: none;">Twitter</a> and <a href="https://www.blogger.com/blog/post/edit/7763553249079245585/5039226310633470520#" style="color: #2288bb; text-decoration-line: none;">YouTube</a>,</i><i style="font-family: arimo; font-size: 15.4px;"> or through these links: <a href="https://links.steveendow.com/" style="color: #2288bb; text-decoration-line: none;" target="_blank">links.steveendow.com</a></i></p></div></div>Steve Endowhttp://www.blogger.com/profile/03950475674093020502noreply@blogger.com0tag:blogger.com,1999:blog-7763553249079245585.post-42127436399077042742022-05-18T09:58:00.003-07:002022-05-20T14:11:06.132-07:00Business Central Custom Fields and Default Field Values<p>by Steve Endow</p><p>When you add new fields to an existing Business Central table, what happens? </p><p>What does Business Central do in the database? How does Business Central handle default field values? </p><p>I didn't know the answers to these questions, so I decided to do a few tests. For fun, obvs!</p><p>To keep things simple, I created a Table Extension object in AL. I assume this applies to creating custom tables and adding fields to an existing custom table, but I figured a Table Extension would be simpler and easier to test with, and I learned a few more things about table extensions in the process.</p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiOhDZdX5JZFsMaLtvilnJ6ukH8Zxp45uXdrEfGluLbkwq1nxASMX8clw10vz_P6ObDQwkUb95NArwqzEsoxAA64xOBc2kM9FiTrHplRCYkEYCuHtrh8njFM7_iqVZe-l-8CNeywgEeq1n7-Ek0qfHCZUj1fpU4Kg6FD-iCYa-6I8reE1KN5cj-6xX8xw/s852/Fields1.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="852" data-original-width="507" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiOhDZdX5JZFsMaLtvilnJ6ukH8Zxp45uXdrEfGluLbkwq1nxASMX8clw10vz_P6ObDQwkUb95NArwqzEsoxAA64xOBc2kM9FiTrHplRCYkEYCuHtrh8njFM7_iqVZe-l-8CNeywgEeq1n7-Ek0qfHCZUj1fpU4Kg6FD-iCYa-6I8reE1KN5cj-6xX8xw/w238-h400/Fields1.jpg" width="238" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Simple Customer Table Extension </td></tr></tbody></table><br /><p><span></span></p><a name='more'></a>I installed the extension in my BC Docker Container, and then took a look at the modified Customer table. I went to the Table Information page and searched for Customer. <p></p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMf35MaFgZo_F9YEUIClBzNplWmPwgF7jtbvu8u7P6jAxk9yZTKAmAlCQyS3sjkSJZsN4Y_NDUpIzT3P3vu1QQqpKPrHC_oQCSaWqrFz4KFEep21A99gzZHomHJ61RYfwOX6lexJcREhRs-KSfaGB8KmR4GABBybbaJBnpq2ySXKxbRK4HTst-TITg_Q/s724/Fields2.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="218" data-original-width="724" height="120" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMf35MaFgZo_F9YEUIClBzNplWmPwgF7jtbvu8u7P6jAxk9yZTKAmAlCQyS3sjkSJZsN4Y_NDUpIzT3P3vu1QQqpKPrHC_oQCSaWqrFz4KFEep21A99gzZHomHJ61RYfwOX6lexJcREhRs-KSfaGB8KmR4GABBybbaJBnpq2ySXKxbRK4HTst-TITg_Q/w400-h120/Fields2.jpg" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Table Information Page</td></tr></tbody></table><br /><p>I then clicked on "5" in the No. of Records column. When I scrolled to the right, I found my custom fields.</p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgeX4BmF02GBWkjzvzwR8nCc7pqaXaVo9j6EpCwv9wkt_sQxjRxplvtgvb-BG-Cy9DfCvPlJPQCq6gx1hrGtUjgBjkAwIeR37P462rC3P90SGzXBkdL4NmAqsUBQZ0qXI8G-Lc7XPIAS90GLEGkNxQiDxJ-IWYveVMrIqgnIPIfCDA6to68pV6xspQF1g/s824/Fields3.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="326" data-original-width="824" height="159" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgeX4BmF02GBWkjzvzwR8nCc7pqaXaVo9j6EpCwv9wkt_sQxjRxplvtgvb-BG-Cy9DfCvPlJPQCq6gx1hrGtUjgBjkAwIeR37P462rC3P90SGzXBkdL4NmAqsUBQZ0qXI8G-Lc7XPIAS90GLEGkNxQiDxJ-IWYveVMrIqgnIPIfCDA6to68pV6xspQF1g/w400-h159/Fields3.jpg" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Custom Fields from Table Extension</td></tr></tbody></table><br />What may not be obvious at this point is that Business Central is choosing a value for the "Allow Nulls" setting on these new fields. This may sound obvious, simply because Table Extensions just work, but if you think about this further, it has some technical implications, and gives us some insight into what BC is doing behind the scenes when it adds new fields to the database.<br /><p>Notice that the 5 existing customer records have some blank custom field values, while a few have a value. So the TestCode, TestDate, and TestText fields are blank, but TestInteger, TestGuid, and TestBool fields effectively have a value of 0.</p><p>Huh. </p><p>Look at TestDate again. It's a Date field. That is blank for existing records. Blank, like an empty string.</p><p>Huh.</p><p>So what's going on behind the scenes? What are the actual properties of the fields that are being created by Business Central for this Table Extension?</p><p>Well, let's take a look.</p><p>I opened SQL Server Management Studio and connected to the SQL Server instance in my Docker Container.</p><p>I then expanded the "default" database, and expanded Tables. I found two tables with "Customers" in the name, and it turned out the first one had the custom fields for my Table Extension.</p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8-6wvafbVR255_kMCuZQjMcawUDJCGinZA0OYtuGTYDZP0rXqqDmL_4aGTONJzc6TOdBexePaRjyfqEuWSUESnAyhwTjJp4p5KIyZRGHByKJPA6QgrPVHSredvqdaXe7CGThkZeF_CcoLu6QgUj2s5Gt0RM-T3nSRbgz5IQtWrX4KDVIHT9lPYJ2-6A/s740/Fields4.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="740" data-original-width="591" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8-6wvafbVR255_kMCuZQjMcawUDJCGinZA0OYtuGTYDZP0rXqqDmL_4aGTONJzc6TOdBexePaRjyfqEuWSUESnAyhwTjJp4p5KIyZRGHByKJPA6QgrPVHSredvqdaXe7CGThkZeF_CcoLu6QgUj2s5Gt0RM-T3nSRbgz5IQtWrX4KDVIHT9lPYJ2-6A/w320-h400/Fields4.jpg" width="320" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Table Extension Fields in Separate Customer Table</td></tr></tbody></table><br /><p>Huh. Look at that. Instead of attempting to append my custom fields to the real Customer table, Business Central creates another table, effectively also called Customers, to store just the custom fields for my Customer Table Extension.</p><p>I can imagine lots of benefits to this design, but can only think a few potential downsides.</p><p>If I query the records in this table, I see a row for each existing Customer, and most of the fields have a default value.</p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYcG8vp0fYOGDpl5vRaNCF7o1RDUVe0lQABdqnFDjMUVhjVZPVZ6mK40JZ20lxbJ9kRQ-hTKMQwFUVlTWJZmyR_Bexam2Xy5ccFjKeQI_b1elHvWH7NCQqVKYKLHl3AjgrgZB_IHdWY0apFaYJOudLczuYQveffRW3GWshIsdJJCyjfS9aXa9y4CUUZw/s857/Fields5.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="300" data-original-width="857" height="140" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYcG8vp0fYOGDpl5vRaNCF7o1RDUVe0lQABdqnFDjMUVhjVZPVZ6mK40JZ20lxbJ9kRQ-hTKMQwFUVlTWJZmyR_Bexam2Xy5ccFjKeQI_b1elHvWH7NCQqVKYKLHl3AjgrgZB_IHdWY0apFaYJOudLczuYQveffRW3GWshIsdJJCyjfS9aXa9y4CUUZw/w400-h140/Fields5.jpg" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Records in Custom Customer Extension Table</td></tr></tbody></table><br /><p>That's interesting.</p><p>Notice something about the "Columns" listed under the custom Customers table in the prior screen shot? Notice the words "not null" after each field?</p><p>Let's think about what that means. First, it tells us that Business Central apparently does not allow NULL fields. This is similar to Dynamics GP, which I worked with for many years--no NULLs allowed. But I also realized Business Central created a new table with fields that do not allow null values, but it appears to have added new records to that table. So that tells me that Business Central has provided some default values for the field.</p><p>How did it do that?</p><p>One way that I'm aware of is to define a default value for the field through the Default Value or Binding field property.</p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCeH0AuQcZP5SZ6LcU0RPtkpDf4Jqa1W3pV1SMuavfo2j0K-ei3y0V9WT9TLufiYEbYgbtfWt9PExa_OjgaCdX1yiTUonICBxN-aZdjxY3NZDVgvgJ7jOkuueSiyFxzoKuI8kdqoEgACH6qWgI9k0ufSrBE6t5N0ECq82w3GGQpEwY8kru9RRqfn2Guw/s573/Fields6b.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="523" data-original-width="573" height="365" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCeH0AuQcZP5SZ6LcU0RPtkpDf4Jqa1W3pV1SMuavfo2j0K-ei3y0V9WT9TLufiYEbYgbtfWt9PExa_OjgaCdX1yiTUonICBxN-aZdjxY3NZDVgvgJ7jOkuueSiyFxzoKuI8kdqoEgACH6qWgI9k0ufSrBE6t5N0ECq82w3GGQpEwY8kru9RRqfn2Guw/w400-h365/Fields6b.jpg" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Default Value or Binding is Blank</td></tr></tbody></table><br /><br /><div>Business Central does not seem to have used that property--Default Value or Binding is blank for the TestDate field, but we saw that customer records had a value of 1753-01-01 in our TestDate field.<br /><p>So how did it create records with default field values in fields that do not allow nulls and do not have a default value defined?</p><p>My guess is that it used a command like this that provides a default value during creation of the field.</p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9lulHSsYV0GQfbXpQaEi2GWaVqiL0m7Qe9jdx1VrvshXQ-2UfDyfLpvUL9wTGA8HeHQgGGwv7LeKxnhPtWECdaBzoYcrDbCNMC8AweGRT6s4xHA7G4pJdTCKR6xY8NXMerCHJPa7g05W6tgHqG8zIiIqoNPeCECcB3XipiTJtSz2xvStla8m7hEf0CQ/s785/Fields7a.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="260" data-original-width="785" height="133" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9lulHSsYV0GQfbXpQaEi2GWaVqiL0m7Qe9jdx1VrvshXQ-2UfDyfLpvUL9wTGA8HeHQgGGwv7LeKxnhPtWECdaBzoYcrDbCNMC8AweGRT6s4xHA7G4pJdTCKR6xY8NXMerCHJPa7g05W6tgHqG8zIiIqoNPeCECcB3XipiTJtSz2xvStla8m7hEf0CQ/w400-h133/Fields7a.jpg" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Add Field with Default Value</td></tr></tbody></table><br /><p>That doesn't explain the full sequence of steps it must perform to create all of the records in the new custom table, but I am guessing it's one step in the process. (a topic for a future blog post)</p><p>Interestingly, we see that the Date field has a default value of 1753-01-01 (the SQL Server minimum date value), but when we view the contents of the customer table, the TestDate field is blank. That seems to indicate that Business Central is automatically replacing the minimum date with a blank value in the UI.</p><p>If I missed any details about table extensions, custom fields, or custom tables, let me know!</p><p><br /></p><p style="background-color: white; color: #444444; font-family: Arimo; font-size: 15.4px;"><i style="font-family: arimo; font-size: 15.4px;">Steve Endow is a Microsoft MVP in Los Angeles. He works with Dynamics 365 Business Central and related technologies.</i></p><p style="background-color: white; color: #444444; font-family: Arimo; font-size: 15.4px;"><i style="font-family: arimo; font-size: 15.4px;">You can also find him on </i><i style="font-family: arimo; font-size: 15.4px;"><a href="https://www.blogger.com/blog/post/edit/7763553249079245585/5039226310633470520#" style="color: #2288bb; text-decoration-line: none;">Twitter</a> and <a href="https://www.blogger.com/blog/post/edit/7763553249079245585/5039226310633470520#" style="color: #2288bb; text-decoration-line: none;">YouTube</a>,</i><i style="font-family: arimo; font-size: 15.4px;"> or through these links: <a href="https://links.steveendow.com/" style="color: #2288bb; text-decoration-line: none;" target="_blank">links.steveendow.com</a></i></p></div>Steve Endowhttp://www.blogger.com/profile/03950475674093020502noreply@blogger.com0tag:blogger.com,1999:blog-7763553249079245585.post-77089129689560361792022-05-05T09:56:00.009-07:002022-05-05T12:38:17.705-07:00Mitigating WiFi deauth attack with Protected Management Frames in Unifi (aka 802.11w Management Frame Protection MFP)<p>by Steve Endow</p><p>Note: In case the title didn't make it obvious, this post has nothing to do with Business Central. I wanted to document my learning because I found very little reliable or current information on mitigating WiFi deauth attacks, as of May 2022. If I got anything wrong or if you find a good resource covering this topic, please post a comment and let me know.</p><p><br /></p><p>When I'm not trying to learn Business Central, I like to learn about computer security. I'm not a computer security expert by any means, just someone who finds it interesting as a side hobby.</p><p>While learning about password cracking several months ago, I learned about <a href="https://www.kali.org/" target="_blank">Kali Linux</a>, an amazing distribution that includes lots of different computer and network security tools pre-installed.</p><p>In order to learn how to use Kali Linux and the security tools it includes, I decided to try to learn how to crack my WiFi password. It seemed like a fun exercise, and it was. But it just happened to teach me something entirely unexpected.</p><p>While following the instructions in this "<a href="https://www.geeksforgeeks.org/how-to-hack-wpa-wpa2-wifi-using-kali-linux/" target="_blank">Hacking Wi-Fi</a>" guide (which had some minor omissions--I recommend <a href="https://www.geeksforgeeks.org/kali-linux-hacking-wi-fi/" target="_blank">using this version instead</a>), I was quite surprised when I read this step:</p><p>"<b>...disconnect the clients connected to the target network...</b>"</p><p>Wait, what?<span></span></p><a name='more'></a><p></p><p>As I reviewed the instructions, I realized that it was instructing me to disconnect the clients on the target network in order to force them to re-authenticate, thus forcing the re-transmission of the encrypted WPA PSK passphrase.</p><p>This is a brilliant technique. But wait a minute--how in the world do you disconnect all of the clients from a WiFi network without even being connected to the network?</p><p>It turns out that anyone can just broadcast a packet telling one or more, or all!, devices on the WiFi network to disconnect. This is called a "deauthentication" attack.</p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiND0IdaZfL_0jYf0rz_g0_VwU9r9zCtINEinvhs48-vBlbx24zsNkNMHAmTEz8tHl350heUeKCdmjGvHqvZAFyQEZrv2BHORcww5IhD6jOt8UBpT6y9ska5ME0QDR5R2z4TdqjI79RQxEzP2y7E6ata9SNHteNtxxxb6amxsCwWpm9Kpl1-7--DaBebw/s960/Deauth1.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="488" data-original-width="960" height="204" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiND0IdaZfL_0jYf0rz_g0_VwU9r9zCtINEinvhs48-vBlbx24zsNkNMHAmTEz8tHl350heUeKCdmjGvHqvZAFyQEZrv2BHORcww5IhD6jOt8UBpT6y9ska5ME0QDR5R2z4TdqjI79RQxEzP2y7E6ata9SNHteNtxxxb6amxsCwWpm9Kpl1-7--DaBebw/w400-h204/Deauth1.jpg" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">WiFi Deauth Attack Using aireplay-ng</td></tr></tbody></table><br /><p>While this is just one step in the process of trying to hack a WiFi password, it happens to also be a pretty significant security vulnerability that could allow anyone to perform a denial of service attack on a WiFi network. Imagine someone sitting in the parking lot of an office park performing a WiFi denial of service attack against dozens of nearby companies using only a laptop. There are even dedicated devices, smaller than a pack of gum, that can be left somewhere with a USB battery bank to perform the attack for days without any human intervention.</p><p>From what I have read, there is virtually nothing you can do to block or prevent such an attack. Any teenager with a laptop or Raspberry Pi can broadcast the deauth packets. This was a known vulnerability of the WiFi standard, so around 2009, a new standard called <a href="https://en.wikipedia.org/wiki/IEEE_802.11w-2009" target="_blank">802.11w</a> was drafted--called the "Protected Management Frames" standard.</p><p>802.11w proposed that a few types of "management frames" be encrypted to mitigate deauthentication attacks (and perhaps a few other attacks).</p><p>Here is a summary from 2009:</p><p><a href="https://www.cwnp.com/wireless-lan-security-and-ieee-802-11w/">https://www.cwnp.com/wireless-lan-security-and-ieee-802-11w/</a></p><p>This standard was apparently eventually implemented through a WiFi feature called "Management Frame Protection" (MFP) or "Protected Management Frames" (PMF), depending on the vendor name for the feature. My understanding is that it implements <a href="https://datatracker.ietf.org/doc/html/rfc4493.html" target="_blank">RFC 4493</a>, which is AES "cipher based message authentication code", or CMAC, on the WiFi management frames. I can't tell which standard covers its implementation, but I've read that this is all rolled into the 802.11ac standard. (I have not attempted to research that yet, so if anyone has a link to a clear explanation as to which standard mandates it, please post a comment below.)<br /></p><p>PMF (or MFP) essentially allows authorized WiFi devices to validate management packets. Devices that are connected to the WiFi network are able to authenticate management commands, and ignore commands that do not have a valid AES CMAC value.</p><p>An attacker can still attempt to send deauth codes to the devices on the WiFi network, but since they won't have a valid CMAC, they can easily be ignored.</p><p><br /></p><p>I'm writing this post because I found very little information about PMF / MFP. The few notes that I found were quite old. One post claimed that MFP was a Cisco feature. Other old posts claimed that MFP was <u>not</u> supported by most devices as of 2017, including all Apple devices.</p><p>I use Ubiquiti Unifi gear for my wireless network, so I looked into whether Unifi had support for PMF. Once again, I found VERY little information, other than the fact that Unifi does support "Protected Management Frames". I happened to find <a href="https://www.youtube.com/watch?v=MG5VQWC4OOM" target="_blank">this 2017 video by Tom Lawrence</a> of Lawrence Systems where he discusses the feature, but indicates that it has very limited support. He notes that only <u>third generation</u> Unifi APs support PMF, and he explains that his Samsung mobile phone didn't support PMF at that time. </p><p>I purchased my Ubiquiti Unifi network gear in September 2017, so I didn't think it would support PMF. I have the UAP-AC-PRO, the UAP-AC-M, and the UAP-AC-IW access points, all of which appear to be "2nd gen" Unifi devices, and thus not supported as of 2017, according to Tom.</p><p>With my expectations very low, I searched for the Protected Management Frames feature in my Unifi configuration page. The feature is buried under each Wifi Network in Advanced -> Security, and the setting is disabled by default.</p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNQhYz0ljYPNXNhGas5FYkwba9YbCngUkL35WfoYsars_QE7hCCwEcZgIGedJubd0xZPFCaou_TJtX4tPUk1ec5vXmC99bxi_UEZ2HukTtihqwAPSXjGvIP9vxqPSaWxyHg-IsPdB3wSM0Vlsqer7tX0uxcqga4EP10At7t8qk5gC_2QBCshXuybdpRw/s620/Deauth2.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="123" data-original-width="620" height="79" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNQhYz0ljYPNXNhGas5FYkwba9YbCngUkL35WfoYsars_QE7hCCwEcZgIGedJubd0xZPFCaou_TJtX4tPUk1ec5vXmC99bxi_UEZ2HukTtihqwAPSXjGvIP9vxqPSaWxyHg-IsPdB3wSM0Vlsqer7tX0uxcqga4EP10At7t8qk5gC_2QBCshXuybdpRw/w400-h79/Deauth2.jpg" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Ubiquiti Unifi Protected Management Frames (PMF) Feature</td></tr></tbody></table><br /><p>One nice thing about the feature is that it is <b>per WiFi network</b>. So I was able to set PMF to Required on my Guest network and then see which devices could connect. To my surprise, not only does it appear that my 2017 Unifi access points do support the PMF feature, but also, most of my devices connected fine with PMF set to Required.</p><p>These three devices connected properly with PMF <b>Required</b>:</p><p> iPhone 13 Pro (2022)</p><p> iPhone 11 Pro (2019)</p><p> Lenovo X1 Carbon with Kali Linux (2017)</p><p><br /></p><p>I then tried a very old 2013 Gen 1 iPad Air. Even though the specs claim that this model supports 802.11ac, it was <u>unable</u> to connect to my Guest network when PMF was set to <b>Required</b>.</p><p>I then set PMF to <b>Optional</b>, and the Gen 1 iPad Air was able to connect successfully. So Optional seems like a good choice if you have to support relatively old devices. </p><p>I was very pleased with these results. If a laptop from 2017 works fine with PMF, I'm happy with that, and don't mind if 6+ year old devices cannot connect if I choose to use PMF Required.</p><div>So now that I had learned about Unifi PMF, confirmed that my 2nd Gen Unifi access points do support PMF, and confirmed that most of my devices support PMF Required, I was ready to re-test the deauth attack.</div><div><br /></div><div>With Unifi PMF set to Required, I re-ran the deauth attack, and my devices did NOT disconnect. I tried it multiple times, and I was unable to disconnect my iPhone 13 or iPhone 11.</div><div><br /></div><div>I didn't try running the deauth attack with PMF Optional to see if my 2013 iPad Air would be disconnected. I assumed that it would still be vulnerable to a deauth, since it would not be using PMF, but I didn't bother to confirm that.</div><div><br /></div><div>So to summarize:</div><div><br /></div><div>--It appears that Unifi Protected Management Frames (PMF) does prevent / mitigate deauth attacks</div><div>--My 2nd generation Unifi access points do support PMF</div><div>--My old 2017 laptop worked fine with PMF, as did my newer iPhones </div><div>--Internet speed tests (using iOS SpeedTest app) showed no difference with PMF enabled</div><div><br /></div><div><br /></div><div>There are probably several things I don't know about PMF, such as any downsides, limitations, or subtle performance impacts of the feature. </div><div><br /></div><div>If you have any information that I missed, please post a comment below and let me know.</div><div><br /></div><div><p style="background-color: white; color: #444444; font-family: Arimo; font-size: 15.4px;"><i style="font-family: arimo; font-size: 15.4px;">Steve Endow is a Microsoft MVP in Los Angeles. He works with Dynamics 365 Business Central and related technologies.</i></p><p style="background-color: white; color: #444444; font-family: Arimo; font-size: 15.4px;"><i style="font-family: arimo; font-size: 15.4px;">You can also find him on </i><i style="font-family: arimo; font-size: 15.4px;"><a href="https://www.blogger.com/blog/post/edit/7763553249079245585/5039226310633470520#" style="color: #2288bb; text-decoration-line: none;">Twitter</a> and <a href="https://www.blogger.com/blog/post/edit/7763553249079245585/5039226310633470520#" style="color: #2288bb; text-decoration-line: none;">YouTube</a>,</i><i style="font-family: arimo; font-size: 15.4px;"> or through these links: <a href="https://links.steveendow.com/" style="color: #2288bb; text-decoration-line: none;" target="_blank">links.steveendow.com</a></i></p></div>Steve Endowhttp://www.blogger.com/profile/03950475674093020502noreply@blogger.com0tag:blogger.com,1999:blog-7763553249079245585.post-45666232518171140812022-04-22T08:34:00.006-07:002022-04-22T08:35:24.844-07:00Power Automate Business Central Journal Line Import Error<p>by Steve Endow</p><p>NOTE: I'm encountering this error as of April 22, 2022. If this ends up being a bug in the Power Automate BC connector that is fixed, I'll post an update.</p><p><br /></p><p>A customer is interested in importing General Journals into Dynamics 365 Business Central using Power Automate.</p><p>Simple, right? Just one Power Automate flow, right? <b>How hard could it be, right?</b></p><p>Well, it depends.</p><p>This is the error that I get in my Power Automate environment.</p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHcqomAYRqPdVQtL98Gv8yNvchEeSIDN3nxTYleZNGPQoFUy9DrgjKQPzEjdt2YW8pGnjsFhQRAz5ApYe7NKzJv0bMJPY4lFdXfcLsr_nK4MpKrcemIq80P_nyj3jHBVbHX5q1H4P2UTJ1YM10DvEleFen5sOq_svdnzotuhkSGhZ3EOYVKgNhGFmQEg/s425/Flow1.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="425" data-original-width="369" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHcqomAYRqPdVQtL98Gv8yNvchEeSIDN3nxTYleZNGPQoFUy9DrgjKQPzEjdt2YW8pGnjsFhQRAz5ApYe7NKzJv0bMJPY4lFdXfcLsr_nK4MpKrcemIq80P_nyj3jHBVbHX5q1H4P2UTJ1YM10DvEleFen5sOq_svdnzotuhkSGhZ3EOYVKgNhGFmQEg/w278-h320/Flow1.jpg" width="278" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">You must specify a journal batch ID or a journal ID to get a journal line</td></tr></tbody></table><br />When I ask why it doesn't work, I get responses that seem to indicate that it should work.<br /><p>"It works fine for me"</p><p>"You must be doing it wrong"</p><p>"Did you try doing it this way?"</p><p>But no matter what I try, the flow gives me the same error:</p><p><span style="font-family: courier;">ErrorCode: Application_DialogException You must specify a journal batch ID or a journal ID to get a journal line. </span></p><span><a name='more'></a></span><p><br /></p><p>My flow is VERY simple. It has a single step: Create Record (V3)</p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikK5bTqJGRWl7uF6BYMLZCiDRqMGScZihdhQMPzALyUFI0xuNbWm9eIIl82iU-VBPossMfAD2eJzenDG86bVg-RylF0lVI_Vx2_jn3mpk18hJRd16H2Mvg4-ri0JILOJNXNEW5wpHTYZWFg7dVHti1-LKPr-IgDRRPDmzrszMKNWILhyq1KGkKbIcuOg/s647/Flow3.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="647" data-original-width="559" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikK5bTqJGRWl7uF6BYMLZCiDRqMGScZihdhQMPzALyUFI0xuNbWm9eIIl82iU-VBPossMfAD2eJzenDG86bVg-RylF0lVI_Vx2_jn3mpk18hJRd16H2Mvg4-ri0JILOJNXNEW5wpHTYZWFg7dVHti1-LKPr-IgDRRPDmzrszMKNWILhyq1KGkKbIcuOg/w345-h400/Flow3.jpg" width="345" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Simple, right?</td></tr></tbody></table><br /><p>I am using the Journal ID from an existing General Journal batch in Business Central. I retrieved the GUID using Postman, and am able to insert Journal Lines in Postman using the GUID. But Power Automate is telling me that I "must specify a journal batch ID or journal ID".</p><p><br /></p><p>For context: I am able to successfully insert a General Journal Line using the Business Central Web API using Postman. Here is Postman using the same Journal ID GUID to add a line to the same General Journal batch.</p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3lpKllk96WhXP3Ha5BWP9eFOUE1LvF6FWAl9EtDrO_YmMskCWvllD1nnhKSDJJIXhB3147biqQ03TABnS-jFgxtFAX-Me8_mHhfRrnkI-wX_8qgECd76eo19eybN_KWm4-YGVa-G-S4wz5gecHCvz6MgeTXjiUn_ZzpoB_v2snaVGJYVQzBh8o067Xw/s1011/Flow4.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="822" data-original-width="1011" height="325" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3lpKllk96WhXP3Ha5BWP9eFOUE1LvF6FWAl9EtDrO_YmMskCWvllD1nnhKSDJJIXhB3147biqQ03TABnS-jFgxtFAX-Me8_mHhfRrnkI-wX_8qgECd76eo19eybN_KWm4-YGVa-G-S4wz5gecHCvz6MgeTXjiUn_ZzpoB_v2snaVGJYVQzBh8o067Xw/w400-h325/Flow4.jpg" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Postman can insert a Journal Line successfully</td></tr></tbody></table><br /><p>Aside from <a href="https://www.youtube.com/watch?v=hygmQF1NwE4" target="_blank">the bug in the Journal Line API page</a> related to the Balancing Account, the Journal Line API endpoint does seem to work.</p><p>But when I attempt to use the Power Automate Business Central Create Record (V3) connector, I always get the above error.</p><p>So I had a call with my friend Tanya Henderson. She created a new flow in her Power Automate environment and attempted to insert a Journal Line into her Business Central environment. Completely different environments--no connection to mine.</p><p><b>She received the same error.</b> So how are people getting this flow to work?</p><p>I then had a call with Mary Thompson. She created the same simple flow to import a Journal Line into Business Central. <b>IT WORKED FOR HER</b>.</p><p>She recommended enabling the Experimental Features option in Power Automate, in case that might allow me to access updated Business Central connectors in my Flow. </p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRK5maxoyVbt-Z7qsJ1NEkX1fAMFBVLAKCI5hfyqw89BNmUqr3tXeyyXRyhf1Wg6wwBegL8MjelsV0Tw000DMEsPngm61R0nQwKDtquSPvESsgZV81Ki6pTp_HeG4LCwHzqlm45NGQFgXneUrV8HTbqrV31ikSnUVf47evZ8nQosNUmO52S-AAAgOaug/s433/Flow2.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="433" data-original-width="278" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRK5maxoyVbt-Z7qsJ1NEkX1fAMFBVLAKCI5hfyqw89BNmUqr3tXeyyXRyhf1Wg6wwBegL8MjelsV0Tw000DMEsPngm61R0nQwKDtquSPvESsgZV81Ki6pTp_HeG4LCwHzqlm45NGQFgXneUrV8HTbqrV31ikSnUVf47evZ8nQosNUmO52S-AAAgOaug/s320/Flow2.jpg" width="205" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Enable Experimental Features</td></tr></tbody></table><br /><p>After enabling this setting, I logged out completely, logged back in, and had to create a new flow in order to access the updated Business Central connector. Enabling Experimental Features did change the Business Central connector--the drop downs were completely different.</p><p>But it still did not work for me. The new flow with the new connector gives me the same error.</p><p>So, it appears that there is a bug in the Power Automate Business Central V3 connector when calling the Journal Line Web API. BUT, the connector apparently in some environments, but not in others.</p><p><br /></p><p>If you have any information about the bug or how to work around it, please let me know!</p><p><br /></p><p style="background-color: white; color: #444444; font-family: Arimo; font-size: 15.4px;"><i style="font-family: arimo; font-size: 15.4px;">Steve Endow is a Microsoft MVP in Los Angeles. He works with Dynamics 365 Business Central and related technologies.</i></p><p style="background-color: white; color: #444444; font-family: Arimo; font-size: 15.4px;"><i style="font-family: arimo; font-size: 15.4px;">You can also find him on </i><i style="font-family: arimo; font-size: 15.4px;"><a href="https://www.blogger.com/blog/post/edit/7763553249079245585/5039226310633470520#" style="color: #2288bb; text-decoration-line: none;">Twitter</a> and <a href="https://www.blogger.com/blog/post/edit/7763553249079245585/5039226310633470520#" style="color: #2288bb; text-decoration-line: none;">YouTube</a>,</i><i style="font-family: arimo; font-size: 15.4px;"> or through these links: <a href="https://links.steveendow.com/" style="color: #2288bb; text-decoration-line: none;" target="_blank">links.steveendow.com</a></i></p>Steve Endowhttp://www.blogger.com/profile/03950475674093020502noreply@blogger.com1tag:blogger.com,1999:blog-7763553249079245585.post-31919796565533528452022-04-07T12:04:00.002-07:002022-04-07T14:16:33.849-07:00Resolving Business Central AL Warning AL0603 - Implicit conversion to a value of type Enum<p> by Steve Endow</p><p>While copying a standard Business Central Web API page to a new project to create a customized version of the API page, I encountered this compiler warning:</p><p><br /></p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQlmjAKcp-ux0II6HmwYv9U8VV4YePe3HlaTeXIsyjgaCZilIoADv0HdwiMTFknAukcjC-UDZGhMz3dqMAIIm-g1gGiQOhGuGMc-bkUxxu_1LdezjxO5AbtVazZ6AZRL1R4gLtJvRblgSXWHlz9iQg8rvMfEuXMG5LVcSEM_6EEXapGHpgue_ZeJEuIw/s874/EnumError1.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="439" data-original-width="874" height="201" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQlmjAKcp-ux0II6HmwYv9U8VV4YePe3HlaTeXIsyjgaCZilIoADv0HdwiMTFknAukcjC-UDZGhMz3dqMAIIm-g1gGiQOhGuGMc-bkUxxu_1LdezjxO5AbtVazZ6AZRL1R4gLtJvRblgSXWHlz9iQg8rvMfEuXMG5LVcSEM_6EEXapGHpgue_ZeJEuIw/w400-h201/EnumError1.jpg" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">AL0603 - Implicit Conversion to a value of type Enum</td></tr></tbody></table><br /><div><br /></div><div><div class="hover-row" style="--z-index-notebook-cell-bottom-toolbar-container: 28; --z-index-notebook-cell-drag-handle: 26; --z-index-notebook-cell-editor-outline: 20; --z-index-notebook-cell-output-toolbar: 30; --z-index-notebook-cell-status: 26; --z-index-notebook-cell-toolbar: 36; --z-index-notebook-folding-indicator: 26; --z-index-notebook-input-collapse-condicon: 29; --z-index-notebook-list-insertion-indicator: 10; --z-index-notebook-output: 27; --z-index-notebook-progress-bar: 5; --z-index-notebook-run-button-container: 29; --z-index-notebook-scrollbar: 25; background-color: #f3f3f3; color: #616161; font-family: "Segoe WPC", "Segoe UI", sans-serif; font-size: 14px;"><div class="marker hover-contents" style="--z-index-notebook-cell-bottom-toolbar-container: 28; --z-index-notebook-cell-drag-handle: 26; --z-index-notebook-cell-editor-outline: 20; --z-index-notebook-cell-output-toolbar: 30; --z-index-notebook-cell-status: 26; --z-index-notebook-cell-toolbar: 36; --z-index-notebook-folding-indicator: 26; --z-index-notebook-input-collapse-condicon: 29; --z-index-notebook-list-insertion-indicator: 10; --z-index-notebook-output: 27; --z-index-notebook-progress-bar: 5; --z-index-notebook-run-button-container: 29; --z-index-notebook-scrollbar: 25; font-family: Consolas, "Courier New", monospace; font-feature-settings: "liga" 0, "calt" 0; letter-spacing: 0px; line-height: 19px; padding: 4px 8px;"><span style="--z-index-notebook-cell-bottom-toolbar-container: 28; --z-index-notebook-cell-drag-handle: 26; --z-index-notebook-cell-editor-outline: 20; --z-index-notebook-cell-output-toolbar: 30; --z-index-notebook-cell-status: 26; --z-index-notebook-cell-toolbar: 36; --z-index-notebook-folding-indicator: 26; --z-index-notebook-input-collapse-condicon: 29; --z-index-notebook-list-insertion-indicator: 10; --z-index-notebook-output: 27; --z-index-notebook-progress-bar: 5; --z-index-notebook-run-button-container: 29; --z-index-notebook-scrollbar: 25; white-space: pre-wrap;">An implicit conversion is being performed from a value of type 'Integer' to a value of type 'Enum "Attachment Entity Buffer Document Type"'. This conversion can lead to unexpected runtime issues. This warning will become an error in a future release.</span><span style="--z-index-notebook-cell-bottom-toolbar-container: 28; --z-index-notebook-cell-drag-handle: 26; --z-index-notebook-cell-editor-outline: 20; --z-index-notebook-cell-output-toolbar: 30; --z-index-notebook-cell-status: 26; --z-index-notebook-cell-toolbar: 36; --z-index-notebook-folding-indicator: 26; --z-index-notebook-input-collapse-condicon: 29; --z-index-notebook-list-insertion-indicator: 10; --z-index-notebook-output: 27; --z-index-notebook-progress-bar: 5; --z-index-notebook-run-button-container: 29; --z-index-notebook-scrollbar: 25; opacity: 0.6; padding-left: 6px;"><span style="--z-index-notebook-cell-bottom-toolbar-container: 28; --z-index-notebook-cell-drag-handle: 26; --z-index-notebook-cell-editor-outline: 20; --z-index-notebook-cell-output-toolbar: 30; --z-index-notebook-cell-status: 26; --z-index-notebook-cell-toolbar: 36; --z-index-notebook-folding-indicator: 26; --z-index-notebook-input-collapse-condicon: 29; --z-index-notebook-list-insertion-indicator: 10; --z-index-notebook-output: 27; --z-index-notebook-progress-bar: 5; --z-index-notebook-run-button-container: 29; --z-index-notebook-scrollbar: 25;">AL </span><a class="code-link" href="https://docs.microsoft.com/en-us/dynamics365/business-central/dev-itpro/developer/diagnostics/diagnostic-al603" style="--z-index-notebook-cell-bottom-toolbar-container: 28; --z-index-notebook-cell-drag-handle: 26; --z-index-notebook-cell-editor-outline: 20; --z-index-notebook-cell-output-toolbar: 30; --z-index-notebook-cell-status: 26; --z-index-notebook-cell-toolbar: 36; --z-index-notebook-folding-indicator: 26; --z-index-notebook-input-collapse-condicon: 29; --z-index-notebook-list-insertion-indicator: 10; --z-index-notebook-output: 27; --z-index-notebook-progress-bar: 5; --z-index-notebook-run-button-container: 29; --z-index-notebook-scrollbar: 25; text-decoration-line: none;"><span style="--z-index-notebook-cell-bottom-toolbar-container: 28; --z-index-notebook-cell-drag-handle: 26; --z-index-notebook-cell-editor-outline: 20; --z-index-notebook-cell-output-toolbar: 30; --z-index-notebook-cell-status: 26; --z-index-notebook-cell-toolbar: 36; --z-index-notebook-folding-indicator: 26; --z-index-notebook-input-collapse-condicon: 29; --z-index-notebook-list-insertion-indicator: 10; --z-index-notebook-output: 27; --z-index-notebook-progress-bar: 5; --z-index-notebook-run-button-container: 29; --z-index-notebook-scrollbar: 25; border-bottom: 1px solid transparent; color: #006ab1; text-decoration-line: underline; text-underline-position: under;">AL0603</span></a></span></div></div><div class="hover-row markdown-hover" style="--z-index-notebook-cell-bottom-toolbar-container: 28; --z-index-notebook-cell-drag-handle: 26; --z-index-notebook-cell-editor-outline: 20; --z-index-notebook-cell-output-toolbar: 30; --z-index-notebook-cell-status: 26; --z-index-notebook-cell-toolbar: 36; --z-index-notebook-folding-indicator: 26; --z-index-notebook-input-collapse-condicon: 29; --z-index-notebook-list-insertion-indicator: 10; --z-index-notebook-output: 27; --z-index-notebook-progress-bar: 5; --z-index-notebook-run-button-container: 29; --z-index-notebook-scrollbar: 25; background-color: #f3f3f3; border-top: 1px solid rgba(200, 200, 200, 0.5); color: #616161; font-family: "Segoe WPC", "Segoe UI", sans-serif; font-size: 14px;"><div class="hover-contents code-hover-contents" style="--z-index-notebook-cell-bottom-toolbar-container: 28; --z-index-notebook-cell-drag-handle: 26; --z-index-notebook-cell-editor-outline: 20; --z-index-notebook-cell-output-toolbar: 30; --z-index-notebook-cell-status: 26; --z-index-notebook-cell-toolbar: 36; --z-index-notebook-folding-indicator: 26; --z-index-notebook-input-collapse-condicon: 29; --z-index-notebook-list-insertion-indicator: 10; --z-index-notebook-output: 27; --z-index-notebook-progress-bar: 5; --z-index-notebook-run-button-container: 29; --z-index-notebook-scrollbar: 25; padding: 4px 8px;"><div style="--z-index-notebook-cell-bottom-toolbar-container: 28; --z-index-notebook-cell-drag-handle: 26; --z-index-notebook-cell-editor-outline: 20; --z-index-notebook-cell-output-toolbar: 30; --z-index-notebook-cell-status: 26; --z-index-notebook-cell-toolbar: 36; --z-index-notebook-folding-indicator: 26; --z-index-notebook-input-collapse-condicon: 29; --z-index-notebook-list-insertion-indicator: 10; --z-index-notebook-output: 27; --z-index-notebook-progress-bar: 5; --z-index-notebook-run-button-container: 29; --z-index-notebook-scrollbar: 25;"><div data-code="id#41" style="--z-index-notebook-cell-bottom-toolbar-container: 28; --z-index-notebook-cell-drag-handle: 26; --z-index-notebook-cell-editor-outline: 20; --z-index-notebook-cell-output-toolbar: 30; --z-index-notebook-cell-status: 26; --z-index-notebook-cell-toolbar: 36; --z-index-notebook-folding-indicator: 26; --z-index-notebook-input-collapse-condicon: 29; --z-index-notebook-list-insertion-indicator: 10; --z-index-notebook-output: 27; --z-index-notebook-progress-bar: 5; --z-index-notebook-run-button-container: 29; --z-index-notebook-scrollbar: 25;"><span style="--z-index-notebook-cell-bottom-toolbar-container: 28; --z-index-notebook-cell-drag-handle: 26; --z-index-notebook-cell-editor-outline: 20; --z-index-notebook-cell-output-toolbar: 30; --z-index-notebook-cell-status: 26; --z-index-notebook-cell-toolbar: 36; --z-index-notebook-folding-indicator: 26; --z-index-notebook-input-collapse-condicon: 29; --z-index-notebook-list-insertion-indicator: 10; --z-index-notebook-output: 27; --z-index-notebook-progress-bar: 5; --z-index-notebook-run-button-container: 29; --z-index-notebook-scrollbar: 25; font-family: Consolas, "Courier New", monospace;"><div class="monaco-tokenized-source" style="--z-index-notebook-cell-bottom-toolbar-container: 28; --z-index-notebook-cell-drag-handle: 26; --z-index-notebook-cell-editor-outline: 20; --z-index-notebook-cell-output-toolbar: 30; --z-index-notebook-cell-status: 26; --z-index-notebook-cell-toolbar: 36; --z-index-notebook-folding-indicator: 26; --z-index-notebook-input-collapse-condicon: 29; --z-index-notebook-list-insertion-indicator: 10; --z-index-notebook-output: 27; --z-index-notebook-progress-bar: 5; --z-index-notebook-run-button-container: 29; --z-index-notebook-scrollbar: 25; white-space: pre-wrap;"><span class="mtk5" style="--z-index-notebook-cell-bottom-toolbar-container: 28; --z-index-notebook-cell-drag-handle: 26; --z-index-notebook-cell-editor-outline: 20; --z-index-notebook-cell-output-toolbar: 30; --z-index-notebook-cell-status: 26; --z-index-notebook-cell-toolbar: 36; --z-index-notebook-folding-indicator: 26; --z-index-notebook-input-collapse-condicon: 29; --z-index-notebook-list-insertion-indicator: 10; --z-index-notebook-output: 27; --z-index-notebook-progress-bar: 5; --z-index-notebook-run-button-container: 29; --z-index-notebook-scrollbar: 25; color: blue;">(field) </span><span class="mtk1" style="--z-index-notebook-cell-bottom-toolbar-container: 28; --z-index-notebook-cell-drag-handle: 26; --z-index-notebook-cell-editor-outline: 20; --z-index-notebook-cell-output-toolbar: 30; --z-index-notebook-cell-status: 26; --z-index-notebook-cell-toolbar: 36; --z-index-notebook-folding-indicator: 26; --z-index-notebook-input-collapse-condicon: 29; --z-index-notebook-list-insertion-indicator: 10; --z-index-notebook-output: 27; --z-index-notebook-progress-bar: 5; --z-index-notebook-run-button-container: 29; --z-index-notebook-scrollbar: 25; color: black;">"Document Type": </span><span class="mtk5" style="--z-index-notebook-cell-bottom-toolbar-container: 28; --z-index-notebook-cell-drag-handle: 26; --z-index-notebook-cell-editor-outline: 20; --z-index-notebook-cell-output-toolbar: 30; --z-index-notebook-cell-status: 26; --z-index-notebook-cell-toolbar: 36; --z-index-notebook-folding-indicator: 26; --z-index-notebook-input-collapse-condicon: 29; --z-index-notebook-list-insertion-indicator: 10; --z-index-notebook-output: 27; --z-index-notebook-progress-bar: 5; --z-index-notebook-run-button-container: 29; --z-index-notebook-scrollbar: 25; color: blue;">Enum</span><span class="mtk1" style="--z-index-notebook-cell-bottom-toolbar-container: 28; --z-index-notebook-cell-drag-handle: 26; --z-index-notebook-cell-editor-outline: 20; --z-index-notebook-cell-output-toolbar: 30; --z-index-notebook-cell-status: 26; --z-index-notebook-cell-toolbar: 36; --z-index-notebook-folding-indicator: 26; --z-index-notebook-input-collapse-condicon: 29; --z-index-notebook-list-insertion-indicator: 10; --z-index-notebook-output: 27; --z-index-notebook-progress-bar: 5; --z-index-notebook-run-button-container: 29; --z-index-notebook-scrollbar: 25; color: black;"> "Attachment Entity Buffer Document Type"</span></div></span></div></div></div></div></div><div><br /></div><div><br /></div><div>I am vaguely familiar with this error, and I think I resolved it months ago in a different Business Central project, but I completely forgot how I figured it out and how I resolved it. So I'm writing this post to remind me when I forget again in 6 months.</div><div><br /><span><a name='more'></a></span></div><div><br /></div><div>I get the concept: Business Central now supports Enums, so instead of referencing values as integers, you can reference them as Enum values. Very simple in concept.</div><div><br /></div><div>But if you look at the line of code with the warning, the value "Document Type" has the squiggly underline. Since I am a complete newbie to AL, that squiggly line threw me off. I looked at the "Document Type" value and thought I needed to replace it with something else. Wrong.</div><div><br /></div><div>If I would have read the warning message very, very, very carefully, I may have better understood the nature of the warning:</div><div><br /></div><div>An implicit conversion is being performed from a value of type 'Integer' to a value of type 'Enum...'</div><div><br /></div><div><b>FROM type Integer, TO type Enum</b></div><div><br /></div><div>The value "Document Type" is presumably NOT an integer. But const(1) does look like an integer.<br /></div><div><br /></div><div>Thanks to <a href="https://twitter.com/JeremyVyska/status/1512124560451198985?s=20&t=UgxlUxTNH0s5c11xHOzjzg" target="_blank">Jeremy Vyska for explaining the very simple fix to me</a>. I needed to replace the <b>integer </b>value of <b>1</b> with the corresponding <b>Enum </b>value.</div><div><br /></div><div>But what exactly do I replace it with? How to I find the proper Enum value? </div><div><br /></div><div><b><u>Option 1</u></b></div><div><br /></div><div>Fortunately my years of experience with Visual Studio and .NET development had some benefit, as I knew that I could click on a value and press F12 to "Go to definition" and drill into the value (you can also right click and select Go to definition).</div><div><br /></div><div>So I clicked on "Document Type" to place the cursor on it, then pressed F12 to drill into the definition of the "Document Type" field.</div><div><br /></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhn_-Lot3fC-MupAx3-KZt9gC8ZxN-nrUqyqU-AFqffvE_heL2OiBD833qLNiuDEYvhMSVWIonMdZqIGxfJb7Areyyzpp_AiVnEQrhJXPpvdLZU2vE8aGkwrzH6nbXX77xKVYRx3btvGr9KuRavoqkngHwWwIu1FgET_pj_MlwSx26kGfBeuyf5LLd6Lg/s782/EnumError2.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="457" data-original-width="782" height="234" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhn_-Lot3fC-MupAx3-KZt9gC8ZxN-nrUqyqU-AFqffvE_heL2OiBD833qLNiuDEYvhMSVWIonMdZqIGxfJb7Areyyzpp_AiVnEQrhJXPpvdLZU2vE8aGkwrzH6nbXX77xKVYRx3btvGr9KuRavoqkngHwWwIu1FgET_pj_MlwSx26kGfBeuyf5LLd6Lg/w400-h234/EnumError2.jpg" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">F12 - Go To Definition of field name</td></tr></tbody></table><br /><div><br /></div><div>That opens "Attachment Entity Buffer.dal" in a new tab.</div><div><br /></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbM7H2YEqYR5zM8ipDp3pi79Gd34gtBgLUgDt323pP9bYVpIiY3M37fmCgHJ6lkUmfGXKupPhP7TP7kyqKi6c1Std4aH3iShgq8YOa5I5_i3cfGqBZm4Rh9X6MAzcqRZhQyD6qHby6x2bmrwPiiKzXQrDn865K1Rsazh2MrCAP7amXsYHsax_HPATMHw/s636/EnumError3.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="304" data-original-width="636" height="191" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbM7H2YEqYR5zM8ipDp3pi79Gd34gtBgLUgDt323pP9bYVpIiY3M37fmCgHJ6lkUmfGXKupPhP7TP7kyqKi6c1Std4aH3iShgq8YOa5I5_i3cfGqBZm4Rh9X6MAzcqRZhQyD6qHby6x2bmrwPiiKzXQrDn865K1Rsazh2MrCAP7amXsYHsax_HPATMHw/w400-h191/EnumError3.jpg" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Enum "Attachment Entity Buffer Document Type"</td></tr></tbody></table><br /><div>My interpretation of this page is that it shows a field called "Document Type", defined with an Enum data type. It is that Enum data type that we need to investigate further.</div><div><br /></div><div>So, click inside the Enum name and press F12 again.</div><div><br /></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKbUI-PacW8efB92QpVbSct2ySrQM-_KLNS40-UcLo4QKS2-2jMF9Pbi-u4pVqtFSTUDWWFuVz85SJZpRaD7XhFtW9xYAy7j2IQygn3T2xTvCfSCYW66LPfuX4F9B9YJ_ftHUOUAtwQ5GefSZmrUdP2qXCPD-ykmtqRvFmD4pKtMeoyvdqpIiJDHpJYA/s830/EnumError4.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="262" data-original-width="830" height="126" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKbUI-PacW8efB92QpVbSct2ySrQM-_KLNS40-UcLo4QKS2-2jMF9Pbi-u4pVqtFSTUDWWFuVz85SJZpRaD7XhFtW9xYAy7j2IQygn3T2xTvCfSCYW66LPfuX4F9B9YJ_ftHUOUAtwQ5GefSZmrUdP2qXCPD-ykmtqRvFmD4pKtMeoyvdqpIiJDHpJYA/w400-h126/EnumError4.jpg" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">F12 into Enum definition</td></tr></tbody></table><br /><div>Now we're talkin!</div><div><br /></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYyu0_YAsojoHxjibdGZsXrBSyqK805tiXSS5amlMURLpk7WYBIo84FwWNgb7flTRDOR2cUmXJjHDllaNjkgxO_9gi90EIS9WnNKeQs_mvUx6EZIyFb9yuP6b5tSv67V5ImX1MB8UZiaVILddMrUnsNRLy5VoDvMBLg0KLqe9C7Cm2i925Pv4wAm8RfA/s648/EnumError5.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="309" data-original-width="648" height="191" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYyu0_YAsojoHxjibdGZsXrBSyqK805tiXSS5amlMURLpk7WYBIo84FwWNgb7flTRDOR2cUmXJjHDllaNjkgxO_9gi90EIS9WnNKeQs_mvUx6EZIyFb9yuP6b5tSv67V5ImX1MB8UZiaVILddMrUnsNRLy5VoDvMBLg0KLqe9C7Cm2i925Pv4wAm8RfA/w400-h191/EnumError5.jpg" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">The Enum Data Type Definition for Attachment Entity Buffer Document Type</td></tr></tbody></table><br /><div><br /></div><div>Here, we finally see t<span style="text-align: center;">he Enum Data Type Definition for Attachment Entity Buffer Document Type. And we can now see that a value of 1 equates to the enum value "Journal".</span></div><div><span style="text-align: center;"><br /></span></div><div><span style="text-align: center;"><br /></span></div><div><span style="text-align: center;"><b><u>Option 2</u></b></span></div><div><span style="text-align: center;"><br /></span></div><div><span style="text-align: center;"><a href="https://twitter.com/drimmelzwaan/status/1512172054371467275?s=20&t=UgxlUxTNH0s5c11xHOzjzg" target="_blank">Daniel Rimmelzwaan suggested an alternative method</a> of viewing Enum values that is simpler and quicker.</span></div><div><span style="text-align: center;"><br /></span></div><div><span style="text-align: center;">Find or create a "Trigger" section on the page, then use intellisense to navigate to the Enum data type and view the enum values.</span></div><div><span style="text-align: center;"><br /></span></div><div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNcw9MMew_P6AVCBrAZB-hiLpxqA-FZ_IJghgZ4y3GZDhplmIVeyHLn44WrGFRzv-hykzFJmat75bBcT8brdvZWtU9JvY0u3W3ILSnm1qLdOKkGNS7GqvdeRFIxGD0Pm0q_rUGsF0VaHtR9y4Ixgw1qegrrrz6d1EmQqevnlLB_uW6_hVL5ECuRnKd7w/s872/EnumError8.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="211" data-original-width="872" height="96" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNcw9MMew_P6AVCBrAZB-hiLpxqA-FZ_IJghgZ4y3GZDhplmIVeyHLn44WrGFRzv-hykzFJmat75bBcT8brdvZWtU9JvY0u3W3ILSnm1qLdOKkGNS7GqvdeRFIxGD0Pm0q_rUGsF0VaHtR9y4Ixgw1qegrrrz6d1EmQqevnlLB_uW6_hVL5ECuRnKd7w/w400-h96/EnumError8.jpg" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">In a trigger, type Enum:: to trigger intellisense</td></tr></tbody></table><br /><span style="text-align: center;"><br /></span></div><div><br /></div><div><span style="text-align: center;">Now that we have found the Enum values, let's get back to Jeremy's instructions: Replace the const int value of 1 with the value of <b>Journal</b>.</span></div><div><span style="text-align: center;"><br /></span></div><div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtcT-r68FaFUQhe-j7Xvoz2wqj2FvZtSxbcE7cWNfPO-N3Xk1NQpjOnWTXfgsZz1_vtW4P0JqpsaqN8uB4GmzA2u38qkjeS-i6q9PAyPo0Nu0Ga5pXtPFIs08XemyNsgsgbalRMxJGkWSKhOlzST4MG64Lpxpnug0F7YcmeTbmQfcwO8O0SdLKNXPTiQ/s741/EnumError6.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="186" data-original-width="741" height="100" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtcT-r68FaFUQhe-j7Xvoz2wqj2FvZtSxbcE7cWNfPO-N3Xk1NQpjOnWTXfgsZz1_vtW4P0JqpsaqN8uB4GmzA2u38qkjeS-i6q9PAyPo0Nu0Ga5pXtPFIs08XemyNsgsgbalRMxJGkWSKhOlzST4MG64Lpxpnug0F7YcmeTbmQfcwO8O0SdLKNXPTiQ/w400-h100/EnumError6.jpg" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Replace integer value of 1 with enum value name</td></tr></tbody></table><br /><span style="text-align: center;"><br /></span></div><div>Notice that after deleting the number 1, as soon as you type "J", the intellisense displays a list of values.</div><div><br /></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiAkO7FyBoB-ZT-jV3LTG_4UbGAqH7-bnn35My_NddPiThRIupLUC8fnYt9Wps8Cs5UtGCeibIWxwB1yE8XaR0MTKsbQUxFmar1nu-KB2cvbb6OkTTKxYbIMMpQyNj76NBoG5dkMo0c3o5CY5oG8vngRrQ5ZkuEaWDQhK3kgO5W4OtgOhXbXZTOPmRL4g/s765/EnumError7.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="458" data-original-width="765" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiAkO7FyBoB-ZT-jV3LTG_4UbGAqH7-bnn35My_NddPiThRIupLUC8fnYt9Wps8Cs5UtGCeibIWxwB1yE8XaR0MTKsbQUxFmar1nu-KB2cvbb6OkTTKxYbIMMpQyNj76NBoG5dkMo0c3o5CY5oG8vngRrQ5ZkuEaWDQhK3kgO5W4OtgOhXbXZTOPmRL4g/w400-h240/EnumError7.jpg" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">With Enum values in place, the AL0603 warning goes away</td></tr></tbody></table><br /><div>No more AL0603 warning!</div><div><br /></div><div>Notice that const(Journal) can be used, without quotes around Journal, but Journal Line, below, needs quotation marks because of the space in the name. You can put quotes around Journal as well, but it is not required.</div><div><br /></div><div>I suspected the solution was simple, and it is, but I just didn't know how to properly fix the warning.</div><div><br /></div><div>Hope that was helpful!</div><div><br /></div><div><br /></div><div><p style="background-color: white; color: #444444; font-family: Arimo; font-size: 15.4px;"><i style="font-family: arimo; font-size: 15.4px;">Steve Endow is a Microsoft MVP in Los Angeles. He works with Dynamics 365 Business Central and related technologies.</i></p><p style="background-color: white; color: #444444; font-family: Arimo; font-size: 15.4px;"><i style="font-family: arimo; font-size: 15.4px;">You can also find him on </i><i style="font-family: arimo; font-size: 15.4px;"><a href="https://www.blogger.com/blog/post/edit/7763553249079245585/5039226310633470520#" style="color: #2288bb; text-decoration-line: none;">Twitter</a> and <a href="https://www.blogger.com/blog/post/edit/7763553249079245585/5039226310633470520#" style="color: #2288bb; text-decoration-line: none;">YouTube</a>,</i><i style="font-family: arimo; font-size: 15.4px;"> or through these links: <a href="https://links.steveendow.com/" style="color: #2288bb; text-decoration-line: none;" target="_blank">links.steveendow.com</a></i></p></div><div><br /></div><div><br /></div>Steve Endowhttp://www.blogger.com/profile/03950475674093020502noreply@blogger.com0tag:blogger.com,1999:blog-7763553249079245585.post-89889122170172762522022-03-25T11:42:00.002-07:002022-03-25T11:57:07.699-07:00Getting Access to The Top Secret Business Central Insider Program<p>by Steve Endow</p><p>If you are a Dynamics 365 Business Central developer or ISV, you should definitely get access to the Business Central Insider program.</p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhIKKet6m58GoTGEqPkKFLgrDqzgmozOELBgPymxdzDig9HdZJJbdlfE55uCbxdhit6zwwRv-XNrjwIUq1PdswWMuof1VWHh1hsw95Rea-AsBc8ai4PxQdUz2HmoVvFeYM4o8B5MMnfAvqbCAsz5zxk6CciNr9pgi2BeGUzycBvHP8sWUhHLWIghb_jPA/s960/Insider1.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="404" data-original-width="960" height="169" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhIKKet6m58GoTGEqPkKFLgrDqzgmozOELBgPymxdzDig9HdZJJbdlfE55uCbxdhit6zwwRv-XNrjwIUq1PdswWMuof1VWHh1hsw95Rea-AsBc8ai4PxQdUz2HmoVvFeYM4o8B5MMnfAvqbCAsz5zxk6CciNr9pgi2BeGUzycBvHP8sWUhHLWIghb_jPA/w400-h169/Insider1.jpg" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Business Central Insider Program</td></tr></tbody></table><br /><p>I don't know why the BC Insider program is so cumbersome to join, but I'm guessing it involves lots of lawyers. Which is unfortunate, since I think BC Insider is an essential program for any BC developer.</p><p>I thought I had a link to the BC Insider program on my <a href="https://bit.ly/bcresources" target="_blank">BC Resources</a> page, but apparently not, as it seems to require several steps, and is not available through a single URL, unfortunately.</p><p>I did a few DuckDuckGo searches, but came up with nothing. I then did several Google searches, but still couldn't find any Microsoft pages explaining how to join the BC Insider program.</p><p>After several searches, I finally found Daniel Rimmelzwaan's excellent blog post from February 9, 2022:</p><p><a href="http://thedenster.com/insider-builds-on-collaborate">http://thedenster.com/insider-builds-on-collaborate</a></p><p><br /></p><p>Thankfully, he documented the process for signing up for Business Central Insider after going through the same puzzling search for one of his clients. </p><span><a name='more'></a></span><p><br /></p><p>Start with Daniel's blog post and walk through each step, and then go to Microsoft Partner Center -> Engagements -> Join to try and join the "Ready! for Dynamics 365 Business Central" program.</p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrUqQBW9bTqLOD8dpCwtjJkkeBsWjBMrHU4svcIpuegxQehnY46Ni4caW9Lme8R0g5Q__49RARhn3xp6CckPk9JJmE8RE59qz0EqYzXqzqTFpgmJDvrPWRbR4-EW1OKsa28GYMsQ68urMBjSk967iS5pvbC5LyIOlcBvi-dUruC_reF2adJzq5wZDJxA/s722/Insider2.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="382" data-original-width="722" height="211" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrUqQBW9bTqLOD8dpCwtjJkkeBsWjBMrHU4svcIpuegxQehnY46Ni4caW9Lme8R0g5Q__49RARhn3xp6CckPk9JJmE8RE59qz0EqYzXqzqTFpgmJDvrPWRbR4-EW1OKsa28GYMsQ68urMBjSk967iS5pvbC5LyIOlcBvi-dUruC_reF2adJzq5wZDJxA/w400-h211/Insider2.jpg" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Partner Center -> Collaborate -> Engagements -> Join</td></tr></tbody></table><br /><p>If you don't see the "Ready! for Dynamics 365 Business Central" engagement option or can't join it, then email <b><span style="color: #2b00fe;">Dyn365BEP@microsoft.com </span></b>to request access.</p><p><br /></p><p>If you review the sign up process and look at all of the pages and names used in the "program", it's quite confusing. </p><p>Here is a list of the names and terms in the hopes that search engines will improve the indexing of this article:</p><p>Microsoft Partner Center</p><p>Microsoft Collaborate</p><p>Microsoft Collaborate Engagements</p><p>Ready! for Dynamics 365 Business Central </p><p>Working with Business Central Insider Builds</p><p><br /></p><p>Once you get access to the "Engagement", you will then need to click on Packages, the click on Working with Business Central Insider Builds.</p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIuk9YqN3hFqhumDwcq5J_29NjxtT_7X-6jw__Qmq81YxziUqLXEf7gRJ8ZWjDw5Lur88l0tFyjbsNlBtNcpmdAWNwqAgh7o8TsyFNr-UQHNmNYn3wEXz3nVw37S-tNerGieOG1gaTNRyH2wDss5w6drRfYVHbUp6sfMuXQ6Lh0jssEb1-BH0eQteoKA/s980/Insider3.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="362" data-original-width="980" height="148" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIuk9YqN3hFqhumDwcq5J_29NjxtT_7X-6jw__Qmq81YxziUqLXEf7gRJ8ZWjDw5Lur88l0tFyjbsNlBtNcpmdAWNwqAgh7o8TsyFNr-UQHNmNYn3wEXz3nVw37S-tNerGieOG1gaTNRyH2wDss5w6drRfYVHbUp6sfMuXQ6Lh0jssEb1-BH0eQteoKA/w400-h148/Insider3.jpg" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Business Central Insider Package</td></tr></tbody></table><br /><p>If you click on that link, you will be taken to a Package page for Working with Business Central Insider Builds.</p><p>You should see a "Files in this Package" section, with a small link to Download File.</p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi358WO6OypcjOmx1lNf70B9YRrc8IbE9PXZjhGORQH9HEWEWpprubD3du8hL1chlFDIJd4GT3ar_qrHEJ5Pjjnp8Qh9G6ryBAPp74JAH7-3MknrPF005HhAZvJ8MXfySk9jJee3so6T5YvDF37XycesRGgtZ54Z7DcEEfuOvtUg8zpe3tLV0pq5ENoqQ/s730/Insider4.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="191" data-original-width="730" height="105" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi358WO6OypcjOmx1lNf70B9YRrc8IbE9PXZjhGORQH9HEWEWpprubD3du8hL1chlFDIJd4GT3ar_qrHEJ5Pjjnp8Qh9G6ryBAPp74JAH7-3MknrPF005HhAZvJ8MXfySk9jJee3so6T5YvDF37XycesRGgtZ54Z7DcEEfuOvtUg8zpe3tLV0pq5ENoqQ/w400-h105/Insider4.jpg" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Package Page -> Download File</td></tr></tbody></table><br />Save the Working_with_Business_Central_Insider_Builds.txt text file:<div><br /><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhw2YUj_h_JVjfN8X6SQsy51v6zoCuFSekTmM7yGJmZkydljf2T_UCTLEG88uLTew7ZH8jZUPPYRE89Nh1KZbWJsBLUOePX0PvBn0EovZYPuycR_ny4yrNSnJkPFgPgOptsCJT1Mv19Vd6BRmTZT4wMIxl0b7jHeSHBo1JRqLbqbiATgAkp2MsmZnySeA/s470/Insider5.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="90" data-original-width="470" height="76" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhw2YUj_h_JVjfN8X6SQsy51v6zoCuFSekTmM7yGJmZkydljf2T_UCTLEG88uLTew7ZH8jZUPPYRE89Nh1KZbWJsBLUOePX0PvBn0EovZYPuycR_ny4yrNSnJkPFgPgOptsCJT1Mv19Vd6BRmTZT4wMIxl0b7jHeSHBo1JRqLbqbiATgAkp2MsmZnySeA/w400-h76/Insider5.jpg" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Download Text File</td></tr></tbody></table><br /><p>That text file will contain the $sasToken value that you can use in Power Shell scripts and DevOps pipelines to download Business Central Insider Docker images for development, testing, and validation.</p><p>This $sasToken value will also be used when calling the <b>Run-AlValidation</b> script, which you should use when testing Business Central apps or extensions, and should be part of your Business Central DevOps pipelines.</p><p>Hopefully this helps shed some light on the Business Central Insider program and adds another entry that someone can find in the search engine results.</p><p><br /></p><p style="background-color: white; color: #444444; font-family: Arimo; font-size: 15.4px;"><i style="font-family: arimo; font-size: 15.4px;">Steve Endow is a Microsoft MVP in Los Angeles. He works with Dynamics 365 Business Central and related technologies.</i></p><p style="background-color: white; color: #444444; font-family: Arimo; font-size: 15.4px;"><i style="font-family: arimo; font-size: 15.4px;">You can also find him on </i><i style="font-family: arimo; font-size: 15.4px;"><a href="https://www.blogger.com/blog/post/edit/7763553249079245585/5039226310633470520#" style="color: #2288bb; text-decoration-line: none;">Twitter</a> and <a href="https://www.blogger.com/blog/post/edit/7763553249079245585/5039226310633470520#" style="color: #2288bb; text-decoration-line: none;">YouTube</a>,</i><i style="font-family: arimo; font-size: 15.4px;"> or through these links: <a href="https://links.steveendow.com" target="_blank">links.steveendow.com</a></i></p><p style="background-color: white; color: #444444; font-family: Arimo; font-size: 15.4px;"><br /></p></div>Steve Endowhttp://www.blogger.com/profile/03950475674093020502noreply@blogger.com0tag:blogger.com,1999:blog-7763553249079245585.post-45804059904856602972022-03-04T16:25:00.002-08:002022-03-04T16:48:50.920-08:00Business Central Web API Error When Using $expand<p> By Steve Endow</p><p>I recently responded to a Business Central Community Forum post here:</p><p><a href="https://community.dynamics.com/business/f/dynamics-365-business-central-forum/448915/api-query-with-odata-date-filter-with-encoding" target="_blank">https://community.dynamics.com/business/f/dynamics-365-business-central-forum/448915/api-query-with-odata-date-filter-with-encoding</a></p><p>While researching that question, I learned something from that forum post: <span style="color: #2b00fe; font-family: courier;">$expand=*</span></p><p>Huh, I didn't know that was possible!</p><p>If you aren't familiar with the <span style="font-family: courier;">$expand</span> OData query option, check out my blog post on the topic:</p><p><a href="https://blog.steveendow.com/2021/09/using-metadata-and-expand-with-business.html">https://blog.steveendow.com/2021/09/using-metadata-and-expand-with-business.html</a></p><p>So it seems that you can use a wildcard with <span style="font-family: courier;">$expand</span> to automatically expand all Navigation Properties available in a Business Central Web API endpoint. Very interesting!</p><p>I personally don't think I would ever recommend using such a query option in a real world API integration, but I was intrigued by the possibility!</p><p>So I fired up Postman and did some testing with my new found query option.</p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEjGlBwJyw_fVu3ND_Yp9Ag3sx7MPLj1TxONmCag2qja78IJY3NDzfhNCsWSFG8QDUKiFOwRgPylhQDxbpWuxQ23rVT9wMz9ufujfa4fdgJvwbxGqwExc501MQh-s1om6z8eQY_XDKpNaUQ66EoFJaOic_GjkItVSZHR2Wng_fX-snwJHWFNeF0nHYGJqQ=s680" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="217" data-original-width="680" height="128" src="https://blogger.googleusercontent.com/img/a/AVvXsEjGlBwJyw_fVu3ND_Yp9Ag3sx7MPLj1TxONmCag2qja78IJY3NDzfhNCsWSFG8QDUKiFOwRgPylhQDxbpWuxQ23rVT9wMz9ufujfa4fdgJvwbxGqwExc501MQh-s1om6z8eQY_XDKpNaUQ66EoFJaOic_GjkItVSZHR2Wng_fX-snwJHWFNeF0nHYGJqQ=w400-h128" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Query Option $expand=*</td></tr></tbody></table><br /><span><a name='more'></a></span>To my surprise I was greeted by this error:<div><br /></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEhCf7fa2N8-f1COl1Y6YLq_dqW0-e8VeyHVyglBq3F7LfwLBSsPmtvvmlGExAlEGaChQdnaUpCWFMznGcjatu4AGAnO1z6XBQXUpE3FgXDWdx_Yee9et4GUMteGrJ45rzv2X9VMfcgtdKR9gU5GXSJ9hDJ3n70eMlb46veHqC7sB3wSm6sVy5zsZmLHHQ=s817" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="260" data-original-width="817" height="127" src="https://blogger.googleusercontent.com/img/a/AVvXsEhCf7fa2N8-f1COl1Y6YLq_dqW0-e8VeyHVyglBq3F7LfwLBSsPmtvvmlGExAlEGaChQdnaUpCWFMznGcjatu4AGAnO1z6XBQXUpE3FgXDWdx_Yee9et4GUMteGrJ45rzv2X9VMfcgtdKR9gU5GXSJ9hDJ3n70eMlb46veHqC7sB3wSm6sVy5zsZmLHHQ=w400-h127" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Error: Application_FilterErrorException Message</td></tr></tbody></table><br /><div><br /></div><div><span style="font-family: courier;">"The filter \"US\" is not valid for the System ID field on the Country/Region table. Invalid format of GUID string. The correct format of the GUID string is: CDEF7890-ABCD-0123-1234-567890ABCDEF where 0-9, A-F symbolizes hexadecimal digits."</span></div><div><br /><p>Huh. Well, that's interesting.</p><p>My first inclination was to assume that there was some bad data in the sample CRONUS company that I was testing with. I've run into a few situations where the demo data was incomplete or invalid, resulting in validation errors.</p><p>But after reviewing all of the customers in CRONUS, the Country/Region value looked okay.</p><p>And then I read the error message a few more times. US is not valid for the System ID field, which is a GUID? That sounds like a data type mismatch, and I couldn't imagine how the sample customer records in CRONUS could be causing this error.</p><p>So I <a href="https://twitter.com/steveendow/status/1499809155695083522?s=20&t=EYP7UN1fGr5VpoIs1FZ0GQ" target="_blank">posted my results on Twitter</a>, and Jeremy, AJ, and Erik all confirmed that it looked like a bug in the Business Central Web API.</p><p>So that was indeed interesting. But the geek inside of me was actually less interested in that, and more interested in yet another thing I learned while researching the error.</p><p>I realized that I did not know how the Navigation Properties are added to a Business Central Web API endpoint. I thought I knew, and thought I had researched it previously, but after reviewing the AL API page code for the Sales Credit Memos, I couldn't find the code that created the Navigation Properties.</p><p>It may be there, and it may have been staring right at me, but for some reason I was unable to identify exactly how the ELEVEN different Navigation Properties are declared or defined in the API page code. I swear that I've worked on a custom API page that had a Navigation Property, but for some reason this one eluded me.</p><p>Here is the AL code for the Sales Credit Memos API page:</p><p><a href="https://github.com/microsoft/ALAppExtensions/blob/main/Apps/W1/APIV2/app/src/pages/APIV2SalesCreditMemos.Page.al" target="_blank">https://github.com/microsoft/ALAppExtensions/blob/main/Apps/W1/APIV2/app/src/pages/APIV2SalesCreditMemos.Page.al</a></p><p><br /></p><p>AJ Kauffmann provided me with some info on how the Navigation Properties are defined, so that's my next learning assignment.</p><p><br /></p><p style="background-color: white; color: #444444; font-family: Arimo; font-size: 15.4px;"><i style="font-family: arimo; font-size: 15.4px;">Steve Endow is a Microsoft MVP in Los Angeles. He works with Dynamics 365 Business Central and related technologies.</i></p><p style="background-color: white; color: #444444; font-family: Arimo; font-size: 15.4px;"><i style="font-family: arimo; font-size: 15.4px;">You can also find him on <a href="https://www.blogger.com/blog/post/edit/7763553249079245585/5039226310633470520#" style="color: #2288bb; text-decoration-line: none;">Twitter</a> and <a href="https://www.blogger.com/blog/post/edit/7763553249079245585/5039226310633470520#" style="color: #2288bb; text-decoration-line: none;">YouTube</a></i></p></div><span><!--more--></span><span><!--more--></span><span><!--more--></span>Steve Endowhttp://www.blogger.com/profile/03950475674093020502noreply@blogger.com0tag:blogger.com,1999:blog-7763553249079245585.post-66389788341353404292022-01-14T11:28:00.008-08:002022-10-12T13:40:08.912-07:00Is Agile Development viable for Business Central customizations?<p> by Steve Endow</p><p>To the Agile Advocates (tm) who will immediately protest "Of course it is!" before reading on, I ask: </p><p>Hear me out.</p><p></p><div class="separator" style="clear: both; text-align: center;"><div style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEienZ6qHFS5H6gNUmXLBHKXuvo4ZMSnRMCxvn1KBVpp2wahpLLCfhGnTks53AY42MeBCOlONk_glK-zdzlL8x0_BrzMKLeS0Llt2eFbF9syjx4G-ly4DD2kxLhx8vj6c9pZFI5lN72LLdRB/"><img alt="" data-original-height="231" data-original-width="888" height="104" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEienZ6qHFS5H6gNUmXLBHKXuvo4ZMSnRMCxvn1KBVpp2wahpLLCfhGnTks53AY42MeBCOlONk_glK-zdzlL8x0_BrzMKLeS0Llt2eFbF9syjx4G-ly4DD2kxLhx8vj6c9pZFI5lN72LLdRB/w400-h104/image.png" width="400" /></a></div></div><p><br /></p>Reference: <a href="https://docs.microsoft.com/en-us/devops/plan/what-is-agile" target="_blank">What is Agile?</a><p></p><p>Reference: <a href="https://docs.microsoft.com/en-us/devops/plan/what-is-agile-development" target="_blank">What is Agile Development?</a></p><p>Reference: <a href="http://agilemanifesto.org/" target="_blank">Manifesto for Agile Software Development</a></p><p>Book: <a href="https://www.amazon.com/Agile-Project-Management-Dummies-3rd/dp/1119676991/" rel="nofollow" target="_blank">Agile Project Management for Dummies 3rd Edition</a></p><p>Book: <a href="https://www.amazon.com/Agile-Estimating-Planning-Mike-Cohn/dp/0131479415/" target="_blank">Agile Estimating and Planning</a></p><p>Book: <a href="https://www.amazon.com/gp/product/B00JI54HCU/" target="_blank">Scrum: The Art of Doing Twice the Work in Half the Time</a></p><p><br /></p><p><b>Disclaimer:</b> I'm not an Agile expert. I'm someone who has tried to learn about Agile (on several occasions) and tried to understand if and how some Agile practices might be used in the projects I work on. I'm asking lots of questions, for which I'm having a difficult time finding answers on my own through part time self-study.</p><p><br /></p><p>"<b>Agile Development</b>". It sounds cool. It sounds compelling. If you've ever suffered on a long, complex project that was over budget and seemed like it would never end, you'll likely appreciate some of the benefits that Agile claims to offer. You'll read the <a href="http://agilemanifesto.org/principles.html" target="_blank">Principles behind the Agile Manifesto</a> and say, "Yes, please!"</p><p>It definitely appeals to me.</p><p>But then there is the reality that I personally work in. Over the last 26 years, I have done consulting and development work mostly for "mid-market" customers in the US. Based on my years of experience, admittedly with organizations and teams that didn't have "best practices", I'm having a difficult time trying to map Agile practices to the mid-market ERP projects that I typically encounter.</p><p>My inquiry is not about whether Agile is good or bad. I'm trying to understand if Agile is a good fit, or even a viable option, for my customers and my projects.</p><span><a name='more'></a></span><p><br /></p><p><b><u>Context: Project Size and Scope</u></b></p><p>The mid-market projects I've worked on over the years have been thousands of dollars or tens of thousands of dollars in consulting fees. I think I worked on one large project that was probably well over $100,000, but that was very unusual for me. So keep in mind that I'm used to delivering solutions to customers that usually cost under $30,000. Quick. Complete. Inexpensive.</p><p>More context: None of my customers have dedicated internal project managers. Very few of them have an internal ERP administrator. And even fewer have an internal developer. Also, my current team only has one dedicated developer, one technical project manager, and one functional project manager, so my organization is small as well.</p><p>For contrast, I had a conversation recently with someone who explained that she won't even consider a consulting project under $6 million. Six. Million. Dollars. That number rolled off her tongue with a confidence and self-assuredness that amazed me. A customer "only" wants to spend $4 million? Nope, not worth her time. I was speechless for several seconds as my brain tried to confirm the words I heard. Let's be clear that those are NOT the projects I work on.</p><p><b>Question:</b> Is there a minimum <u>project budget</u> required for Agile Development to be viable? </p><p><b>Related Question:</b> Is there a minimum <u>project team</u> size or staffing level required for an Agile Development project to be practical?</p><p><br /></p><p>I have several challenges trying to understand if, and how, Agile Development might be used with my projects, but I'll just mention 2 challenges for now, as those are two that I've investigated.</p><p><br /></p><p><b><u>Challenge #1: Proposals and Estimates and Timelines</u></b></p><p>My mid-market customers want 3 answers before approving a project.</p><blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;"><p>1. What exactly am I going to get at the end of the project?</p><p>2. How much is this going to cost me?</p><p>3. When will the project be done?</p></blockquote><p>I started reading <a href="https://www.amazon.com/Agile-Estimating-Planning-Mike-Cohn/dp/0131479415/" target="_blank">Agile Estimating and Planning</a>, but although the book has English words and sentences in it, it felt to me like it was written in a different language. My impression is that it is based on an entire foundation of Agile concepts that will require months of studying and learning for me to grasp the larger philosophy, terminology, practices, and communication techniques of Agile to even be minimally competent with Agile Estimating.</p><p>I could be completely wrong due to my lack of knowledge and experience with Agile Estimating, but it seems like I would also have a very difficult time proposing an Agile Estimate to one of my customers. Unless I'm directly and briefly answering the 3 questions above, they would also think I'm speaking a different language.</p><p><b>Question:</b> Is Agile Estimating viable for a customer who has never been involved with an Agile project and never heard of Agile Estimating?</p><p><b>Question:</b> If a customer wants answers to the 3 questions above before approving a project, does that immediately rule out Agile Estimating?</p><p><b>Related question:</b> If I'm unable to use Agile Estimating on a project, does that automatically and completely rule out Agile Development for the project? Or are there options for "sort-of-partial-Agile Development" practices on the project? (see Challenge #2)</p><p><br /></p><p><b><u>Challenge #2: Iteration and Integration is Costly (for my customers)</u></b></p><p>For a moment, let's just assume that my projects aren't suited for an Agile Estimate, and a full blown Agile Development methodology is not appropriate for my projects or my customers. No problem.</p><p>Even though the project isn't "full Agile", I can still use some simple Agile tools and practices, right?</p><p>For example, Business Central development projects can use:</p><blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;"><p>1. <a href="https://www.amazon.com/Automated-Testing-Microsoft-Dynamics-Business-ebook/dp/B098KHMJCR/" target="_blank">Automated Testing</a> and Acceptance Test Driven Development</p><p>2. <a href="https://docs.microsoft.com/en-us/learn/modules/use-azure-pipelines/" target="_blank">Azure DevOps Pipelines</a> for build automation</p><p>3. Continuous Deployment using <a href="https://docs.microsoft.com/en-us/dynamics365/business-central/dev-itpro/administration/itpro-introduction-to-automation-apis" target="_blank">Business Central Automation APIs </a></p></blockquote><p>Given that these tools are available, I thought, "Awesome! Let's do some iterative development and crank out releases!" </p><p>Let's be "agile"! Let's push beta releases! Let's push minimum viable product and get early feedback! </p><p>Technically, the tools listed above worked well. We produced prototypes and alpha releases and beta releases. We were able to quickly iterate. We were able to quickly fix bugs and add features and crank out new, tested releases with a click of a button using Azure DevOps.</p><p>But after several months of trying to provide rapid releases to customers, I came to a realization.</p><p><b>My customers are unable to keep up with a rapid release pace.</b> They simply do not have the time and attention to look at new releases every week or every two weeks, and perhaps not even once a month. </p><p>Our application consultants are also challenged to keep up. They are very busy with dozens of tasks aside from customizations, and in most cases, a new deployment requires a call with the customer to get logged in and upload a new PTE or install a new AppSource release. And then the customer needs to set aside time to review the changes, bug fixes, or new features.</p><p>We have not yet had a customer where we could use automation APIs to automatically install or update an extension. Even if we were able to achieve Continuous Deployment, the problem I'm seeing isn't a technical one, so I don't know that Continuous Deployment would help our projects be much more Agile.</p><p>In one case, we've released a new version of a PTE and installed it in the customer's environment, and a month later realized that the customer still hadn't used or even reviewed the new release. I assume they've been busy. I'm guessing they've had other priorities. Maybe there was a communication issue--and I'll take the blame for forgetting to follow up, as I'm also busy. But that lack of follow up happened to provide a valuable lesson: I learned that the customer still hadn't looked at a new release after a full month.</p><p>In another case, we released a new version of an app for Business Central v19, but then realized the customer's environment was still on v18.5. We then had to fix the BC upgrade issue, and now we're still waiting to schedule another call to get the new version installed. Weeks have passed. Again, the customer is busy. A deployment call takes time. Reviewing the new release takes time. Etc. Etc. Etc.</p><p>So even if we are able to technically deliver incremental releases as quickly as every week, I'm seeing some clear signals that my customers are simply unable to consume them at that pace. </p><p>Given this, is there really any value in pursuing Agile Development for my typical customer?</p><p><br /></p><p><b><u>Is It Really "Agile" At This Point?</u></b></p><p>If I have a project that does not use Agile Estimating, and if the project does not use iterative development with multiple or rapid releases...is that a fundamentally non-Agile project?</p><p>If I have a waterfall estimate plus a big-bang "Go Live" and a mad scramble of bug fixes and enhancements immediately after go live, I'm assuming that's non-Agile, even if we are using Automated Testing, Continuous Integration, and Continuous Deployment.</p><p><br /></p><p><b><u>It's Good to Know We Can</u></b></p><p>Although our current customers may not be comfortable with an Agile Estimate, and may not have the capacity for an Agile project or rapid release cycles, I think it's good to know we seem to have the capability to iterate and deliver quickly if we ever need to. And that we can at least use the technical tools to support rapid development, testing, and deployment, even if it isn't technically "Agile".</p><p>Maybe I'll never work on a project that uses Agile Estimation or full Agile Development, but I'm still planning on using Automated Testing and DevOps Pipelines for all of our development projects. That makes our lives easier, regardless of the release pace.</p><p><br /></p><p style="background-color: white; color: #444444; font-family: Arimo; font-size: 15.4px;"><i style="font-family: arimo; font-size: 15.4px;">Steve Endow is a Microsoft MVP in Los Angeles. He works with Dynamics 365 Business Central.</i></p><p style="background-color: white;"><i style="color: #444444; font-family: arimo; font-size: 15.4px;">You can also find him on these platforms: </i><span style="background-color: transparent; font-size: 15.4px;"><span style="color: #444444; font-family: arimo;"><i><a href="https://links.steveendow.com/">https://links.steveendow.com/</a></i></span></span></p>Steve Endowhttp://www.blogger.com/profile/03950475674093020502noreply@blogger.com0tag:blogger.com,1999:blog-7763553249079245585.post-15567262401229388232022-01-03T12:34:00.005-08:002022-01-05T11:56:45.564-08:00The Business Central Default Dimension Priorities Feature<div class="separator">by Steve Endow</div><p><i>[NOTE: I'm new to Business Central Dimensions, so if I got anything wrong, or missed any important details, please post a comment below and let me know. Thanks!]</i></p><p>I have recently been exploring how Business Central can provide default values for Dimension Codes.</p><p>For example, if I create a new Sales Invoice in Cronus, select Alpine Ski House as the customer, and then add an ATHENS Desk as a line item, both the Customergroup Code and Department Code dimension fields remain blank on the line.</p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEiZv4bo7eQkUb3Bvt6k_h2oNTdnnueodB5I4264MuDTHI38IsGxAC8r6IeKUMNVb1T0lU3C0xHoNdFC65KRR8rZp9y36rXcmT0NrinqzI2p4Ufm_wpLBUuaZTOqc0FAXhfGrJKch1dn_r6QQd9PcVtA452PJX1l7Dd7xmODEc0Q2jdd_jBBCgPylrf25g=s978" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="512" data-original-width="978" height="210" src="https://blogger.googleusercontent.com/img/a/AVvXsEiZv4bo7eQkUb3Bvt6k_h2oNTdnnueodB5I4264MuDTHI38IsGxAC8r6IeKUMNVb1T0lU3C0xHoNdFC65KRR8rZp9y36rXcmT0NrinqzI2p4Ufm_wpLBUuaZTOqc0FAXhfGrJKch1dn_r6QQd9PcVtA452PJX1l7Dd7xmODEc0Q2jdd_jBBCgPylrf25g=w400-h210" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">No Default Dimension Values</td></tr></tbody></table><br /><p>Why are these Dimension Code fields blank? In this example, they are blank because I don't have any Default Dimension Value Codes defined for the <b>Customer</b> or <b>Item</b> records. Let's explore how we can get Business Central to provide default values for those Dimension fields.</p><span><a name='more'></a></span><p>If I open the <b>Customer Card</b> for Alpine Ski House, then click on Related -> Customer -> Dimensions, I can view the Default Dimensions for the customer.</p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEhaD8rdSahESC-iJv_kAq6d18N6i0NDBFn0_shBl7Vc3ylVQO7Cun9yxkuOUhxiJbfafgEN8ymUkAgMMe2i3kGomEJqRflZnEIACBVaYnJQEk0v8CJKTRudHvZL3pT-8zOo-9r1GvrfV-ZRkQYAIGb8oeOqDPlF_5AhAAoFejuaijZle7xlVBOpf0miTA=s846" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="287" data-original-width="846" height="136" src="https://blogger.googleusercontent.com/img/a/AVvXsEhaD8rdSahESC-iJv_kAq6d18N6i0NDBFn0_shBl7Vc3ylVQO7Cun9yxkuOUhxiJbfafgEN8ymUkAgMMe2i3kGomEJqRflZnEIACBVaYnJQEk0v8CJKTRudHvZL3pT-8zOo-9r1GvrfV-ZRkQYAIGb8oeOqDPlF_5AhAAoFejuaijZle7xlVBOpf0miTA=w400-h136" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Customer Card -> Related -> Customer -> Dimensions</td></tr></tbody></table><br /><p>And here we see that there are no Default Dimensions for Customer 40000.</p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEhmaDsqAnuaaBoqG91yLcALs3aV0gUmhEWy1wG2bepsR2W6kGy9_qkAKCHcVOUOn7VzSkGBDPQeH6oxuiUNngtOTH0CrYYLZWbWguNYKyk8z1om7r0C0zaTwFX_DjqiVozQRUd98zhTZo38j0zDrfMiJ55E36EB6n24t-PYBZ6KnvZ_xMgExYZC7LOyrQ=s681" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="250" data-original-width="681" height="146" src="https://blogger.googleusercontent.com/img/a/AVvXsEhmaDsqAnuaaBoqG91yLcALs3aV0gUmhEWy1wG2bepsR2W6kGy9_qkAKCHcVOUOn7VzSkGBDPQeH6oxuiUNngtOTH0CrYYLZWbWguNYKyk8z1om7r0C0zaTwFX_DjqiVozQRUd98zhTZo38j0zDrfMiJ55E36EB6n24t-PYBZ6KnvZ_xMgExYZC7LOyrQ=w400-h146" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">No Default Customer Dimension Value Codes Defined</td></tr></tbody></table><br /><p>If we open the ATHENS Desk <b>Item Card</b>, we can similarly navigate to Related -> Item -> Dimensions.</p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEi4xApyL6_FL7JGcgSjhrAotrM86cEjJsX2lTGb23aT5_1LIlsPOjnmhiXMWzlVP833DAz-8iCcKqH8sMvDc_gk2_wimLP2mzzpIXL7d1wZOtD5tm_6QB90aKVJP_yYb6ZRU5OLFnl64YWrY6-qDtKvko6y-_IjEqbAMIaHM2eZpULTLgcqTPMWx4LQFQ=s665" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="291" data-original-width="665" height="175" src="https://blogger.googleusercontent.com/img/a/AVvXsEi4xApyL6_FL7JGcgSjhrAotrM86cEjJsX2lTGb23aT5_1LIlsPOjnmhiXMWzlVP833DAz-8iCcKqH8sMvDc_gk2_wimLP2mzzpIXL7d1wZOtD5tm_6QB90aKVJP_yYb6ZRU5OLFnl64YWrY6-qDtKvko6y-_IjEqbAMIaHM2eZpULTLgcqTPMWx4LQFQ=w400-h175" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Item Card -> Related -> Item -> Dimensions</td></tr></tbody></table><br /><p>And just like the Alpine Ski House Customer record, the 1896-S ATHENS Desk Item record also does not have any Default Dimension Value Codes defined.</p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEiGqe5ZMMd8eCCoWQbQ1JAQdChaiWCIlJ5idlIYy9q1Tvz43afGT_o1QWTFDnsNsDb6N-6OjDq30-OaFE3sLRKt4xcledaBOBalO-ztgPFr7_OI6-fKRVLRdrtY6gfSwJWN73h8HB16iRTjWQwb5WX73xSK5coN3A813KAGuLzy1En5r2QQpufOF7Dj0Q=s661" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="245" data-original-width="661" height="149" src="https://blogger.googleusercontent.com/img/a/AVvXsEiGqe5ZMMd8eCCoWQbQ1JAQdChaiWCIlJ5idlIYy9q1Tvz43afGT_o1QWTFDnsNsDb6N-6OjDq30-OaFE3sLRKt4xcledaBOBalO-ztgPFr7_OI6-fKRVLRdrtY6gfSwJWN73h8HB16iRTjWQwb5WX73xSK5coN3A813KAGuLzy1En5r2QQpufOF7Dj0Q=w400-h149" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">No Default Item Dimension Value Codes Defined</td></tr></tbody></table><br /><p>So let's setup some default values for both our Item and Customer test records.</p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEgc_ZZK-wdGInIdyzq9zYNdU4dW10tw8dknWGtaVvuTxGZmA7UsJj_B9HdL8rhnYD18udhhfz8I9H6UBFndX0htGp1jySyijXUcODYcXfRTHkXsR7oRGDT5gM8tUJswvd4YF8MG1BbNs_gR0rVbCI5jJKwS2YmZbDEMVtG4YYD6FYc47PedeaLVdtN2xw=s524" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="244" data-original-width="524" height="186" src="https://blogger.googleusercontent.com/img/a/AVvXsEgc_ZZK-wdGInIdyzq9zYNdU4dW10tw8dknWGtaVvuTxGZmA7UsJj_B9HdL8rhnYD18udhhfz8I9H6UBFndX0htGp1jySyijXUcODYcXfRTHkXsR7oRGDT5gM8tUJswvd4YF8MG1BbNs_gR0rVbCI5jJKwS2YmZbDEMVtG4YYD6FYc47PedeaLVdtN2xw=w400-h186" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Customer Default Dimension Value Codes</td></tr></tbody></table><br /><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEiVps3PjufVVpG1mZ9f9uGMko3nR2CRNEszqyC4FPNEPAaXht8ZJn6Mts2Kp-Dlqrg49U9IlCxOeq8vtIwwnYB9vKmxTHdtxKKpM7oVFtLt1TJ5N11IJgbFVaB-zMIQ-x8wdf_qci2tYTzmCShpfn4OTtuGv-EmFLmtJ6OPYho-_qP4cpgwekZshb2brg=s533" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="241" data-original-width="533" height="181" src="https://blogger.googleusercontent.com/img/a/AVvXsEiVps3PjufVVpG1mZ9f9uGMko3nR2CRNEszqyC4FPNEPAaXht8ZJn6Mts2Kp-Dlqrg49U9IlCxOeq8vtIwwnYB9vKmxTHdtxKKpM7oVFtLt1TJ5N11IJgbFVaB-zMIQ-x8wdf_qci2tYTzmCShpfn4OTtuGv-EmFLmtJ6OPYho-_qP4cpgwekZshb2brg=w400-h181" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Item Default Dimension Value Codes</td></tr></tbody></table><br /><p>Now that we have defaults set for our Customer and Item records, what happens when we create a new Invoice and select an Item?</p><br /><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEiVbPDPOFXz36jSibcHwEHV4sqjAsRjqcVY_jVUXamLsw_ZiY_fxxrpMs2N-ge5e8EhjyVrH69YgqFg6beslp8AxKQ5joq77_eut-iAtDp-ilIvEbm3-2RnnV_c_WJD3KTINuL-FpdUDkowOZE-Lluwcf6oW7IyJehy45by-nyKjOnlvqstUizjBdeDog=s973" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="497" data-original-width="973" height="204" src="https://blogger.googleusercontent.com/img/a/AVvXsEiVbPDPOFXz36jSibcHwEHV4sqjAsRjqcVY_jVUXamLsw_ZiY_fxxrpMs2N-ge5e8EhjyVrH69YgqFg6beslp8AxKQ5joq77_eut-iAtDp-ilIvEbm3-2RnnV_c_WJD3KTINuL-FpdUDkowOZE-Lluwcf6oW7IyJehy45by-nyKjOnlvqstUizjBdeDog=w400-h204" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Dimension Value Codes Default from Customer</td></tr></tbody></table><br /><div>In the screen shot above, we see that the Dimension Value Codes defaulted from the <b>Customer</b> record--MEDIUM and PROD. The Default Dimension Value Codes from the Item record were not used on the new line item.</div><div><p>So this appears to show that by default, Business Central will first use defaults <strike>from the <b>Customer</b> record</strike> before using defaults from the <b>Item </b>record.</p><p><b>CORRECTION</b>: In the above example, Business Central actually defaulted the Sales Invoice Header Dimension Value fields based on the Customer defaults. Business Central then uses those Sales Header dimension values as defaults for the new line items. BC does not directly retrieve the current Customer default Dimension values from the customer during line item entry.</p><p>Business Central does support mixing Customer and Item Dimension Value Codes. For example, if I only specify a default value for the CUSTOMERGROUP Dimension Code on the <b>Customer </b>record, like this:</p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEix0xUK-WxqXq-oqlibzScZU-9zIveUQnyGqJDxogPw2vknhOvKOJWVFXLrYFYPYFk9BUpQyeqTgcaKMpHCSOdOoSW_P5K_kchYiUw5elHd2m9DmqSJkjvXpISC2wb8zeHvMFk-O4VXkoWYvsX9nZP5iqRaQnWIyAQVUeNE-AwX1GKg2j9HgpUzTdhLuA=s525" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="245" data-original-width="525" height="186" src="https://blogger.googleusercontent.com/img/a/AVvXsEix0xUK-WxqXq-oqlibzScZU-9zIveUQnyGqJDxogPw2vknhOvKOJWVFXLrYFYPYFk9BUpQyeqTgcaKMpHCSOdOoSW_P5K_kchYiUw5elHd2m9DmqSJkjvXpISC2wb8zeHvMFk-O4VXkoWYvsX9nZP5iqRaQnWIyAQVUeNE-AwX1GKg2j9HgpUzTdhLuA=w400-h186" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Default Customer Group on Customer Record</td></tr></tbody></table><p><br /></p>Then a new Sales Invoice Line with the ATHENS Desk will use the <b>Customer</b> default for the Customergroup Code, and the <b>Item </b>default for the Department Code.</div><div><br /></div><div><b>CORRECTION</b>: As above, BC is only using the Customer defaults to populate the Dimension fields on the Sales Invoice Header, which are then used as defaults for the new lines. It is not directly retrieving the Customer default Dimension values for use on new line items.<br /><div><br /><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEiAzfIhK2a5eKx3w8EqxDlV1pzmA6GbV0uVJg4Bf582ExfklJO9F3p2yWSTPQIhxR-W_0nfUe-mqgvSUrD-lNm1LtDmUSwdnnuYxYYJcFf1XczX-YPk_U6ejObruEqStFLBItM_y2jlBsxJ77r32WXpuVX46FZeaxoNwIQ8ylzdrbtyQ1Zg53oWyCtZpg=s988" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="185" data-original-width="988" height="75" src="https://blogger.googleusercontent.com/img/a/AVvXsEiAzfIhK2a5eKx3w8EqxDlV1pzmA6GbV0uVJg4Bf582ExfklJO9F3p2yWSTPQIhxR-W_0nfUe-mqgvSUrD-lNm1LtDmUSwdnnuYxYYJcFf1XczX-YPk_U6ejObruEqStFLBItM_y2jlBsxJ77r32WXpuVX46FZeaxoNwIQ8ylzdrbtyQ1Zg53oWyCtZpg=w400-h75" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Default Values From Both Customer and Item</td></tr></tbody></table><br /><p>But what if we want Value Codes to always default from the Item record first, instead of the Customer?</p><p>To support that requirement, Business Central has a feature called Default Dimension Priorities.</p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEi3_p4Qh8OlocH7qmtPtb0nqYZvoT50IK8tT6GQX0VVpew_JuYj_xq-n3PZ_Z4WrAjqVUsZB-zcyI4THKE1J6X1-3_77bTqYmXyP9EbOYbfYrGYwSauJcpHSL4SfOAxHbL_51LCzNr49r8LTvi9t45U-rVg5C8qIRKFsOHw81FfY6LgKg4KpOZD0xqAEA=s946" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="348" data-original-width="946" height="148" src="https://blogger.googleusercontent.com/img/a/AVvXsEi3_p4Qh8OlocH7qmtPtb0nqYZvoT50IK8tT6GQX0VVpew_JuYj_xq-n3PZ_Z4WrAjqVUsZB-zcyI4THKE1J6X1-3_77bTqYmXyP9EbOYbfYrGYwSauJcpHSL4SfOAxHbL_51LCzNr49r8LTvi9t45U-rVg5C8qIRKFsOHw81FfY6LgKg4KpOZD0xqAEA=w400-h148" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Specify Default Dimension Priorities by Source Code</td></tr></tbody></table><br />As a new Business Central user, I didn't find this window to be very intuitive, but after testing it for a while, I think I've figured out how to use it for my Sales Invoice example.<br /><p>In the screen shot above, I've setup Default Dimension Priorities for the <b>SALES </b>Source Code. The <b>Item </b>table has Priority 1, and the <b>Customer </b>table has Priority 2.</p><p>I don't yet know of a good way to determine which Source Code value should be used for a given Business Central record or transaction, other than guessing and testing. And I suspect it may not always be clear which Table ID to choose for a given default--but it should be possible to figure out with a bit of trial and error.</p><p>So now that I have Default Dimension Priorities setup for the SALES source code, let's try creating a new Sales Invoice.</p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEhHOYdF1Y_8aPh3XNMjQOqsofczMF3BZ--HIO0r-R6GO_3hn8QAd0SzPj9dUq09UXWM8oqwD3uj9wTq50wqIpoJOR-PjNLGeF5IQ7z_ux1_bGeaBGlzMYXsA0NRqGRXOoUbM3keVH0XgVwV8eqQ1dg3LnbJr5ZzsfI8CBwUqvtMSfqWXUPWC5RuQ5bdew=s976" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="511" data-original-width="976" height="210" src="https://blogger.googleusercontent.com/img/a/AVvXsEhHOYdF1Y_8aPh3XNMjQOqsofczMF3BZ--HIO0r-R6GO_3hn8QAd0SzPj9dUq09UXWM8oqwD3uj9wTq50wqIpoJOR-PjNLGeF5IQ7z_ux1_bGeaBGlzMYXsA0NRqGRXOoUbM3keVH0XgVwV8eqQ1dg3LnbJr5ZzsfI8CBwUqvtMSfqWXUPWC5RuQ5bdew=w400-h210" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Dimension Value Codes now default from the Item</td></tr></tbody></table><br /><p>You can see that both Dimension Value Codes are defaulting from the ATHENS Desk, and the default dimension value codes from the Customer are no longer being used as defaults.</p><p>After doing these tests, I had a few observations related to default Dimension values.</p><p>1. Business Central allows me to specify default Dimension values for records such as Item, Customer, and Vendor. But what if I want to have default values at the Company level, in case neither the Customer nor Item have defaults? <strike>It seems that Business Central does not currently support default values at the Company level.</strike> </p><p><b>UPDATE:</b> <a href="https://twitter.com/ajkauffmann/status/1478104760020615170" target="_blank">AJ Kauffmann shared</a> that the Business Central Responsibility Center feature can supply default Dimension Value Codes at the Company level. And he explains that a Responsibility Center can also be configured per user, which provides some additional flexibility over a single Company default. I will have to test the Responsibility Center feature. </p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEgKpHv8RdAlsPx0Ldkx83zsHEzOXQGvXtkM21BEKXiFQPpr5UcrbtoGqjdTHkKs0wAbZdeokTr5ALr5ABx-CkB3p-z5TQsGmkD6miuU4OZtcH9vlQMP1ks-9nf82z-6r2aNTtA5kkXRT8CRcJuK0CfI6G7Bdgtw5N2a2FKPb0Rh8c0fk7kMe_hiPg_SEA=s585" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="517" data-original-width="585" height="283" src="https://blogger.googleusercontent.com/img/a/AVvXsEgKpHv8RdAlsPx0Ldkx83zsHEzOXQGvXtkM21BEKXiFQPpr5UcrbtoGqjdTHkKs0wAbZdeokTr5ALr5ABx-CkB3p-z5TQsGmkD6miuU4OZtcH9vlQMP1ks-9nf82z-6r2aNTtA5kkXRT8CRcJuK0CfI6G7Bdgtw5N2a2FKPb0Rh8c0fk7kMe_hiPg_SEA=s320" width="320" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">AJ recommends trying the Responsibility Center feature</td></tr></tbody></table><br /><p>2. The Default Dimension Priorities page allows you to specify the "Priority" of the different tables that may be used to determine the default Dimension Value Codes. You would typically have a list of 1, 2, 3, etc. But I noticed that Business Central allows you to set the same priority for multiple Table IDs. I don't know when or why someone would do this, and I have a feeling this might result in some potential confusion or complexity when configuring Default Dimension Priorities.</p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEj9cIZgllbo0wKHK4Jna_1HC6VSDp20Qe8KffYZpc40X9qmv2hwipTn7L9aZcmRzg7jP-p3It9pcu7MSiUEV1YcYSO3ne9D0y9zM6Z5mFEkeDRpOQR1_4wRXd-Du6dy9rREjrKLnabwu4XyB21BS--LKaD_uKsv_2vC-Fh-R6G6oBnlPtxLzp1ZwL9log=s908" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="373" data-original-width="908" height="164" src="https://blogger.googleusercontent.com/img/a/AVvXsEj9cIZgllbo0wKHK4Jna_1HC6VSDp20Qe8KffYZpc40X9qmv2hwipTn7L9aZcmRzg7jP-p3It9pcu7MSiUEV1YcYSO3ne9D0y9zM6Z5mFEkeDRpOQR1_4wRXd-Du6dy9rREjrKLnabwu4XyB21BS--LKaD_uKsv_2vC-Fh-R6G6oBnlPtxLzp1ZwL9log=w400-h164" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Everything is Top Priority!?</td></tr></tbody></table><br /><p>If you are aware of a good example of when a customer might want to have the same Priority for two different Table IDs, please let me know--I'm curious how that "feature" might be used. (Abused?)</p><p><br /></p><p>If there's anything I missed or any interesting uses of this feature that you've seen, please post a comment below and let me know!</p><p><br /></p><p style="background-color: white; color: #444444; font-family: Arimo; font-size: 15.4px;"><i style="font-family: arimo; font-size: 15.4px;">Steve Endow is a Microsoft MVP in Los Angeles. He works with Dynamics 365 Business Central.</i></p><p style="background-color: white; color: #444444; font-family: Arimo; font-size: 15.4px;"><i style="font-family: arimo; font-size: 15.4px;">You can also find him on <a href="https://www.blogger.com/blog/post/edit/7763553249079245585/5039226310633470520#" style="color: #2288bb; text-decoration-line: none;">Twitter</a> and <a href="https://www.blogger.com/blog/post/edit/7763553249079245585/5039226310633470520#" style="color: #2288bb; text-decoration-line: none;">YouTube</a></i></p></div></div>Steve Endowhttp://www.blogger.com/profile/03950475674093020502noreply@blogger.com0tag:blogger.com,1999:blog-7763553249079245585.post-27186358872913237612021-11-26T09:08:00.004-08:002022-03-04T16:49:33.109-08:00Business Central API - Filter Child Array Values Using $filter Query Option<p> by Steve Endow</p><p>I had a difficult time finding an example of this type of API filtering using the OData $filter query option, so I wanted to share an example that I needed for a project.</p><p>For context, this is a very simple example of a Business Central API "child array" that I wanted to filter. Technically, I think that OData calls this an "<a href="http://docs.oasis-open.org/odata/odata/v4.0/os/part2-url-conventions/odata-v4.0-os-part2-url-conventions.html#_Toc372793860" target="_blank">expanded navigation property</a>".<br /></p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEh7vlt8Dq50tACbcTm3MK8xIBAHaUWntqsCp767soFCiqRghFfeD4R1jBV0mKzdjh73hmQhHUk_5qPINP_nUoFgrZrfsEQ9JyoHzSts20vZ65qtdExBlFUPn6FmichIQg45FuOTUGPn6LCwhPT8PTNO0oz96kDXLcxdV3YD9ODx3CVLL5rDLD-u9kO9Mg=s761" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="399" data-original-width="761" height="210" src="https://blogger.googleusercontent.com/img/a/AVvXsEh7vlt8Dq50tACbcTm3MK8xIBAHaUWntqsCp767soFCiqRghFfeD4R1jBV0mKzdjh73hmQhHUk_5qPINP_nUoFgrZrfsEQ9JyoHzSts20vZ65qtdExBlFUPn6FmichIQg45FuOTUGPn6LCwhPT8PTNO0oz96kDXLcxdV3YD9ODx3CVLL5rDLD-u9kO9Mg=w400-h210" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Customers with Expanded contactsInformation Navigation Property</td></tr></tbody></table><br /><br /><div>First, if you are not familiar with the OData $metadata URL and the $expand query parameter, <a href="https://blog.steveendow.com/2021/09/using-metadata-and-expand-with-business.html" target="_blank">please see my blog post here</a>.<div><br /><p><span></span></p><a name='more'></a>Second, I'd like to thank <a href="https://twitter.com/ajkauffmann" target="_blank">AJ Kauffman</a> for helping me understand how to use this type of filter. If you want to learn more about how to work with Business Central APIs, I highly recommend AJ's class.<p></p><p><a href="https://www.kauffmann.nl/bc-apis-online-course/">https://www.kauffmann.nl/bc-apis-online-course/</a></p><p>One slide that I constantly refer to from AJ's API class is a list of 7 common OData query parameters.</p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEhLHRM_yn-iK_Onq7mxBBii08bf46B7XtNtSuRbwJaR7zIfqc35ThNLzcI8vf27Y-ECwc5k2aQrU6PW9dzgiwFz9rqmRR3aZ0r5s14ZFL0Htm5qbUFsTR6ZKB3mZPkL5XSd-9Gw5zgG5EGOiT7lsyLFV6u8iru_vfhKE4mQWVS-Bqes6LY2CyOLKEDjGg=s1215" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="650" data-original-width="1215" height="214" src="https://blogger.googleusercontent.com/img/a/AVvXsEhLHRM_yn-iK_Onq7mxBBii08bf46B7XtNtSuRbwJaR7zIfqc35ThNLzcI8vf27Y-ECwc5k2aQrU6PW9dzgiwFz9rqmRR3aZ0r5s14ZFL0Htm5qbUFsTR6ZKB3mZPkL5XSd-9Gw5zgG5EGOiT7lsyLFV6u8iru_vfhKE4mQWVS-Bqes6LY2CyOLKEDjGg=w400-h214" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Know the 7 Basic OData Query Parameters</td></tr></tbody></table><br /><p>The <a href="http://docs.oasis-open.org/odata/odata/v4.0/os/part2-url-conventions/odata-v4.0-os-part2-url-conventions.html#_Toc372793792" target="_blank">OData v4 specification</a> refers to these as "Query Options".</p><p>So let's explore a specific use case for the <b>$filter</b> query option. This sample JSON shows a customer record and the expanded <b>contactsInformation</b> navigation property.</p><p><br /></p><p>Here is the URL:</p><div style="background-color: #fffffe; font-family: Consolas, "Courier New", monospace; font-size: 14px; line-height: 21px; white-space: pre;"><span style="color: #2a00ff;">http://bcdev-default:7048/BC/api/v2.0/companies(684c3004-464e-ec11-bb7e-000d3a39265e)/</span></div><div style="font-family: Consolas, "Courier New", monospace; font-size: 14px; line-height: 21px; white-space: pre;"><span style="color: #2a00ff;"><span style="background-color: #fcff01;">customers</span><span style="background-color: #fffffe;">(461d8d2a-464e-ec11-bb7e-000d3a39265e)</span><span style="background-color: #fcff01;">?$expand=contactsInformation</span></span></div><p><br /></p><p>And here is the response, showing multiple contacts for the customer:</p><blockquote><div style="font-family: Consolas, "Courier New", monospace; font-size: 14px; line-height: 21px; white-space: pre;"><div style="background-color: #fffffe;">{</div><div style="background-color: #fffffe;"> <span style="color: #a31515;">"@odata.context"</span>: <span style="color: #0451a5;">"http://bcdev-default:7048/BC/api/v2.0/$metadata#companies(684c3004-464e-ec11-bb7e-000d3a39265e)/customers/$entity"</span>,</div><div style="background-color: #fffffe;"> <span style="color: #a31515;">"@odata.etag"</span>: <span style="color: #0451a5;">"W/\"JzQ0O3VXUnY4ZHNyb3dyMGVja2owMTh4QmJabEJqVmVndHdmSHV2ZE5PdDVMSTQ9MTswMDsn\""</span>,</div><div style="background-color: #fffffe;"> <span style="color: #a31515;">"id"</span>: <span style="color: #0451a5;">"461d8d2a-464e-ec11-bb7e-000d3a39265e"</span>,</div><div style="background-color: #fffffe;"> <span style="color: #a31515;">"number"</span>: <span style="color: #0451a5;">"10000"</span>,</div><div style="background-color: #fffffe;"> <span style="color: #a31515;">"displayName"</span>: <span style="color: #0451a5;">"Adatum Corporation"</span>,</div><div style="background-color: #fffffe;"> <span style="color: #a31515;">"type"</span>: <span style="color: #0451a5;">"Company"</span>,</div><div style="background-color: #fffffe;"> <span style="color: #a31515;">"addressLine1"</span>: <span style="color: #0451a5;">"192 Market Square"</span>,</div><div style="background-color: #fffffe;"> <span style="color: #a31515;">"addressLine2"</span>: <span style="color: #0451a5;">""</span>,</div><div style="background-color: #fffffe;"> <span style="color: #a31515;">"city"</span>: <span style="color: #0451a5;">"Atlanta"</span>,</div><div style="background-color: #fffffe;"> <span style="color: #a31515;">"state"</span>: <span style="color: #0451a5;">"GA"</span>,</div><div style="background-color: #fffffe;"> <span style="color: #a31515;">"country"</span>: <span style="color: #0451a5;">"US"</span>,</div><div style="background-color: #fffffe;"> <span style="color: #a31515;">"postalCode"</span>: <span style="color: #0451a5;">"31772"</span>,</div><div style="background-color: #fffffe;"> <span style="color: #a31515;">"phoneNumber"</span>: <span style="color: #0451a5;">""</span>,</div><div style="background-color: #fffffe;"> <span style="color: #a31515;">"email"</span>: <span style="color: #0451a5;">"robert.townes@contoso.com"</span>,</div><div style="background-color: #fffffe;"> <span style="color: #a31515;">"website"</span>: <span style="color: #0451a5;">""</span>,</div><div style="background-color: #fffffe;"> <span style="color: #a31515;">"salespersonCode"</span>: <span style="color: #0451a5;">"JO"</span>,</div><div style="background-color: #fffffe;"> <span style="color: #a31515;">"balanceDue"</span>: <span style="color: #098658;">0</span>,</div><div style="background-color: #fffffe;"> <span style="color: #a31515;">"creditLimit"</span>: <span style="color: #098658;">0</span>,</div><div style="background-color: #fffffe;"> <span style="color: #a31515;">"taxLiable"</span>: <span style="color: #0451a5; font-weight: bold;">true</span>,</div><div style="background-color: #fffffe;"> <span style="color: #a31515;">"taxAreaId"</span>: <span style="color: #0451a5;">"6701222f-464e-ec11-bb7e-000d3a39265e"</span>,</div><div style="background-color: #fffffe;"> <span style="color: #a31515;">"taxAreaDisplayName"</span>: <span style="color: #0451a5;">"ATLANTA, GA"</span>,</div><div style="background-color: #fffffe;"> <span style="color: #a31515;">"taxRegistrationNumber"</span>: <span style="color: #0451a5;">""</span>,</div><div style="background-color: #fffffe;"> <span style="color: #a31515;">"currencyId"</span>: <span style="color: #0451a5;">"00000000-0000-0000-0000-000000000000"</span>,</div><div style="background-color: #fffffe;"> <span style="color: #a31515;">"currencyCode"</span>: <span style="color: #0451a5;">"USD"</span>,</div><div style="background-color: #fffffe;"> <span style="color: #a31515;">"paymentTermsId"</span>: <span style="color: #0451a5;">"551c8d2a-464e-ec11-bb7e-000d3a39265e"</span>,</div><div style="background-color: #fffffe;"> <span style="color: #a31515;">"shipmentMethodId"</span>: <span style="color: #0451a5;">"00000000-0000-0000-0000-000000000000"</span>,</div><div style="background-color: #fffffe;"> <span style="color: #a31515;">"paymentMethodId"</span>: <span style="color: #0451a5;">"0e01222f-464e-ec11-bb7e-000d3a39265e"</span>,</div><div style="background-color: #fffffe;"> <span style="color: #a31515;">"blocked"</span>: <span style="color: #0451a5;">"_x0020_"</span>,</div><div style="background-color: #fffffe;"> <span style="color: #a31515;">"lastModifiedDateTime"</span>: <span style="color: #0451a5;">"2021-11-25T23:20:30.547Z"</span>,</div><div><span style="background-color: #fffffe;"> </span><span style="color: #a31515;"><span style="background-color: #fffffe;">"</span><span style="background-color: #fcff01;">contactsInformation</span><span style="background-color: #fffffe;">"</span></span><span style="background-color: #fffffe;">: [</span></div><div style="background-color: #fffffe;"> {</div><div style="background-color: #fffffe;"> <span style="color: #a31515;">"@odata.etag"</span>: <span style="color: #0451a5;">"W/\"JzQ0O0hYRTV0WnVQc0FIWUN5d0ZWY2QwOS94dVJvelBqVUdPTEVCUlZSbDNvQU09MTswMDsn\""</span>,</div><div style="background-color: #fffffe;"> <span style="color: #a31515;">"contactId"</span>: <span style="color: #0451a5;">"ee01222f-464e-ec11-bb7e-000d3a39265e"</span>,</div><div style="background-color: #fffffe;"> <span style="color: #a31515;">"contactNumber"</span>: <span style="color: #0451a5;">"CT000001"</span>,</div><div style="background-color: #fffffe;"> <span style="color: #a31515;">"contactName"</span>: <span style="color: #0451a5;">"Adatum Corporation"</span>,</div><div style="background-color: #fffffe;"> <span style="color: #a31515;">"contactType"</span>: <span style="color: #0451a5;">"Company"</span>,</div><div style="background-color: #fffffe;"> <span style="color: #a31515;">"relatedId"</span>: <span style="color: #0451a5;">"461d8d2a-464e-ec11-bb7e-000d3a39265e"</span>,</div><div style="background-color: #fffffe;"> <span style="color: #a31515;">"relatedType"</span>: <span style="color: #0451a5;">"Customer"</span></div><div style="background-color: #fffffe;"> },</div><div style="background-color: #fffffe;"> {</div><div style="background-color: #fffffe;"> <span style="color: #a31515;">"@odata.etag"</span>: <span style="color: #0451a5;">"W/\"JzQ0O01JdGtxcUxla0d6MDJHWnl0VklOdnNlUy9uMjZGWVdDeFJ2VisySGxINTg9MTswMDsn\""</span>,</div><div style="background-color: #fffffe;"> <span style="color: #a31515;">"contactId"</span>: <span style="color: #0451a5;">"ef01222f-464e-ec11-bb7e-000d3a39265e"</span>,</div><div style="background-color: #fffffe;"> <span style="color: #a31515;">"contactNumber"</span>: <span style="color: #0451a5;">"CT000002"</span>,</div><div style="background-color: #fffffe;"> <span style="color: #a31515;">"contactName"</span>: <span style="color: #0451a5;">"Robert Townes"</span>,</div><div style="background-color: #fffffe;"> <span style="color: #a31515;">"contactType"</span>: <span style="color: #0451a5;">"Person"</span>,</div><div style="background-color: #fffffe;"> <span style="color: #a31515;">"relatedId"</span>: <span style="color: #0451a5;">"461d8d2a-464e-ec11-bb7e-000d3a39265e"</span>,</div><div style="background-color: #fffffe;"> <span style="color: #a31515;">"relatedType"</span>: <span style="color: #0451a5;">"Customer"</span></div><div style="background-color: #fffffe;"> }</div><div style="background-color: #fffffe;"> ]</div><div style="background-color: #fffffe;">}</div></div></blockquote><p><br /></p><p>So now that I have the contacts for the customer, what if I want to filter those contacts? Perhaps I only want to see records with contactType = "Person". How do you use $filter to achieve that? </p><p>If you try this:</p><p class="MsoNormal" style="background: rgb(255, 255, 254); line-height: 15.75pt;"><span style="font-family: courier;"><span style="color: #0451a5; font-size: 10.5pt;"> </span>/customers({{customerid}})?$expand=contactsInformation&$filter=contactType
eq 'Person'</span><o:p></o:p></p><p>You will get this error:</p><div style="background-color: #fffffe; font-family: Consolas, "Courier New", monospace; font-size: 14px; line-height: 21px; white-space: pre;"><div> <span style="color: #a31515;">"code"</span>: <span style="color: #0451a5;">"BadRequest"</span>,</div><div> <span style="color: #a31515;">"message"</span>: <span style="color: #0451a5;">"Could not find a property named 'contactType' on type 'Microsoft.NAV.customer'."
</span></div></div><p>Because the $filter is applied on the "parent" customer record, there is no contactType field available.</p><p>So what if we try this:</p><p><span style="font-family: courier;"><span> </span>/customers({{customerid}})?$expand=contactsInformation&$filter=contactsInformation/contactType eq 'Person'</span></p><p><br /></p><p>Well, that won't work either. You'll get this error:</p><div style="background-color: #fffffe; font-family: Consolas, "Courier New", monospace; font-size: 14px; line-height: 21px; white-space: pre;"><div> <span style="color: #a31515;">"code"</span>: <span style="color: #0451a5;">"BadRequest"</span>,</div><div> <span style="color: #a31515;">"message"</span>: <span style="color: #0451a5;">"The parent value for a property access of a property 'contactType' is not a single value. Property access can only be applied to a single value."</span></div></div><p><br /></p><p>So, how do we filter the records in a "child" array? This is the way:</p><p><span> </span><span style="font-family: courier;">/customers({{customerid}})?$expand=<span style="background-color: #fcff01;">contactsInformation($filter=contactType eq 'Person')</span></span></p><p><br /></p><p>That gives you this response, with only the Person contact type in the contactsInformation array:</p><div style="background-color: #fffffe; font-family: Consolas, "Courier New", monospace; font-size: 14px; line-height: 21px; white-space: pre;"><div> <span style="color: #a31515;">"lastModifiedDateTime"</span>: <span style="color: #0451a5;">"2021-11-25T23:20:30.547Z"</span>,</div><div> <span style="color: #a31515;">"contactsInformation"</span>: [</div><div> {</div><div> <span style="color: #a31515;">"@odata.etag"</span>: <span style="color: #0451a5;">"W/\"JzQ0O01JdGtxcUxla0d6MDJHWnl0VklOdnNlUy9uMjZGWVdDeFJ2VisySGxINTg9MTswMDsn\""</span>,</div><div> <span style="color: #a31515;">"contactId"</span>: <span style="color: #0451a5;">"ef01222f-464e-ec11-bb7e-000d3a39265e"</span>,</div><div> <span style="color: #a31515;">"contactNumber"</span>: <span style="color: #0451a5;">"CT000002"</span>,</div><div> <span style="color: #a31515;">"contactName"</span>: <span style="color: #0451a5;">"Robert Townes"</span>,</div><div> <span style="color: #a31515;">"contactType"</span>: <span style="color: #0451a5;">"Person"</span>,</div><div> <span style="color: #a31515;">"relatedId"</span>: <span style="color: #0451a5;">"461d8d2a-464e-ec11-bb7e-000d3a39265e"</span>,</div><div> <span style="color: #a31515;">"relatedType"</span>: <span style="color: #0451a5;">"Customer"</span></div><div> }</div><div> ]</div></div><p><br /></p><p>After AJ showed me how to do this, I did find an example in the OData documentation, but you really have to know what you are looking for to see it.</p><p><a href="http://docs.oasis-open.org/odata/odata/v4.0/os/part2-url-conventions/odata-v4.0-os-part2-url-conventions.html#_Toc372793860">http://docs.oasis-open.org/odata/odata/v4.0/os/part2-url-conventions/odata-v4.0-os-part2-url-conventions.html#_Toc372793860</a></p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEgUoX5uE3f4vlFkdddK-E1PjEf7Oeeh93neR4Ny_yrbERJOPUaCotDEz-6aAOh5SOWlD5jZic5XY9bCF0dpzMnik1qCjkWKOYc409NYOyfwqz2D8SS3YJso_IHMHuhcch4zNEbh8aI4YqTIbUkjA1o8gabIgsFO5lIxJRcLxZm-iVxC3J6somvwfStgfg=s831" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="190" data-original-width="831" height="91" src="https://blogger.googleusercontent.com/img/a/AVvXsEgUoX5uE3f4vlFkdddK-E1PjEf7Oeeh93neR4Ny_yrbERJOPUaCotDEz-6aAOh5SOWlD5jZic5XY9bCF0dpzMnik1qCjkWKOYc409NYOyfwqz2D8SS3YJso_IHMHuhcch4zNEbh8aI4YqTIbUkjA1o8gabIgsFO5lIxJRcLxZm-iVxC3J6somvwfStgfg=w400-h91" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Like finding a tiny footnote in a giant book</td></tr></tbody></table><br /><br /><p>I hope that made sense and helps someone else out there looking to use this type of array filtering!</p><p><br /></p><p style="background-color: white; color: #444444; font-family: Arimo; font-size: 15.4px;"><i style="font-family: arimo; font-size: 15.4px;">Steve Endow is a Microsoft MVP in Los Angeles. He works with Dynamics 365 Business Central.</i></p><p style="background-color: white; color: #444444; font-family: Arimo; font-size: 15.4px;"><i style="font-family: arimo; font-size: 15.4px;">You can also find him on <a href="https://www.blogger.com/blog/post/edit/7763553249079245585/5039226310633470520#" style="color: #2288bb; text-decoration-line: none;">Twitter</a> and <a href="https://www.blogger.com/blog/post/edit/7763553249079245585/5039226310633470520#" style="color: #2288bb; text-decoration-line: none;">YouTube</a></i></p></div></div>Steve Endowhttp://www.blogger.com/profile/03950475674093020502noreply@blogger.com0tag:blogger.com,1999:blog-7763553249079245585.post-85195478590283927482021-11-15T10:28:00.009-08:002021-12-06T07:54:29.312-08:00Troubleshooting BcContainerHelper Docker Build Errors on Windows 10 versions 21H1 and 21H2<p>by Steve Endow</p><p>If you've been using Docker Desktop on Windows 10 to build Business Central Docker containers with BcContainerHelper, you have likely encountered build errors for some reason.</p><p><a href="https://twitter.com/freddydk" target="_blank">Freddy Kristiansen</a> has been constantly working to improve BcContainerHelper to deal with weird Windows version issues and Docker Desktop quirks, but it seems that Windows 10 versions 21H1 and 21H2 are currently causing some build errors, despite Freddy's best efforts.</p><p>If you are unsure which Windows 10 "version" you have, you can click on the Windows Start button and type "winver". </p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEiTFxtT17-nOkvmVUg_dVRyACfeeUJL8vM7VYE0VrCVmLiLH-ngf-gk0VuAsgEX7uaysUokU_5VBT8gmJS4VSOMJ2KoU6yjdmCrGONpSmnv7W9Epz3mS1OO0mBdDUDdrXVgcDG84GR3RQNsp6bZKmlRWorMhWp1YvKDwMIhEdl84HzN3kbLGvBpr2cfpg=s575" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="320" data-original-width="575" height="223" src="https://blogger.googleusercontent.com/img/a/AVvXsEiTFxtT17-nOkvmVUg_dVRyACfeeUJL8vM7VYE0VrCVmLiLH-ngf-gk0VuAsgEX7uaysUokU_5VBT8gmJS4VSOMJ2KoU6yjdmCrGONpSmnv7W9Epz3mS1OO0mBdDUDdrXVgcDG84GR3RQNsp6bZKmlRWorMhWp1YvKDwMIhEdl84HzN3kbLGvBpr2cfpg=w400-h223" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Windows 10 - Version 21H2</td></tr></tbody></table><br /><p>I've reviewed a few <a href="https://github.com/microsoft/navcontainerhelper/issues" target="_blank">issues on the BcContainer GitHub repository</a> while helping a few people troubleshoot BC container build issues recently, and it appears there are currently 3 techniques to try and resolve errors when using Docker Desktop and BcContainerHelper on Windows 10 versions 21H1 and 21H2.</p><p>As of November 2021, if you are using Windows 10 version 21H1 or 21H2, you should see this warning from BcContainerHelper during the build process.</p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEgiPXRTzOqsFQI7NnMkK0_JPAocqbvwuglx8c2Mfy9VD5pRvy3FSqeKnjgbDWa6JIblAqxlrmzuedtdBlaqpHYa6kagDkecTjwwGnuDxN4--x7ehUFpmnt3AGoACJ9FHjEYnibH9_JTE8x8YdnS25Y1fvEwBXqWW2aS5-LqozPg5Q6cN4eSWsenUphZ9g=s1307" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="168" data-original-width="1307" height="82" src="https://blogger.googleusercontent.com/img/a/AVvXsEgiPXRTzOqsFQI7NnMkK0_JPAocqbvwuglx8c2Mfy9VD5pRvy3FSqeKnjgbDWa6JIblAqxlrmzuedtdBlaqpHYa6kagDkecTjwwGnuDxN4--x7ehUFpmnt3AGoACJ9FHjEYnibH9_JTE8x8YdnS25Y1fvEwBXqWW2aS5-LqozPg5Q6cN4eSWsenUphZ9g=w640-h82" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Windows 10 21H1 / 21H2 Warning Message</td></tr></tbody></table><br /><p>If you do see this message during your build, do not be surprised if the Docker Container build process fails.</p><p>Here's an example of one type of error that may occur: "Docker Build failed with exit code -1"</p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEhnieKS4aFQd1DrgLuA_C46a8KdY7jYNPMSnlxobt7NWPSUTm280gE-9YFhpr4ttrnzMwN_7Kimarr_osQRmzYt3FcD7vX3lvgTFypQxBInS9Tqe8YnGcaAdxPeRll1sBXGaBpeYZInJhTUpbkBBSWHcZVaXBsVhWiqjAnx65Wk0vGld6j0_VM-jGdG1A=s1203" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="267" data-original-width="1203" height="142" src="https://blogger.googleusercontent.com/img/a/AVvXsEhnieKS4aFQd1DrgLuA_C46a8KdY7jYNPMSnlxobt7NWPSUTm280gE-9YFhpr4ttrnzMwN_7Kimarr_osQRmzYt3FcD7vX3lvgTFypQxBInS9Tqe8YnGcaAdxPeRll1sBXGaBpeYZInJhTUpbkBBSWHcZVaXBsVhWiqjAnx65Wk0vGld6j0_VM-jGdG1A=w640-h142" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Docker Build failed with exit code -1</td></tr></tbody></table><br /><p>Here are the 4 workarounds that seem to help resolve errors on the newer versions of Windows 10.</p><p><br /></p><p>1. <b>Temporarily disable Windows Defender Real-time Protection</b> (under "Windows Security"). It seems that Windows Defender real-time virus scanning is interfering with the Docker Container build process, and either causing some type of file lock, or a quarantine, that is interfering with the build process. Disabling the Real-time protection stops the file scanning, which may resolve your build error.</p><p>After the container is successfully created, you can re-enable the Real-time protection. (but you'll probably need to turn it back off again temporarily the next time you create a new container)</p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEhKmxr0pnqxcsKb5_B0XaiLTZtRT20yxEbn7MNUwwlGe9rPhUWA3_6kjqy-X3ohubVOSC8KmP9AydVXT-zgr-nhpg18YW18ecSYyZn-JRoHBeAjG-3jNrO7KzJIRNAax0NfHqOoYgWQi0mCIN_kCMiFiVl8k6oiOwkoHsWMMcnquzSc9DeTOSh7RPqPXw=s514" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="306" data-original-width="514" height="239" src="https://blogger.googleusercontent.com/img/a/AVvXsEhKmxr0pnqxcsKb5_B0XaiLTZtRT20yxEbn7MNUwwlGe9rPhUWA3_6kjqy-X3ohubVOSC8KmP9AydVXT-zgr-nhpg18YW18ecSYyZn-JRoHBeAjG-3jNrO7KzJIRNAax0NfHqOoYgWQi0mCIN_kCMiFiVl8k6oiOwkoHsWMMcnquzSc9DeTOSh7RPqPXw=w400-h239" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Windows Defender Real-time protection setting</td></tr></tbody></table><br /><br />2. <b>Completely disable Windows Defender temporarily</b> (under "Windows Security"). A developer shared with me that he had previously been able to disable Defender Real-time Protection to build BC Docker Containers, but recently, that stopped working. When he completely disabled <br /><br /><br /><p>3. <b>Remove the imageName parameter from the BcContainerHelper script</b>. I saw this mentioned in a <a href="https://github.com/microsoft/navcontainerhelper/issues/2004" target="_blank">GitHub Issue</a>, and it <a href="https://twitter.com/MatthewPerren1/status/1460024624557744129?s=20" target="_blank">seems to have worked for Matthew Perren</a>.</p><p>I don't know if the image creation process is triggering an error directly, or if skipping the named image process avoids a potential issue with Defender that is causing the problem. But if disabling Defender Real-time protection alone doesn't work, try removing imageName.</p><p><br /></p><p>4. <b>Try adding the "-isolation hyperv" parameter to the BcContainerHelper script</b>. This used to be the go-to solution for a version mismatch between the host OS and the container OS, but it seems that with 21H1 and 21H2 the isolation mode does not always resolve build errors.</p><p><br /></p><p>If you do encounter container build issues with Windows 10 version 21H1 or 21H2, please let me know if one of the steps above worked for you, or if you found a different solution to your build error.</p><p><br /></p><p style="background-color: white; color: #444444; font-family: Arimo; font-size: 15.4px;"><i style="font-family: arimo; font-size: 15.4px;">Steve Endow is a Microsoft MVP in Los Angeles. He works with Dynamics 365 Business Central.</i></p><p style="background-color: white; color: #444444; font-family: Arimo; font-size: 15.4px;"><i style="font-family: arimo; font-size: 15.4px;">You can also find him on <a href="https://www.blogger.com/blog/post/edit/7763553249079245585/5039226310633470520#" style="color: #2288bb; text-decoration-line: none;">Twitter</a> and <a href="https://www.blogger.com/blog/post/edit/7763553249079245585/5039226310633470520#" style="color: #2288bb; text-decoration-line: none;">YouTube</a></i></p>Steve Endowhttp://www.blogger.com/profile/03950475674093020502noreply@blogger.com1tag:blogger.com,1999:blog-7763553249079245585.post-70466124656536008292021-11-08T14:31:00.003-08:002021-11-08T14:31:14.956-08:00Business Central Chat with Stefan Maroń: Designing Complex Pages in BC<p> by Steve Endow</p><p><a href="https://twitter.com/StefanMaron" target="_blank">Stefan Maroń</a> was kind enough to have an impromptu live stream with me today to help me understand how to design complex pages in Business Central. We discussed how I might develop replicate the functionality of the .NET interface of my "Data Generator" application in a Business Central page.</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEiCXZJnIZsOmJcLFKvS39HRkrdt835f2SRl-dJbGfSXxVC3rCGTOICY0GlBMhYS4wpM7voQKAOkKZQjGVlP9o4b3uN8oI-szkaTfS2wod_G2VKhfQW1cbIfe1oxAv0G7yUMZDGpVUMS5_NvTE7zNv0A3lsW6PKpR853i7pay_COmJ3kYiYkd71PbXpZSg=s1922" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1082" data-original-width="1922" height="180" src="https://blogger.googleusercontent.com/img/a/AVvXsEiCXZJnIZsOmJcLFKvS39HRkrdt835f2SRl-dJbGfSXxVC3rCGTOICY0GlBMhYS4wpM7voQKAOkKZQjGVlP9o4b3uN8oI-szkaTfS2wod_G2VKhfQW1cbIfe1oxAv0G7yUMZDGpVUMS5_NvTE7zNv0A3lsW6PKpR853i7pay_COmJ3kYiYkd71PbXpZSg=w320-h180" width="320" /></a></div><br /><p>In addition to designing the UI of a data generator, Stefan shares some very valuable information about how to process background tasks in Business Central, which I was unfamiliar with.</p><p>Here is a link to the "Coding4Performance" series on his blog:</p><p> <a href="https://stefanmaron.com/?s=Coding4Performance" target="_blank">https://stefanmaron.com/?s=Coding4Performance</a></p><p><br /></p><p>Here is the recording of our discussion:</p><div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen="" class="BLOG_video_class" height="344" src="https://www.youtube.com/embed/bcWSwIjZSG8" width="480" youtube-src-id="bcWSwIjZSG8"></iframe></div><br /><p style="text-align: center;"><a href="https://www.youtube.com/watch?v=bcWSwIjZSG8" target="_blank">https://www.youtube.com/watch?v=bcWSwIjZSG8</a></p><p><br /></p><p style="background-color: white; color: #444444; font-family: Arimo; font-size: 15.4px;"><i style="font-family: arimo; font-size: 15.4px;">Steve Endow is a Microsoft MVP in Los Angeles. He works with Dynamics 365 Business Central, Microsoft Power Automate, Power Apps, Azure, and .NET.</i></p><p style="background-color: white; color: #444444; font-family: Arimo; font-size: 15.4px;"><i style="font-family: arimo; font-size: 15.4px;">You can also find him on <a href="https://www.blogger.com/blog/post/edit/7763553249079245585/5039226310633470520#" style="color: #2288bb; text-decoration-line: none;">Twitter</a> and <a href="https://www.blogger.com/blog/post/edit/7763553249079245585/5039226310633470520#" style="color: #2288bb; text-decoration-line: none;">YouTube</a></i></p>Steve Endowhttp://www.blogger.com/profile/03950475674093020502noreply@blogger.com0tag:blogger.com,1999:blog-7763553249079245585.post-8266845239462215662021-10-31T12:35:00.006-07:002021-10-31T12:35:35.879-07:00Learning Business Central Development - Season 2 - Episode 1<p> by Steve Endow</p><p>I have needed good test data in Business Central for many months, but I just haven't gotten around to finding a good import tool or writing code. There are several options, so I kept weighing the pros and cons of each, and sure enough, never chose one and still don't have a tool for creating reliable test data in Business Central.</p><p>In addition to not setting up a tool for test data, I also have not had the time to write any AL code. I've been busy with other things while our developer focuses on writing AL code, so the little bit of AL knowledge I had has been fading for months.</p><p>That is finally about to change. It's time for me to continue my AL code learning and create a "data generator" tool, so I'm going to combine both of those tasks into one project.<br /></p><p>Introducing "<a href="https://www.youtube.com/playlist?list=PL79Z40BeLOVl-LGmK6-Gng8JZN_SzWkNm" target="_blank">Learning BC Development: Season 2</a>"! (following the <a href="https://www.youtube.com/playlist?list=PL79Z40BeLOVlPWHLoHAH3-8-kLO679EVg" target="_blank">Learning BC Development From Scratch video series</a>)</p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjokwW3RYTwNtvNQt8ggs1frKgUYPQkpoDLZ7wZp-20qaU1dBRX0xRfinBlm8LDtfbF-G-ZOMyJr551zwGJw7EdZNHOFN0cqYyb_YbO8vj1J0nC3pzj2oDA_fb_MbS_bPz08wnpA4akzZTq/" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="434" data-original-width="801" height="216" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjokwW3RYTwNtvNQt8ggs1frKgUYPQkpoDLZ7wZp-20qaU1dBRX0xRfinBlm8LDtfbF-G-ZOMyJr551zwGJw7EdZNHOFN0cqYyb_YbO8vj1J0nC3pzj2oDA_fb_MbS_bPz08wnpA4akzZTq/w400-h216/image.png" width="400" /></a></div><br /><p></p><p>In this "season", I'm going to learn how to develop a test data generator for Business Central. I'm going to use the AL language to create custom windows and tables and codeunits as part of a custom Business Central application.</p><p>I don't really know what I'm doing or how I'm going to develop the application, but I'm going to give it a try and learn along the way.</p><p>Videos will be live streamed on Twitter, YouTube, and Twitch, but will be saved as recordings on YouTube. </p><p>If you have any questions or comments, you can post a comment on this blog post, or a comment on the <a href="https://www.youtube.com/steveendow" target="_blank">YouTube video</a>. Or you can send me a Tweet or <a href="https://twitter.com/steveendow" target="_blank">DM on Twitte</a>r.</p><p>Here's the video:</p><div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen="" class="BLOG_video_class" height="355" src="https://www.youtube.com/embed/Z0fgHDoiUnk" width="427" youtube-src-id="Z0fgHDoiUnk"></iframe></div><div><br /></div><div style="text-align: center;"><a href="https://www.youtube.com/watch?v=Z0fgHDoiUnk" target="_blank">https://www.youtube.com/watch?v=Z0fgHDoiUnk</a></div><p><br /></p><p style="background-color: white; color: #444444; font-family: Arimo; font-size: 15.4px;"><i style="font-family: arimo; font-size: 15.4px;">Steve Endow is a Microsoft MVP in Los Angeles. He works with Dynamics 365 Business Central, Microsoft Power Automate, Power Apps, Azure, and .NET.</i></p><p style="background-color: white; color: #444444; font-family: Arimo; font-size: 15.4px;"><i style="font-family: arimo; font-size: 15.4px;">You can also find him on <a href="https://www.blogger.com/blog/post/edit/7763553249079245585/5039226310633470520#" style="color: #2288bb; text-decoration-line: none;">Twitter</a> and <a href="https://www.blogger.com/blog/post/edit/7763553249079245585/5039226310633470520#" style="color: #2288bb; text-decoration-line: none;">YouTube</a></i></p>Steve Endowhttp://www.blogger.com/profile/03950475674093020502noreply@blogger.com0tag:blogger.com,1999:blog-7763553249079245585.post-24829641836526711432021-10-05T16:39:00.011-07:002021-10-06T12:53:52.907-07:00Docker Engine Enterprise and Mirantis Container Runtime for Business Central Developers<p>by Steve Endow</p><p><i><b>NOTE:</b> This post relates to Docker Engine Enterprise and Mirantis Container Runtime on <b>Windows Server</b>. I don't believe this relates to or affects Docker Desktop. But let me know if I missed anything regarding Docker Desktop, and let me know if I have any details wrong regarding Mirantis Container Runtime and its use with BcContainerHelper and Business Central Docker containers.</i></p><div><br /><p></p><p>On September 27, 2021, Tobias Fenster shared a <a href="https://techcommunity.microsoft.com/t5/containers/updates-to-the-windows-container-runtime-support/ba-p/2788799" target="_blank">Microsoft announcement</a> about the future of Docker Engine Enterprise, sometimes referred to as "Docker EE". </p><p></p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqGAgc6sSWCs3vnpDsLPs9YuEEspbyrcJmd0OppzZSMPg7_x1K2YNwziCE8A0zi75XgSebWhtvPmPxEn7Vz39asSOiONBm1ZxWyjd8ekgQdXZ7M3X1MBEd2XuguOYPy51LEhROpf5n4h9e/" style="margin-left: auto; margin-right: auto;"><img alt="" data-original-height="521" data-original-width="578" height="361" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqGAgc6sSWCs3vnpDsLPs9YuEEspbyrcJmd0OppzZSMPg7_x1K2YNwziCE8A0zi75XgSebWhtvPmPxEn7Vz39asSOiONBm1ZxWyjd8ekgQdXZ7M3X1MBEd2XuguOYPy51LEhROpf5n4h9e/w400-h361/image.png" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;"><span style="background-color: white; font-size: 15px; text-align: start; white-space: pre-wrap;"><a href="https://twitter.com/tobiasfenster/status/1442533006812631047?s=20">https://twitter.com/tobiasfenster/status/1442533006812631047?s=20</a></span></td></tr></tbody></table><br /><br />This Microsoft announcement comes <a href="https://techcrunch.com/2019/11/13/mirantis-acquires-docker-enterprise/" target="_blank">almost 2 years after Docker was acquired</a> by a company named Mirantis, in November 2019.<p></p><p>The Microsoft announcement indicates that <u>technical support</u> for the Mirantis Container Runtime will be transitioned to Mirantis.</p><p><a href="https://www.mirantis.com/blog/windows-server-container-users-mirantis-is-here-to-support-you/" target="_blank">Mirantis also published a post</a> explaining the transition, and discussing options for receiving support for Mirantis Container Runtime (aka "MCR"), and free licenses for up to 9 "nodes" for <b>Windows Server </b>users.</p><p><br /></p><p><b><u>So what does this mean for Business Central developers who use Windows Server?</u></b></p><p>When I first read the <a href="https://www.mirantis.com/blog/windows-server-container-users-mirantis-is-here-to-support-you/" target="_blank">Mirantis blog post</a>, I assumed I would need to contact Mirantis to take advantage of their "special offer" to receive a free license for MCR for my Business Central development on <b>Windows Server</b>.</p><p><a href="https://info.mirantis.com/docker-engine-support" target="_blank">This page on the Mirantis web site</a> explains the "beta pricing" offer is available until December 31, 2021.</p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKP2IwR4WJGLgJI1nQrM1IvNhWhnwrvnPh1Bb0lFfS1Pl_3lKiPOxsZ08K6-Hm3Hx4hIlhrpq2M-D8aPNuGfTmPnDH5df6i30LOYhm_vXHrSTueSlXnEARtsME7IhpMSYHRnALiHZ7a6KF/" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="526" data-original-width="649" height="324" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKP2IwR4WJGLgJI1nQrM1IvNhWhnwrvnPh1Bb0lFfS1Pl_3lKiPOxsZ08K6-Hm3Hx4hIlhrpq2M-D8aPNuGfTmPnDH5df6i30LOYhm_vXHrSTueSlXnEARtsME7IhpMSYHRnALiHZ7a6KF/w400-h324/image.png" width="400" /></a></div><br />I thought that I would request licenses for a few nodes, which would cost me $0. But, that would NOT include any support. <p></p><p>I'm okay with the $0 price tag, and if I did need support for some reason, I would be open to paying a reasonable price for support. I would even be open to paying $50 per node to receive limited support, but based on the information on the web page shown above, it is not included by default with the 1-9 or 10-50 note packages by default. But it may be possible to purchase support separately for 50 nodes or less.</p><p>I'm assuming that after December 31, 2021, Mirantis will come up with new pricing, and MCR will not be free for Windows users.</p><p><br /></p><p><b><u>What about "Moby"?</u></b></p><p>But today I re-read <a href="https://www.mirantis.com/blog/windows-server-container-users-mirantis-is-here-to-support-you/" target="_blank">the Mirantis blog post</a> and noticed this.</p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrmRiAFpv7UXzbqS4B4vcpcEdMW3T6mMZSggx2lLDmN1fOWDNlo04vI6ochVh7-DApPiFaxG6PEPoRPjju6A_iyNPWrJHprEBm_BAqv78M6pAQs26j-JtR68BuxDMkwi6IKn_k74oT9hRg/" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="337" data-original-width="549" height="245" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrmRiAFpv7UXzbqS4B4vcpcEdMW3T6mMZSggx2lLDmN1fOWDNlo04vI6ochVh7-DApPiFaxG6PEPoRPjju6A_iyNPWrJHprEBm_BAqv78M6pAQs26j-JtR68BuxDMkwi6IKn_k74oT9hRg/w400-h245/image.png" width="400" /></a></div><br />Wait, what?<p></p><p>I'm a Business Central "developer". I am not using my containers in "production".</p><p>Does that mean that I can use the "default Moby engine"? Whatever that means?</p><p>I posted my initial thoughts about this to the hive mind called Twitter:</p><p></p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7MTcrf3d2IG1dTqDmEo2bXqEcxrKPRoqPTqMsRRZGjz6uSaLBqdtYA2GyfsEvKhLgdZbq83sZo7zDTtUNVM3qKVP6aszPz_gYMLSiGrcnux1Uj2lwpbmeMptHHmTYHyV01XziZV3HsYqG/" style="margin-left: auto; margin-right: auto;"><img alt="" data-original-height="529" data-original-width="582" height="364" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7MTcrf3d2IG1dTqDmEo2bXqEcxrKPRoqPTqMsRRZGjz6uSaLBqdtYA2GyfsEvKhLgdZbq83sZo7zDTtUNVM3qKVP6aszPz_gYMLSiGrcnux1Uj2lwpbmeMptHHmTYHyV01XziZV3HsYqG/w400-h364/image.png" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;"><a href="https://twitter.com/steveendow/status/1445494238955720713">https://twitter.com/steveendow/status/1445494238955720713</a></td></tr></tbody></table><br /><br /><p></p><p>I tagged our resident Business Central Docker expert, <a href="https://twitter.com/tobiasfenster" target="_blank">Tobias Fenster</a> to see if I was missing anything.</p><p>I'm glad I tagged him, because he shared some important information about how Docker works and additional considerations about the Mirantis announcement that I believe are pretty important to Business Central developers.</p><p>Tobias replied, and mentioned that the free Moby engine has "No client component".</p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_Anliw-CgEGWmu4M-hpheUPO_1WYBjGgiebLpcQhGifwgnPlnYsv5akpHAzU3stFK3NZX_pdwrJX_cqo1_abDaDG1W0I6msG_Sc4Pm2HFO7xhFhGdrDCOYgb9kALmk7iSkWfAPleg9jZ5/" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="230" data-original-width="578" height="159" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_Anliw-CgEGWmu4M-hpheUPO_1WYBjGgiebLpcQhGifwgnPlnYsv5akpHAzU3stFK3NZX_pdwrJX_cqo1_abDaDG1W0I6msG_Sc4Pm2HFO7xhFhGdrDCOYgb9kALmk7iSkWfAPleg9jZ5/w400-h159/image.png" width="400" /></a></div><br />I didn't know what this meant, so he generously explained further.<p></p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYGuh6-ZzQ_tgSGPO6mRR6PQw0WaRHdGwpAZfxd6dIqEuGrULTE2PQUEu6vC-OWoeM2IwoDFBpFCsufM-olwEjOIqDWFR8eyyn5YGCOg3BcrVBi2OGGB2IkdSxXSsJL3O-sbQj4_vzAPyr/" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="234" data-original-width="582" height="161" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYGuh6-ZzQ_tgSGPO6mRR6PQw0WaRHdGwpAZfxd6dIqEuGrULTE2PQUEu6vC-OWoeM2IwoDFBpFCsufM-olwEjOIqDWFR8eyyn5YGCOg3BcrVBi2OGGB2IkdSxXSsJL3O-sbQj4_vzAPyr/w400-h161/image.png" width="400" /></a></div><p>So while we could run BC containers using Moby, technically we would not have a docker.exe "client" to manage or create the containers on <b>Windows Server</b>.</p><p><br /></p><p><b><u>It seems we will need MCR</u></b></p>You can <a href="https://twitter.com/tobiasfenster/status/1445498129218883593?s=20" target="_blank">read the rest of the Twitter thread</a> if you would like, but after a few more questions from me, and answers from Tobias, these are the points I think are important for BC developers <b>who use Docker Engine Enterprise on Windows Server</b>.<p></p><p>1. If you do NOT get a license for the Mirantis Container Runtime (MCR), and choose to use the "Moby engine", that is ONLY the "server" (daemon) portion of the solution. Moby will allow you to host containers, but technically, that does not include the docker.exe "client" or any tools or utilities to help you manage your containers. You could try to find other Docker tools, but Tobias suspects that limited interest in Docker on Windows means limited options for Docker tools on Windows.</p><p>2. As a Business Central developer, I regularly use the docker.exe "client" command in PowerShell to manage containers and images. So I believe I will still need that, and therefore will need MCR.</p><p>3. The BcContainerHelper PowerShell module that BC developers use to create Business Central containers relies on the docker.exe "client" tool to create and maintain and interact with containers, so I assume that the full MCR solution will be required in order to continue using BcContainerHelper. (there may be other ways to download a docker.exe client or equivalent, but I have no yet researched that)</p><p><br /></p><p>Given this, I will want to request the MCR licenses from Mirantis so that I can have access to the full MCR product suite on my Windows Servers and continue to reliably use BcContainerHelper.</p><p><br /></p><p>If you are aware of other solutions that provide a Docker client and related tools on Windows Server and work well with BcContainerHelper, please let me know.</p><p><br /></p><p style="background-color: white; color: #444444; font-family: Arimo; font-size: 15.4px;"><i style="font-family: arimo; font-size: 15.4px;">Steve Endow is a Microsoft MVP in Los Angeles. He works with Dynamics 365 Business Central, Microsoft Power Automate, Power Apps, Azure, and .NET.</i></p><p style="background-color: white; color: #444444; font-family: Arimo; font-size: 15.4px;"><i style="font-family: arimo; font-size: 15.4px;">You can also find him on <a href="https://www.blogger.com/blog/post/edit/7763553249079245585/5039226310633470520#" style="color: #2288bb; text-decoration-line: none;">Twitter</a> and <a href="https://www.blogger.com/blog/post/edit/7763553249079245585/5039226310633470520#" style="color: #2288bb; text-decoration-line: none;">YouTube</a></i></p></div>Steve Endowhttp://www.blogger.com/profile/03950475674093020502noreply@blogger.com0