tag:blogger.com,1999:blog-42112131649204514812024-02-02T03:42:47.511-07:00DMS BlogMicrosoft Dynamics ERP, IT Solutions, Software Development, and Other Random Thoughts.Dynamic Manufacturing Solutionshttp://www.blogger.com/profile/12694920969455017434noreply@blogger.comBlogger16125tag:blogger.com,1999:blog-4211213164920451481.post-16139640671206315792015-06-19T10:16:00.001-06:002015-06-19T10:16:30.422-06:00Feeding the Dataport<h4>
Please note that all DMS news and blog content has been moved to the main website at <a href="http://www.dynms.com/">www.dynms.com</a> for a categorized view.</h4>
<h4>
All utilities and downloads are available at <a href="http://www.dmsiworks.com/microsoft-dynamics-nav-resources/software-downloads">www.dmsiworks.com</a></h4>
<br />
In a previous post, we introduced the <a href="http://blog.dynms.com/2012/06/introducing-dms-universal-dataport.html" target="_blank">Universal Dataport</a> – a tool that can import a simple text file into any NAV table, complete with validations and change log. The Universal Dataport (UDP) is a useful tool for importing data once NAV is in production, but is even more useful when doing the initial imports from legacy systems during new implementations. The tricky part of these initial imports is actually obtaining and mapping the legacy data to NAV before feeding it into the UDP. A number of years ago we developed a fairly simple spreadsheet-based tool to help define field mappings from legacy systems and to generate a file that easily feeds the UDP.<br />
<br />
Often during implementations you won’t import data just once – normally we’ll do an initial import into a pilot or staging NAV database to highlight missing data elements, aid in discovery sessions, and perform initial training. This initial import is never good enough to “go live” with, and is usually drastically out of date by the time go-live comes around. So what ends up happening is that we do a number of imports, tweaking the data cleanup rules and the mappings as the requirements get more refined. To be efficient, we’d rather not start from scratch with raw exports from the legacy system and a ton of manual editing and reformatting each time we need to do an import.<br />
<br />
This is where the spreadsheet (DMSDataMap to be specific) comes in – it lets you create a mapping between NAV fields and the legacy data that you can save, tweak, and reuse multiple times. (Being able to save the mapping rules is also great if there is a post-implementation audit by an external auditor).<br />
<br />
The DMSDataMap uses the power of SQL to map NAV fields to a legacy field or expression. This, of course, means that the legacy data needs to be in an ODBC-compliant database, with SQL Server being the preferred choice (“ODBC-compliant” does not mean we have the same range of SQL functionality provided by SQL Server). “But”, you say, “most of the time my data comes to me in Excel or text files”. No problem – SQL Server has a handy SSIS wizard to automagically import Excel spreadsheets (and other files) into new tables. See this <a href="http://msdn.microsoft.com/en-us/library/ms140052" target="_blank">MSDN article</a> on the wizard (there are also lots of other step-by-step examples out there).<br />
<br />
So whether you started with the data in an existing ODBC-compliant database or you moved the data to SQL, we now have the data in a repository we can access with the DMSDataMap tools. Let’s walk through an example of importing item data from a legacy table already in SQL. First, we open the workbook and enable the macros (the macros are available in a text file with the download for you to examine before enabling them if you like). The workbook has three sheets in it: a “Notes” sheet for notes on this mapping, a “Mapping” sheet for the actual field mapping, and a “Query” sheet for defining the source database and exporting data.<br />
<br />
<<spreadsheet pic>><br />
<br />
The first thing we’ll do is bring in the NAV field names. Open the Object Designer and design table 27 (Item). In the table designer, show the “Field Type” column and filter on “Normal” to exclude any flow fields and flow filters. <br />
<br />
<<filtered fields pic>><br />
<br />
Select and copy all the rows in the designer and paste into a blank sheet, then copy the list of field names into the DataMap “Mapping” sheet. You should end up with something like the list below (which you can sort alphabetically to make it easier to find the fields).<br />
<br />
<<nav fields pic>><br />
<br />
The next step is to map the available and/or required fields (or expressions) from the legacy table to the appropriate NAV fields, and indicate which ones need to be validated by the UDP as they’re imported. Here’s a sample of some of the mapped fields (blank mappings have been filtered out).<br />
<br />
<<mapping pic>><br />
<br />
Let’s take a closer look at these mappings:<br />
<ul>
<li>No. : this is straightforward – the “PART_NO” field from the legacy table maps directly to the NAV “No.” field.</li>
<li>Description and Description 2: slightly trickier – here we’re converting from the single “DESCRIPTION” field in the legacy table to two NAV fields using the SQL substring function to split the text and limit the number of characters in each field.</li>
<li>Base Unit of Measure: another simple 1:1 mapping, but this time we’re validating the field. Validating this field populates the Purchase and Sales unit of measure fields. (Keep in mind that the UDP will automatically create the “Item Unit of Measure” record when we import this field if it doesn’t exist).</li>
<li>Replenishment System: Trickier yet. The legacy system uses “M” to identify manufactured items, and “P” or other codes for purchased items. The CASE statement allows us to do a simple conversion from the legacy field value to what NAV expects.</li>
<li>Vendor No.: Trickiest so far. In this example, the default vendor for each item is stored in a separate table. This mapping retrieves that mapping through the use of a subquery to the PART_VEND table. Note that you can use joins, but usually a simple subquery is much easier to keep track of. </li>
</ul>
Once the field mapping is complete, we can now do a little setup and see what kind of file gets generated. On the “Query” sheet, the cells in light green need to be filled in:<br />
<br />
<<query sheet pic>><br />
<ul>
<li>Connection String: this is where you specify the connection details for the legacy database (not the NAV database). Click the ellipses button for a wizard to step you through building the string.</li>
<li>“SELECT” modifier: Optional. Anything you enter here will appear immediately after the “SELECT” keyword in the generated query. Use this for modifiers like “TOP 10” to only retrieve 10 records for testing purposes.</li>
<li>Tables (“FROM” clause): Enter the table or tables from the legacy database that you’re querying. You can specify any number of JOINs and the join conditions here if you have multiple tables.</li>
<li>“WHERE” clause: Optional. Use this to restrict which records you get from the legacy table.</li>
<li>“ORDER BY” clause: Optional. Use this to specify the order of the returned data.</li>
<li>Export File: Enter the file name you will be exporting the data to. Click the ellipses button to open a file selection dialog.</li>
<li>Pre-Query Lines: Optional. Enter a full query here that you want to run before the generated export query runs. For example, you may want to generate some temporary tables for the main query to use.</li>
<li>Post-Query Lines: Optional. Enter a full query here that you want to run after the generated export query runs. For example, you may want to drop temporary tables here.</li>
<li>Other export queries: Optional. The data retrieved from queries entered here will be appended to the export file. Only useful if you’re using custom, multi-table dataports.</li>
</ul>
<br />
Here’s an example of the fields populated with the details for our legacy table:<br />
<br />
<<query sheet – populated pic>><br />
<br />
Now that we have the settings filled in, the next step is to either export the data or generate the query to see what it looks like and possibly to test it in SQL Management Studio (SSMS). To see what the query will look like, click “Create Query”. This generates the query and asks if you’d like to copy it to the clipboard, which can be handy for pasting into SSMS for testing.<br />
<br />
To export the data, click (you guessed it) “Export Data”. This will generate the query, execute it against the database specified in the connection string, and create a tab-delimited export file that’s ready for the UDP. After the file is generated, you will be prompted to view it – if you click “Yes”, Notepad is launched to show the file:<br />
<br />
<<export file pic>><br />
<br />
At this point you can run the UDP in NAV, specify the item table to import, select the exported file, and you’re done.<br />
<br />
The real value with this tool is that we now have a data mapping that can be saved, easily modified, and executed any time the data changes or we refine our understanding of the mappings to NAV. We can also reuse the mappings any time we convert from the same legacy system in the future (for example, we can have a library of mappings from AccPac or Syteline to NAV).<br />
<br />
Hopefully you find the tool as useful as we do. Let us know if you have any comments or suggestions.<br />
<br />
<<Extra notes for the end:<br />
* some other options – if you’re using SQL to SQL, why not just populate data directly? Validations.<br />
* we also have some generic dataports for importing item and general journals, including item tracking (lot and serial #’s) and dimensions. We’ll publish them in an upcoming post, or give us a shout and we’ll fire ‘em off to you.<br />
* stay tuned for an upcoming post on an XMLPort version of the UDP for NAV2013<br />
** make sure macros are provided as separate file<br />
>> Dynamic Manufacturing Solutionshttp://www.blogger.com/profile/12694920969455017434noreply@blogger.com0tag:blogger.com,1999:blog-4211213164920451481.post-71809623850510782522012-12-20T14:40:00.000-07:002015-06-19T10:15:40.991-06:00All I Want for Christmas is an ERP<h4>
Please note that all DMS news and blog content has been moved to the main website at <a href="http://www.dynms.com/">www.dynms.com</a> for a categorized view.</h4>
<h4>
All utilities and downloads are available at <a href="http://www.dmsiworks.com/microsoft-dynamics-nav-resources/software-downloads">www.dmsiworks.com</a></h4>
<br />
We all know Santa Claus exists. It’s a fact. However, did you know that it takes more than magic to ensure his operations run at an optimal level? By using an ERP system Santa has all the tools and visibility to guarantee that the world’s (nice) children receive their presents on Christmas morning.<br />
<br />
<a name='more'></a><h4>
Electronically Manage Customer Demand</h4>
By tying in his customer requests (letters to Santa, wish lists) into his ERP system, Santa ensures that his elves know exactly what to produce and what quantities of what materials they’ll need.<br />
<br />
<h4>
Shop Floor Data Collection</h4>
Collecting time against work orders on the shop floor will give Santa a crystal clear view of how his work is progressing and how efficient his elves are operating. This kind of visibility will allow Santa to properly allocate his resources to ensure all projects are completed by December 24.<br />
<br />
<h4>
Rework Visibility</h4>
Let’s face it: elves are only human (wait a minute…). Either way, they’re going to make mistakes. By associating work with machines and employees, any defective product can be traced back to find the root cause. Less time diagnosing the problem mitigates the cost of rework and ensures problem areas are quickly rectified.<br />
<br />
<h4>
Inventory Control</h4>
Santa’s inventory levels are unparalleled. If presents aren’t properly labeled and placed in his warehouse he may not even get out the door on Christmas Eve. To maintain this level of goods, Santa could use barcodes for all of his stock, amalgamating an entire household’s presents on one pallet to streamline the delivery process.<br />
<br />
With a powerful ERP system (like Microsoft NAV supplemented with DMS add-ons…) Santa could easily structure his operations to ensure that Christmas Eve goes off without a hitch. And even if Rudolph’s nose isn’t bright enough to see through the fog, he could always use his handheld scanner. Merry Christmas and Happy Holidays from everyone at DMS!Dynamic Manufacturing Solutionshttp://www.blogger.com/profile/12694920969455017434noreply@blogger.com0tag:blogger.com,1999:blog-4211213164920451481.post-87751936614496810252012-10-02T14:28:00.000-06:002015-06-19T10:16:05.545-06:00NAV 2013 Report Issues (Solved)Anyone who is thinking about deploying NAV 2013 via Citrix, Terminal Services, or virtual desktops may get a bit of a surprise: none of the reports will print properly unless you take additional measures. The issue is not specifically a NAV bug, it's due to RDLC/SSRS issues when running remote sessions. This has been an issue for a couple of years and there's no word from Microsoft on a fix yet. There are, however, a few work-arounds.<br />
<br />
<b>UPDATE:</b> There are now two fixes for this issue. Run Server 2012 (as per <a href="http://blogs.msdn.com/b/nav/archive/2013/02/25/nav-2013-printing-over-terminal-server-can-scramble-reports.aspx" target="_blank">NAV Team Blog</a>), or install the <a href="http://support.microsoft.com/kb/2768741" target="_blank">Microsoft hotfix for 2008/Win7</a> (thanks to Duilio and Marco in the comments for the tip). We've installed the hotfix and it works well. <br />
<br />
<h4>
Please note that all DMS news and blog content has been moved to the main website at <a href="http://www.dynms.com/">www.dynms.com</a> for a categorized view.</h4>
<h4>
All utilities and downloads are available at <a href="http://www.dmsiworks.com/microsoft-dynamics-nav-resources/software-downloads">www.dmsiworks.com</a></h4>
<br />
<a name='more'></a><h2>
Behavior</h2>
When running NAV remotely (RDP, etc.) and previewing a report it looks great, but when you print it (regardless of printer) you get a report with squished fonts. This makes some reports almost unreadable, and it makes most reports look quite ugly. For example, below are screen shots from the standard NAV invoice in Cronus:<br />
<br />
Print Preview (click for larger view):<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWLMktQs6D5IexZxdqGofzXW_-PplZCuICIkbmRcD0zWbYKfyNaYhA0zMCTqhbf5ZPtnXAbCIeXxjck56BsATBpItsfOXdLd6StXC-RZWzg2QxqU2Ni_J1vOJGmtVFSF6HalF0rv2WECk/s1600/InvPreview.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWLMktQs6D5IexZxdqGofzXW_-PplZCuICIkbmRcD0zWbYKfyNaYhA0zMCTqhbf5ZPtnXAbCIeXxjck56BsATBpItsfOXdLd6StXC-RZWzg2QxqU2Ni_J1vOJGmtVFSF6HalF0rv2WECk/s400/InvPreview.jpg" width="400" /></a></div>
<br />
<br />
Printed Version:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIBaGx-Lscw4zzie8x_EUcTm4L7Nw5MO4g8FqyDvwcY40d2o6nTxIWaqa0z5OE9cQn3xWKQ_L9xzF01RmRKvo2Stw8tuBdj56cs-XE_lb6OncDiDZWg_UBwusG2TRnj3hH2AAI6tcnpXI/s1600/InvPrint.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="331" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIBaGx-Lscw4zzie8x_EUcTm4L7Nw5MO4g8FqyDvwcY40d2o6nTxIWaqa0z5OE9cQn3xWKQ_L9xzF01RmRKvo2Stw8tuBdj56cs-XE_lb6OncDiDZWg_UBwusG2TRnj3hH2AAI6tcnpXI/s400/InvPrint.jpg" width="400" /></a></div>
As you can see, the fonts are rendered in a way that messes the spacing up quite a bit. This report is still fairly readable, but others don't fare as well, e.g., have a look at the Shipment heading: <br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVuB_4AXCtFG1TmM8Y-WqAyRNJcCD5BQTzYOJhRLS2a6fW6WZd0-sQ2XnP_DgCqH7CQQij_RnOvIbHisUkFLhs5P5IqCH33NSmGYBOt_xmVZuFyVeDLuTJCwPqz1bPOiCh4Lz3q_4RV_c/s1600/ShipPrint.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVuB_4AXCtFG1TmM8Y-WqAyRNJcCD5BQTzYOJhRLS2a6fW6WZd0-sQ2XnP_DgCqH7CQQij_RnOvIbHisUkFLhs5P5IqCH33NSmGYBOt_xmVZuFyVeDLuTJCwPqz1bPOiCh4Lz3q_4RV_c/s1600/ShipPrint.jpg" /></a></div>
<br />
<br />
<br />
Once it's actually printed on paper, it looks worse.<br />
<br />
<h2>
Work-Arounds</h2>
This behavior only occurs if you're running NAV 2013 via Citrix, Terminal Services, or virtual desktops, and then only if you're running NAV with a display resolution that isn't a 4:3 aspect ratio. I.e., if you're running a "wide screen" (16:9) display resolution, you'll get this issue; if you're running something like 1024x768, you're fine (that, incidentally, is one of the work-arounds we've found).<br />
<br />
After a lot of searching and experimenting, these are the solutions we've found for the issue so far:<br />
<ol>
<li>Run NAV using a local install. As mentioned, the issue only seems to occur when running via RDP, Citrix, etc. Not always the best solution, but may be the easiest in many cases.</li>
<li>Change the client's display resolution to one that's a 4:3 aspect ratio (or less - i.e., 1280x1024 works fine too). See <a href="http://en.wikipedia.org/w/index.php?title=File:Vector_Video_Standards4.svg&page=1" target="_blank">this chart</a> for a list of resolutions and aspect ratios.</li>
<li>Don't print reports from NAV. Instead, save them as PDF, Word, or Excel and then print them. The "save as" function is not affected by the issue. This isn't much help when doing Post+Print, but for general reports could be acceptable.</li>
<li>Instead of having actions that run reports, execute a codeunit that saves the report to PDF and then launches it. A bit of a pain (which is why we haven't done this), but would be useful for Post+Print scenarios.</li>
</ol>
<b>UPDATE: </b>One of our developers has confirmed that using background posting for post+print causes the documents print correctly, which makes sense since they're being printed on the server instead of the client. <br />
<ol>
</ol>
<h2>
</h2>
There are also some wilder, more involved options like creating a custom report viewer that can force the DPI settings appropriately, or even a print processor to adjust the PostScript on the fly (craziness, though we've actually done something similar before). Anyway, we're not going that far - our approach so far has been to either install locally, and in cases
where we cannot, force users to use a different resolution for their sessions.<br />
<br />
If anyone has additional work-arounds or solutions, we'd love to hear about them. Anonymoushttp://www.blogger.com/profile/11736205194091133444noreply@blogger.com6tag:blogger.com,1999:blog-4211213164920451481.post-68154922955023849442012-09-25T10:57:00.001-06:002015-06-19T10:16:12.962-06:00The NAV 2013 Universal XMLport<h4>
Please note that all DMS news and blog content has been moved to the main website at <a href="http://www.dynms.com/">www.dynms.com</a> for a categorized view.</h4>
<h4>
All utilities and downloads are available at <a href="http://www.dmsiworks.com/microsoft-dynamics-nav-resources/software-downloads">www.dmsiworks.com</a></h4>
In a <a href="http://blog.dynms.com/2012/06/introducing-dms-universal-dataport.html">previous post</a> we introduced a dataport that could be used to quickly bring data into any NAV table without any coding. It's a great little tool that is almost immediately obsolete with the release of NAV 2013. Luckily, we have a solution for that: the DMS Universal XMLport. <br />
<br />
<a name='more'></a><br />
<h2>
NAV 2013 Data Import Options</h2>
NAV 2013 is a huge step forward from 2009 - we've using it since the beta was released and we're very impressed. Part of the new and enhanced functionality provided in 2013 are the data migration tools housed in the Rapid Start framework (hint: there is a Rapid Start Role Center that gives you easy access to these tools).<br />
<br />
The two biggest problems with the Rapid Start tools are that they're quite slow (at least in the beta), and there's a bit of a learning curve to get them up and running. Once you have some packages set up for master data, they work great. I expect Microsoft will provide a number of these base packages for different industries, making setup much easier.<br />
<br />
Another new option for data import is simply pasting data from Excel into NAV (we've been able to do this for years with <a href="http://dynamicsmanufacturingsolutions.com/products/navxtender.html" target="_blank">NavXtender</a>). Pasting from Excel works great for smaller data sets, and I expect to use this feature all the time.<br />
<br />
<h2>
A Simpler Option</h2>
So what do you do if you need to quickly bring a larger dataset into NAV 2013 today? Simple: use the DMS Universal XMLport (<a href="http://mibuso.com/dlinfo.asp?FileID=1474" rel="nofollow" target="_blank">download here</a>). NAV 2013 eliminates Dataports, but allows you to run XMLports directly from the RTC. Much like the Universal Dataport, all you need for the XMLport is a tab-separated file (usually generated from Excel or SQL Server Management Studio), and a table number. The XMLport will import all the data from the text file, either inserting new records or updating existing ones. Field validation and disabling the change log are also supported.<br />
<br />
Performance of the XMLport in NAV 2013 Beta is not as good as the Dataport in previous NAV versions. This might change with the 2013 final release, but the XMLport speed is generally acceptable - depending on the table, it normally imports up to a few hundred records per second when change logging is off.<br />
<br />
To use the XMLport, simply import the object (XMLport 50098 - download link at the end of the post), and either add the XMLport to the menu as a Task, or run it directly from the Object Designer. If you add it as a menu item, you can also add it to the ribbon of the Role Center by right-clicking the menu item.<br />
<br />
Once running, the XMLport user interface looks like this:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxdsu64wV1qpdx3eLQ6N9zhvDjHckevInXxhyphenhyphen4nXT3nx69rI7ys3SmXjky2zZ86vkEvgXPtDzJriCe7Bzs8_ZFcNKzMiHvhQ7r_W9huc7V13L5yea6_uO_A6fxIVQso5TmCf23Jd8u_VE/s1600/UniversalXMLport.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img alt="DMS Universal XMLPort" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxdsu64wV1qpdx3eLQ6N9zhvDjHckevInXxhyphenhyphen4nXT3nx69rI7ys3SmXjky2zZ86vkEvgXPtDzJriCe7Bzs8_ZFcNKzMiHvhQ7r_W9huc7V13L5yea6_uO_A6fxIVQso5TmCf23Jd8u_VE/s1600/UniversalXMLport.jpg" title="DMS Universal XMLPort" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<h2>
Description of fields:</h2>
<blockquote class="tr_bq">
<b>Filename</b>: The name of the tab delimited text file to import. This is optional, as NAV prompts you for a filename when you hit OK anyway. However, if this is filled in, you can just click "Open" when NAV prompts you again.<br />
<br />
<b>Import table number</b>: The NAV table ID to import data into. If you click the "Assist Edit" button beside the lookup, the XMLport will launch the table you've selected - this will open in another instance of NAV.<br />
<br />
<b>Allow record inserts</b>: If checked, new records will be created.<br />
<br />
<b>Allow record updates</b>: If checked, existing table records will be updated. This will only work if your file includes the record's primary key value.<br />
<br />
<b>V</b><b>alidate fields: </b>If "Only validate fields prefixed with '*'" is selected, the NAV data validation logic will only be called for
fields that begin with an asterisk on the first row of the import file. If the "Validate all fields" option is chosen instead, the validation logic will be called for all fields.<br />
<br />
<b>Disable change log</b>: Unlike earlier versions of NAV, NAV 2013 logs programmatic record changes to the change log. If you enable the "Disable change log" option, the XMLport will disable the change log during the import and re-enable it when done (assuming it was originally enabled). This can improve import performance quite a bit.</blockquote>
<br />
<h2>
Sample import:</h2>
A basic import into the NAV “Location” table appears in Excel below:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<img border="0" height="62" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8qvKJzXrg_oH-0iveW5QR74GtpIKwEUQpHAs3k5wSuiox3VUvPfwN7CAhQbnAA2oz7QXnrn9S52087bM7O-FLSOYmw3HE6wX5XJaLm27X_6shgD37OKyUEZJIFFIdfsA2AdPfPWsn-svC/s400/Dataport2.png" width="400" /></div>
<br />
The
first row tells the DMS Universal XMLport to import values into four
NAV fields; “Code”, “Name”, “City” and “Phone No_”. The asterisk in
front of the “code” fieldname would indicate to the XMLport to validate
this field if the “Validate all fields” option was not enabled.
Note that the XMLport will accept field names in the NAV
format (using punctuation as in "Phone No."), or in the SQL format that
replaces
punctuation with underscores (like "Phone No_").<br />
<br />
Saving this spreadsheet as a tab delimited text file would yield the following file which can be imported into NAV: <br />
<blockquote class="tr_bq">
*code name City Phone No_<br />
DMS Dynamic Mfg. Solutions Edmonton 780-988-0215 </blockquote>
<h2>
Additional information:</h2>
<ul>
<li>If you're importing Contacts, you can include the "No." field in the
header row but leave the values blank/empty and the XMLport will
automatically use the Contact number series for you. This functionality
could be extended to other tables fairly easily.</li>
<li>NAV will attempt to validate fields in the order it encounters them
(from left to right) so be sure to lay out the import file to avoid
validation problems based on field ordering. For instance, if you are
importing into the item journal and NAV encounters the quantity field
before the item number field the validation will fail with an error. </li>
<li>When importing into the Item or Resource table the base unit of
measure will automatically be added to the item unit of measure or
resource unit of measure table for you, so you can import into these
tables in one step.</li>
<li>Be careful with tools like Excel that might insert double quotes
around columns containing certain text data when it creates a tab
delimited text files.</li>
<li>Watch out for duplicate data when running with the ”Allow record inserts” option.</li>
</ul>
<br />
<h2>
XMLport Object</h2>
We've used the XMLport quite a bit (100's of thousands of records) and it's working quite well. However, it was built on beta software and you may find quirks - if you do, please let us know and we'll try to address them.<br />
<br />
You can download the XMLport from <a href="http://mibuso.com/dlinfo.asp?FileID=1474" rel="" target="_blank">Mibuso</a>.Anonymoushttp://www.blogger.com/profile/11736205194091133444noreply@blogger.com51tag:blogger.com,1999:blog-4211213164920451481.post-87811731448084958252012-08-02T12:06:00.001-06:002015-06-19T10:16:46.434-06:00Through Thick and Thin (Pt.2): Behind the Scenes<h4>
Please note that all DMS news and blog content has been moved to the main website at <a href="http://www.dynms.com/">www.dynms.com</a> for a categorized view.</h4>
<h4>
All utilities and downloads are available at <a href="http://www.dmsiworks.com/microsoft-dynamics-nav-resources/software-downloads">www.dmsiworks.com</a></h4>
<br />
Going back to my Tour de France analogy from the previous post, this installment is all about the action that takes place behind the scenes to make sure that the rider is successful in his bid to win races. Just like any well functioning and cohesive team, every individual has specific responsibilities and tasks that need to be carried out. Specific to cycling, most teams competing at a high level have the following personnel:<br />
<a name='more'></a><ul>
<li>Team Manager: oversees the team's commitments and general operations</li>
<li>Directeurs Sportif: travels to races and dictates race strategy</li>
<li>Coach: directs rider training</li>
<li>Doctor: responsible for riders' well-being and often making sure the riders meet race regulations</li>
<li>Therapist: assist the doctor</li>
<li>Soigneur: responsible for feeding, clothing, and escorting riders</li>
<li>Mechanic: responsible for the team's riding and associated equipment </li>
</ul>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgeegMQiG7Mq_f-OMmJhA80DJGJUWh00MGsOqy3-Ee1NEhUpn9VOSDwNz0kYFITmyEdjn0IYuzuAZ0PMLhhuuuMZYHHh8kv5d0UF_kmyIHLLiO1HXLTqymXTNdslt-jpcwPBUItbLmHbAqB/s1600/sportif.jpg" imageanchor="1"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgeegMQiG7Mq_f-OMmJhA80DJGJUWh00MGsOqy3-Ee1NEhUpn9VOSDwNz0kYFITmyEdjn0IYuzuAZ0PMLhhuuuMZYHHh8kv5d0UF_kmyIHLLiO1HXLTqymXTNdslt-jpcwPBUItbLmHbAqB/s320/sportif.jpg" width="320" /></a></div>
<br />
Although these people may be rarely seen, acknowledged or talked about, without their support the riders’ ability to perform at the optimal level would be greatly hampered. The same holds true for making the thin client terminals function as they were designed; without the underlying and supporting hardware infrastructure, the terminal will not operate at it its optimal level, if at all. <br />
<br />
The required underlying (back-end) hardware and supporting services for thin client computing or desktop and server virtualization is somewhat dependent on what technology is used to ‘host’ the client computing environment. There are several well known applications out there that have a significant market presence. These include:<br />
<ul>
<li>VMWare (vSphere)</li>
<li>Citrix (XenApp)</li>
<li>Microsoft (Hyper-V)</li>
<li>Oracle (Oracle VM) </li>
</ul>
The application technologies and competition in the virtualization market from each of these big market players is ever-advancing. This is great for the consumer in many fronts; better and easier to deploy technologies, pricing levels, feature enhancements and continued improvements – basically a healthy competitive environment that's driving innovative and cost-effective solutions for the end-user.<br />
<br />
For the purposes of this discussion, I will be focusing primarily on the infrastructure to effectively run the VMWare technology. As stated above, there are several integral components that are required to host the virtual desktop, and server, environments. VMWare currently has approximately 70% of the virtual market and continues to expand its portfolio to enhance their products.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUwWh9Bsnv4roeYMgktJ9AjsLOgUwaodftidWWTn1MiYl4VLt3hQW13rR017dMPRLaslDCQ16Dva1ibczd1p5pXn5paHO5A2ewx0i8pxZgsbzNPADZcb7m5SzHdKITWzhtKsgZMhzjQ45W/s1600/vdi.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="340" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUwWh9Bsnv4roeYMgktJ9AjsLOgUwaodftidWWTn1MiYl4VLt3hQW13rR017dMPRLaslDCQ16Dva1ibczd1p5pXn5paHO5A2ewx0i8pxZgsbzNPADZcb7m5SzHdKITWzhtKsgZMhzjQ45W/s400/vdi.gif" width="400" /></a></div>
<br />
The primary required hardware components are:<br />
<br />
<h4>
Server (“Host”): the server hardware is the heart of the virtual environment. Primarily, in the entry level stage, the server provides:</h4>
<ul>
<li>CPU</li>
<li>RAM</li>
<li>Ethernet adapter(s)</li>
<li>Local hard drive(s): this is optional as more robust environments utilize a Storage Area Network (SAN) to share hard drive capacity and storage amongst multiple “Hosts”</li>
</ul>
The components that have the biggest impact to the speed and performance for the virtual machines being hosted by the server are hard drive space and speed (15K rpm hard drives are highly encouraged), RAM and CPU speeds.<br />
<br />
<h4>
Network switch: the switch is what connects the clients to the server environment and other network resources (printers, scanners, faxes, etc) </h4>
<br />
The above are very basic and entry level requirements to having an environment that will host virtual machines that will be accessed by the thin client. For more redundancy, high availability and better performance, the use of high speed SAN’s, faster and redundant switches (fiber channel or high end iSCSI), routers, hard drive controllers, redundant servers, WAN/LAN accelerators, etc are recommended. The amount of virtual machine environments that a server can host is highly dependant on the type of hardware that is put in place. The faster and more redundant the hardware, the better the experience and reliability of the virtual environment.<br />
<br />
Each virtual machine can run any operating system supported by the underlying hardware and virtualization application. Users can thus run two or more different "guest" operating systems simultaneously, in separate "private" virtual computers.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUi-dvULPNAELuTyNf-dHcyg2IdLlGjDAfVB7we2ftvlVCYehN3ek1W9exnPxCn_79aMe8aMZsAr1K_tpdcPRcU9T4t1ZHKQ8bXJ2QVfR3NGBFIGos68TZI6o-gH-X1CR4BzLe_jmFyUZ8/s1600/vmware_virtual_infrastructure.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="451" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUi-dvULPNAELuTyNf-dHcyg2IdLlGjDAfVB7we2ftvlVCYehN3ek1W9exnPxCn_79aMe8aMZsAr1K_tpdcPRcU9T4t1ZHKQ8bXJ2QVfR3NGBFIGos68TZI6o-gH-X1CR4BzLe_jmFyUZ8/s640/vmware_virtual_infrastructure.jpg" width="640" /></a></div>
<br />
So now that we have all this hardware and fancy gear in place to host and display the virtues of virtualization, now what? Well, next we’ll talk about what it takes to deploy a thin client / VMWare or like environment.<br />
<br />
Marc Driessen<br />
Dynamic Manufacturing SolutionsDynamic Manufacturing Solutionshttp://www.blogger.com/profile/12694920969455017434noreply@blogger.com0tag:blogger.com,1999:blog-4211213164920451481.post-21911712211909930282012-07-18T16:18:00.004-06:002015-06-19T10:17:03.058-06:00Through Thick and Thin: The Case for Thin Client Computing<h4>
Please note that all DMS news and blog content has been moved to the main website at <a href="http://www.dynms.com/">www.dynms.com</a> for a categorized view.</h4>
<h4>
All utilities and downloads are available at <a href="http://www.dmsiworks.com/microsoft-dynamics-nav-resources/software-downloads">www.dmsiworks.com</a></h4>
<br />
As I’m watching the 2012 Tour de France, I've started thinking about how different the race would be if participants were required to carry all of their own food, replacement and maintenance parts, tools, and any other related gear for the 3,500 km journey from Liege, Belgium to Paris, France. The riders would be burdened with bags or maybe even small trailers attached to their bikes, stretching the trek from a few weeks to a few months. <br />
<br />
<a name='more'></a>In drastic contrast, Tour riders have a team car that follows them throughout the competition, which carries all of the items they may require along the way. Their bikes are streamlined, quick and agile, and in the event of a puncture or mechanical failure, the broken component is changed out quickly and they’re back on their way.<br />
<br />
This comparison isn’t very different from the one between thin and thick computing platforms. Everything that a user would need is locally installed on a thick client system. Although this may sound self-sufficient, there are several caveats to this topology and mindset. For instance, since all user files and folders are installed locally, there is the danger of hard drive failure. Constantly backing up this data is an intensive and repetitive process, but is necessary to ensure files are safe in the event of a failure.<br />
<br />
What about all the other hardware components that make a thick client run? What’s wrong with them? Say you have a business with ten users that all have their own desktop PCs. There are ten hard drives that have the possibility of failing, ten copies of Windows which have to be maintained (anti-virus, driver updates, etc.), ten CD or DVD-ROMs, ten cooling fans, ten power supplies, and so on and so on. The specific parts have nothing wrong with them but in combination with each other, and then multiplied by the number of thick clients in your operations, the potential for failure is much higher than it needs to be.<br />
<br />
How is this different in the thin computing environment? Well, almost all thin client hardware platforms have no moving parts. They usually have a very basic operating system called firmware (some also have copies of Windows CE or Linux on them) which is stored on Read Only Memory (ROM) – basically think of this like a tiny stick of RAM; very fast and no moving parts. The firmware stores very basic information for allowing the thin client to connect to the network, keyboard, mouse, video, and other basic settings. With little or no moving parts at all, the risk of component failure is drastically reduced, which translates into significant savings in hardware replacement and maintenance.<br />
<br />
Well, that’s all good and nice, but what else do thin clients have in/on them so that they actually provide user functionality? Almost all thin clients have an integrated video card and port(s) (VGA or DVI), network Ethernet port, USB port(s), audio in and out jacks, serial, keyboard, and mouse ports (USB or PS2), an onboard processor and RAM (flash memory). As an example, see the <a href="http://www.wyse.com/products/cloud-clients/thin-clients/S10" target="_blank">Wyse S10 </a>below: <br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmlqKMvd3kkepDrckdUEJ_f4tfhbUxpaBNs_XvujOKqeQ3FCblCBnClDhjY3Vswl7lm34eECTzW-45RjrV9Edw0LOdDCfslnLr6-69djxM3g1ko2dkPtCe97hm1Vs1ZDMH6UGhNQJcYqhR/s1600/wyseS10.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="424" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmlqKMvd3kkepDrckdUEJ_f4tfhbUxpaBNs_XvujOKqeQ3FCblCBnClDhjY3Vswl7lm34eECTzW-45RjrV9Edw0LOdDCfslnLr6-69djxM3g1ko2dkPtCe97hm1Vs1ZDMH6UGhNQJcYqhR/s640/wyseS10.jpg" width="640" /></a></div>
<br />
<br />
For such a small device, almost every necessary component is packed in there. The footprint of the thin client is significantly smaller than the standard desktop PC, which frees up all kinds of real estate on user desks to pile more work onto!<br />
<br />
With so many benefits, we should also play devil’s advocate and look at some of the questions related to thin-client computing, like how thin-clients fit into the growing market of cloud-based computing and how thin clients will handle the increased number of applications using rich graphics.<br />
<br />
<h4>
Thin-Clients and the Cloud</h4>
You can’t read a tech blog these days without have some reference to Cloud Computing. The question is: As more and more software offerings are being pushed to subscription-based cloud architectures (SAP, NAV 2013, Office 365, etc), where do thin clients fit in the equation? The answer is that thin client technology works with the cloud, not against it. Obviously there are fundamental differences between virtualized and web-based infrastructures, but the premise is still the same; provide a functional user interface that accesses software and operating systems from a server. The ability to integrate thin clients into the burgeoning cloud market is likely the reason that <a href="http://www.wired.com/wiredenterprise/2012/04/dell-wyse/" target="_blank">Dell recently acquired thin client leader Wyse Terminals for an estimated $500M</a>.<br />
<br />
<h4>
Graphics and Thin Computing</h4>
Like every technology, there are situations that are going to lend themselves better to thin clients than others. As thin clients transmit screen, keyboard, mouse, and audio data across a network, hi-resolution graphics as background images generally slow down the user experience, depending on the system architecture. As a rule of thumb, if you're playing games, doing multi-media work, or otherwise need a better graphics card, then thin clients are likely not the best option for you. Likewise, if all of your applications are already cloud-based and work in a browser, then the value proposition of moving to thin clients is now just a matter of hardware savings, instead of the full benefit of hardware savings and reduced overall IT expenditure. These scenarios generally fit a smaller portion of the population, and since the industry has recognized this as a liability, they're already moving towards <a href="http://www.vmware.com/products/view/overview.html?src=PaidSearch&ClickID=cne4axpfikevfses7svk4wia7vka4fke7nea#utm_source=PaidSearch&utm_medium=src&utm_campaign=src-tagged-url" target="_blank">thin clients that can process at much higher speeds</a>.<br />
<br />
Thin clients, where applicable, can significantly reduce the administrative overhead required to maintain user hardware and software, while also reducing energy consumption. Think green! Not only the environment, but also the paper ‘green’ we all like to have in our pockets.<br />
<br />
So, now you have this device that sits on a user’s desk, but is basically ‘dumb’, so now what? Well, stay tuned for our next post, where we will explore the infrastructure that sits behind the thin-clients that makes everything work.<br />
<br />
Marc Driessen<br />
Dynamic Manufacturing Solutions
<a href="http://blog.dynms.com/" rel="tag" style="display: none;">CodeProject</a>Dynamic Manufacturing Solutionshttp://www.blogger.com/profile/12694920969455017434noreply@blogger.com0tag:blogger.com,1999:blog-4211213164920451481.post-6706061477571187742012-07-12T15:04:00.000-06:002015-06-19T10:18:53.979-06:00How to Use MVC.Net on the Dynamics NAV Database Structure<h4>
Please note that all DMS news and blog content has been moved to the main website at <a href="http://www.dynms.com/">www.dynms.com</a> for a categorized view.</h4>
<h4>
All utilities and downloads are available at <a href="http://www.dmsiworks.com/microsoft-dynamics-nav-resources/software-downloads">www.dmsiworks.com</a></h4>
<br />
For the example files associated with this tutorial, visit the <a href="http://mibuso.com/dlinfo.asp?FileID=1454" target="_blank">Mibuso downloads</a>.<br />
<br />
So you’ve been asked to make a web portal for some Dynamics NAV data. You also have a desire to stay current and would like to take advantage of some of the newer web development frameworks out there. You’ve seen, or heard great things about how quickly you can get <a href="http://en.wikipedia.org/wiki/Create,_read,_update_and_delete" target="_blank">CRUD</a> with some of the popular MVC frameworks out there like pages working with <a href="http://www.asp.net/mvc">MVC.Net</a> or <a href="http://rubyonrails.org/" target="_blank">Ruby on Rails</a>.<br />
<br />
<a name='more'></a>MVC.Net and Ruby on Rails both would prefer that you have control over the database, and that the database follow industry standard naming conventions and patterns (the phrase “Convention over Configuration” is mentioned many places). This allows you to make websites very quickly. As a Dynamics NAV programmer you already know that the table names in NAV cause problems with these frameworks, specifically the prefixing of tables with “CompanyName$”.<br />
<br />
This tutorial will show you how you can use the Entity Framework in an MVC.Net web application with Dynamics NAV.<br />
<br />
Let’s start with a table that won’t cause problems. The “Company” table in NAV is not company specific, and presents no problems using the "Table" data annotation attribute.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJ5TGEvvKqO0HYXztXnQahWIIDrJBj9JZePLOMLJPyDRFBa0GgWshScX2f278ay5_SJ46kqPHDzOLgwXE2oX_HEg4dT44RIL8tdRPLy9w-CVHhOs0foDVd6yO8VAT2wQmjwHG0oaxGLaX5/s1600/MVC1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="280" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJ5TGEvvKqO0HYXztXnQahWIIDrJBj9JZePLOMLJPyDRFBa0GgWshScX2f278ay5_SJ46kqPHDzOLgwXE2oX_HEg4dT44RIL8tdRPLy9w-CVHhOs0foDVd6yO8VAT2wQmjwHG0oaxGLaX5/s400/MVC1.png" width="400" /></a></div>
Happiness and butterflies all around, you get to your next table and now you want “Contact” data. If you’ve got two companies, that now becomes two different SQL server tables. “CRONUS Canada, Inc_$Contact” and “AnotherCompany$Contact”.<br />
<br />
You could hard code the companies, but that will create deployment problems. You could then get around the multiple companies by inheriting different classes, but that seems a waste.<br />
<br />
Another possibility is to use a different table attribute that allows you to change companies. In the below example we’re using a new table attribute class called “DynamicsNavTable”, that allows you to specify the NAV table portion name.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEguMB3VtXbfyxmJ68VT1j4Lx0oCKfXXZxHo-tMq0OC-OaLZzJCGonaZE_DORacn4I3VzIIjWhjK7R8UTvzNRTLwFs-VabWcEVJKqLUosXrGX2Ao7V0A_M5mKElDQAdNiIBCMKQwfq_hawpI/s1600/MVC2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="385" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEguMB3VtXbfyxmJ68VT1j4Lx0oCKfXXZxHo-tMq0OC-OaLZzJCGonaZE_DORacn4I3VzIIjWhjK7R8UTvzNRTLwFs-VabWcEVJKqLUosXrGX2Ao7V0A_M5mKElDQAdNiIBCMKQwfq_hawpI/s400/MVC2.png" width="400" /></a></div>
<br />
The company portion is then handled via the attribute. They key parts to this attribute are as follows:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLRnuVycrywYX8ANimvATWK_FduSdIyrqJGrV0L5XzoP6uFAQ4zpjHZxVOYumIast3RakW2fghCRqlgJN4TjvQIErh4zCA87YpVXZV3Zm9pEjPAOSkyFHKej4Oe_V7VDVWQYiD-kWPvxG0/s1600/MVC3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="348" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLRnuVycrywYX8ANimvATWK_FduSdIyrqJGrV0L5XzoP6uFAQ4zpjHZxVOYumIast3RakW2fghCRqlgJN4TjvQIErh4zCA87YpVXZV3Zm9pEjPAOSkyFHKej4Oe_V7VDVWQYiD-kWPvxG0/s640/MVC3.png" width="640" /></a></div>
<style>
<!--
/* Font Definitions */
@font-face
{font-family:"MS 明朝";
mso-font-charset:78;
mso-generic-font-family:auto;
mso-font-pitch:variable;
mso-font-signature:1 0 16778247 0 131072 0;}
@font-face
{font-family:Cambria;
panose-1:2 4 5 3 5 4 6 3 2 4;
mso-font-charset:0;
mso-generic-font-family:auto;
mso-font-pitch:variable;
mso-font-signature:3 0 0 0 1 0;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:12.0pt;
font-family:"Times New Roman";
mso-ascii-font-family:Cambria;
mso-ascii-theme-font:minor-latin;
mso-fareast-font-family:"MS 明朝";
mso-fareast-theme-font:minor-fareast;
mso-hansi-font-family:Cambria;
mso-hansi-theme-font:minor-latin;
mso-bidi-font-family:"Times New Roman";
mso-bidi-theme-font:minor-bidi;}
@page Section1
{size:612.0pt 792.0pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;
mso-header-margin:36.0pt;
mso-footer-margin:36.0pt;
mso-paper-source:0;}
div.Section1
{page:Section1;}
-->
</style>
<br />
<div class="MsoNormal">
<br />
You’ll notice that we are deriving from the same "TableAttribute" that we used in the “Company” table example, where in our constructor
we’re setting the actual table name to use ( via the GetCompanyTableName
function described below ).<br />
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrJqPa_jXG-VqntDh1UwEZEnZR7JXb5A5zM1nMQlDq4QxB7SPj3_M5LtmUJ3JmQvHohEZhS-RyC2rQ77F32x1uEa3rnsTgamPy36mWdB0QjcVSLcI_8lZUTfmE_cGUm0FkwxtFphOdC3ju/s1600/MVC4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="44" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrJqPa_jXG-VqntDh1UwEZEnZR7JXb5A5zM1nMQlDq4QxB7SPj3_M5LtmUJ3JmQvHohEZhS-RyC2rQ77F32x1uEa3rnsTgamPy36mWdB0QjcVSLcI_8lZUTfmE_cGUm0FkwxtFphOdC3ju/s640/MVC4.png" width="640" /></a></div>
<div class="MsoNormal">
<br />
The current company is then determined by the current users chosen company, which if not yet defined, will bring it in from our settings.<br />
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhClBzUBAbiXu3hhbcjNssS1Mem7imMRKSGvE3x-ujDUIgmt3WSP81dfEUhDjbUS3FhFR_z0yKv40MdQEa6z4Ay28TUuRu37qTdJMiLfstueTQaxzPVV1UomCJEXrzbcIJ9ksYvvxz9KNEf/s1600/MVC5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="281" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhClBzUBAbiXu3hhbcjNssS1Mem7imMRKSGvE3x-ujDUIgmt3WSP81dfEUhDjbUS3FhFR_z0yKv40MdQEa6z4Ay28TUuRu37qTdJMiLfstueTQaxzPVV1UomCJEXrzbcIJ9ksYvvxz9KNEf/s640/MVC5.png" width="640" /></a></div>
<div class="MsoNormal">
<br />
We’ll show how the current company can change on the fly a bit further down in this example, but for the moment let’s just go with a configurable company name in the web.config.<br />
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXBDhN2qhXgVf4bJ02CpS-hfT8WdacoawzS7QltEbyVSvC2Hwcxdup6b0n_OJe6SLgKRV5QQ91DVJl1Y13hx2bMx10OK5ji6F8XQa4AQaBmBkkwz2a3AQQ1rF5xI4cyjEY_M5IA4gygO4z/s1600/MVC6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="172" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXBDhN2qhXgVf4bJ02CpS-hfT8WdacoawzS7QltEbyVSvC2Hwcxdup6b0n_OJe6SLgKRV5QQ91DVJl1Y13hx2bMx10OK5ji6F8XQa4AQaBmBkkwz2a3AQQ1rF5xI4cyjEY_M5IA4gygO4z/s640/MVC6.png" width="640" /></a></div>
<div class="MsoNormal">
<style>
<!--
/* Font Definitions */
@font-face
{font-family:"MS 明朝";
mso-font-charset:78;
mso-generic-font-family:auto;
mso-font-pitch:variable;
mso-font-signature:1 0 16778247 0 131072 0;}
@font-face
{font-family:Cambria;
panose-1:2 4 5 3 5 4 6 3 2 4;
mso-font-charset:0;
mso-generic-font-family:auto;
mso-font-pitch:variable;
mso-font-signature:3 0 0 0 1 0;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:12.0pt;
font-family:"Times New Roman";
mso-ascii-font-family:Cambria;
mso-ascii-theme-font:minor-latin;
mso-fareast-font-family:"MS 明朝";
mso-fareast-theme-font:minor-fareast;
mso-hansi-font-family:Cambria;
mso-hansi-theme-font:minor-latin;
mso-bidi-font-family:"Times New Roman";
mso-bidi-theme-font:minor-bidi;}
@page Section1
{size:612.0pt 792.0pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;
mso-header-margin:36.0pt;
mso-footer-margin:36.0pt;
mso-paper-source:0;}
div.Section1
{page:Section1;}
-->
</style>
<span style="font-family: Cambria; font-size: 12pt;"> </span><br />
<span style="font-family: Cambria; font-size: 12pt;">And let’s set it as our default in the web application.</span><br />
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4Emu0euBZdo6FIg4eHtMKmj28DjKbWi67HjWsWkuWut564BuMClL7q8mle7SGjrKTm6ic1k6dA8byTi1Z9mpH87PG-Toz_FdSUeQoZBaedcpZU86rYoby4IDamllqNusKeaUzsZTg3biZ/s1600/MVC7.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="346" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4Emu0euBZdo6FIg4eHtMKmj28DjKbWi67HjWsWkuWut564BuMClL7q8mle7SGjrKTm6ic1k6dA8byTi1Z9mpH87PG-Toz_FdSUeQoZBaedcpZU86rYoby4IDamllqNusKeaUzsZTg3biZ/s400/MVC7.png" width="400" /></a></div>
<div class="MsoNormal">
<br />
<span style="font-family: Cambria; font-size: 12pt;">So far so good, so let’s use the default MVC.Net scaffold around the "Contact" model and let’s see what we have so far. At this point all we really have to support table names is the special table helper data annotation attribute, with a supporting configuration file. </span><br />
<span style="font-family: Cambria; font-size: 12pt;"> </span>
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKwCKAvsra6D5w1Oz76YFvvQBMblM5DBuMHl0w82ecrBNw0hAWTCNGuTnH5rQ0dQvXZ8pDtZ02JuKKCUJqU-JkJPt2Gzb9Xd4DnGyGPZnb_O-NVRVqF6VBf1wSJ11rXm-qPxJm82cY261L/s1600/MVC8.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="384" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKwCKAvsra6D5w1Oz76YFvvQBMblM5DBuMHl0w82ecrBNw0hAWTCNGuTnH5rQ0dQvXZ8pDtZ02JuKKCUJqU-JkJPt2Gzb9Xd4DnGyGPZnb_O-NVRVqF6VBf1wSJ11rXm-qPxJm82cY261L/s640/MVC8.png" width="640" /></a></div>
<br />
So at this point you have the ability to configure the company in the web.config, but that still doesn’t let you change the model (yet). A complicating factor is the behavior of MVC.Net about how the database model gets compiled from your model. Specifically, it will compile the model once the first time it’s used and after that it’s cached. While this is great for performance, you seem to be stuck with that compiled table name of “CRONUS Canada, Inc_$Contact”, because it would have read in the model, and the table data annotation once, thus even if you were to create new contexts passing in the attributes that you wanted it would still use the previously compiled version.<br />
<br />
The easy solution is to use the model when the DbContext is being constructed. What we’ll do is make a base DynamicsNavDataContext, derived from DbContext, and then use that for our future implementations.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhM1SmrK6c0M6aFMK4kgXCozo_5FONQsOoZaQuru6Xrn_snPymXOzFiyFSQfoHZlWurHrfcYX7fb1cClSl6R340u1asgBhkg7wfw2waYbhbcdQPXL6CWVNNPpHXjwMdkLbO6nEbKbKHNCac/s1600/MVC9.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="290" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhM1SmrK6c0M6aFMK4kgXCozo_5FONQsOoZaQuru6Xrn_snPymXOzFiyFSQfoHZlWurHrfcYX7fb1cClSl6R340u1asgBhkg7wfw2waYbhbcdQPXL6CWVNNPpHXjwMdkLbO6nEbKbKHNCac/s640/MVC9.png" width="640" /></a></div>
<style>
<!--
/* Font Definitions */
@font-face
{font-family:"MS 明朝";
mso-font-charset:78;
mso-generic-font-family:auto;
mso-font-pitch:variable;
mso-font-signature:1 0 16778247 0 131072 0;}
@font-face
{font-family:Cambria;
panose-1:2 4 5 3 5 4 6 3 2 4;
mso-font-charset:0;
mso-generic-font-family:auto;
mso-font-pitch:variable;
mso-font-signature:3 0 0 0 1 0;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:12.0pt;
font-family:"Times New Roman";
mso-ascii-font-family:Cambria;
mso-ascii-theme-font:minor-latin;
mso-fareast-font-family:"MS 明朝";
mso-fareast-theme-font:minor-fareast;
mso-hansi-font-family:Cambria;
mso-hansi-theme-font:minor-latin;
mso-bidi-font-family:"Times New Roman";
mso-bidi-theme-font:minor-bidi;}
a:link, span.MsoHyperlink
{color:blue;
text-decoration:underline;
text-underline:single;}
a:visited, span.MsoHyperlinkFollowed
{mso-style-noshow:yes;
color:purple;
text-decoration:underline;
text-underline:single;}
@page Section1
{size:612.0pt 792.0pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;
mso-header-margin:36.0pt;
mso-footer-margin:36.0pt;
mso-paper-source:0;}
div.Section1
{page:Section1;}
-->
</style>
<br />
<br />
This approach to changing the table mapping at runtime is based off the example provided by <a href="http://blog.bennymichielsen.be/2011/05/21/entity-framework-4-1-change-mappings-at-runtime/" target="_blank">bennymichielson</a>. In our solution specific data context we then just have create a helper method to create the appropriate DbModelBuilder.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjExW1jN9KufHxLfHzdqtg_ZxhnyjKsrl3LLgVu3op7yLSmc1a8Cpn5-EFKG6rqOmA_bILwDElBxukRrcMFOJHTpmEighHCphR58iWiSth_FL-PTD4GAKU_qu7NW2zHscTbXME8zoMMNhll/s1600/MVC10.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="234" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjExW1jN9KufHxLfHzdqtg_ZxhnyjKsrl3LLgVu3op7yLSmc1a8Cpn5-EFKG6rqOmA_bILwDElBxukRrcMFOJHTpmEighHCphR58iWiSth_FL-PTD4GAKU_qu7NW2zHscTbXME8zoMMNhll/s640/MVC10.png" width="640" /></a></div>
<div class="MsoNormal">
<br />
With the last piece of the puzzle just to get the appropriate table name in the BuildModel() method.<br />
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgv0csXfLmjIp4iil4U8WPM-FUsRPbY6jRq_QDkbgNPb9lsYL4EPOvNMkfhfdaoblAHo8uHvWj0kGsoFVzyk3lQVNefc2kdjeIqyQUE764vYyxHNtT1wPPlAh2Ra8VZQaWAR7M-7LpXEju9/s1600/MVC11.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="152" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgv0csXfLmjIp4iil4U8WPM-FUsRPbY6jRq_QDkbgNPb9lsYL4EPOvNMkfhfdaoblAHo8uHvWj0kGsoFVzyk3lQVNefc2kdjeIqyQUE764vYyxHNtT1wPPlAh2Ra8VZQaWAR7M-7LpXEju9/s640/MVC11.png" width="640" /></a></div>
<div class="MsoNormal">
<br />
So once you have this code established, an implementation looks very simple. Your controller will look something like this (in our example you’ll notice we allow changing the company on the fly with as a URL parameter, that line isn’t necessary):<br />
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7Nlmc9VwKh6B_JA_hl7_jc2QapVr-fag8Nlk_ZxG1L4rKOsy6LWupBA6mXnHC7Vyls_Mn72Fq-lSbjGCtk1bLLwI0Y0xG11qiyxbWc_ltheag01FyiVSDcc0BAEsPNytoqERA4fGYh1tl/s1600/MVC12.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="310" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7Nlmc9VwKh6B_JA_hl7_jc2QapVr-fag8Nlk_ZxG1L4rKOsy6LWupBA6mXnHC7Vyls_Mn72Fq-lSbjGCtk1bLLwI0Y0xG11qiyxbWc_ltheag01FyiVSDcc0BAEsPNytoqERA4fGYh1tl/s640/MVC12.png" width="640" /></a></div>
<div class="MsoNormal">
<br />
To take it a step further and allow changing the company per user ‘session’ instead of just on the URL we just store the current company per user.<br />
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhuLL72Uz5EwNAsMdxc9n4TBiEOVqKUzAl6hBl4AWF3TtAnht4WUk04FYUsmZn5l14fnDytqAHXHXKAv1dUApgWjhAhynP1CJJWOSrrYz924RRzTeLhb5HQjqJ8WqE75WDiax4muRhW7SxD/s1600/MVC13.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="64" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhuLL72Uz5EwNAsMdxc9n4TBiEOVqKUzAl6hBl4AWF3TtAnht4WUk04FYUsmZn5l14fnDytqAHXHXKAv1dUApgWjhAhynP1CJJWOSrrYz924RRzTeLhb5HQjqJ8WqE75WDiax4muRhW7SxD/s640/MVC13.png" width="640" /></a></div>
<div class="MsoNormal">
<style>
<!--
/* Font Definitions */
@font-face
{font-family:"MS 明朝";
mso-font-charset:78;
mso-generic-font-family:auto;
mso-font-pitch:variable;
mso-font-signature:1 0 16778247 0 131072 0;}
@font-face
{font-family:Cambria;
panose-1:2 4 5 3 5 4 6 3 2 4;
mso-font-charset:0;
mso-generic-font-family:auto;
mso-font-pitch:variable;
mso-font-signature:3 0 0 0 1 0;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:12.0pt;
font-family:"Times New Roman";
mso-ascii-font-family:Cambria;
mso-ascii-theme-font:minor-latin;
mso-fareast-font-family:"MS 明朝";
mso-fareast-theme-font:minor-fareast;
mso-hansi-font-family:Cambria;
mso-hansi-theme-font:minor-latin;
mso-bidi-font-family:"Times New Roman";
mso-bidi-theme-font:minor-bidi;}
@page Section1
{size:612.0pt 792.0pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;
mso-header-margin:36.0pt;
mso-footer-margin:36.0pt;
mso-paper-source:0;}
div.Section1
{page:Section1;}
-->
</style>
</div>
<div class="MsoNormal">
<br />
Provide a mechanism to change the current company:<br />
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghusKSl186rqRIweIioVwGgI0RoR0N3tH4rGIvcSjWqvp9yfyKYT5vqvVQi2UoSu5wmHSyi8ZlXoms1oxsaS3_4prM1xkJzyo0kz_EcvfLai7ofO5Pttu21G8Jv7nZ7VS2i1c4mfg-F9ap/s1600/MVC14.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="242" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghusKSl186rqRIweIioVwGgI0RoR0N3tH4rGIvcSjWqvp9yfyKYT5vqvVQi2UoSu5wmHSyi8ZlXoms1oxsaS3_4prM1xkJzyo0kz_EcvfLai7ofO5Pttu21G8Jv7nZ7VS2i1c4mfg-F9ap/s400/MVC14.png" width="400" /></a></div>
<div class="MsoNormal">
<br />
And then in our function that returns the current company we just return the current users selected company, where if not specified grabs the default out of our settings file.<br />
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDtls4s8G8q_tjXgIrV28TDVYihpEgDTnGVpHMqu2ipdNutBdoXiAcVE4c8VuAAV7Am6RE-TlE8q8LJQruUJi1OUZdkIXkmU7oZg16bY0KiVUOcQBGQB1OXLGH0s3Cvwbkk4X-HsfRk4jg/s1600/MVC15.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="207" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDtls4s8G8q_tjXgIrV28TDVYihpEgDTnGVpHMqu2ipdNutBdoXiAcVE4c8VuAAV7Am6RE-TlE8q8LJQruUJi1OUZdkIXkmU7oZg16bY0KiVUOcQBGQB1OXLGH0s3Cvwbkk4X-HsfRk4jg/s400/MVC15.png" width="400" /></a></div>
<div class="MsoNormal">
<style>
<!--
/* Font Definitions */
@font-face
{font-family:"MS 明朝";
mso-font-charset:78;
mso-generic-font-family:auto;
mso-font-pitch:variable;
mso-font-signature:1 0 16778247 0 131072 0;}
@font-face
{font-family:Cambria;
panose-1:2 4 5 3 5 4 6 3 2 4;
mso-font-charset:0;
mso-generic-font-family:auto;
mso-font-pitch:variable;
mso-font-signature:3 0 0 0 1 0;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:12.0pt;
font-family:"Times New Roman";
mso-ascii-font-family:Cambria;
mso-ascii-theme-font:minor-latin;
mso-fareast-font-family:"MS 明朝";
mso-fareast-theme-font:minor-fareast;
mso-hansi-font-family:Cambria;
mso-hansi-theme-font:minor-latin;
mso-bidi-font-family:"Times New Roman";
mso-bidi-theme-font:minor-bidi;}
@page Section1
{size:612.0pt 792.0pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;
mso-header-margin:36.0pt;
mso-footer-margin:36.0pt;
mso-paper-source:0;}
div.Section1
{page:Section1;}
-->
</style>
<span style="font-family: Cambria; font-size: 12pt;"> </span><br />
<span style="font-family: Cambria; font-size: 12pt;">We can then whip up a Razor page to allow changing the company.</span><br />
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjC0hm1PKE7vcbpgKsE2-UDUVDNVQxoj3I46dvBt_JG8t_M1wnlaDt19QIcGUA-iT-_-ByR0F8BN8YkCpdbmX1cJLyHs8qDzFsv8jV4IoFTyBSzcoBDio7MFUQ1g8XzaCWpyyykwU7DG1OC/s1600/MVC16.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="411" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjC0hm1PKE7vcbpgKsE2-UDUVDNVQxoj3I46dvBt_JG8t_M1wnlaDt19QIcGUA-iT-_-ByR0F8BN8YkCpdbmX1cJLyHs8qDzFsv8jV4IoFTyBSzcoBDio7MFUQ1g8XzaCWpyyykwU7DG1OC/s640/MVC16.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjE82vux7KzsARX3LtyFs3Q2JyKjcpquZh1Yq-FfK5XdLdnUP81dnRynaggtVGZ4Ug0ibia0c2JXH68khygKmV8tTjXMEKPgZSBDx0B5Y7aQpdhgU5sP0ShmZoHIkUIAW5jSj-lugdYYd7n/s1600/MVC17.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="220" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjE82vux7KzsARX3LtyFs3Q2JyKjcpquZh1Yq-FfK5XdLdnUP81dnRynaggtVGZ4Ug0ibia0c2JXH68khygKmV8tTjXMEKPgZSBDx0B5Y7aQpdhgU5sP0ShmZoHIkUIAW5jSj-lugdYYd7n/s400/MVC17.png" width="400" /></a></div>
<div class="MsoNormal">
<br />
We take a peek at our “Contacts” view while in “Another
Company” (there are only two contacts)<br />
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgv5R4q-tdRBzwKYlFZdgoChoYJlS8ICcinRDYip-x17U5x6JmrCV02F9N7Ds9KvIzrvvDkyJZ5QI1CRotZpq_xKB3lGZIObhmm1rZEDBDTr0upgimXEbK9-Um5ebzmTJq_scd6F-_SI6lH/s1600/MVC18.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="158" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgv5R4q-tdRBzwKYlFZdgoChoYJlS8ICcinRDYip-x17U5x6JmrCV02F9N7Ds9KvIzrvvDkyJZ5QI1CRotZpq_xKB3lGZIObhmm1rZEDBDTr0upgimXEbK9-Um5ebzmTJq_scd6F-_SI6lH/s400/MVC18.png" width="400" /></a></div>
<div class="MsoNormal">
<br />
Use our company changer to get back to "CRONUS Canada, Inc."<br />
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhCcfHL7Dq3jt-2J3Kt9ONv1OUsACiajYsjYkhMCZlDB39bWAzQc19VR62k5Db_ls1y7I-4Ya7eeKZMGSira8YO27fNHaL2nxPN6JK2yZlCMo3Bk56ioVdzH4W_5IkHOA57lTsfhYOeKBr/s1600/MVC19.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="123" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhCcfHL7Dq3jt-2J3Kt9ONv1OUsACiajYsjYkhMCZlDB39bWAzQc19VR62k5Db_ls1y7I-4Ya7eeKZMGSira8YO27fNHaL2nxPN6JK2yZlCMo3Bk56ioVdzH4W_5IkHOA57lTsfhYOeKBr/s320/MVC19.png" width="320" /></a></div>
<div class="MsoNormal">
<br />
And we now see "CRONUS Canada, Inc." contacts.<br />
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiz1tLJbCSNiO3hQuwU7O7u6GpTpC7ZPr7Ldl1HwaD8qL-UPMhAUNgI16ea0QeY72QVIYuI4fSad5RjAY98MRYMRDoW6k7yYrpt_eg2j9WJZbudOuSPnKUiB8r1f9OcvFfcgi4Z6iHuz-qU/s1600/MVC20.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="151" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiz1tLJbCSNiO3hQuwU7O7u6GpTpC7ZPr7Ldl1HwaD8qL-UPMhAUNgI16ea0QeY72QVIYuI4fSad5RjAY98MRYMRDoW6k7yYrpt_eg2j9WJZbudOuSPnKUiB8r1f9OcvFfcgi4Z6iHuz-qU/s400/MVC20.png" width="400" /></a></div>
<div class="MsoNormal">
<br />
Alternatively since we added the ability to change the company in the Index controller action we could change companies on the fly in the URL like this:<br />
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgX0KH6MTHvROH1d_SqfuP14DQp_LIPnZnHqGmIQQY6hvtgaVpyc6-rwptHOFaKocvTFNVhpwdJ3djDPAbIUAADrPieMTIrT0QzUbDOc_a9NQB0m1D51kKXTBQZo9du0gPFNQQ8Vv5-PCcl/s1600/MVC21.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="67" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgX0KH6MTHvROH1d_SqfuP14DQp_LIPnZnHqGmIQQY6hvtgaVpyc6-rwptHOFaKocvTFNVhpwdJ3djDPAbIUAADrPieMTIrT0QzUbDOc_a9NQB0m1D51kKXTBQZo9du0gPFNQQ8Vv5-PCcl/s400/MVC21.png" width="400" /></a></div>
<div class="MsoNormal">
<br />
To summarize we’ve established how to use MVC.Net and connect a data entity that you can use with LINQ, to work with Dynamics NAV table naming convention, while providing the option to dynamically change the company name in a configuration file, on the URL, and with a “change” option.<br />
<br />
It was a little bit of work, however you only need to build the supporting code once, and then you can re-use it in future projects. We’ve also provided the code to support this as a download (see link above). If you have a more complicated model you will probably want to cache the DBCompiledModel that is generated instead of re-building it with each DBContext.</div>
<div class="MsoNormal">
</div>
<div class="MsoNormal">
<br />
Tim Dimsdale<br />
Dynamic Manufacturing Solutions</div>
<a href="http://blog.dynms.com/" rel="tag" style="display: none;">CodeProject</a>Dynamic Manufacturing Solutionshttp://www.blogger.com/profile/12694920969455017434noreply@blogger.com2tag:blogger.com,1999:blog-4211213164920451481.post-46636756844567349302012-07-03T16:21:00.004-06:002015-06-19T10:18:49.296-06:00Web Integration Options in Microsoft NAV<h4>
Please note that all DMS news and blog content has been moved to the main website at <a href="http://www.dynms.com/">www.dynms.com</a> for a categorized view.</h4>
<h4>
All utilities and downloads are available at <a href="http://www.dmsiworks.com/microsoft-dynamics-nav-resources/software-downloads">www.dmsiworks.com</a></h4>
<br />
You’re a developer, and you’ve been asked to make a part of MS Dynamics
NAV web accessible. Great! It’s out of the box in NAV 2013. <br />
<br />
Uh
oh, it’s not 2013 yet? No problem, you still have options and
should probably consider licensing, architecture, and integration interfaces
soon.<br />
<br />
<a name='more'></a><h3>
Licensing.</h3>
<br />
The first step is get licensing out of the
way. Determine before you start which licenses your client will
need or already has available, as they will affect your architecture.
Have handy the number of users that will be accessing your site, and
whether they will be internal or external. (Hint: your scenario will
probably be in one or more of the following granules 1240, 1260, 1280, 2450, or 2510). Some of these licensing options are
very expensive and could change some of the requirements. <br />
<br />
<h3>
Architecture.</h3>
<br />
If you’re lucky, you will find a third party component that fits the bill. In most cases you will end up needing to either <a href="http://blog.dynms.com/2012/06/build-vs-buy-whats-best-for-you.html" target="_blank">custom build or build an integration component</a>. Every situation is unique, but there are a few patterns that you’ll see more often with Dynamics NAV sites.<br />
<br />
<h4>
An Existing Purpose-Built Website, Synchronizing the Information</h4>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgd4xsYvafPEHCn370j8to3Vx31eeq_YpaUQD8ndVLCcxmnWkQFux5qN5JAykmBSqlcwQ0W9paIyWtFNKtvtpJtA8ekJ2AXFXrM_kY4C_xzmXFpHe3YG4V5xBwMiDYstCf4AIDfHXUWJIA/s1600/WD1.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="435" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgd4xsYvafPEHCn370j8to3Vx31eeq_YpaUQD8ndVLCcxmnWkQFux5qN5JAykmBSqlcwQ0W9paIyWtFNKtvtpJtA8ekJ2AXFXrM_kY4C_xzmXFpHe3YG4V5xBwMiDYstCf4AIDfHXUWJIA/s640/WD1.png" width="640" /></a></div>
<br />
If
you’re lucky, you will find a website solution that is purpose built
for the problem you’re solving. A retail system is a good example. In
this scenario you just need to have a mechanism to synchronize the data,
and often not in real-time. For example, prices can be updated in a
batch process nightly from NAV into a retail system, and sales
information can be grabbed from that system and put into sales journals
and posted in Dynamics NAV. In this scenario you only need to custom
build the synchronization component. This component could connect to
either your business web services or do regular updates from a landing
area in your Dynamics NAV database (for example writing sales into the
sales journal, and potentially reading current pricing or inventory from
Dynamics NAV).<br />
<br />
<h4>
An Existing Custom Website, That Now Needs to Integrate Some NAV Data with Existing Data</h4>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3D2xD3oRz04b0IUHR6_LLcsuBFn3mRmv2_SMn8GJgYlG-XmdvQ7Gr1F-sZHo_08iW-eyaZPWBbxytMvn8qlQ8i3eDBGjuY5J6bj9y5VgzBa5IQVBoEFjsH97zqmzrSfEWD7QPmMuIAR0/s1600/WD2.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="436" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3D2xD3oRz04b0IUHR6_LLcsuBFn3mRmv2_SMn8GJgYlG-XmdvQ7Gr1F-sZHo_08iW-eyaZPWBbxytMvn8qlQ8i3eDBGjuY5J6bj9y5VgzBa5IQVBoEFjsH97zqmzrSfEWD7QPmMuIAR0/s640/WD2.png" width="640" /></a></div>
<br />
Sometimes
you’ve got a website with a database that already exists, and you just
need to grab some of the data and merge it with some other
information. <br />
<br />
If you need to merge the data, and the
data does not need to be real-time then your integration option looks
similar to the 3rd party component web site.<br />
<br />
<h4>
An Internal Website, or a Website that Needs Real-time Information</h4>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOvnCW1hQ5h7GXooS_HG7hPo1yLOxzZyvwyyUoJPhbBFZpDiKSQ13mjjK27XVx4-mV4KRZHSXn2HHhkad0AprzdSBeTkET7bgBMw856siV07N9HUz2CnY9IXrcBZPHdWXNsPlNFBZxNHM/s1600/WD3.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="436" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOvnCW1hQ5h7GXooS_HG7hPo1yLOxzZyvwyyUoJPhbBFZpDiKSQ13mjjK27XVx4-mV4KRZHSXn2HHhkad0AprzdSBeTkET7bgBMw856siV07N9HUz2CnY9IXrcBZPHdWXNsPlNFBZxNHM/s640/WD3.png" width="640" /></a></div>
<br />
If
it’s an internal website, or need real-time data then you can connect
directly the Dynamics NAV SQL database or to the Dynamics NAV web
services.<br />
<br />
There are many variations of the above. For
example, you might want database replication to keep your NAV data available and not have web usage introduce risk or load
on your company operations. <br />
<br />
<h3>
Choosing the Integration Interface to Connect with NAV</h3>
<br />
There
are several NAV interfaces, but you’ve really got two main options.
RTC business web services (Dynamics NAV pages or CodeUnits exposed as
business web services), or direct to SQL server. The best choice will
really depend on your architecture, which is also affected by your
licensing.<br />
<br />
<h4>
2009 Web Services, AJAX > RTC Web Services</h4>
<br />
If
you’re using NAV 2009 you have the option of using the RTC web
services. These web services are really meant for SOA integration,
however you could just expose the RTC web services directly over the
Internet and then have a completely AJAX driven website connect to that,
however the web service requires you to be authenticated against Active
Directory. This has a few implications: <br />
<ol>
<li><a href="http://www.microsoft.com/licensing/about-licensing/client-access-license.aspx" target="_blank">Licensing</a>
(again). Every user would need windows CAL and a dynamics NAV C/AL.
This option is fine for your existing Dynamics NAV users as that license
fee would already have been paid, but it makes it more costly to allow
access for your customers or vendors. It’s not an option at all for
anonymous logins.</li>
<li><a href="http://blogs.technet.com/b/askds/archive/2008/06/13/understanding-kerberos-double-hop.aspx" target="_blank">Kerberos</a>
double (or more) hop. Having gone through this several times it’s
doable, however be aware that some IT departments will not allow web
accessible computers to delegate authentication, which is a key step in
configuring double-hop to work properly. Determine now before you start
whether this is a possible deployment scenario, because sometimes it’s a
showstopper.</li>
</ol>
Another issue with the AJAX Dynamics NAV Web service option is
that the web services provided do not work out of the box with the two
popular AJAX frameworks <a href="http://en.wikipedia.org/wiki/JQuery" target="_blank">JQuery</a> or <a href="http://en.wikipedia.org/wiki/Ext_JS" target="_blank">EXTJS</a>, which would require several JavaScript wrappers. In 2013 that should change with <a href="http://community.dynamics.com/product/nav/navnontechnical/b/erpsoftwareblog/archive/2012/05/10/microsoft-dynamics-nav-2013-preview-from-directions-emea-2012-conference.aspx" target="_blank">the ODATA option that will be available</a>.<br />
<br />
<h4>
2009 Web Services, but with Your own Custom Decorators and Controllers on Top</h4>
<br />
Dynamics
NAV 2009 web services are WCF based, which makes it very simple to
connect to from ASP.Net based systems. This also provides the option to
have your web site exposed with it’s own custom forms based
authentication, while still connecting to NAV as a single application
user (check your licensing options before you do this). This makes it
easy to execute NAV business logic from within your custom website, and
provide access to data.<br />
<br />
<h4>
Direct to SQL Server</h4>
<br />
If you’re using Dynamics NAV 5 or
earlier then web-services aren’t available as an option, and you will
often need to just connect to SQL server directly.<br />
<br />
Even
if you’re on 2009 or later, the downside to using the NAV web services
is that it is not the most efficient communication available. For
performance-minded applications this is not often a solution as you’ll
have your website data layer, making an HTTP call to the web services,
passing noisy XML data back and forth, and having that XML data
serialize and de-serialize both on the side of Dynamics NAV and your
custom website. <br />
<br />
Your challenges with the direct to SQL Server option are:<br />
<ul>
<li>No business logic is available.</li>
<li>The table naming convention of prefixing SQL server tables
“CompanyName$” will make it more difficult to develop and deploy, and
can also cause problems with newer frameworks such as Ruby on Rails, or
MVC.Net</li>
</ul>
In a future blog post we’ll show how to use a new framework
(MVC.Net) to connect to SQL server directly for the situations where the
Dynamics NAV web services are not an option, and get around the
table-naming problem.<br />
<br />
Tim Dimsdale<br />
Dynamic Manufacturing SolutionsDynamic Manufacturing Solutionshttp://www.blogger.com/profile/12694920969455017434noreply@blogger.com0tag:blogger.com,1999:blog-4211213164920451481.post-34306900452382338562012-06-28T10:08:00.000-06:002015-06-19T10:18:40.601-06:00Software Build vs. Buy: What's Best for You?<h4>
Please note that all DMS news and blog content has been moved to the main website at <a href="http://www.dynms.com/">www.dynms.com</a> for a categorized view.</h4>
<h4>
All utilities and downloads are available at <a href="http://www.dmsiworks.com/microsoft-dynamics-nav-resources/software-downloads">www.dmsiworks.com</a></h4>
<br />
I’m currently in the process of buying a new house. I
have two options: buy an older home that has as many of the necessities
I’m looking for as possible, or build a new house that is customized to
my preferences. The pros and cons are obvious for both, but making a
decision between them is not quite that easy.<br />
<br />
<a name='more'></a>Assuming I can find something in my price range, the time until I move into an older house is relatively short. Once possession is negotiated and my mortgage cheque (hopefully) clears I’m a proud homeowner. That being said, I may have to renovate the property to achieve the actual aesthetics and functionality I’m looking for. Still, someone else has done the hard work and I’m happy to sacrifice personalization for predictability and simplicity. <br />
<br />
On the other hand, building from the ground up ensures that I’ll have everything I want in a house, right down to the beer taps installed in my man-cave. Sure, I’ll have to wait over a year (or longer) to see my plans come to fruition, but in the end I’ll pay a little more in terms of time and money to get exactly what I want and need.<br />
<br />
If you've had the opportunity to work with, or in, the software development industry you will inevitably be involved in arguments about whether or not to build or buy. If you're a customer you might not have even been aware there was an option. Much like buying a house, choosing whether or not to customize the system to your needs is based on a multitude of factors and needs to be made on a situational basis.<br />
<br />
<h3>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZQXXOHBgm1NmAkVg-LFJQX5p4c9e3U6uBaW4NFQ-uz3tfUe7H6KbCcnIRRjQ5yuQxiyLKwtkah6VKgHIYAp1vVxPFiCyjyxXSzpAq2TqBeigm3yEsoKCTswORXeflkR-iIGLuN_jHWd9g/s1600/buildorbuy-resized-600.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="123" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZQXXOHBgm1NmAkVg-LFJQX5p4c9e3U6uBaW4NFQ-uz3tfUe7H6KbCcnIRRjQ5yuQxiyLKwtkah6VKgHIYAp1vVxPFiCyjyxXSzpAq2TqBeigm3yEsoKCTswORXeflkR-iIGLuN_jHWd9g/s200/buildorbuy-resized-600.jpg" width="200" /></a>
All About Building:</h3>
<br />
Building a custom solution is appealing. On paper you get functionality closer to what you want, you can limit process changes, and adapt the system to fit you. For specific problems, or company specific problems, doing a custom build is often the only option.<br />
<br />
Custom builds sound great, but what are the <i>gotchas</i>?<br />
<ul>
<li>A custom build will take longer to get the solution operational. Is this an issue? If it is, how much longer? If it takes a year to build does that really matter to you? If you need a solution in place because you're bleeding operationally then this is probably not the approach.</li>
<li>If you're building with external contractors then make sure effective communications are established before starting. What needs to get done is like playing a <a href="http://www.blogger.com/%28http://en.wikipedia.org/wiki/Telephone_%28game%29" target="_blank">game of telephone</a>: by the time a requirement gets from the person through analysts and requirements spreadsheets, all the way down to the programmer an original feature request could have changed. (<a href="http://blog.dynms.com/2012/06/agile-vs-waterfall.html" target="_blank">Agile methodologies or shorter project iterations</a> can help with this by enabling more frequent feedback).</li>
<li>How much of your internal operational people will be affected for requirements gathering, testing, and training? Remember that it will often be your key people that have the right information about how things are done now in addition to how they should change. </li>
<li>Who will be supporting it? If it's internal people building it will you be able to dedicate some of their time afterwards to supporting the system? If you're hiring external then is the support contract something that is affordable? Did you remember to include this new support in your budget for the next quarter? If communications break down between yourself and the contractors that built it, will you be stuck with a re-build or can somebody else take it over?</li>
<li>Will you own the source code that it was built with?</li>
<li>Are there any frameworks that can be leveraged? Will it built from scratch, or can you leverage other existing solutions to extend? Are there any frameworks that you can use or 3rd party components that can be purchased? </li>
<li>If you're building internally does your company have the appropriate skills to build it? If you apply your employee turnover rate to that department will you still have those skills by the end of the project? What about a year after it's deployed and it's now broken?</li>
</ul>
<br />
If you're using Dynamics NAV, AX, or CRM many of the risks from custom built solutions can be reduced. It's often shorter to develop a solution on top of Dynamics, mostly because these systems are frameworks that allow you to focus on the business problems.<br />
<br />
External contractors could be changed more easily. For example with Dynamics NAV the source code is in the system so you need to worry less about IP, and there is a large ecosystem of NAV solution providers to work with. This should reduce future support concerns and provide options for future maintenance.<br />
<br />
<h3>
All About Buying:</h3>
<br />
Buying a solution is appealing. It's a one-time predictable cost, which is often easier to budget and get funds for. There is often existing support systems in place for products, including documentation and training. The impact to your operations during deployment is minimal, because you're not taking your key people away running your company. There will also likely be less issues post-deployment, because as a product it will have been installed many times before and many product issues will have already been worked out.<br />
<br />
Buying sounds great, but what are the <i>gotchas</i>?<br />
<ul>
<li>It is very unlikely that the add-on will meet 100% of your needs out of the box. Can your processes change to work with the system? Or could you extend or customize the product to fit that gap?</li>
<li>If the product breaks what does support look like? It is more easy to change your own employees time to fix an issue immediately than it is to call somebody outside your company, escalate the issue as necessary, and find the right guy to balance that time with. </li>
<li>If you're not buying an add-on that works in an environment like Dynamics NAV, what upgrades and patches will work? Has the vendor committed to a specific product roadmap and demonstrated that they are living up to those promises?</li>
<li>Buying means it's already been done before, which should raise a flag if you're thinking of buying to get a functionally competitive advantage. Do not be under the illusion that the same product that you're buying that has some features that currently leapfrog your competitor are out of reach of your competitor. </li>
</ul>
<br />
Like building, by using an environment like Dynamics NAV these risks can also be reduced. Many add-ons can be further customized be other consultants, and by the open nature of how the code is produced Dynamics NAV even products that have reached end of life can still be supported an further customized. <br />
<br />
<h3>
You Have Choices:</h3>
<br />
If you're already in the Dynamics ecosystem then you have choices, and those choices are easier than most. Many Dynamics project extensions are often hybrids. Usually a consultant will try and find an add-on that will meet most of the requirements, and then do custom integration work to tie in the rest.<br />
<br />
There is a plethora of add-ons for Dynamics NAV, AX, and CRM that enable you to buy off the shelf. Many of these add-ons also enable you to customize the rest. Since Dynamics NAV often has many ways of interacting with the system even solutions that aren't "in" Dynamics NAV but around it can more easily be changed.<br />
<br />
To make the decision you need to remind yourself how your business operates. <br />
<ul>
<li>Is your technology keeping up with your business now? </li>
<li>Does the solution you need provide you with a competitive advantage? </li>
<li>Do you need the capability now, or can that capability be delayed with more importance on it being more specific and correct? </li>
</ul>
<br />
Tim Dimsdale<br />
Dynamic Manufacturing Solutions
<a href="http://blog.dynms.com/" rel="tag" style="display: none;">CodeProject</a>Dynamic Manufacturing Solutionshttp://www.blogger.com/profile/12694920969455017434noreply@blogger.com0tag:blogger.com,1999:blog-4211213164920451481.post-40666862362016797592012-06-26T11:23:00.000-06:002015-06-19T10:18:10.022-06:00The Key to a Secure Password<div class="separator" style="clear: both; text-align: center;">
</div>
<h4>
Please note that all DMS news and blog content has been moved to the main website at <a href="http://www.dynms.com/">www.dynms.com</a> for a categorized view.</h4>
<h4>
All utilities and downloads are available at <a href="http://www.dmsiworks.com/microsoft-dynamics-nav-resources/software-downloads">www.dmsiworks.com</a></h4>
<br />
Whether you’re an aspiring computer hacker or just someone who values their privacy, password security is an inherent concern of the internet era. If you value your data then you should value a good password. The password is one of the gateways to your information, confidential or otherwise, and therefore must be as secure as possible.<br />
<h3>
<a name='more'></a></h3>
<h3>
Password Security</h3>
<br />
Passwords are synonymous with computer use or internet access. Keeping a secret on the internet is akin to keeping a secret in junior high school, especially considering that valuable data is held with a varying degree of safety protocols, depending on who is managing your information. This post is meant to inform on how password holders keep your information secure, the methods that hackers use to break passwords, and what you can do to ensure your information has the best chance of staying safe.<br />
<h4>
</h4>
<h4>
The Code: Cryptographic Hashes</h4>
These are used in competent databases for password authentication and obfuscation of passwords. Their purpose is to protect the passwords from being released once a database has been compromised. This is done by storing passwords as hashes, not plain text, and then password inputs are hashed themselves and that hash is compared to the stored hash. If someone has stolen a password hash list then there is still work ahead for them as they then have to guess the passwords that lead to the hash list. If the passwords were in plain text, then the attacker has access to every account without further effort. Cryptographic hashes are one way functions meaning that given the output hash you should not mathematically be able to ascertain the input password. Therefore, cryptographic hashes are important to security because they add another layer of protection if done right but are not a guarantee.<br />
<h3>
</h3>
<h3>
Cracking the Code</h3>
<br />
Usually you will hear a story on the news about password hashes being stolen or leaked. The reason that this is a big deal is because a hash does not guarantee security; it merely enhances it by wasting the attacker’s time. Cryptographic hashing functions are well known and their security is in the generation of the hash rather than being secretive about their approach. Therefore, once a hashed password is gleaned from a system, attempts can be made by guessing different passwords, feeding it through the hashing function and then looking for a match or pattern between the hashes. Some basic methods for cracking passwords include:<br />
<h4>
</h4>
<h4>
Brute Force Attack</h4>
<ul>
<li>Generate every possibly password combination and try them one at a time</li>
<li>This wastes a lot of time because it iterates over every possible password and may not ever be able to recover a good password with today’s hardware, mathematics and physics</li>
<li>Good enough method to use against short, weak passwords</li>
<li>Password length and character set (letters, numbers, capitals, symbols) determine the time it will take to break these passwords</li>
</ul>
<h4>
</h4>
<h4>
Dictionary Attack</h4>
<ul>
<li>Use a pre-computed list of common passwords and words to search for the password; this list can include every known word so do not rely upon an obscure word for protection</li>
<li>The dictionary can be generated once and used for multiple attacks against different hashes</li>
<li>Thwarting these types of attacks involve having a random looking password that is not common and still adheres to having sufficient length and a high character set</li>
</ul>
<h4>
</h4>
<h4>
Miscellaneous</h4>
<ul>
<li>Use a dictionary attack but with rule modifiers to substitute letters for numbers, appending letters or numbers to the end or beginning, </li>
<li>There are more possible avenues of attack but they also reinforce the notion that a good password choice makes an attack harder</li>
</ul>
<br />
This <a href="https://community.qualys.com/blogs/securitylabs/2012/06/08/lessons-learned-from-cracking-2-million-linkedin-passwords%20" target="_blank">link</a> shows how passwords can be cracked, given a sufficient period of time and some intellect:<br />
<br />
The article highlights some slightly complex passwords that the author found and is a good example of actual security compared to what people think is secure. Although some of the ‘harder’ passwords lacked actual complexity, the author does a good job of pointing out that any correlation to an actual word makes cracking the password that much easier. <br />
<h3>
</h3>
<h3>
Password Choice</h3>
<br />
Choosing a strong password is nearly as difficult as cracking one. Different passwords can be easier or harder to guess based upon the avenue of attack. As this web comic points out password length is important due to the bits of entropy required to brute force a guess. However, the method proposed is weak to dictionary attacks that use every possible combination of all words together making the search space still sufficiently small.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://imgs.xkcd.com/comics/password_strength.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://imgs.xkcd.com/comics/password_strength.png" height="323" width="400" /></a></div>
<h4>
Password Reuse </h4>
Using the same password between multiple sites is a security hole and is best illustrated by <a href="http://xkcd.com/792/" target="_blank">the same web comic</a>. A site may not be a phishing scheme but if the site’s passwords are ever stolen then this attack would still apply. This is a big problem because once one site is compromised or takes your information, then it can be applied against all the major banking sites or whatever the attacker deems valuable. Remembering passwords for all those different sites is not easy so you can try using a password manager or use a hierarchical approach to passwords by arranging your passwords in tiers. Anything deemed critical is tier one and must have one strong password per login (banks, company systems). Tier two can be anything you know is not critical but still important to keep safe (social media) and can have some password reuse (but never with another tier) and there should still be more than one password in this tier. Tier three can be sites that you sign up for that you intend to not use or store data in them or simply throw away sites and this tier can share one password (again this better not be shared with another tier) so long as you do not mind any of these sites being compromised.<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<h4>
Password Managers: It’s All About Trust</h4>
My network security professor told my class (and has been reinforced by multiple studies) that “Security is about who you trust.” If you use a password manager, you are really putting as much trust in a 3rd party as you would coworkers walking past a sticky note on your desk. Password managers can be extremely useful, especially if you’ve got multiple passwords and a weak memory, but should be used under the caveat that you’re still trusting someone else to keep your secret.<br />
<h3>
</h3>
<h3>
So how do I choose a good password?</h3>
<br />
This is hard to answer as technology constantly changes. But essentially you want a password that looks nothing like a word, phrase or number and you need it to have zero discernable pattern. Your IT department can usually make you a really nice secure password if you have one. If not, there are programs that can generate passwords for free that do exist that can be found by doing a simple web search. I will not list any as I do not want to endorse one over the other and depending on your level of paranoia; they may not be secure themselves. If you are paranoid, then simply alter a randomly generated password and make it your own. <br />
<h4>
</h4>
<h4>
Password Creation</h4>
<ul>
<li>Choose a password over 10 characters in length (10 is a minimum but 12 and greater are encouraged)</li>
<li>Use uppercase, lowercase, numbers and punctuation spread throughout</li>
<li>Do not rely upon substituting, appending, or prefixing numbers/letters/punctuation to words as this is not secure</li>
<li>Do not use words, dates, addresses, personal info in your password as these are most likely public knowledge somewhere on the internet or can be found out in some way</li>
<li>For secure sites where security is really important to you, have unique passwords for each site in case one site is compromised, then all your secure sites are not compromised</li>
<li>Change your password immediately when there is a hash leak for one of the sites you use (change it often anyways in case there is a leak but it is unreported or unknown) </li>
<li>Random looking long passwords are great</li>
<li>Don’t use public computers for anything important as these can be assumed to be constantly compromised and may leak your data to an attacker</li>
</ul>
<br />
Password cracking methods are getting faster based on increasing processor speed, clusters of computers, and more intelligent methods. Therefore, some password deemed to be secure today will not be secure in the future. For every researcher developing cutting-edge ways to prevent attacks there is a hacker coming up with ways to compromise it. When it comes to passwords, it’s a good idea to always assume that the ‘bad guys’ are out to get you. That is, unless we figure out how to <a href="http://www.canadianbusiness.com/blog/tech/88991--a-world-without-passwords-yes-please" target="_blank">make passwords a thing of the past...</a><br />
<br />
Robert Dmytruk<br />
Dynamic Manufacturing Solutions <br />
<br />
<a href="http://blog.dynms.com/" rel="tag" style="display: none;">CodeProject</a>Dynamic Manufacturing Solutionshttp://www.blogger.com/profile/12694920969455017434noreply@blogger.com0tag:blogger.com,1999:blog-4211213164920451481.post-72193411612037504012012-06-19T12:38:00.000-06:002015-06-19T10:17:58.682-06:00Introducing the DMS Universal DataPort<h4>
Please note that all DMS news and blog content has been moved to the main website at <a href="http://www.dynms.com/">www.dynms.com</a> for a categorized view.</h4>
<h4>
All utilities and downloads are available at <a href="http://www.dmsiworks.com/microsoft-dynamics-nav-resources/software-downloads">www.dmsiworks.com</a></h4>
<br />
Data is the currency of the information age, so it should come as no surprise one of the more frequent tasks integrators, users, and system administrators encounter when implementing or maintaining a Microsoft Dynamic NAV installation is data migration. The four common approaches to getting the data from where it resides into NAV are: manual entry in the NAV client, using SQL server’s database tools, using NAV's Excel mapping, or via a NAV Dataport or XMLport.<br />
<a name='more'></a><ul>
<li>Manual entry is the low-tech approach, but can be beneficial in cases where the information exists in a non-electronic format or if a low volume of unusually formatted data needs to be entered. A major downside to manual data entry is the opportunity for random data entry errors, which <a href="http://www.intermec.com/public-files/white-papers/en/EAM-EliminatePaperwork_wp_web.pdf" target="_blank">studies</a> have shown occur roughly once for every 300 keystrokes.</li>
<li>SQL Server’s tools provide simple and robust data manipulation and formatting capabilities, but using it to insert or update directly into NAV bypasses the business logic and can result in any number of issues if the user doesn’t know and replicate what NAV would normally do behind the scenes. </li>
<li>NAV's Excel Mapping tools are fairly easy to use from an end-user point of view, but require a separate setup for each table that can be tedious to configure, and require a very specific Excel sheet layout. Once they're set up, they can be very slow to run - significantly slower than a Dataport or SQL. They do have the advantage of providing validation on the incoming data and letting the user review any errors that have occurred before committing the data to the database.</li>
<li>NAV’s Dataport and XMLport can be tedious when having to select all the import fields, but have the benefit of having the imported data validated by the business logic. However, this validation can also create additional work, such as an initial import into the Item table. You can’t provide a base unit of measure or the validation on that field will fail, so you’re forced to import the item without it, create the item unit of measure, and then import the item again and supply the base unit of measure.</li>
</ul>
So what’s a savvy system integrator to do? Use the <a href="http://www.mibuso.com/dlinfo.asp?FileID=1450" target="_blank">DMS Universal Dataport (Download Link)</a>, our gift to you!<br />
<br />
At its core the DMS Universal Dataport is a NAV dataport that automatically sets the fields to import based on the values that are present in the first row of the tab delimited import file. Users have the ability to select which fields the NAV business logic should validate, can specify if new records should be inserted or if existing records should be updated.<br />
<br />
It's true that NAV 2013 will do away with dataports completely, but the Universal DataPort is great for any pre-2013 databases, and all the code in it is easily ported to an XMLPort (stay tuned - we'll be releasing that shortly).<br />
<br />
<h4>
DMS Universal Dataport</h4>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYg0GFoytyeewiNYqCRk4yz48A6evGuG79XSF6Mii6cuXqZrm33gng_27HFgCfJylS3O8khLU07QD0lhB9E4jsKnvT3S8-0ioppFwXJBEkqD6Dz-rNSB2fFcX6RGxpGZcwLVpQkiH60cxg/s1600/Dataport1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="262" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYg0GFoytyeewiNYqCRk4yz48A6evGuG79XSF6Mii6cuXqZrm33gng_27HFgCfJylS3O8khLU07QD0lhB9E4jsKnvT3S8-0ioppFwXJBEkqD6Dz-rNSB2fFcX6RGxpGZcwLVpQkiH60cxg/s400/Dataport1.png" width="400" /></a></div>
<br />
<h4>
Description of fields:</h4>
<blockquote class="tr_bq">
<b>Filename</b>: The name of the tab delimited text file to import<br />
<br />
<b>Import table number</b>: The NAV table ID to import data into<br />
<br />
<b>Allow record inserts</b>: If checked new records will be created.<br />
<br />
<b>Allow record updates</b>: If checked existing table records will be updated.<br />
<br />
<b>Use change log if set up</b>: If checked the actions of the DMS Universal Dataport will be logged in the change log (if it is configured to log the table and fields being imported or updated).<br />
<br />
<b>V</b><b>alidate fields starting with “*”</b>: If checked the NAV data validation routine will only be called for fields that begin with an asterisk on the first row of the import file.<br />
<br />
<b>Validate all fields</b>: If checked all fields that exist in the import file will have their imported values validated.</blockquote>
<br />
<h4>
Sample import:</h4>
A basic import into the NAV “Location” table appears in Excel below:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8qvKJzXrg_oH-0iveW5QR74GtpIKwEUQpHAs3k5wSuiox3VUvPfwN7CAhQbnAA2oz7QXnrn9S52087bM7O-FLSOYmw3HE6wX5XJaLm27X_6shgD37OKyUEZJIFFIdfsA2AdPfPWsn-svC/s1600/Dataport2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="49" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8qvKJzXrg_oH-0iveW5QR74GtpIKwEUQpHAs3k5wSuiox3VUvPfwN7CAhQbnAA2oz7QXnrn9S52087bM7O-FLSOYmw3HE6wX5XJaLm27X_6shgD37OKyUEZJIFFIdfsA2AdPfPWsn-svC/s320/Dataport2.png" width="320" /></a></div>
<br />
The first row tells the DMS Universal Dataport to import values into four NAV fields; “Code”, “Name”, “City” and “Phone No_”. The asterisk in front of the “code” fieldname would indicate to the Dataport to validate this field, assuming the “Validate all fields” option was not enabled. Note that the Universal Dataport will accept field names in the NAV
format (using punctuation as in "Phone No."), or in the SQL format that replaces
punctuation with underscores (like "Phone No_").<br />
<br />
Saving this spreadsheet as a tab delimited text file would yield the following file which can be imported into NAV: <br />
<blockquote class="tr_bq">
*code name City Phone No_<br />
DMS Dynamic Mfg. Solutions Edmonton 780-988-0215 </blockquote>
<h4>
Additional information:</h4>
<ul>
<li>If you're importing Contacts, you can include the "No." field in the header row but leave the values blank/empty and the Dataport will automatically use the Contact number series for you. This functionality could be extended to other tables fairly easily.</li>
<li>NAV will attempt to validate fields in the order it encounters them (from left to right) so be sure to lay out the import file to avoid validation problems based on field ordering. For instance, if you are importing into the item journal and NAV encounters the quantity field before the item number field the validation will fail with an error. </li>
<li>When importing into the Item or Resource table the base unit of measure will automatically be added to the item unit of measure or resource unit of measure table for you, so you can import into these tables in one step.</li>
<li>Make sure to include fields that match one of the NAV table keys for the table you are updating.</li>
<li>Be careful with tools like Excel that might insert double quotes around columns containing certain text data when it creates a tab delimited text files.</li>
<li>Watch out for duplicate data when running with the ”Allow record inserts” option.</li>
</ul>
<h4>
Extending the Dataport:</h4>
Though the Dataport functions very well as-is, there are a lot of possibilities for extending what it can do, including:<br />
<ul>
<li>adding more default subtable insertions (like what the DataPort does for units of measure on the Item table)</li>
<li>launching user-specified Codeunits for pre- or post-processing imported records</li>
<li>creating a reconciliation screen that users can review before committing changes to existing records</li>
</ul>
If you experiment with updating the Dataport, let us know - we'd be curious to see how people build on it.<br />
<br />
<ul>
</ul>
MG<br />
Dynamic Manufacturing SolutionsDynamic Manufacturing Solutionshttp://www.blogger.com/profile/12694920969455017434noreply@blogger.com0tag:blogger.com,1999:blog-4211213164920451481.post-87940796407202058342012-06-13T15:11:00.000-06:002015-06-19T10:17:49.336-06:00In-Depth Bank Reconciliations in Microsoft NAV<h4>
Please note that all DMS news and blog content has been moved to the main website at <a href="http://www.dynms.com/">www.dynms.com</a> for a categorized view.</h4>
<h4>
All utilities and downloads are available at <a href="http://www.dmsiworks.com/microsoft-dynamics-nav-resources/software-downloads">www.dmsiworks.com</a></h4>
<br />
I like it when thing lines up as they're supposed to. Maybe it’s a slight degree of <a href="http://www.buzzfeed.com/samir/things-that-will-drive-your-ocd-self-insane" target="_blank">obsessive-compulsive disorder</a> on my part, but my personal well-being is dependent upon keeping certain aspects of my life in a state of tranquility.<br />
<br />
When it comes to my operations, and especially my finances, I don't want to come across any unexpected surprises. At the end of the month, I need to know that my bank statements all sync up with my bank transactions. I don’t think that’s too much to ask??? In Microsoft Dynamics NAV, performing a bank reconciliation is quick and easy to do and helps ensure that all is in order, and here’s how:<br />
<a name='more'></a><br />
First you need to set up your worksheet.<br />
<br />
The bank rec functionality is accessed through Cash Management > Bank Account Reconciliations. Select an existing worksheet from the list or click New to start a new one.<br />
<ol>
<li>Choose the Bank Account number. The Statement Number should fill in automatically from the bank account number.</li>
<li>Enter the Statement Date. This is the date up to which the bank is being reconciled.</li>
<li>The Cleared With/Chks Per Stmnt and Cleared Inc/Dpsts Per Stmnt fields are for your information only and can be entered from the Total Debits and Total Credits typically on the last page of a printed bank statement. These fields are optional and are not used by the program.</li>
<li>The Balance on Statement field is mandatory and is the amount to which the reconciliation must balance.</li>
</ol>
An example of a Bank Rec Worksheet with these steps completed is shown below:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhEoTwLd8bZExU03g7LNIdBOKRDkqq3vBhwoSjnLFhQosXQBL6_iWUy_5fNp23eiOXHtMY-dh4Wq_kG5lgWEwWPCtn0jcqZHcfj5-n4bNiRrrvx3zt7cA4cgVMZYZpWuVnZIu3AyAQ4OxeK/s1600/Worksheet1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="404" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhEoTwLd8bZExU03g7LNIdBOKRDkqq3vBhwoSjnLFhQosXQBL6_iWUy_5fNp23eiOXHtMY-dh4Wq_kG5lgWEwWPCtn0jcqZHcfj5-n4bNiRrrvx3zt7cA4cgVMZYZpWuVnZIu3AyAQ4OxeK/s640/Worksheet1.png" width="640" /></a></div>
<br />
The next step is to bring in all entries that have been posted in NAV up to and including the Statement Date entered above.<br />
<br />
To retrieve bank transactions, from the Bank Rec Worksheet click on the Actions button > Functions > Suggest Lines. On the Options tab, select Both in the Record type to process field. Only select the Replace existing lines option if starting the bank rec over.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhquMR0JRlLJalPKR-JuDNEXUfB-RD_vHBKHSF4lubOfaeBIs7NF720WVgAZxjCwOSXeAJeIqBVf0frxGxYurPtHss5Z5fOeLrPkvZoertBw_k2mb6-c89yC44qERc-fkMn1JR9UWSKTHRb/s1600/Worksheet2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="282" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhquMR0JRlLJalPKR-JuDNEXUfB-RD_vHBKHSF4lubOfaeBIs7NF720WVgAZxjCwOSXeAJeIqBVf0frxGxYurPtHss5Z5fOeLrPkvZoertBw_k2mb6-c89yC44qERc-fkMn1JR9UWSKTHRb/s320/Worksheet2.png" width="320" /></a></div>
<br />
Click OK.<br />
<br />
To review the open cheques for this bank account, click on the Cheques FastTab. To review non-cheque transactions such as deposits, transfers, journal entries, etc., click on the Deposits/Transfers FastTab.<br />
<br />
The bank rec is now set up. You can start reconciling. Yay!!<br />
<br />
<h4>
Processing the Bank Reconciliation</h4>
<br />
There are two ways to clear the outstanding transactions: manually or program-assisted.<br />
<br />
Manually clearing transactions involves:<br />
<ol>
<li>Matching the NAV transaction to the bank statement transactions and putting a checkmark in the Cleared field.</li>
<li>Transactions that are not marked cleared when the bank rec is posted, are considered outstanding and will appear on the next bank rec worksheet. </li>
</ol>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkVktP47Yd_pF4A7xUe-vkZWtdJ7POJm7lFCqa1ETzWcK2LGuzKL4rVtcupXqkE9FhEDSA1D1nTTY2OF4sdg1EIIm6RWYBz0t2YMLt5tqDMvKX708Pe9Kagcg51ouoEX0l-E8MEfG7YWyk/s1600/Processing1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="482" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkVktP47Yd_pF4A7xUe-vkZWtdJ7POJm7lFCqa1ETzWcK2LGuzKL4rVtcupXqkE9FhEDSA1D1nTTY2OF4sdg1EIIm6RWYBz0t2YMLt5tqDMvKX708Pe9Kagcg51ouoEX0l-E8MEfG7YWyk/s640/Processing1.png" width="640" /></a></div>
<br />
The program-assisted clearing of transactions involves using NAV functionality to clear the transactions en masse. You can either set filters to select particular transactions or select all transactions. If all transactions are marked as cleared, then you manually uncheck the outstanding transactions. This method is quicker when there are relatively few outstanding transactions.<br />
<ol>
<li>Click on the Actions button > Functions > Mark Lines to pull up the request form for this functionality. This opens the Bank Rec Process Lines request form. The Options FastTab allows you to select the Record type to process.</li>
<li>Put a checkmark in the Mark lines as cleared field. Filters are set on the Bank Rec Line FastTab. Click OK to mark the transactions as cleared. This marks all cheques and deposits as cleared.</li>
<li>The next step is to manually go and uncheck the transactions that did not actually clear the bank.</li>
</ol>
When all the cleared transactions are marked, return to the General FastTab of the bank rec worksheet to review the amounts. The General FastTab maintains running totals of the reconciliation. In my example, I have a Difference of $165.22.<br />
<br />
Upon review of the bank statement, I see that there is $165.22 of unrecorded bank charges. NAV’s bank rec functionality allows you to record this type of transaction from directly within the bank rec worksheet.<br />
<br />
<h4>
Recording Adjustments</h4>
<br />
To record miscellaneous bank transactions and adjustments, go to the Adjustments FastTab. This FastTab lets you enter in adjustments for transactions that appear on the bank statement but have not been recorded in NAV. You can record many different types of transactions but the most common use is for recording bank charges.<br />
<br />
Note: If after starting your bank rec, you do enter and post additional bank transactions (outside of your bank rec), you will need to Suggest Lines again to bring in the new transactions. Do not choose the option Replace Existing Lines unless you intend to start your bank rec process all over again.<br />
<br />
<b>Posting Date</b> – This transaction date should be on or before the bank rec Statement Date.<br />
<b>Account Type</b> – Select Bank Account.<br />
<b>Account No.</b> – This must be the bank account number for the bank being reconciled.<br />
<b>Amount</b> – Enter the amount of the adjustment. A negative amount indicates an amount coming out of the bank and a positive amount indicates an amount going into the bank.<br />
<b>Bal. Account Type</b> – Select the balancing account type here. It is usually a G/L Account.<br />
<b>Bal. Account No.</b> – The Account where the adjustment is being posted.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEji_UmMSWwLcMs-q_UWCdEuB5tSlNcugfXSqa51oVHJzT8X2jBDoIITaKPKSXCWACAp2Ko-aG0Z0v2M1aYXhZGaqwHCFzJNju2ck2CNUVs2IMFV5ErbRKGWaSGXDTSV10uIzVm9A6cqdp4A/s1600/Processing2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="281" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEji_UmMSWwLcMs-q_UWCdEuB5tSlNcugfXSqa51oVHJzT8X2jBDoIITaKPKSXCWACAp2Ko-aG0Z0v2M1aYXhZGaqwHCFzJNju2ck2CNUVs2IMFV5ErbRKGWaSGXDTSV10uIzVm9A6cqdp4A/s320/Processing2.png" width="320" /></a></div>
<br />
These adjustments can also be posted with dimension information, by showing the dimension columns and entering this information.<br />
<br />
Return to the General FastTab to review the reconciliation totals. When the bank has been reconciled successfully the Difference will display zero. The bank rec can now be posted. Awesome!<br />
<h4>
</h4>
<h4>
Posting the Bank Reconciliation</h4>
<br />
Click on the Actions button > Posting > Test Report to review the Bank Rec Test Report. The report details are set on the Options FastTab; these options are retained when using Post and Print in the future. The most commonly used options are shown below.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjw1-UHUKnrgqS6lIBfjGjrt7KK8TM5ViZujCZkotbDeJKg_P8EKP5RgnnyfHp9qfRWOChJ9zJYZyhuUgvzM5tvghMrOnmzxvztc4Zn44WD9Z_2lacfcVCm3FF4t-4qGImUe3dlCbcNvhTS/s1600/Processing3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjw1-UHUKnrgqS6lIBfjGjrt7KK8TM5ViZujCZkotbDeJKg_P8EKP5RgnnyfHp9qfRWOChJ9zJYZyhuUgvzM5tvghMrOnmzxvztc4Zn44WD9Z_2lacfcVCm3FF4t-4qGImUe3dlCbcNvhTS/s320/Processing3.png" width="292" /></a></div>
<br />
You can either <i>Post</i> or <i>Post and Print</i> the completed bank rec by clicking on these action buttons.<br />
A progress window is displayed while the system works. The posting process clears the marked transactions and posts the adjustments. It also closes the open bank rec worksheet and posts a bank statement.<br />
<br />
And with that, there is balance in the universe.<br />
<br />
Kelly S.<br />
Dynamic Manufacturing SolutionsDynamic Manufacturing Solutionshttp://www.blogger.com/profile/12694920969455017434noreply@blogger.com2tag:blogger.com,1999:blog-4211213164920451481.post-71304095105306069002012-06-07T15:14:00.001-06:002015-06-19T10:17:37.425-06:00Barcodes, We Love You<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<h4>
Please note that all DMS news and blog content has been moved to the main website at <a href="http://www.dynms.com/">www.dynms.com</a> for a categorized view.</h4>
<h4>
All utilities and downloads are available at <a href="http://www.dmsiworks.com/microsoft-dynamics-nav-resources/software-downloads">www.dmsiworks.com</a></h4>
<br />
Unless you’ve never been in a grocery store or shopping mall, barcodes aren’t exactly a novel technology. We’re all familiar with ubiquitous UPC codes, but in recent years the advent of complex barcode technologies and the proliferation of QR codes for social purposes has people reevaluating just how important barcodes can be. <br />
<br />
<a name='more'></a><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7JGoiNRRtYJGITjkqWGUo2OCBSKuP2rLomwe5d5RPVG2NTyjXwLck5KuOnF7YD3xSRaIZ79pThcyHFuQWW3oPO3VZ8BE0eTdpdDq0cRUIUgU_fBUZk3Vk3TbBhYBwXemfyDVlBl8GFbU8/s1600/upcdynms.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="102" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7JGoiNRRtYJGITjkqWGUo2OCBSKuP2rLomwe5d5RPVG2NTyjXwLck5KuOnF7YD3xSRaIZ79pThcyHFuQWW3oPO3VZ8BE0eTdpdDq0cRUIUgU_fBUZk3Vk3TbBhYBwXemfyDVlBl8GFbU8/s200/upcdynms.png" width="200" /></a></div>
<br />
Evolutionarily, barcodes are one of the most adaptable technologies of the last half-century. Every time someone runs into an apparent Achilles heel for the technology, a cost-effective, functional solution appears. Harsh work environments? Laser-imprinted barcodes. Dust and dirt? Teflon-coated barcodes. Not enough information? 2D and high capacity barcodes. There really is a barcode solution for almost any scenario. And for the most part, scanning technology is largely the same as it was 40 years ago, implementation costs are dirt-cheap. Functional scanners are so readily available that anyone with a smartphone has the ability to scan, which has led to a barcode renaissance, if you will.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWxSVdGBMvgFnFi2dw2NN-ZSdOey0LWw4-BGWx9snOBiIihzqYiIMjsAKOy7ajkl-4t72P89pQ7kWN1728scTiF5mjOv7nw9mML9AvKDvs91WqBqFj0uPjr-bFg25W5jev6-Z8hf2UnD8a/s1600/datamatrixdynms.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWxSVdGBMvgFnFi2dw2NN-ZSdOey0LWw4-BGWx9snOBiIihzqYiIMjsAKOy7ajkl-4t72P89pQ7kWN1728scTiF5mjOv7nw9mML9AvKDvs91WqBqFj0uPjr-bFg25W5jev6-Z8hf2UnD8a/s1600/datamatrixdynms.png" /></a></div>
<br />
The most apparent use for barcodes still remains in commercial applications (UPC codes for retail, groceries, etc), but their use in industrial settings can have a much more significant impact. Barcodes provide a cost-effective way of tracking inventory, employee time and attendance, manufacturing costs, and provide both ease of use for employees and unprecedented insight for executives. Most ERP systems have some sort of barcode functionality built in, so anyone with a system can reap the benefits that they provide, often with a very high return on investment and short payback period. For the same reasons that make barcodes extremely cheap and effective on a personal level; cost and simplicity, companies can leverage<br />
<br />
Of course, with all technologies there are good and bad ways to leverage their benefits. You could either use barcodes to <a href="http://medgadget.com/2010/08/2d_barcodes_to_help_prevent_proliferation_of_counterfeit_drugs.html" target="_blank">prevent the proliferation of counterfeit drugs</a>, or you could use your own barcodes to <a href="http://www.dailymail.co.uk/news/article-2148074/Silicon-Valley-tech-executive-Thomas-Langenbach-caught-switching-bar-codes-steal-Lego-Target.html" target="_blank">rip off toy suppliers</a>, your choice. We’re here to inform, not judge.Dynamic Manufacturing Solutionshttp://www.blogger.com/profile/12694920969455017434noreply@blogger.com0tag:blogger.com,1999:blog-4211213164920451481.post-49017058281324643182012-06-05T14:22:00.000-06:002015-06-19T10:17:29.396-06:00How to Balance Project Agility and Predicitability<h4>
Please note that all DMS news and blog content has been moved to the main website at <a href="http://www.dynms.com/">www.dynms.com</a> for a categorized view.</h4>
<h4>
All utilities and downloads are available at <a href="http://www.dmsiworks.com/microsoft-dynamics-nav-resources/software-downloads">www.dmsiworks.com</a></h4>
<br />
A project manager is often seen dancing in the wilderness of scope creep, balancing resourcing constraints on the head of the budgetary needle, dealing with the inevitable boogeymen on the road to integration. Your role as a PM, in short, is to remove obstacles that enable real progress. <br />
<br />
<a name='more'></a>A formalized project implementation methodology and accompanying document artifacts, like that provided by Microsoft Dynamics SureStep, help provide predictability and control. The challenge is that typical waterfall based approaches don’t work well on smaller budget projects, or where scope is not well known.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhiBWlaRnainAqP1bPC8GnPC430PdRdZVRpA-z3Avb0S6P-OdNQJwNUXRwO3itnGDP-IKIkf9CK6l2WdCGUVQjy3YsPavKnX8Y9CfLci03ujgeuIYPLOJu9tpfl3lHMyntHTKvlovNBPdSL/s1600/Surestepsmall.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="231" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhiBWlaRnainAqP1bPC8GnPC430PdRdZVRpA-z3Avb0S6P-OdNQJwNUXRwO3itnGDP-IKIkf9CK6l2WdCGUVQjy3YsPavKnX8Y9CfLci03ujgeuIYPLOJu9tpfl3lHMyntHTKvlovNBPdSL/s320/Surestepsmall.jpg" width="320" /></a></div>
<br />
“Agile to the rescue!” is heard over trumpets. Your small army arrives and starts configuring, coding, and generally doing things very quickly. Things are being built, things you can see, that’s progress right? Are they the right things? When is it done? How do you measure completion without the requirements up front? And how did you sell agile when your client needed a predictable budget? <br />
<br />
An agile methodology provides working use cases early and often, and by its nature engages clients directly in the development of a system. These benefits tend to be yielded at the expense of predictability. With clients where you have already established a level of trust you’ll notice that your projects often drift this direction - I think that’s good. Until that trust is established predictability will be important. <br />
<br />
Let’s say that your project has unknown scope, or the scope will likely change frequently. Maybe you’ve got a new client, or a tight budget, or for other reasons don’t want to introduce the burden of a complete waterfall methodology. What are your options? SureStep provides a defined agile methodology (see below), based on SCRUM , and while this approach is good, we’ve already established that it requires a level of trust and commitment from your client.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSZy-XmIzihHoms2PyLTE8B0RxCp8PsTaD_Az9Yx7EvBbNBeZZnGVSTHl9X9R7WmZYM9JEko0M5zUVJrWy-0gFAc26GC6z5XdVY88Yxtsn0BmKP2mK0GyzMJR87EsTPHmw3J7VkHzDx4Fu/s1600/Surestepagile.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="253" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSZy-XmIzihHoms2PyLTE8B0RxCp8PsTaD_Az9Yx7EvBbNBeZZnGVSTHl9X9R7WmZYM9JEko0M5zUVJrWy-0gFAc26GC6z5XdVY88Yxtsn0BmKP2mK0GyzMJR87EsTPHmw3J7VkHzDx4Fu/s320/Surestepagile.jpg" width="320" /></a></div>
<br />
A practical approach to applying SureStep is to follow the methodology, but minimize the document artifacts that need to be produced. Let’s work backwards on a project. One of the last key document artifacts before sign off is the User Acceptance Test script (UAT), produced by the “Conduct Solution Testing” step (3.6.9 in the standard project type, and 3.6.1 in the agile project type). UAT is unfortunately often a rushed activity near project completion, or is sometimes skipped if your budget is shot, or it will sometimes end up as an “as-built” instead of “what-I-wanted”. This is unfortunate as it’s the document that has the most relevance and the most clear document that says: “When I put my initials, dates, and comments on this list of steps, I am agreeing that this functionality works in a way that I have tested it and that is sufficient to meet my needs.” Why is it skipped so often? The UAT document is the realization of your requirements and design documents, so the material by that point has been established. You’ve likely just finished some training prior to the UAT, so the client is already familiar with its workings. If the project budget needs help, this document and its supporting activity are often the easy targets. <br />
<br />
Let’s switch it around. A UAT will contain your core use cases, which inherently contain your important requirements and the user interaction design. Instead of capturing requirements and interaction design in separate documents, let’s define those up front, and build those into the UAT. Requirements that cannot be placed directly into a use case can still be listed separately in a simple table near the top of your UAT. It should help make your implementation team’s lives easier as it provides a clear use case of how the system should work (much easier than a long requirements document, which is often in a language that will engage your clients instead of your implementation team), and it should also make it easier for your clients to visualize how the solution will work.<br />
<br />
By applying a test-first approach directly to SureStep, we end up with a model like the one shown below. Incorporating UAT documentation at the design stage of the classic waterfall implementation aligns usability with development goals and reduces the required steps in the implementation process, which still remains predictable and cost-effective. The amalgamated documents can then be referenced throughout the implementation process as a check against requirements. <br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhiy4C_3wuOEwXtq9MUBtjV1l2U7HUSwbdfQR1qiW3M4cMPgnCRcbIgJBgEcc4VJ6DVxIkKYHYUiMOHWrYTM9MqiCDsLPPFzLtdL7pi6jHirpkxqHsWEIuaLcycZucIyeUOTouLtV5FawdI/s1600/DMSAgile.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhiy4C_3wuOEwXtq9MUBtjV1l2U7HUSwbdfQR1qiW3M4cMPgnCRcbIgJBgEcc4VJ6DVxIkKYHYUiMOHWrYTM9MqiCDsLPPFzLtdL7pi6jHirpkxqHsWEIuaLcycZucIyeUOTouLtV5FawdI/s320/DMSAgile.png" width="320" /></a></div>
<br />
Where the colors follow the standard Dynamics SureStep phases.<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTjqFtsP75x4yTv6w-xkrGIhooXPlpb3oDN4UyRCYQDP4Ff9sJVZalk24_Rhq-OVpgdz0jvgMCLw7LzZG5qkVxwO85Oac3a3dnaBvGNZnU8Ed7qClLLOAVHkEy9qHEYTft39ntvF_7EAA7/s1600/DMSAgileSmall.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="17" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTjqFtsP75x4yTv6w-xkrGIhooXPlpb3oDN4UyRCYQDP4Ff9sJVZalk24_Rhq-OVpgdz0jvgMCLw7LzZG5qkVxwO85Oac3a3dnaBvGNZnU8Ed7qClLLOAVHkEy9qHEYTft39ntvF_7EAA7/s320/DMSAgileSmall.png" width="320" /></a><br />
<br />
<br />
Compromising the predictability of required documentation for the sake of project fluidity may not sound like an ideal situation, but in many cases it can be beneficial to the project. We’ve implemented a similar test-first hybrid model on projects in the past and have found it’s a great way to provide clients with both sound budgeting and project flexibility, all while clarifying their desired usability for our development team.<br />
<br />
Tim Dimsdale<br />
Dynamic Manufacturing Solutions
<a href="http://blog.dynms.com/" rel="tag" style="display: none;">CodeProject</a>Dynamic Manufacturing Solutionshttp://www.blogger.com/profile/12694920969455017434noreply@blogger.com1tag:blogger.com,1999:blog-4211213164920451481.post-68261651683324505362012-06-01T10:00:00.000-06:002015-06-19T10:17:21.595-06:00Funding the Digital Economy<h4>
Please note that all DMS news and blog content has been moved to the main website at <a href="http://www.dynms.com/">www.dynms.com</a> for a categorized view.</h4>
<h4>
All utilities and downloads are available at <a href="http://www.dmsiworks.com/microsoft-dynamics-nav-resources/software-downloads">www.dmsiworks.com</a></h4>
<br />
<h4>
To Invest or Not to Invest…It’s Not Even a Question</h4>
<br />
The debate on whether or not to invest in times of economic uncertainty has been raging in the years since the recent financial crisis. In Canada, the latest budget has revealed the extent to which our government is willing to fund growth projects. Budget 2012 has set aside nearly $500M ($400M via the private sector and $100M via government) for venture capital funding to invest in early-stage risk capital, and to support the creation of large-scale venture capital funds led by the private sector.<br />
<br />
<a name='more'></a>In addition, the government recently unveiled its Digital Economy Strategy (<a href="http://digitaleconomy.gc.ca/">digitaleconomy.gc.ca</a>), a multi-faceted effort to position Canada as an innovator, adopter, and user of Information Communication Technologies (ICT). Between various ICT related programs, small-to-medium sized businesses now have access to $280M in government grants and medium-term loans to invest in technology solutions that will increase their productivity and ability to compete on a global scale.<br />
<br />
Please excuse us while we jump for joy. This news is exciting for DMS, our partners, and most of all, our clients. Even if you’re relatively happy with your operations, why not take this opportunity to add extra efficiencies while you still can?<br />
<br />
With this in mind, we thought it would be worthwhile to explore some of the initiatives the Canadian government is supporting and how they can positively affect your bottom line for years to come.<br />
<br />
<h4>
DTAPP</h4>
<br />
The primary vehicle for accelerating ICT adoption is the Digital Technology Adoption Pilot Program (DTAPP), an $80 million investment over three years designed to provide nearly 600 small and medium sized enterprises (SMEs) with digital tools to boost productivity.<br />
<br />
The primary goals of the DTAPP are:<br />
<br />
• Improve the rate of digital technology adoption by SMEs <br />
• Improve understanding of the link between digital technologies and productivity<br />
• Raise awareness of the benefits and importance of adopting these technologies<br />
<br />
DTAPP launched in the 2011 fiscal year and has already gained significant momentum. We’ve already worked with DTAPP to fund productivity investments and found that the application process and turnaround time were fairly streamlined, especially given the demand that this program has generated. <br />
<br />
Firms interested in adopting digital technology into their operations (i.e., production lines, workflow processes, or supply chain or customer management systems) may be eligible to receive advisory services and/or a financial contribution of up to $99,999 through the pilot program. If your firm is incorporated, has 500 employees or less and is currently seeking opportunities to adopt digital technology, you could be eligible to receive assistance through the DTAPP team.<br />
<br />
For more information, see the <a href="http://www.nrc-cnrc.gc.ca/eng/ibp/irap/digital-technology-adoption/dtapp-index.html" target="_blank">National Research Council Website</a><br />
<br />
<h4>
Business Development Bank of Canada</h4>
<br />
The Business Development Bank of Canada (BDC) announced that it is setting aside $200 million for loans that help entrepreneurs gear up with information and communications technology (ICT).<br />
<br />
Both BDC client and non-client companies, including small businesses such as individual or home offices, may apply for a loan from this ICT initiative. BDC will speed up and simplify the processing of these applications. The loans can be used to purchase hardware, software and consulting services.<br />
<br />
Entrepreneurs with ICT projects that do not exceed $50,000 must submit their loan applications online at www.bdc.ca. Companies that need more than $50,000 can contact the BDC business centre in their area, apply online or call BDC customer service at 1 877 BDC BANX (232-2269).<br />
<br />
The goal of these loans is to provide short to medium term financing that helps SMEs overcome the initial cost of funding productivity investments. These companies have access to BDC representatives who can recommend vendors, discuss financing options, and guide companies through the implementation process. <br />
<br />
For more information, see the <a href="http://www.bdc.ca/en/about/mediaroom/news_releases/Pages/bdc_200_million_help_entrepreneurs_invest_ICT.aspx" target="_blank">BDC website</a>. <br />
<br />
<h4>
Why NOW is the Best Time to Invest</h4>
<br />
If you produce goods, carry inventory, or ship/receive, there are systems available that will help you make any of these processes more efficient. Higher productivity leads to higher margins, which leads to growth for you and your investors. Canadian companies should really leverage their government’s foresight and take advantage of these programs before it’s too late. <br />
<br />
Kevin George<br />
Dynamic Manufacturing SolutionsDynamic Manufacturing Solutionshttp://www.blogger.com/profile/12694920969455017434noreply@blogger.com0tag:blogger.com,1999:blog-4211213164920451481.post-27495461099192325502012-05-17T13:03:00.000-06:002015-06-19T10:17:13.559-06:00The Power of Collective Knowledge<h4>
Please note that all DMS news and blog content has been moved to the main website at <a href="http://www.dynms.com/">www.dynms.com</a> for a categorized view.</h4>
<h4>
All utilities and downloads are available at <a href="http://www.dmsiworks.com/microsoft-dynamics-nav-resources/software-downloads">www.dmsiworks.com</a></h4>
<br />
At DMS we strongly believe in the power of collective knowledge. In the history of mankind, never has there been more information so readily available. Today there’s almost anything can be learned through intuitive searching, message boards, and web videos. Granted, it may take more than a minute to learn the quantum physics (or does it? <a href="http://youtu.be/cTodS8hkSDg" target="_blank">Minute Physics</a>) but as our collective information sources grow, so does our ability to leverage the experience of the people around us.<br />
<br />
<a name='more'></a><br />
<style>
<!--
/* Font Definitions */
@font-face
{font-family:Cambria;
panose-1:2 4 5 3 5 4 6 3 2 4;
mso-font-charset:0;
mso-generic-font-family:auto;
mso-font-pitch:variable;
mso-font-signature:3 0 0 0 1 0;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:12.0pt;
font-family:"Times New Roman";
mso-ascii-font-family:Cambria;
mso-ascii-theme-font:minor-latin;
mso-fareast-font-family:Cambria;
mso-fareast-theme-font:minor-latin;
mso-hansi-font-family:Cambria;
mso-hansi-theme-font:minor-latin;
mso-bidi-font-family:"Times New Roman";
mso-bidi-theme-font:minor-bidi;}
a:link, span.MsoHyperlink
{mso-style-noshow:yes;
color:blue;
text-decoration:underline;
text-underline:single;}
a:visited, span.MsoHyperlinkFollowed
{mso-style-noshow:yes;
color:purple;
text-decoration:underline;
text-underline:single;}
@page Section1
{size:612.0pt 792.0pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;
mso-header-margin:35.4pt;
mso-footer-margin:35.4pt;
mso-paper-source:0;}
div.Section1
{page:Section1;}
-->
</style><br />
<h3 class="separator" style="clear: both; text-align: center;">
</h3>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfETguzACOf0j1VYhInsamsgNw3fO0i2MjJ43K8Us224b4icKIJqlKZrnBWY1gTDnZh7s9TC5_Q981A6RDUvZ8VNZhLxQeYt34xJhGaVXpt0ARD82fnIDlyjivlz5qy5RHmytF6VBlgdqp/s1600/Collective+Brain.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfETguzACOf0j1VYhInsamsgNw3fO0i2MjJ43K8Us224b4icKIJqlKZrnBWY1gTDnZh7s9TC5_Q981A6RDUvZ8VNZhLxQeYt34xJhGaVXpt0ARD82fnIDlyjivlz5qy5RHmytF6VBlgdqp/s320/Collective+Brain.jpg" width="320" /></a></div>
<br />
For this reason we’ve decided to start a blog that shares the experience and perspective we’ve gained over countless Dynamics NAV and DMS product implementations. For every unique client there is a unique set of circumstances that require creative solutions and deep technical and business knowledge.<br />
<br />
We hope to bring our readers as much relevant information as possible, with dynamic content and a little bit of lightheartedness every now and then. We’re serious about our work, but we’re also just sons, fathers, brothers, sisters, mothers, and daughters making a living by doing the best job we can. We hope you get some value from this blog and encourage you to leave comments or say hi at your convenience.<br />
<br />
All the best,<br />
<br />
DMSDynamic Manufacturing Solutionshttp://www.blogger.com/profile/12694920969455017434noreply@blogger.com0