• Microsoft Dynamics NAV Team Blog

    Cumulative Update 6 for Microsoft Dynamics NAV 2013 R2 has been released

    • 15 Comments

    NOTE: The term “update rollup”, which has been used until now for hotfix releases, has been replaced with the term “cumulative update”. The meaning of the term is unchanged.

    Cumulative update 6 includes all application and platform hotfixes and regulatory features that have been released for Microsoft Dynamics NAV 2013 R2. 

    The cumulative update includes hotfixes that apply to all countries and hotfixes specific to the following local versions:

    • AU - Australia
    • AT - Austria
    • BE - Belgium
    • CH - Switzerland
    • DE - Germany
    • DK - Denmark
    • ES - Spain
    • FI  - Finland
    • FR - France
    • IS - Iceland
    • IT - Italy
    • NA - North America
    • NL - Netherlands
    • NO - Norway
    • NZ - New Zealand
    • RU – Russia (NEW)
    • SE - Sweden
    • UK - United Kingdom

    Where to find cumulative update 6

    You can download cumulative update 6 from KB 2955941 – Cumulative Update 6 for Microsoft Dynamics NAV 2013 R2 (Build 36366).

    Note: Implementing this cumulative update will require a database conversion unless you have already implemented update rollup 5.

    For a full list of all hotfixes included in cumulative updates for Microsoft Dynamics NAV 2013 R2, see the following CustomerSource and PartnerSource pages: 

    CustomerSource:

    PartnerSource

    More Information

    For more information about cumulative updates for Microsoft Dynamics NAV 2013 R2, see Announcement of update rollups for Microsoft Dynamics NAV 2013 R2

  • Microsoft Dynamics NAV Team Blog

    Cumulative Update 13 for Microsoft Dynamics NAV 2013 has been released

    • 0 Comments

    NOTE: The term “update rollup”, which has been used until now for hotfix releases, has been replaced with the term “cumulative update”. The meaning of the term is unchanged.

    Cumulative update 13 includes all application and platform hotfixes and regulatory features that have been released for Microsoft Dynamics NAV 2013. The cumulative update includes hotfixes that apply to all countries and hotfixes specific to the following local versions:

    • AU - Australia
    • AT - Austria
    • BE - Belgium
    • CH - Switzerland
    • DE - Germany
    • DK - Denmark
    • ES - Spain
    • FI   - Finland
    • FR - France
    • IS  - Iceland
    • IT   - Italy
    • NA - North America
    • NL - Netherlands
    • NO - Norway
    • NZ - New Zealand
    • SE - Sweden
    • UK - United Kingdom

    Where to find cumulative update 13

    You can download cumulative update 13 from KB 2955943 – Cumulative Update 13 for Microsoft Dynamics NAV 2013 (Build 36347).

    For a full list of all hotfixes included in the cumulative update, see the following CustomerSource and PartnerSource pages:

    CustomerSource:

    PartnerSource:

    More Information

    For more information about cumulative updates for Microsoft Dynamics NAV 2013, see Announcement of new hotfix process for Microsoft Dynamics NAV 2013.

  • Microsoft Dynamics NAV Team Blog

    NAV Design Pattern of the Week - Temporary Dataset Report

    • 1 Comments

    After a short delay, here is the latest design pattern, brought to you by the Microsoft Dynamics NAV Design Patterns team.

    Meet the Pattern

    This pattern generates the data to be displayed dynamically by combing/processing several data sources. It then displays the resulting dataset without writing to the database.

     

    Know the Pattern

     

    While writing reports in Microsoft Dynamics NAV, we have the luxury of using a built-in iterator. So, once we define the dataitem and the ordering, the runtime takes care of the iteration.

     

    The iterator has one shortcoming: It can only run through records written into the database. There are situations, however, where we want to display temporary datasets created at runtime by processing data from different sources. That is where the Temporary Dataset Report pattern can be used.

     

    Use the Pattern

     

     This pattern takes a two-step approach to displaying the data:

     

    • Parse the data sources to create a record buffer in a temporary record variable.
    • Iterate through a data item of the Integer table and display one record from the temporary recordset in each iteration.

     

    Step 1: Combining data sources to create a dataset

     

    In this step, we would process the existing data to create a temporary recordset. The three most common techniques to do this are discussed in the following paragraphs.

     

    The first technique is mostly used when we want to build the report based on one or more source tables. A lot of processing is required, and we therefore want to store and display information from a temporary recordset. With this technique, we create a data item of the source record and then iterate through this data item to create the temporary recordset. An advantage of this technique is that it allows the user to perform additional filtering on the data source tables since they are added as additional data items and therefore will have their tabs on the request page by default.

     

     

    The second technique was made available with NAV 2013 when queries were introduced as a tool to help us combine data from different sources.

    Read the entire pattern on NAV Wiki...

     

    Best regards,

    Abhishek Ghosh from the Microsoft Dynamics NAV Design Patterns team

  • Microsoft Dynamics NAV Team Blog

    Update Rollup 12 for Microsoft Dynamics NAV 2013 has been released

    • 0 Comments

    Update rollup 12 for Microsoft Dynamics NAV 2013 (Build 36207) has been released.

    Update rollup 12 includes all application and platform hotfixes and regulatory features that have been released for Microsoft Dynamics NAV 2013. With update rollup 12, local hotfixes for additional countries have been added, and update rollups for Microsoft Dynamics NAV 2013 now include hotfixes that apply to all countries and hotfixes specific to the following local versions:

    • AU - Australia
    • AT - Austria (NEW)
    • BE - Belgium (NEW)
    • CH - Switzerland (NEW)
    • DE - Germany
    • DK - Denmark
    • ES - Spain (NEW)
    • FI   - Finland (NEW)
    • FR - France
    • IS  - Iceland (NEW)
    • IT   - Italy
    • NA - North America
    • NL - Netherlands
    • NO - Norway (NEW)
    • NZ - New Zealand
    • SE - Sweden
    • UK - United Kingdom

    New in update rollup 12 

    Beginning with update rollup 12, the update rollups for Microsoft Dynamics NAV 2013 now also include hotfixes for the upgrade toolkit. 

    Where to find update rollup 12

    You can download update rollup 12 from KB 2937998 - Update Rollup 12 for Microsoft Dynamics NAV 2013 (Build 36207).

    The hotfixes that have been released since update rollup 11 are listed in KB 2937998. For a full list of all hotfixes included in the update rollup, see the following CustomerSource and PartnerSource pages:

    CustomerSource:

    PartnerSource:

     More Information

    For more information about update rollups for Microsoft Dynamics NAV 2013, see Announcement of new hotfix process for Microsoft Dynamics NAV 2013.

  • Microsoft Dynamics NAV Team Blog

    The New Table Synchronization Paradigm in Microsoft Dynamics NAV 2013 R2

    • 33 Comments

    Microsoft Dynamics NAV 2013 R2 was dispatched with a brand new feature that introduces big challenges to all of the Microsoft Dynamics NAV channel: Multitenancy. In simple words, multitenancy allows partners to deal with hosting scenarios on-premises and in cloud services in an easier and more flexible way than in the past.

    Before Microsoft Dynamics NAV 2013 R2, partners and customers could only use a single-tenant scenario (here also called Legacy mode).

    Below a short explanation how table synchronization used to work in earlier versions.

    Microsoft Dynamics NAV 2009 / Microsoft Dynamics NAV 2013

    1. At object import/compile, C/SIDE checks the Object Metadata version in working memory and compares it to the version in Object Metadata table to decide if and what kind of change is made.
    2. Schema changes are DIRECTLY APPLIED to the SQL Server database by C/SIDE if there is no breaking schema change, otherwise an error will be thrown by C/SIDE depending on SQL Server error catch.
    3. Object Change Listener is checking for changes in metadata, then updating Microsoft Dynamics NAV Server Cache with data from Object Metadata table if the change was detected.

    A synchronization failure would typically be reported with an error like “The Object Metadata does not exist. Identification and values … “ when running the Microsoft Dynamics NAV Windows client.

    The multitenancy feature has also changed the design how Microsoft Dynamics NAV developers has to deal with object changes, overall related to table objects. Multitenancy implies that the table structure definition has to be stored in the application database and this needs to be applied on one or more separate storage databases called Tenants. From a development perspective, this means that any modification that are made to a table object in C/SIDE are NOT DIRECTLY applied to the SQL Server structure but there is a need of performing a secondary action to apply and made persistent these modification at SQL Server side: this process is called Synchronization. Microsoft Dynamics NAV 2013 R2, then, comes with a time decoupling between table metadata creation (C/SIDE) and data structure changes (SQL Server).

    In order to simplify the current design, the Microsoft Dynamics NAV development team decided to handle single- and multitenant scenarios in the same way (roughly speaking a single-tenant / Legacy mode is handled as a multitenant scenario with a single tenant database constantly mounted against an application database).

    Below a short explanation how this is working in practice.

    Microsoft Dynamics NAV 2013 R2

    SCENARIO 1:

    • Single-tenancy / Legacy mode
    • “Prevent data loss from table changes” = Yes (default):

     

    1. At object import/compile, C/SIDE checks the Object Metadata version in working memory and compares it to the version in Object Metadata table to decide if and what kind of change is made. (Same as in Microsoft Dynamics NAV 2009 and Microsoft Dynamics NAV 2013)
    2. C/SIDE then CALLS THE Microsoft Dynamics NAV Server to check for breaking schema changes in SQL Server structure.
      If C/SIDE is unable to call the Microsoft Dynamics NAV Server or if a breaking schema change is attempted (action that cannot performed due to the current SQL Server structure such as deleting a field containing data): a C/SIDE error is reported accordingly and changes to Object Metadata table will not be committed.
      If it is evaluated as not attempting a breaking schema change in SQL Server then metadata from C/SIDE working memory is saved and committed to Object Metadata table.
      PLEASE NOTE: at this stage NO CHANGES ARE MADE TO THE SQL SERVER DATA STRUCTURE.
    3. When prompting for SYNCHRONIZATION, Microsoft Dynamics NAV Server then compares Object Metadata table with Object Metadata Snapshot table content. Any difference in the value for the “Hash” field is a flag to Microsoft Dynamics NAV Server that a change exists and should be subsequently applied physically SQL Server side as structural changes.

    Prompting for Synchronization happens when

    -         Performing ANY Microsoft Dynamics NAV client action.

    For example, if a user opens a Microsoft Dynamics  NAV Windows client, then Microsoft Dynamics NAV Server is starting applying the relevant structure changes to SQL Server, and the Microsoft Dynamics NAV Windows client is not shown until all the changes are done on SQL Server side.

    OR

    -         Running the Sync-NAVTenant Windows PowerShell cmdlet.

    SCENARIO 2 (DEPRECATED):

    • Single-tenancy / Legacy mode
    • “Prevent data loss from table changes” = No (Manually opted, not persistent)

    IMPORTANT NOTICE:

    Setting the “Prevent data loss from table changes” C/SIDE switch to “No” has been intended to be used as last resource in a pure multitenancy scenario and in Test or Staging environments when partners does not have any business data database mounted against the application database. All other usages that deviate from this statement might lead to unpredictable results and even undesired data loss scenarios in upgrades or, even worse, production environments.

    Never change for any reason this parameter to “No” when developing against a single-tenant / Legacy mode database.

    1. At object import/compile: C/SIDE checks the Object Metadata version in working memory and compares it to the version in Object Metadata table to decide if and what kind of change is made. (Same as in Microsoft Dynamics NAV 2009 and Microsoft Dynamics NAV 2013)
    2. C/SIDE DOES NOT CHECK FOR ANY BREAKING SCHEMA CHANGES IN SQL SERVER but simply FORCES COMMIT of metadata from C/SIDE cache TO the Object Metadata table.
    3. When prompting for SYNCHRONIZATION, Microsoft Dynamics NAV Server then compares Object Metadata table with Object Metadata Snapshot table content. Any difference in the value for the “Hash” field is a flag to Microsoft Dynamics NAV Server that a change exists and should be subsequently applied physically SQL Server side as structural changes.

    Since no validation is made against SQL Server (“Prevent data loss from table changes” was set to “No”) there might be chances that this will result in:

    • Data Loss
      There are few specific cases where data is dropped in this scenario:
      • The primary key is detected as being no longer unique
      • Data per Company is changed from Yes to No and more than one company contains data
      • One or more fields are deleted
      • One or more field data type is/are changed
    • Missing Synchronization
      Activities cannot be completed since SQL Server prevents these actions that would break the data structure and therefore no Microsoft Dynamics NAV Windows client or Web client can connect to the database. The partner or customer has to resolve these missing synchronization issues before moving forward or fall back to a backup where these issues does no longer exists

    SCENARIO 3:

    • Multitenancy
    • “Prevent data loss from table changes” = Yes (default):

    Same as Scenario 1 for point 1. and point 2.

    When prompting for SYNCHRONIZATION, changes will be triggered and applied to the SQL Server data structure.

    Prompting for synchronization in a pure multitenant deployment happens when

    -         Performing ANY Microsoft Dynamics NAV client action

    OR

    -         Running the Sync-NAVTenant Windows PowerShell cmdlet

    OR

    -         Mounting a tenant database

     

    Based on the scenario depicted above, there might be risks of data loss and/or missing synchronization issues if handling C/SIDE development (namely dealing with Table objects) in a way that deviate by the prospected paradigm.

    Data loss issues:

    These might arise typically in one of the following scenarios:

    • Direct removal of rows from the Object Metadata table in SQL Server
    • Stretched / Borderline scenarios that implement platform files with a Build No. lower than 36281 KB 2934571 as described in this blog post.

     

    Synchronization issues:

    These might arise typically in one of the following scenarios:

    • The Microsoft Dynamics NAV Server service account has insufficient permissions
      The service account must be added to “db owner” SQL Server role for the Microsoft Dynamics NAV tenant Database.
    • Stretched / Borderline scenarios that implement platform files with a Build No. lower than 36281 KB 2934571 as described in this blog post.
      With a lower build number, you might get into one of the following scenarios:
      • When several developers commit changes at the same time in the same database / tenant while synchronization is running, this might lead to metadata corruption. (Object Metadata table now is locked for committing  changes).
      • Doing actions like FOB Import > Replace > SaveAs  and then Import again the saved FOB was causing a metadata corruption.
    • SQL Connection Timeout meanwhile performing an operation, such as when SQL Server schema changes require drop and build of indexes on large tables.
      To resolve this issue it is necessary to increment the following parameter in the Microsoft Dynamics NAV Server CustomSettings.config file
       <add key="SqlCommandTimeout" value="10:00:00" />

    Development Environment best practice

    thinking about potential data loss and synchronization issues is a brand new big challenge in the development environment, and so some consideration and following best practice might be advisable. These applies to developing solutions for both single- and multitenant deployments.

    1. Do not use Build No. lower than than 36310 KB 2934572
      As a partner, you take this as the "RTM Build No." starting point for NAV 2013 R2 and deploy this platform hotfix in the future projects while you also convert existing installations.
      NOTE: As per common best practice, we recommend that you download / request / test and deploy the latest platform hotfix for Microsoft Dynamics NAV 2013 R2. This will contain correction for minor issues not directly or just slightly related to synchronization scenarios.
    2. Never-ever change “Prevent data loss from table changes” to “No”.
      This have been noticed as one of the major source of potential data loss and missing synchronization for NAV 2013 R2 databases.
    3. Make sure that the Microsoft Dynamics NAV Server service account has been granted the “db owner” role in SQL Server.
    4. Increment the SQL Server Command Timeout parameter in the Microsoft Dynamics NAV Server configuration file that you use in development to a very high value (such as 10:00:00)
    5. For large Microsoft Dynamics NAV objects OR a high number of table modifications, do NOT use a Microsoft Dynamics NAV client action to prompt for synchronization but it is warmly preferable to use the Sync-NAVTenant Windows PowerShell cmdlet. (This is a typical scenario related to upgrades).
    6. For big batch of FOB files that are making a high number of table modifications, be sure to have this tested on a safe staging environment and import, where possible, the Table Objects in smaller chunks and synchronize them after importing every single chunk of Microsoft Dynamics NAV objects.
    7. For important changes in several table structures, such as when upgrading from previous version, it would be good to run a SQL Server Profiler trace after prompting for synchronization to check what is running on the SQL Server side and keep the synchronization monitored until it ends.

    Recommended Events:

    • SP:StmtCompleted
    • SQL:StmtCompleted

    Recommended Column Filters:

    • DatabaseName   Like <DatabaseName>
    • TextData       Not Like  SELECT %

    Bottom line. Worth mentioning that if a Microsoft Dynamics NAV Client hang / disconnect happens due to a missing synchronization issue or there were a synchronization transaction running behind the transaction rollback SQL Server side will take a higher amount of time in comparison with the same committed transaction, depending on the type of changes, resources available, etc.

    Just in case you fall back in this situation, it is warmly advisable to do not stop nor restart Microsoft Dynamics NAV Server and check through a SQL Server Profiler trace and/or via SQL Server Management Studio if the transaction has successfully rollback.

    Another blog post will follow this one, related to synchronization challenges and best practice while upgrading to Microsoft Dynamics NAV 2013 R2 from previous versions.

     

    These postings are provided "AS IS" with no warranties and confer no rights. You assume all risk for your use.

     

    Gerard Conroy - Microsoft Dynamics UK

    Abdelrahman Erlebach - Microsoft Dynamics Germany

    Duilio Tacconi - Microsoft Dynamics Italy

    Jasminka Thunes - Microsoft Dynamics Norway                   

    Microsoft Customer Service and Support (CSS) EMEA

     

    A special thanks to Jorge Alberto Torres & Jesper Falkebo from the Microsoft Dynamics NAV development team

  • Microsoft Dynamics NAV Team Blog

    Formatted decimal values dropping symbols in RDLC

    • 1 Comments

    I have seen several reports about the Microsoft Dynamics NAV RDLC reports dropping symbols out of decimals when printing out a report.  One of the most common occurrences, that I have seen, is when the de-CH locale is being used by the end user.  After some investigation, it appears that this problem is due to some changes between Windows 7 and Windows 8 (and Windows 2012). 

    Windows 7 (de-CH): 1’745.55

    Windows 8 (de-CH): 1 745.55                      [Note: the thousand separator is not printed]

    During my investigation I found some references to using “Custom Locales” to resolve this issue.  In order to use a custom locale you must build a replacement locale using the Locale Builder 2.0 tool.  There is a link to this tool at the following referenced URL.  Once this is created, you then need to replace your existing locale.  If you are interested in more information, please follow this link (http://msdn.microsoft.com/en-us/library/windows/desktop/dd317785(v=vs.85).aspx ).

    Another option ...

    There is another way that doesn’t involved changing out your locale.  All it takes is a little code and some familiarity with editing RDLC reports.  For this blog I am going to use Microsoft Visual Studio 2012 and Microsoft Dynamics NAV 2013 R2.  I have outlined the required steps below …

    1) After designing a report in the Microsoft Dynamics NAV 2013 R2 development environment, load the RDLC Layout (View\Layout).  Depending on your setup, this will either load Microsoft Visual Studio 2012 or Report Builder 3.0 (if you are using Microsoft SQL Server 2012).

    2) Once the layout is open, display the properties of the report.  This can be done by opening the Properties window (CTRL+W,P) and clicking in the blank area around the Report or right click in the blank area around the report and select Report Properties.

     
    3) You should see a Properties window like this …

    Notice the highlighted Code property – click on the value and then click on the ellipse () that appears.  This will open up the Code window.

     

    4) Scroll to the bottom of the existing code functions and add the following code …

    Public Function FormatDecimalString(ByVal Amount as Decimal, ByVal FormatString as String,ByVal Language as String) as String

      Dim CultureInfo as New System.Globalization.CultureInfo(Language)

      Return Amount.ToString(FormatString,CultureInfo)

    End Function

    The new function will convert a decimal amount to a specific cultural locale based on the format string provided in the dataset.

    5) Next, select a textbox that needs to have its printed format corrected.  Once the textbox has its border highlighted, right click and select the Expression option.  This will open the Expressions window.

     

    6) Now, copy the following code into the “Set expression for: Value” textbox.  The following code will need to replace the reference to the current value.

    =Replace(Code.FormatDecimalString(<FIELDNAME.VALUE>,<FIELDNAMEFORMAT.VALUE>,”en-US”),”,”,”’”)

    Make sure to replace <FIELDNAME.VALUE> with the appropriate value reference and replace <FIELDNAMEFORMAT.VALUE> with the appropriate format reference.  This code will replace the comma in the en-US format with an apostrophe to match the de-CH format.

    For Example:  If you use the GLBalance field from the Dataset of REPORT 4 – Detail Trial Balance, then the code would look like this …

    =Replace(Code.FormatDecimalString(Fields!GLBalance.Value,Fields!GLBalanceFormat.Value,”en-US”),”,”,”’”)

    When using the de-CH locale, the number format is similar to what en-US uses, except that the apostrophe in the de-CH format is replaced with the comma in the en-US format.

    de-CH 1’745.55 ==> en-US 1,745.55

    The basic premise behind these code changes is to convert the decimal value to a locale format that is then returned as a text.  Once in the text format, it is now possible to replace the values for the thousands and decimal separators as needed.

     Hopefully, this will make your reporting experience in Microsoft Dynamics NAV 2013 R2 a little easier.

     

    These postings are provided "AS IS" with no warranties and confer no rights. You assume all risk for your use.

  • Microsoft Dynamics NAV Team Blog

    Update Rollup 5 for Microsoft Dynamics NAV 2013 R2 has been released

    • 26 Comments

    Update rollup 5 includes all application and platform hotfixes and regulatory features that have been released for Microsoft Dynamics NAV 2013 R2.

    With update rollup 5, local hotfixes for additional countries have been added, and update rollups for Microsoft Dynamics NAV 2013 R2 now include hotfixes that apply to all countries and hotfixes specific to the following local versions:

    • AU - Australia
    • AT - Austria (NEW)
    • BE - Belgium (NEW)
    • CH - Switzerland (NEW)
    • DE - Germany
    • DK - Denmark
    • ES - Spain (NEW)
    • FI   - Finland (NEW)
    • FR - France
    • IS  - Iceland (NEW)
    • IT   - Italy
    • NA - North America
    • NL - Netherlands
    • NO - Norway (NEW)
    • NZ - New Zealand
    • SE - Sweden
    • UK - United Kingdom

     

    Where to find update rollup 5

    You can download update rollup 5 from KB 2937999 - Update Rollup 5 for Microsoft Dynamics NAV 2013 R2 (Build 36281). Note: Implementing this update rollup will require a database conversion.

    The hotfixes that have been released since update rollup 4 are listed in KB 2937999. For a full list of all hotfixes included in update rollups for Microsoft Dynamics NAV 2013 R2, see the following CustomerSource and PartnerSource pages: 

    CustomerSource:

    PartnerSource

     

    More Information

    For more information about update rollups for Microsoft Dynamics NAV 2013 R2, see Announcement of update rollups for Microsoft Dynamics NAV 2013 R2.

  • Microsoft Dynamics NAV Team Blog

    NAV Design Pattern of the Week – the Hooks Pattern

    • 6 Comments

    A new series of NAV Design Patterns is just starting. To make a good beginning, the first one is not chosen randomly. It is indeed a very powerful pattern – the “Hooks”, by Eric Wauters. It is also different from most patterns you’ve seen so far, in that it does not exist in the core product. “How can it be? A powerful NAV pattern which is not in NAV?”, you wonder.

    This is exactly the point of the Hooks. It is a partner pattern – something you, as a partner, can use, when you implement your customization. And if done correctly, it has the potential to make the next upgrade superfast.   

    Are you having a hard time installing update after update, rollup after rollup? Does it consume more resources than you had wished? Is the customization code entangled with the core product code, in such a way that each update requires complicated merges, with the developer trying to figure out which code goes where?

    To keep it short, here it is – the Hooks pattern. Most powerful when starting a new customization, as it can be implemented fully. It will keep things simple. As for the legacy customizations... it is still possible to use it, by refactoring key areas such as areas with the most update merge issues.

    Hooks Pattern

    by Eric Wauters (waldo), Partner-Ready-Software

    Meet the Pattern

    By minimizing the code in already existing application objects, you will make the upgrade process much easier, and all customization business logic will be grouped in new objects.  When using atomic coding, it will be very readable what is being customized on a certain place in an existing part of the application.

    To minimize the impact of customizations, the idea of hooks is:

    • First of all, name the places in the already existing code where customization is needed;
    • Second, place your business logic completely outside the already existing application code.

    Know the Pattern

    When doing development over years, by different developers with different mindsets, the standard codebase gets changed a lot, adding multiple lines of code, adding local and global variants, adding or changing keys, changing existing  business logic, … .  In other terms, the standard text objects are being changed all over the place.. .

    After years, it's not clear why a change was done, and what was the place where the change was intended to be done.  And the latter is quite important in an upgrade process, when code in the base product is being refactored: if the exact place of the posting of the Customer Entry is being redesigned to a separate number, the first thing I need to know, is that I did a certain change at the place: "where the posting of the Customer Entry starts".  The definition of that place, we call a "Hook".

    I recommend to use this concept on the following:

    • All objects of the default applications that need to be changed
    • On objects that should not hold any business logic (like tables, pages, XMLPorts)

    Use the Pattern

    Step 1 - if it doesn't exist yet - you create your Hook codeunit.  As the name assumes .. this is always a codeunit.  We apply the following rules to it:

    • One Hook always hooks into one object.  Which basically means that I will only declare this new codeunit in one other object (which is its parent object)
    • The naming convention is: The_Original_Object_Name Hook.  Naming conventions are important, just to find your mapped object, and also to be able to group the Hooks.

    Step 2, you  create the hook, which is basically a method (function) in your codeunit.  The naming is important:

    • The naming of the hook should NOT describe what it is going to do (So, examples like CheckMandatoryFields, FillCustomFields should not be used as a hook)
    • The naming of the hook should describe WHERE the hook is placed, not what the hook will be doing (as nobody is able to look into the future .. :-))
    • To help with the naming, it is a good convention to use the "On"-prefix for these triggers.  This way, it's very clear what are hooks, and what aren't..

    Step 3, it's time to hook it to its corresponding object and right place in the business logic of that object.  You do this by declaring your codeunit as a global in your object, and using the created hook function on its place in the business logic.  This way, these one-liners apply:

    • A Hook codeunit is only used once in one object only (its corresponding object)
    • A Hook (function) is used only once in that object.  As a consequence, changing the parameters has no consequence: you only need to change one function-call
    • The codeunit is declared as a global.  That exact global is the only custom declaration in the existing object .. Everything else is pushed to the hook-codeunit.

    Step 4, implement your business logic in the hook.  Do this in the most atomic way, as there is a good chance that this same hook is going to be used for other business logic as well.  Best is to use a one-line-function-call to business logic, so that the Hook Function itself stays readable.

    Example

    Suppose, we want to add business logic just before posting a sales document.  In that case, we have to look for the most relevant place, which is somewhere in the "Sales-Post" codeunit.  So:

    Step 1: create codeunit Sales-Post Hook:

    Step 2: create the hook function OnBeforePostDocument:

    Step 3: declare a global in the Sales-Post codeunit, called SalesPostHook.  Then,...

    Continue reading on the NAV Patterns Wiki...

     

    Best regards,

    The NAV Patterns team

  • Microsoft Dynamics NAV Team Blog

    Modifying the Microsoft Dynamics NAV 2013 R2 Installation Program to Include Microsoft.Dynamics.Nav.Client.WinForms.tlb

    • 6 Comments

    With NAV 2013 R2 Update Rollup 3, in the process of build sealing, it has been changed the Library GUID used to register Microsoft.Dynamics.Nav.Client.WinForms.tlb.

    Accordingly to this previous blog post: Installing Microsoft Dynamics NAV 2013 R2 Side-by-Side with Microsoft Dynamics NAV 2013, the TypeLib GUID has been changed from the RTM value of {5020AC1E-A4F0-402B-A920-3FED4E3B05CC} to {95819FD3-CF0A-4706-BE93-35B3DDCB817C}.

    Due to this change, if you try to patch a Microsoft Dynamics  NAV 2013 R2 DVD with the latest platform hotfix from Update Rollup 3, you will probably receive an error from the Setup.exe that is related to a missing registration of this TypeLib during the installation of the Microsoft Dynamics NAV Windows client.

     

    In order to successfully deploy a new DVD that is fully patched with the latest platform hotfixes, we at the NAV core team could create a new client MSI file for every localized version that we have released for Microsoft Dynamics NAV 2013 R2 and include this into the hotfix stack, or we could create a new hotfix package that only contains a specific, country-/region specific MSI file.

    Since this does not follow the normal hotfix sealing procedure and the effort to put through is consistent, the recommended best practices is to deploy Microsoft Dynamics NAV 2013 R2 based on the installation program in the original release and then fully patch the installation afterwards with the platform hotfixes.

    However, you can choose to change the MSI file TypeLib value using an MSI editor. Microsoft provides a set of Windows Installer Development Tools for free. We recommend that you use the Orca.exe tool that is part of the Windows Installer Development Tools. If you download the tools, you can install Orca.exe from the following location:

    On an x86 computer:  \Program Files (x86)\Microsoft SDKs\Windows\v7.0\Bin\Orca.msi

    On an x64 computer: \Program Files\Microsoft SDKs\Windows\v7.0\Bin\Orca.msi

    Once you have installed Orca.exe, to edit the Microsoft Dynamics NAV client components MSI file, follow the following steps:

    1. Run Orca.exe.
    2. Choose File, and then choose Open.
    3. Browse to the Role Tailored Client folder in your copy of the Microsoft Dynamics NAV 2013 R2 DVD to locate and open the Microsoft Dynamics NAV RoleTailored Client.msi file.
    4. When the file is opened, in the left pane, under Tables, choose the TypeLib entry as illustrated in the following screenshot.

    5. In the row that refers to Microsoft.Dynamics.Nav.Client.WinForms.tlb , in the LibId field, change the value to {95819FD3-CF0A-4706-BE93-35B3DDCB817C}.
    6. Choose the Save button. The following screenshot illustrates the result of your modification:
       
    7. Close Orca.exe.

    Now you can replace the Microsoft Dynamics NAV RoleTailored Client.msi file that is in the Role Tailored Client folder on your copy of the Microsoft Dynamics NAV 2013 R2 DVD with this modified file.

     

    These postings are provided "AS IS" with no warranties and confer no rights. You assume all risk for your use.

     

    Duilio Tacconi (dtacconi)          &             Marco Mels (mmels)

    Microsoft Dynamics Italy                        Microsoft Dynamics Netherlands

    Microsoft Customer Service and Support (CSS) EMEA

  • Microsoft Dynamics NAV Team Blog

    RDLC Report and Performance in Microsoft Dynamics NAV

    • 9 Comments

    It has been a while since I last blogged and I am taking the chance now to post on a very delicate argument. The main focus of my dissertation is about performance (Out Of Memory exception, typically) with Microsoft Dynamics NAV 2009 R2, Microsoft Dynamics NAV 2013, and Microsoft Dynamics NAV 2013 R2.

    I would encourage you to post your comments and thoughts. Have a good read.

    Microsoft Dynamics NAV 2009 R2 Considerations (RDLC 2005 - Report Viewer 2008)

    All the Microsoft Dynamics NAV 2009 stack (RTM, SP1, R2) is built and sealed for the x86 platform. This means that both client (Microsoft.Dynamics.NAV.Client.exe) and server (Microsoft.Dynamics.NAV.Server.exe) are 32bit components of the NAV platform. RDLC Reporting (Enhanced Reporting, in the recent NAV terminology) in Microsoft Dynamics NAV 2009 is made of a Report Viewer .NET Control targeted for WinForm, and Microsoft Dynamics NAV casts this control into a Microsoft Dynamics NAV modal page (that is a WinForm, roughly speaking) within the RTC boundaries.

    Report Viewer works, in principle, accepting 2 items:

    -          a metadata definition plain XML file (Report.rdlc) that define the structure of the report rendering runtime  

    -          a Dataset that is a serialized XML file that contains the data to be rendered in the way defined in the rdlc file definition

    With Microsoft Dynamics NAV 2009, Report Viewer works client-side to render the report to the user (Preview Layout rendering extension) and therefore it needs to have both RDLC definition and dataset streamed completely from the Server to the Client. This streaming process of Client memory population, since Microsoft Dynamics NAV 2009 SP1, is made with a chunking method that can be resumed in shorts as per below.

    SQL Server process and generate a complete Result Set. The Result Set is sent to the Microsoft Dynamics NAV Server as normal TCP packets informations and the Microsoft Dynamics NAV Server, meanwhile receiving these packets from SQL Server, is sending this Result Set in chunks to the client, clearing the Microsoft Dynamics NAV Server memory once the packet is received from the client. This has been introduced to avoid memory leak server side that works only as routing point for packets / chunks from SQL Server to the Microsoft Dynamics NAV Windows client. If you open task manager both in the Middle Tier machine and Client machine, meanwhile processing a Heavy report (or whatever report), you might notice that the memory footprint server side is constant and pretty low while the Client one is growing and growing in consumption until it reaches a physical limit.

    When it reaches its physical limit, you receive the typical error message like the one shown below (explicit Out Of Memory exception)

    And, most of the times, report viewer continue clearing the error message and simply display a single blank page (implicit Out Of Memory exception) or several pages with mixed random string value assignments (blurred Out of Memory exception).

    I do not want to go more deep into the technicalities that lies beneath but you have to consider the following:

    1. The Microsoft Dynamics NAV 2009 R2 Role Tailored client is a 32bit application (with a limit, on the chart, of 2GB memory per process).
    2. The Microsoft Dynamics NAV 2009 R2 Role Tailored client and report(s) share the same memory Application Domain (this means the same memory stack).
    3. Report Viewer control run in a sort of sandbox mode inside the Microsoft Dynamics NAV WinForm so that the memory consumption is even more limited (approx. 1GB).

    Based on the assumption above my studies on performance related to heavy reports have been the following:

    1. Report Viewer Preview rendering extension within Role Tailored Client is raising an Out Of Memory exception when Client process memory reaches 0.8 – 1.1 GB approx. (this differs between multiple factors like e.g. OS, Hardware type, Resources, etc.)
    2. Considering a typical Microsoft Dynamics NAV dataset (60 – 80 columns on average) there is a potential risk of Out Of Memory between 40K up to 100K rows range. This depends on number of columns in the dataset and quality of columns (e.g. which data type they belongs, if and how this is populated, etc.).

    If you pack up all these considerations, these are the actions that you might take (or have to) depending on your scenarios within the Microsoft Dynamics NAV 2009 R2 stack:

    1. If your report is raising an Out Of Memory exception in a range lower or close to 80/90K rows then you can try to optimize the report by reducing the Dataset. Reducing the dataset means :
      1. Write optimal code for RDLC Report (e.g. use CurrReport.SKIP when needed, avoid use data items for CALCSUMS and use record AL variables instead, rewrite the report to use drill-through to enable getting to details if required in the report - so still possible to move calculations to CSIDE – or refactor to use hyperlink to another report for details, etc.)
      2. Reduce the Dataset Columns (e.g. eliminate Section control that you do not use with RDLC report)
      3. Reduce the Dataset Rows (refactor as much as it possible to push in the dataset only the data that need to be printed)
    2. If your report is already in a range equal or higher then 80/90K then you have no other choices with NAV 2009 R2 than the following :
      1. Delete RDLC Report layout and enable Classic Client report fall back (this is the solution that I will warmly suggest and it is a really finger snap solution)
      2. (this is pretty obvious) Apply filters in the request page (or through AL Code) in order to reduce the amount of rows in the dataset and instead of print the report in one single shot, print it N times.

    And this is all about the Microsoft Dynamics NAV 2009 R2 stack and how to solve / workaround the problem in the feasible (and easiest way) within this version.

    Microsoft Dynamics NAV 2013 (RDLC 2008 – Report Viewer 2010) / NAV 2013 R2 (RDLC 2010 – Report Viewer 2012) is another story and challenge type.

    To resume, the milestone changes between Microsoft Dynamics NAV 2009 and Microsoft Dynamics NAV 2013 (and R2) are the following:

    1. Microsoft Dynamics NAV Server is now 64bit (finally…) while the Windows client still remains as 32bit application. This means that the client is still a physical bottleneck and are still valid the considerations related to memory footprint and dataset volume as reported previously for Microsoft Dynamics NAV 2009 R2.
    2. You cannot anymore enable Classic client report fallback but you have to use RDLC Report in any occasion.

    With these 2 new variables or constraints in mind, below how you could workaround / resolve the performance problem with Microsoft DynamicsNAV 2013  / Microsoft Dynamics NAV 2013 R2:

    1. Same considerations about Optimizing reports: if you receive (or think of receiving) an Out Of Memory exception you might go for optimize the report as much as you can IF you forecast that in the end your dataset will never ever exceed 70/90K rows.
    2. If you have heavy reports with a dataset volume higher than 70/90K rows then this is what you could do:
      1. Filter data and print the report N times, wherever possible (use common sense)
      2. Use the Job Queue to enable Server Side Printing. What is Server Side Printing? It is simply running Report Viewer totally in the background through NAS Services (that is using Background Sessions through STARTSESSION AL statement). Running Server Side means running under 64 bits context and therefore Report Viewer (“.NET component targeted for any CPU” = 64 bit enabled) will use ALL the memory available from the OS (e.g. if you have 32 GB it could reach up to consume all of these if you have to work with several MILLION of dataset rows – I have seen it with my own Italian eyes - ) and you will succeed in PRINT the report or, better, use SAVEASPDF to generate a PDF file to be consumed by the user.
      3. Use STARTSESSION AL statement as you like in your own custom code after gathering user filters and parameter and pass this to a Codeunit that does filter record(s) and run a SAVEASPDF in the background as per your exotic flavor.

    THE FUTURE

    The Microsoft Dynamics NAV Core team is fully aware about these scenarios and working hard on improving the RDLC Report performance and experience in future versions of Microsoft Dynamics NAV

    NOTE:

    In this blog post you will find a set of objects (1 Report, 1 Codeunit, 1 Page) to easily simulate an Out Of Memory exception or Save as PDF the report in background.

    Just import these NAV object set and run Page 50666. You can choose to simulate an Out Of Memory exception by clicking the appropriate Action and then Preview the Report or you can choose to SAVEASPDF the same Report via enabling a Background Session that would do this action Server Side. 

    Be sure to have at least 4 GB of Available Memory Server Side and just wait for the background session to end its activity and stream out the content of the report (this should take close to 5/6 minutes with a standard Cronus database, depending on resources).

    These postings are provided "AS IS" with no warranties and confer no rights. You assume all risk for your use.

    Duilio Tacconi (dtacconi)

    Microsoft Dynamics Italy

    Microsoft Customer Service and Support (CSS) EMEA

    A special thanks to Peter Borring Sørensen & Torben Wind Meyhoff from the Microsoft Dynamics NAV core team.

  • Microsoft Dynamics NAV Team Blog

    Coming Soon: Exporting and Importing Companies and Other Data

    • 9 Comments

    We are not quite ready yet, but we will soon announce the availability of new functionality for Microsoft Dynamics NAV 2013 R2: The ability to export business data, global data, and/or applications from one database and import the data into another database. Many of you used the FBK functionality to do this in earlier versions of Microsoft Dynamics NAV, but since we removed that backup/restore functionality in Microsoft Dynamics NAV 2013 R2, you have let us know how much you relied on it in your daily work. So we are working hard on this new functionality, and we will make an announcement when you can download the update.

    When the update is available, we will also update the Microsoft Dynamics NAV 2013 R2 Release Notes Follow-Up document, which is available here: https://mbs.microsoft.com/downloads/customer/NAV/NAV%202013%20R2/MicrosoftDynamicsNAV2013R2_ReleaseNotesFollowup.pdf

    Best regards,

    The Dynamics NAV team

  • Microsoft Dynamics NAV Team Blog

    SAVEASWORD and the Fixed Header design

    • 0 Comments

    Microsoft Dynamics NAV 2013 and Microsoft Dynamics NAV 2013 R2 implement a new rendering extension and give users the capability of saving the report into Word .DOC (NAV 2013) or .DOCX (NAV 2013 R2) format. The same action can be done through C/SIDE by using the SAVEASWORD C/AL statement.  For more information, see the MSDN Library:  http://msdn.microsoft.com/en-us/library/hh165802(v=nav.71).aspx

    However, the Report Viewer Word rendering engine has some caveats related to its own proper design that you should be aware of.

    When you are invoking the Word rendering engine, the Header and Footer are transformed into static Word Header and static Word Footer. The SSRS team took the basic Header / Footer Word concept to have these as static sections. Therefore the FIRST statement generated in report viewer is the one that will be sent to the Word document, no further processing will be made typically to the value expression of any control in Page Header / Page Footer. In other words, it is like saying that all the ReportItems!Field.value or Code.Function() in Page Header or Page Footer are evaluated only one time and never changed at runtime.

    Let's illustrate the challenge with the Word rendering engine and how it handles Page Header and Page Footer within the context of Microsoft Dynamics NAV. I am using the following to demonstrate this behavior in few seconds:

    1. Open the Microsoft Dynamics NAV 2013 or Microsoft Dynamics NAV 2013 R2 Windows client.
    2. Go to Posted Documents (in the navigation pane).
    3. Go to Posted Sales Invoice list.
    4. Select all invoices, and then choose Print.
    5. In the report request page, choose Print and then choose Microsoft Word… and you have your repro: All the invoices belong to the first customer and have the same invoice no., etc.

    This designed limitation is described in the Page Headers and Footers section of the Exporting to Microsoft Word (Report Builder and SSRS) article in the TechNet Library:

    http://technet.microsoft.com/en-us/library/dd283105(v=sql.110).aspx

    The article points this out: "However, when a page footer or page header contains a complex expression that evaluates to different values on different pages of a report, the same value might display on all report pages. "

    Since this is a declared design limitation, you could target SAVEASWORD to those reports where:

    • The report does not use Page Header / Page Footer

    Or

    • The report does have a Static Page Header / Page Footer

    If you would like to have this design changed in future version from SQL Server Reporting Service (SSRS) Team, I would encourage you to log a request of design change into MSCONNECT or vote for an existing one, if any.

    These postings are provided "AS IS" with no warranties and confer no rights. You assume all risk for your use.

    Duilio Tacconi (dtacconi)

    Microsoft Dynamics Italy

    Microsoft Customer Service and Support (CSS) EMEA

    A special thanks to Peter Borring Sørensen & Torben Wind Meyhoff from the Microsoft Dynamics NAV Core Team

  • Microsoft Dynamics NAV Team Blog

    Great update rollup news for AT, BE, CH, ES, FI, IS, NO

    • 3 Comments

    We have some great news to share with customers and partners in AT, BE, CH, ES, FI, IS, and NO: The next update rollups for Microsoft Dynamics NAV 2013 and Microsoft Dynamics NAV 2013 R2 will include local files for these countries.

    We know this has been long-awaited and we hope we are putting smiles on a few faces with this announcement. :-)

  • Microsoft Dynamics NAV Team Blog

    Important Information: In a live database with active users connected, changing an object multiple times or compiling all objects can cause data loss in NAV 2013 R2

    • 37 Comments

    You may experience data loss in Microsoft Dynamics NAV 2013 R2 in the following situations, separately or in combination:

    • Changing an application object more than once, for example by two different developers, in the same database connected to the same Microsoft Dynamics NAV Server instance while users are working in the system.
    • Compiling all application objects, and thereby potentially changing objects more than once, in a database that is connected to a Microsoft Dynamics NAV Server instance that users are accessing.

    To avoid the problem, we advise that you work according to the following best practices:

    • Application developers must be working on their own database and connect to their own Microsoft Dynamics NAV Server instance. When you deploy changes to the live production database, make sure that no users are working in the system.
    • You must compile objects only when no users are working in the system, including users connecting through NAS. 

    With update rollup 5 for Microsoft Dynamics NAV 2013 R2 - KB 2937999, this issue has been fixed and you do not have to take the precautions described above. However, we still advise that you separate development from production databases.

    Please note that implementing update rollup 5 will require a database conversion.

     

     

  • Microsoft Dynamics NAV Team Blog

    Installing Microsoft Dynamics NAV 2013 R2 side-by-side with Microsoft Dynamics NAV 2013

    • 9 Comments

    A year after Microsoft Dynamics NAV 2013 released, we released a new version of it, Microsoft Dynamics NAV 2013 R2. They share common files, so if you install both versions on the same computer, then they will try to use the same resources, and so you run into problems. This really means that you cannot install the two versions side-by-side.

    We resolved this issue with the fix in KB 2907588 for Microsoft Dynamics NAV 2013 R2 (build number higher than 35850). But there is some manual work that you have to do to apply the fix fully.
    Microsoft Dynamics NAV 2013 and Microsoft Dynamics NAV 2013 R2 use the same Windows registry entries to describe which interface and libraries to use. With the described fix, Microsoft Dynamics NAV 2013 R2 can use new registry entries, but simply installing the hotfix does not generate the registry entries. Windows registry settings are created by installation programs, but creating a new installer for every language is out of scope for hotfix releases.

    To get Microsoft Dynamics NAV 2013 and Microsoft Dynamics NAV 2013 R2 working side-by-side, you can choose to modify some of the existing entries in the Windows registry. But the easiest way is to delete the existing registry entries and create new entries in the registry.

    Depending on the specific machine architecture, your registry settings can include the following entries:
    " HKEY_CLASSES_ROOT\TypeLib\{5020AC1E-A4F0-402B-A920-3FED4E3B05CC}\7.1"
    " HKEY_CLASSES_ROOT\Interface\{14519985-4959-4F7C-AC30-CBBCD9DFBC08}"
    " HKEY_CLASSES_ROOT \Interface\{59521B62-D441-47E6-8224-A07203686BA2}"
    " HKEY_CLASSES_ROOT \Wow6432Node\TypeLib\{5020AC1E-A4F0-402B-A920-3FED4E3B05CC}\7.1"
    " HKEY_CLASSES_ROOT \Wow6432Node\Interface\{14519985-4959-4F7C-AC30-CBBCD9DFBC08}"
    " HKEY_CLASSES_ROOT \Wow6432Node\Interface\{59521B62-D441-47E6-8224-A07203686BA2}"

    Remove the entries.

    To create new correct windows registry entries, open the Command Prompt as an administrator, and then, run the RegAsm.exe /register Microsoft.Dynamics.Nav.Client.WinForms.dll /tlb command for each of the two products.

    For example, for Microsoft Dynamics NAV 2013, enter the following command:

    C:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe /register "C:\Program Files (x86)\Microsoft Dynamics NAV\70\RoleTailored Client\Microsoft.Dynamics.Nav.Client.WinForms.dll" /tlb

    And for Microsoft Dynamics NAV 2013 R2, enter the following command:
    C:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe /register "C:\Program Files (x86)\Microsoft Dynamics NAV\71\RoleTailored Client\Microsoft.Dynamics.Nav.Client.WinForms.dll" /tlb

    When you have run those two commands on a 32-bit computer, the following entries exist in the registry:

    Microsoft Dynamics NAV 2013:
    HKEY_CLASSES_ROOT\Interface\{14519985-4959-4F7C-AC30-CBBCD9DFBC08} (where \TypeLib\Version == 7.0)
    HKEY_CLASSES_ROOT\TypeLib\{5020AC1E-A4F0-402B-A920-3FED4E3B05CC}\7.0

    Microsoft Dynamics NAV 2013 R2:
    HKEY_CLASSES_ROOT\Interface\{59521B62-D441-47E6-8224-A07203686BA2} (where \TypeLib\Version == 7.1)
    HKEY_CLASSES_ROOT\TypeLib\{95819FD3-CF0A-4706-BE93-35B3DDCB817C}\7.1

    And for 64-bits computers:
    Microsoft Dynamics NAV 2013:
    HKEY_CLASSES_ROOT\Interface\{14519985-4959-4F7C-AC30-CBBCD9DFBC08} (where \TypeLib\Version == 7.0)
    HKEY_CLASSES_ROOT\Wow6432Node\Interface\{14519985-4959-4F7C-AC30-CBBCD9DFBC08} (where \TypeLib\Version == 7.0)
    HKEY_CLASSES_ROOT\TypeLib\{5020AC1E-A4F0-402B-A920-3FED4E3B05CC}\7.0
    HKEY_CLASSES_ROOT\Wow6432Node\TypeLib\{5020AC1E-A4F0-402B-A920-3FED4E3B05CC}\7.0

    Microsoft Dynamics NAV 2013 R2:
    HKEY_CLASSES_ROOT\Interface\{59521B62-D441-47E6-8224-A07203686BA2}(where \TypeLib\Version == 7.1)
    HKEY_CLASSES_ROOT\Wow6432Node\Interface\{59521B62-D441-47E6-8224-A07203686BA2}(where \TypeLib\Version == 7.1)
    HKEY_CLASSES_ROOT\TypeLib\{95819FD3-CF0A-4706-BE93-35B3DDCB817C}\7.1
    HKEY_CLASSES_ROOT\Wow6432Node\TypeLib\{95819FD3-CF0A-4706-BE93-35B3DDCB817C}\7.1

    If you have applied everything correctly, then Microsoft Dynamics NAV 2013 and Microsoft Dynamics NAV 2013 R2 will now both be able to run on the computer.

    If you have only Microsoft Dynamics NAV 2013 R2 installed and any object run from dev env opens new RTC instance, then you can apply the same registry modify (related to 7.1) and issue will be resolved.

    Attached is PowerShell script does all job.
    BTW: If Microsoft Dynamics NAV 2013 R2 is installed alone, you can also use script - it will fix registries. 

     

    Best regards,

    Gedas Busniauskas and Jorge Alberto Torres from the Dynamics NAV team

Page 1 of 41 (615 items) 12345»