Microsoft Dynamics NAV

Team Blog

  • Microsoft Dynamics NAV Team Blog

    Performance Analyzer 1.0 for Microsoft Dynamics

    • 4 Comments

    The Microsoft Premier - Dynamics team has created and compiled a set of scripts and tools for helping analyze and troubleshoot SQL Server performance issues on the Dynamics products. These are the same tools that we use on a daily basis for collecting SQL performance data and troubleshooting SQL performance issues on all our Dynamics products* and we want to make this available to our partners and customers. These tools rely heavily on the SQL Server DMVs so it is only available for SQL Server 2005, SQL Server 2008, and SQL Server 2008 R2. 

    This tool can aid in the troubleshooting of blocking issues, index utilization, long running queries, and SQL configuration issues. Instructions for installing and using the tool are included in the download package. One nice feature of this tool is that it creates a database called DynamicsPerf and imports all the performance data collected into the DynamicsPerf DB, which can be backed up and restored on any SQL Server (2005, 2008) for later analysis making it "portable." The collection of performance data can also be automated via a SQL job for which the scripts are provided.

    Performance Analyzer 1.0 for Microsoft Dynamics can be downloaded via the following MSDN link. This tool is updated on a fairly consistent basis with bug fixes and new functionality so please check often for new versions.

    http://code.msdn.microsoft.com/DynamicsPerf

    This tool and associated scripts are released "AS IS" and are not supported.

    *There is added functionality for Dynamics AX

    -Michael De Voe

  • Microsoft Dynamics NAV Team Blog

    Microsoft Dynamics NAV : Online Maps

    • 0 Comments

    Online map functionality that we've had in Dynamics NAV for some time now has changed for most of countries, after Maps were moved to Bing.

    As maps were moved and collections changed, the code needs to be changed to align with this. This is scheduled for change in standard application.

    Meanwhile, it is fairly simple to make some basic changes in current application code that will allow you to align existing functionality with Bing maps, for basic search functionalities in any case. Code changes are not many and are fairly simple, but stretch across several objects so I have uploaded the txt file containing these objects, for simplicity.

    The changes i made here only align with new maps, functionality is more or less the same as it was, with few minor changes. Online map setup is a bit simpler, as no default links are needed nor inserted. Remember though when using this: when URL is built, it is the country/region code that will decide what language the site will open in.

    Not all local sites are translated to local languages, so if one specifies NO (Norway) as a country (for example), maps will still show in English. For some countries (Germany, Spain, Italy, France,...)  selecting a country will show maps in local language. One should also keep in mind, for countries that don't have the collections in local languages - specifying country name in local language might confuse the search in some scenarios. Meaning if your user resides in Norway (example) and  customer resides in Sweden, address URL will contain country name:  Sverige (Norwegian for Sweden), and that will put the search off in some scenarios. All you need here is to either change the code so country code is not within URL (but that might give more hits to select from), or simply add a field to table 9 (Country/Regions) called ENUName. Use the data migration functionality to Import the attached XML file containing list of countries present in demo data and their ENU translations. Include only Code and ENUName fields when importing the file, and change the following line of codeunit 801 Online Map Utilities:

    replace:


    IF country.GET(Address[5]) THEN
      Address[5] := country.Name

    with


    IF country.GET(Address[5]) THEN
      Address[5] := country.ENUName

     

    and your URL will always be built with country name in English, which would work for search in any language.

     

  • Microsoft Dynamics NAV Team Blog

    Test Automation Series 2 - Creation Functions

    • 0 Comments

    With the introduction of the NAV test features in NAV 2009 SP1 it has become easier to develop automated test suites for NAV applications. An important part of an automated test is the setup of the test fixture. In terms of software testing, the fixture includes everything that is necessary to exercise the system under test and to expect a particular outcome. In the context of testing NAV applications, the test fixture mainly consists of all values of all fields of all records in the database. In a previous post I talked about how to use a backup-restore mechanism to recreate the fixture and also about when to recreate the fixture.

    A backup-restore mechanism allows a test to use a fixture that was prebuild at some other time, that is, before the backup was created. In this post I'll discuss the possibility to create part of the fixture during the test itself. Sometimes this will be done inline, but typically the creation of new records will be delegated to creation functions that may be reused. Examples of creation functions may also be found in the Application Test Toolset.

    Basic Structure

    As an example of a creation function, consider the following function that creates a customer:

    CreateCustomer(VAR Customer : Record Customer) : Code[20] 
    
    Customer.INIT;
    Customer.INSERT(TRUE);
    CustomerPostingGroup.NEXT(RANDOM(CustomerPostingGroup.COUNT));
    Customer."Customer Posting Group" := CustomerPostingGroup.Code;
    Customer.MODIFY(TRUE);
    EXIT(Customer."No.")

    This function shows some of the idiom that is used in creation functions. To return the record an output (VAR) parameter is used. For convenience the primary key is also returned. When only the primary key is needed, this leads to slightly simplified code. Compare for instance

    CreateCustomer(Customer);
    SalesHeader.VALIDATE("Bill-to Customer No.",Customer."No.");

    with

    SalesHeader.VALIDATE("Bill-to Customer No.",CreateCustomer(Customer));

     Obviously, this is only possible when the record being created has a primary key that consists of only a single field.

    The actual creation of the record starts with initializing all the fields that are not part of the primary key (INIT). If the record type uses a number series (as does Customer), the record is now inserted to make sure any other initializations (in the insert trigger) are executed. Only then the remaining fields are set. Finally, the number of the created customer is returned.

    Field Values

    When creating a record some fields will need to be given a value. There are two ways to obtain the actual values to be used: they can be passed in via parameters or they can be generated inside the creation function. As a rule of thumb when calling a creation function from within a test function, only the information that is necessary to understand the purpose of the test should be passed in. All the other values are "don't care" values and should be generated. The advantage of generating "don't care" values inside the creation functions over the use parameters is that it becomes immediately clear which fields are relevant in a particular test by simply reading its code.

    For the generation of values different approaches may be used (depending on the type). The RANDOM, TIME, and CREATEGUID functions can all be used to generate values of different simple types (optionally combined with the FORMAT function).

    In the case a field refers to another table a random record from that table may be selected. The example shows how to use the NEXT function to move a random number of records forward. Note that the COUNT function is used to prevent moving forward too much. Also note that If this pattern is used a lot, there may be a performance impact.

    Although the use of random value makes it very easy to understand what is (not) important by reading the code, it could make failures more difficult to reproduce. A remedy to this problem is to record all the random values used, or to simply record the seed used to initialize the random number generator (the seed can be set using the RANDOMIZE function). In the latter case, the whole sequence of random values can be reproduced by using the same seed.

    As an alternative to selecting random records, a new record may be created to set a field that refers to another table.

    Primary Key

    For some record types the primary key field is not generated by a number series. In such cases a simple pattern can be applied to create a unique key as illustrated by the creation function below:

    CreateGLAccount(VAR GLAccount : Record "G/L Account") : Code[20]; 
    
    GLAccount.SETFILTER("No.",'TESTACC*');
    IF NOT GLAccount.FINDLAST THEN
    GLAccount.VALIDATE("No.",'TESTACC000');
    GLAccount.VALIDATE("No.",INCSTR(GLAccount."No."));
    GLAccount.INIT;
    GLAccount.INSERT(TRUE);
    EXIT(GLAccount."No.")

    The keys are prefixed with TESTACC to make it easy to recognize the records created by the test when debugging or analyzing test failures. This creation function will generate accounts numbered TESTACC001, TESTACC002, and so forth. In this case the keys will wrap around after 999 accounts are created, after which this creation function will fail. If more accounts are needed extra digits may simply be added.

    Input Parameters

    For some of the fields of a record you may want to control their values when using a creation function in your test. Instead of generating such values inside the creation function, input parameters may be used to pass them in.

    One of the difficulties when defining creation functions is to decide on what and how many parameters to use. In general the number of parameters for any function should be limited. This also applies to creation functions. Parameters should only be defined for the information that is relevant for the purpose of a test. Of course that may be different for each test.

    To avoid libraries that contain a large number of creation functions for each record, only include the most basic parameters. For master data typically no input parameters are required. For line data, consider basic parameters such as type, number, and amount.

    Custom Setup

    In a particular test you typically want to control a slightly different set of parameters compared to the set of parameters accepted by a creation function in an existing library. A simple solution to this problem is to update the record inline after it has been returned by the creation function. In the following code fragment, for example, the sales line returned by the creation function is updated with a unit price.

    LibrarySales.CreateSalesLine(SalesLine.Type::"G/L Account",AccountNo,Qty,SalesHeader,SalesLine,);
    SalesLine.VALIDATE("Unit Price",Amount);
    SalesLine.MODIFY(TRUE);

    When the required updates to a particular record are complex or are required often in a test codeunit, this pattern may lead to code duplication. To reduce code duplication, consider wrapping a simple creation function (located in a test helper codeunit) in a more complex one (located in a test codeunit). Suppose that for the purpose of a test a sales order needs to be created, and that the only relevant aspect of this sales order is that it is for an item and its total amount. Then a local creation function could be defined like

    CreateSalesOrder(Amount : Integer; VAR SalesHeader : Record "Sales Header") 
    
    LibrarySales.CreateSalesHeader(SalesHeader."Document Type"::Order,CreateCustomer(Customer),SalesHeader);
    LibrarySales.CreateSalesLine(SalesHeader,SalesLine.Type::Item,FindItem(Item),1,SalesLine);
    SalesLine.VALIDATE("Unit Price",Amount);
    SalesLine.MODIFY(TRUE)

    In this example a complex creation function wraps two simple creation functions. The CreateSalesHeader function takes the document type, a customer number (the customer is created here as well) as input parameters. The CreateSalesLine function takes the sales header, line type, number, and quantity as input. Here, a so-called, finder function is used that returns the number for an arbitrary item. Finder functions are a different type of helper functions that will be discussed in a future post. Finally, note that the CreateSalesLine function needs the document type and number from the header; instead of using separate parameters they are passed in together (with the SalesHeader record variable).

    Summary

    To summarize here is a list of tips to consider when defining creation functions:

    • Return the created record via an output (VAR) parameter
    • If the created record has a single-field primary key, return it
    • Make sure the assigned primary key is unique
    • If possible, have the key generated by a number series
    • The safest way to initialize a record is to make sure all triggers are executed in the same order as they would have been executed when running the scenario from the user interface. In general (when DelayedInsert=No) records are created by this sequence :
      • INIT
      • VALIDATE primary key fields
      • INSERT(TRUE)
      • VALIDATE other fields
      • MODIFY(TRUE)
    • Only use input parameters to pass in information necessary to understand the purpose of a test
    • If necessary add custom setup code inline
    • Wrap generic creation functions to create more specific creation functions
    • Instead of passing in multiple fields of a record separately, pass in the entire record instead

    These and some other patterns have also been used for the implementation of the creation functions included in the Application Test Toolset.

  • Microsoft Dynamics NAV Team Blog

    NAV 2009 Tips and Tricks: Create Notifications from Task Pages

    • 7 Comments

    You can create notifications from task pages such as customer cards or sales orders. You can use notifications as reminders, or as a way to send information to other NAV users in your company.

    A notification is displayed on the recipient's Role Center. By clicking the notification, the recipeint opens the associated task page.

    1. To create a notification, open the task page from which you want to send a notification. For example, open a customer card, sales order, or other task page.

    2. In the FactBox area, scroll down to the Notes part.

    3. In the Notes part, click to create a new note.

    4. In the Enter a new note here text box, type a note.

    5. Select a recipient.

    6. Select Notify.

    7. Click Save.

    The notification is saved on the task page.

     

    The notification is also relayed to the recipient and is displayed on his/her Role Center under My Notifications.

    For more information about usability and the RoleTailored client, see the blog post Useful, Usable, and Desirable.

  • Microsoft Dynamics NAV Team Blog

    Integration to Payment Service in NAV 2009 R2

    • 5 Comments

    The Payment Service available from Online Services for Microsoft Dynamics ERP is an example of the growing availability of online services that users of ERP systems can benefit from connecting to. Adding functionality to the application through connecting to a service is new territory for us in the NAV development team, and we have learned a lot through this development project. We are looking forward to sharing the benefits of being able to expand the service, while we keep our focus on delivering the new NAV product.

    The Payment Service is hosted by Microsoft and the number of available Payment Providers is growing. Today there are multiple Payment Providers like First Data, Pay Pal, and Cybersource supporting the US and Canadian markets. The plan is to grow the number of payment providers, so that the rest of the world can be supported as well. We are shipping the integration for all NAV supported countries - even though the payment providers aren't available yet - so the code is ready when the service becomes available.

    The integration to the Payment Service that is included in NAV 2009 R2 will allow users of Microsoft Dynamics NAV to accept credit and debit card payments from Sales Orders, Invoices, as well as the Cash Receipt Journal. The solution will allow for both an authorization process and an automatic capture of the required amount during post as well as using it more freely on the Cash Receipt Journal.

    Adding the integration to the online services has been done with a number of goals in mind:

    • Keeping it simple: Adding the integration to the Payment Service will allow the user of NAV to work within NAV when he is accepting the credit cards as payments. There is no need for a third party add-on outside the normal environment. The payment information is built in to the existing order entry process, using the Sales Orders and the Invoices as a starting point. This means a simple payment flow that doesn't require a huge effort to learn and set up. This will support the envisioning behind adding services to existing installations: it must add to the existing functionality without making it more complex.
    • Power of Choice: Secondly, choosing the online payment service will allow the users to choose the payment provider that suits their needs the best. There can be a difference in the transaction cost per payment provider and the user is encouraged to investigate which one that fits their scenario the best. Depending on the payment provider, there is support for multiple credit cards and currencies. Out of the box there is built-in setup for Visa, MasterCard, American Express, and Discover.
    • Secure integration: Third, there has been focus on ensuring that the information that is required to handle credit card transactions is kept as secure as possible and that the design adheres to the standards of the market. To this, there are two aspects to consider: the data that is stored in the ERP system and what is being sent to the payment providers through the service.
    • The ERP data includes encrypted storage of the customer credit card number as well as securing that users don't have access to the numbers.
    • The payment service is also certified by following the guidance of the Payment Card Industry (PCI) Security Standards Council.

    Scenarios Covered by the Integration

    The areas that are relevant when describing the integration to the Payment Service can be described by the following scenarios:

    1. Authorization of the amount from the Sales Order or Invoice against the customer's credit card
    2. Capture of the actual amount and thereby also creating the payment in the system
    3. Voiding the authorized amount
    4. Refunding against an existing capture

    To describe the scenarios it is useful to think about the personas using the functionality; in this case we work with Susan, the Order Processor, as well as Arnie the Accounts Receivable Administrator.

    As a part of Susan's work, she receives and processes the incoming orders from the sales representatives. She will in some cases talk to the customer to validate the orders and ensure that items are available and that the price is correct according to the agreement. In some cases the customer can request that they want to pay using a credit card, instead of having to handle the invoice later. Susan has to ensure that the information required for using a credit card is available; if not, she will get the information from the customer.

    If Susan needs to be certain that the customer can pay the agreed amount, she can go ahead and authorize the amount against the provided credit card information. If the result is successful the sales order can be shipped. When the sales order is posted (or parts of it) the actual capture of the amount on the sales order will automatically be processed. When capture is successful the payment will be automatically registered and money will be received shortly.

    On the sales order it looks like below - there are two new fields for the credit cards - as well as a requirement to use a specific Payment Method (described below in the Getting Started section).

     

    The scenario above is the simplest process that is supported by the new payment service integration. The following scenarios is also covered in the implementation:

    1. Partial posting of the sales order will only capture the amount that is posted. The rest can be captured later.
    2. It is possible from the Cash Receipt Journal to accept multiple credit cards against the same invoice. This is done by adding multiple lines in the journal - one per credit card.
    3. It is possible to use a credit card transaction to cover more than one invoice. Again, this is only possible from the Cash Receipt Journal.
    4. It is possible to void an existing authorization in case the amount is not needed. This is only implemented in a manual step.
    5. It is possible to refund an existing transaction as well as part of a transaction. This is done through the Credit Memo.

    All of the above transactions and connection to the payment service can be seen on the specific customer as well as on the specific documents. On all places a Transaction Log has been implemented that shows the status of the current transactions and if the connections have been successful or not.

    Getting Started

    Enabling the payment integration does require a couple of steps both inside and outside NAV:

    • First of all, it is required to sign up for the Payment Service. Details can be found here: Microsoft Dynamics Online Payments Introduction. The sign up includes validating and choosing which Payment Provider to use. There is a difference in the cost and in the support, so some investigation is recommended. After signing up a Live ID and a Password is provided that is required when setting up the connection.
    • Within Microsoft Dynamics NAV 2009 R2 there are a couple of steps that needs to be completed:
      • First of all, the connection needs to be setup - and this is where the Live ID and the password are required. Please note  that the Microsoft Dynamics ERP Payment Service Connection Setup is only available in the Classic Client due to security reasons.  

    •  
      • For the connection to carry the correct currency there is a need to fill out the currency field on the General Ledger Setup. Please verify with the help document for the correct values. Below is an example in the CRCARD payment method
      • Finally it is required that a Payment Method is created that uses the Payment Processor field as well as the bank account with correct currency as signed up with

    For more information please look at the following resources:

    -Rikke Lassen

     

  • Microsoft Dynamics NAV Team Blog

    .NET Interoperability in NAV 2009 R2

    • 15 Comments

    The greatest development platform in the world meets the greatest set of functional libraries, types, methods, and properties as Microsoft Dynamics NAV 2009 R2 allows developers to take advantage of the Microsoft .NET Framework! With NAV 2009 R2, you can reference external .NET components and make use of the Types and Functions from .NET Framework assemblies and from your own or 3rd party code.

    Being able to use .NET from C/AL code has been planned for a long time - the whole NAV Server architecture released with NAV 2009 has been building to this time where we can finally reach out from the NAV C/AL context and make use of these functions. The feature is very much part of our roadmap going forward where we want to give developers more power and allow partners to create solutions with much broader reaches than can be achieved within a native C/AL environment.

    Referencing an external component will be similar to the pattern that Automation developers are accustomed to - you can quickly choose a component from the variable declaration window and then start using the object in C/AL with full support from NAV's Symbol Menu (F5). 

    When working with variables of type DotNet, we distinguish between two sorts: Add-ins and those registered from the Global Assembly Cache (GAC). The Add-in type are those that are custom made or custom written, they do not need to be strong-named, and they may also change or are updated often. These components must be copied into a new directory (the Add-ins directory) on the developer's C/SIDE installation in order to be utilized. Variables based on types registered in the GAC are less likely to be swapped around but support strong-named types and include components like the .NET Framework. .NET Framework components have the additional benefit that they are already deployed on computers so there is no need for additional deployment!

    Rather than elaborate more on the properties and definitions, let's look at a sample. In this code sample, we will use methods from the .NET Framework to retrieve a list of processes running on the NAV Server and show the process IDs in a message box. The sample is not exactly an ERP task but shows what can now be achieved by using .NET and hopes to show that familiar code patterns can be applied.

    This screenshot shows the whole solution:

    Notice that we have declared two DotNet variables here - myproclist, which is a System.Array and holds our list of processes, and process, which is a System.Diagnotics.Process subtype. Both variables are from the .NET Framework and are thus registered in the system GAC and we don't need to worry about deploying them for when we run the code.

    Notice also that unlike Automation (based on COM), you don't always need to CREATE the objects. In DotNet, objects need to have a constructor called when they are instance-based or they may be used directly if they are static. The GetProcesses method is a static method in .NET, as we can see in the information section in our ever-helpful Symbol Menu.

    Notice also that the C/AL code is able to loop through the Array. Using arrays (be they NAV arrays or .NET System.Arrays) is such a common programming pattern that it would be very wrong of us to not include it.

    Of course using .NET is only supported on the NAV Server and, like Automation, you can also run the .NET objects either on the NAV Server or on the RoleTailored client.

    Using .NET in C/AL will open many new options - more than we can possibly imagine. We hope you'll enjoy using this feature from NAV 2009 R2 and go on to make some fantastic new solutions for all our customers!

    Good luck and happy coding!

    Stuart

    To view a recorded version of the Hot Topic session about .NET Interoperability, see the Partner Learning Center.

  • Microsoft Dynamics NAV Team Blog

    NAV 2009 Tips and Tricks: Save Filtered Lists

    • 4 Comments

    When you work with lists, you often need to filter them and work with a subset, like customers from Germany or items in Blue location. After you create filters on a list, you can save the filtered list. This is especially useful if you have several filter parameters and you don't want to create the filters every time you start your work. You can come back to the saved filtered list any time you want.

    To Save a Filtered List

    1. To save the filtered list, click the name of the list next to the filter field.

    2. Click Save View As.

    3. Type the name for the view and choose the Activity Group to store the view.

    4. Click OK.

    5. Click Yes to restart the application.

     

     After restart the saved filter appears in the Navigation Pane.

    To Delete a Saved Filtered List

    To delete a saved filtered list, you remove it from the Navigation Pane.

    1. Right-click the saved filter in the Navigation Pane, and then click Customize Navigation Pane.

    2. In the Customize Navigation Pane window, select your filtered list, click Remove, and then click OK.

    3.  Click Yes to restart the application. After restart the saved filter no longer appears in the Navigation Pane.

  • Microsoft Dynamics NAV Team Blog

    Some tips about creating "Tree view" in List pages

    • 7 Comments

    In Microsoft Dynamics NAV 2009 in new Role Tailored Client we have new feature – we can show lists in “tree view”. We can expand/collapse nodes and make lists more interesting and more visual.

    However this new feature isn’t documented very well and every developer needs to collect his own experience. With this article I will try to make this way easierJ

    So if we want to see Tree View we need to have:

    1.       Table with field type Integer. This field will get us major point – will show is record root or fork or leaf.

    a.       Few words about “IndentationColumnName” field; (that how property to indentation field is named on Pages)

                                                                  i.      Field could be only type Integer.

                                                                ii.      Allowed values are >=0. I didn’t find upper limit, but because view indentation shift is calculated based on this value then with “big” values filed is indented too far to right that becomes invisible.

                                                              iii.      Root record has “0” indentation. Higher numbers means higher indentation. There could be several “0” records placed on table.

    2.       Page type List.

    a.       On page designer there must be “Group” & subtype “Repeater” and we need to set on it:

                                                                  i.      Property “ShowAsTree” = Yes

                                                                ii.      Property “IndentationColumnName” must be field name we defined in table as indentation field.

    b.      Repeater must include fields we want to see in list. First field in list will be indented and will have ‘+-‘ signs for collapse/expand list. Indentation field could be not included to page.

    If everything is done (and you have data in the table), then run page. Fortunately for me I have table with some data in it:

    Few interesting points I want to have your attention:

    • Field “Int” is used for primary key
    • Field “Indentation” has indentation value used for Tree View.
    • Both fields are not used on page so field “Txt” has text showing which record and what indentation level is.
    • There are no relations between primary key and indentation. You see 0 indentation is record 18.

    So run page and see:

    If we “Expand All” we’ll see:

    Wow it works J

    Please keep in mind:

    • There could be few records with the same indentation.
    • If after record ‘A’ is going record ‘B’ with bigger indentation then we can expand record ‘A’.
    • View belongs to sorting. I sorted records based on “Indentation” value. So I see “full tree” started from “0 level”. But really “0 level” record is 18 record by primary key, and if change sorting to primary key I will see different tree.

    You see now: first record has primary key 0 and indentation level 5, but next record has level 1 so my first record has no possibilities “collapse/expand”. Record 18 with level 0 is in the end of list and only one record is after it, so “my root records from previous view” now can expand/collapse only one record.

     

    And last:

    • You can’t insert manually new records to “Tree View”. Please use code if you want to create new records from “Tree view”
    • You can delete records manually from “Tree view” one by one. If you will try to delete not expanded record then only this record will be deleted.
    • You can edit records in “Tree view”. You can modify even “Indentation level” field, just after modify “Refresh” (F5) and you will see “new view”.
    • There were few stability issues in “Tree view ”, so please use possible latest NAV builds
    • If you have questions/issues regarding this functionality, please contact our best ever NAV support team J

     

    Gedas Busniauskas
    Microsoft Lithuania
    Microsoft Customer Service and Support (CSS) EMEA

  • Microsoft Dynamics NAV Team Blog

    Running classic reports in RTC (RUNMODAL and a few other things)

    • 10 Comments

    Just a few points about running classic reports from RTC, based on common support scenarios:


    RUNMODAL (Not possible)

    RTC runs classic reports (reports with no RDL Layout) by starting the report engine from a classic client. However, RTC is not able to run classic reports MODALLY. RUNMODAL as opposed to just RUN means that execution of the  next line of C/AL code waits until the report has completed. Of course RTC reports which DO have a layout can run MODALLY without any problems.

    So Report.RUNMODAL on a classic report from RTC does exactly the same as Report.RUN, i.e. RTC will launch the classic report engine but not wait for the report to finish before executing the next line of code. In most cases this doesn't matter. But the challenge is when the next line of code dependeds on the report having completed, for example to email the report, convert it to pdf, write back a result of the report to the database, or something else.

     

    Running batches of classic reports (Improvement)

    The good news is that there has been a few small other improvements relating to running classic reports from RTC. When the classic client closes, it updates a few files like the .zup file, and in the case of breakpoints having been used, also NaviBP.xml as described here:
    http://msdn.microsoft.com/en-us/library/dd355196.aspx
    In case we launched a batch of classic reports, one instance of the classic report engine would start up for each report. And each instance could overwrite each other's files, leading to error messages like this:

    You cannot use the file C:\Users\[USER]\AppData\Roaming\fin.zup  because it is already in use.

    and


    Microsoft Visual C++ Runtime Library
    Runtime Error!

    Program: C:...

     This application has requested the Runtime to terminate it in an unusual way.
    Please contact the application's support team for more information. 

    But with KB 2398170 (build 31587) the behaviour is changed, so that now when the classic client closes the report engine, it willl 1) only try to update the .zup file, and 2) not try to update naviBP.xml at all, avoiding the error messages mentioned above.

     
    Licenses (No, it doesn't consume a license)

    When you run a classic report from RTC, this does NOT consume a user license. If you watch the Session table while a classic report is running, you will see that a new session has connected, but with "Application Name" = '111'. In this way the system knows not to count it as a normal NAV client, so it will not count as a concurrent session.

     

     

    Lars Lohndorf-Larsen

    Microsoft Dynamics UK

    Microsoft Customer Service and Support (CSS) EMEA

  • Microsoft Dynamics NAV Team Blog

    Integrating NAV 2009 R2 with CRM 4.0

    • 19 Comments

    With the release of NAV 2009 R2, we have endeavoured to prioritise features that many customers and partners have requested and this includes the ability to integrate NAV with CRM.

    The approach we have chosen to provide integration between NAV and CRM is to use an existing solution called the Connector for Microsoft Dynamics. This solution enables the integration of NAV 2009 R2 with CRM 4.0 online or on premise.

    As part of R2, we will provide out of the box support for synchronising common data such as customer, contact, sales order, and invoice, while also providing a means to enable synchronisation between any other standard or custom entities or fields that support specific business processes.

    Let's take a typical scenario where integration between CRM and NAV can really support a business process:

    The marketing manager uses CRM to manage her campaigns, opportunities and leads. When the leads are qualified they can be converted into a CRM Account. With integration enabled, this account subsequently becomes a customer in NAV. It's now possible for the sales team or customer service representatives to create orders in either CRM or NAV depending on their business process. The sales order will be integrated to NAV where the planning, payment processes, and shipping are handled, taking advantage of the core strengths of NAV.

    When R2 ships we will be providing as standard, integrations between the following entities:

    The Connector for Microsoft Dynamics uses web services to read and write data from CRM and NAV. It has two adapters for our solution that are designed to integrate with NAV 2009 R2 and with CRM 4.0. During configuration of the adapters, it is possible to specify which entities you want to integrate, which companies will be integrated, etc. so once the adapters are configured you can see a company-to-company integration with all the entities that you plan to integrate between the two systems.

    The entities are synchronised through the use of maps which indicate which field in NAV relates to which field in CRM. For example, Customer Name in the Customer table in NAV may relate to the Customer Name in the Account entity in CRM. The systems can be kept in synch on a schedule that works for each entity. So for example, it might be that you want to synchronise your customer information from NAV to CRM every hour but you may only want to synchronise item data from NAV to create products in CRM on a weekly basis.

    When the Connector runs, changes made to data in NAV that have been identified as data that will be integrated will trigger a field to be updated with a date/time stamp indicating that a change was made. The Connector can then query this date and look for changes via the web services since the last time the integration ran and write those changes to the destination system.

    To view a recorded version of the Hot Topic session about Integrating Microsoft Dynamics NAV 2009 R2 with CRM 4.0, see the Partner Learning Center.

    - Samantha Scott

  • Microsoft Dynamics NAV Team Blog

    Increased Deadlocking After Full Dynamics NAV Upgrade

    • 0 Comments

    I was recently on-site at a large Dynamics NAV customer attempting to help them get through a number of significant performance issues they encountered on their two previous failed attempts to upgrade from NAV 3.70 to NAV 5.00 SP1. In summary, they had in excess of 100 concurrent users running relatively well on NAV 3.70 with a high transaction volume. When they attempted to go live on the upgraded NAV 5.00 SP1 version they could barely get 10 users in the system without completely deadlocking each other and it was, for the lack of better term, unusable. During the previous two attempts to upgrade the partner had deployed the NAV Application Benchmark tool and coded in all the customer business cases and custom functionality to allow them to do their scalability testing (Very Cool!!). This is where I came in.

    The first thing the partner and I did was run a 30-user mixed workload test for 10 minutes on the upgraded code just to see where we were at. During this test we received over 1100 SQL deadlocks. There were so many it was difficult to even categorize where they were coming from. We reviewed the C/AL code for each of the profiles we were using and with client monitor trying to track down issues with the locking order of the tables between these processes. Sounds easy, but it's not and took a considerable amount of time. As we were scanning through the code I happened to look over the shoulder of one of the partners who had the code up on his screen for one of the processes only reports we were using and I noticed a comment in the code that caught my attention.

                //CI-Perf 1.01 140206 CI-HJS 1.00

    What first caught my attention was the word "Perf." I was very interest to know what performance modifications had been made to the code. The second thing that caught my attention was the date "140206," which means this performance enhancement dated back to 2006, when they were running NAV 3.70. Further inspection of the code revealed that several of these enhancements were to correct locking order bugs in the standard code and localization code for the 3.70 version. These changes were absolutely necessary on 3.70 to be able to achieve any type of scalability but on 5.00 SP1 they were fixing issues which no longer existed, causing several locking order violations in very key NAV processes and causing a huge number of deadlocks. We went through all the code and "unwound" these locking order changes and re-ran the benchmark tests*. Eventually we ended in a 100-user mixed workload test for 2 hours that produced > 30 deadlocks and these were on reservation entry and no. series, and we also achieved a very high transaction volume. 

    The moral of the story is when you do code upgrades from version to version, especially when you have a large gap of versions in between, be very careful what C/AL performance optimizations you bring forward from the old version to the new, and evaluate each one to make sure it is still necessary or it could end up having the absolute opposite effect on the newer version and causing performance issues.

    Thanks go out the partner who helped me work through all these issue while I was on-site!

    *There were other changes made with executable versions and SQL and database configuration that I will not detail here.

    Michael De Voe

    Senior Premier Field Engineer

    Microsoft Dynamics

    Microsoft Certified Master - SQL Server 2008

  • Microsoft Dynamics NAV Team Blog

    Let NAV PLAY! (Media Play… of course)

    • 2 Comments

    In this blog you will find the source code in order to implement a client add-in based project with Windows Media Player. You would have a wide range of possibilities to use this simple add-in and enlarge this project on your own.

    If you want to know more about client add-ins you can refer to MSDN link:

    Extending the RoleTailored Client Using Control Add-ins in Microsoft Dynamics 2009 SP1

    Step by step creation of the NavMP (NAV Media Player) add-in:

     (always remember the 'DodgeBall' rules: Develop, Sign, Place, Register, and Develop)

    1. DEVELOP your add-in (in Visual Studio)
    2. Strong SIGN and Build
    3. PLACE DLLs into Add-ins folder
    4. REGISTER the add-in in Table 2000000069, Client Add-in
    5. DEVELOP your C\AL code (in Object Designer)

    My ingredients:

    • Visual Studio 2010 Professional
    • Windows 7 Enterprise
    • Windows Media player 12

    DodgeBall rule 1: DEVELOP your add-In (in Visual Studio)

    A. Create a New Class project

    1. Open Visual Studio (in this example I am using Visual Studio 2010)
    2. Create a New Project (CTRL+SHIFT+N) with these parameters:
    •  
      • Visual C# - Windows
      • Class library
      • .NET Framework 3.5
      • Name: NavMP
      • Location: C:\TMP (or whatever location you like)
      • Solution Name: NavMP
      • Create directory for solution

     

    B. Create a Strong Name Key (SNK)

    1. Go to Project > Properties (NavMP Properties...)
    2. From the Project Properties form go to the Signing tab
    3. Tick the Sign the assembly option
    4. Create a New SNK (e.g. NavMP.snk)

     

    C. Add a Windows Form to the class project and modify its properties

    1. In the main menu click on "Project" > "Add New Item" (Ctrl + Shift + A)
    2. Select "Windows Form"
    3. Click "Add"
    4. In this way, Visual Studio has added a brand new Windows Form to your project and inherit all the necessary references.

     

    • The brand new Form should be added to your project. And you just simply need to change the Form properties as reported below:
    Property Value
    AutoScaleMode None
    Autosize True
    FormBorderStyle None
    Locked True
    MaximizeBox False
    MinimizeBox False
    Size 212;207
    Text NAV Media Player

     

    D. Add a Media Player object  to the class project and modify its properties

    1. Normally, a Media Player object is not present as an item in the Toolbox. In order to add it you need to have Media Player installed in your machine. Then, you can just follow the next steps or simply refer to this useful How To video: http://msdn.microsoft.com/en-us/vcsharp/bb798025.aspx
    2. Go to the Toolbox and scroll down to the last available space ("General" group)
    3. Click on General > Right-click in the blank area > Select "Choose Items"

    • In the "Choose Toolbox Items" form > Select tab "COM Components" > check on "Windows Media Player" and click OK

    • Now the Windows Media Player item should be added to your toolbox

     

    • Select the Windows Media Player item and drop it into the Form created before

    • Right click on the Windows Media Player control added and click on "Properties"
    • Change the Windows Media Player properties as reported in the screens below and click OK

    • Change the Windows Media Player control item properties added to the Form
    Property Value
    (Name) NAVMediaPlayer
    Anchor Top, Bottom, Left, Right
    Ctlenabled True
    enableContextMenu True
    fullScren False
    Location 0;0
    Locked True
    Margin 2;2;2;2
    Size 287;256
    stretchToFit True
    uiMode full
    windowlessVideo False

     

    If you want to know more about the player object visit http://msdn.microsoft.com/en-us/library/dd564034(v=VS.85).aspx.

    E. Add remaining References to the project

    1. In the Solution Explorer window select "Reference", right-click "Add Reference"
    2. Add a reference to Microsoft.Dynamics.Framework.UI.Extensibility

    F. Develop (add code to) your NavMP project

    1. Locate your Form1.cs file in the Solution Explorer
    2. Right-click > View Designer (Shift+F7)

    • Replace the C# code with the one written below (or copy that from the image)

     

    using System;

    using System.Collections.Generic;

    using System.ComponentModel;

    using System.Data;

    using System.Drawing;

    using System.Linq;

    using System.Text;

    using System.Windows.Forms;

     

    namespace NavMP

    {

        public partial class Form1 : Form

        {

            public Form1()

            {

                InitializeComponent();

            }

            private void NavMediaPlayer_Enter(object sender, EventArgs e)

            {

                string MoviePath = @"C:\TMP\Presentation.avi";

                NavMediaPlayer.settings.autoStart = false;

                NavMediaPlayer.URL = MoviePath;

            }

        }

    } 

    • Now, you need to add some code also in the Class
    • Right-click on the form and select "View Designer" (Ctrl + F7)
    • Select the Media Player control
    • Right-click on it and select "View Code" (F7)

    • Replace the C# code with the one written below (or copy that from the image)

    using System;

    using System.Collections.Generic;

    using System.ComponentModel;

    using System.Linq;

    using System.Text;

    using Microsoft.Dynamics.Framework.UI.Extensibility;

    using Microsoft.Dynamics.Framework.UI.Extensibility.WinForms;

    using System.Windows.Forms;

    using System.Drawing;

     

    namespace NavMP

    {

        // WinFormsControlAddInBase

        [ControlAddInExport("Cronus.DynamicsNAV.NMediaPlayer")]

        [Description("Let this Add-in Media Play")]

     

        public class TestMPClass : StringControlAddInBase

        {

            // Form

            protected override Control CreateControl()

            {

                Form1 MPForm = new Form1();

                MPForm.TopLevel = false;

                MPForm.Visible = true;

                return MPForm;

            }

        }

    }

    DodgeBall rule 2 : Strong SIGN and build

    1. Now it is all set up, you are ready to build your client add-in. In the main menu, go to "Build" > "Build NavMP". (This is automatically strong signed as per rule 1 point B.)

    DodgeBall rule 3 : PLACE DLLs into Add-In folder

    1. Locate/copy/paste NavMP.dll, AxInterop.WMPLib.dll and Interop.WMPLib.dll (should be in your \NavMP\NavMP\bin\Debug folder) in the Add-ins folder of a machine where the RoleTailored client has been installed (typically C:\Program Files\Microsoft Dynamics NAV\60\RoleTailored Client\Add-ins).

    DodgeBall rule 4 : REGISTER the Add-in in Table 2000000069 Client Add-in

    1. Launch the Visual Studio Command Prompt (VSCP)
    2. In the VSCP:

    Sn -T "C:\TMP\NavMP\NavMP\bin\Debug\NavMP.dll"

     dfcb4863cf7c4cb0 is the PKT (Public Key Token) needed to register the AddIn into NAV.

    (You will probably have another value, this is just an example)

    • Open Classic Client
    • Open Object Designer (SHIFT+F12)
    • Select Table object (ALT+B)
    • Run Table 2000000069 Client Add-in
    • Insert a new line with these values:
    • Field Value
      Control Add-in Name Cronus.DynamicsNAV.NMediaPlayer
      Public Key Token dfcb4863cf7c4cb0 (this is an example)
      Version 1.0.0.0
      Description Let this Add-in Media Play

    DodgeBall rule 5 : DEVELOP your C/AL code

    1. Copy/paste the Txt format code written below in a new Notepad object or download the Txt file from the bottom of this blog

    OBJECT Page 50100 Nav Media Player

    {

      OBJECT-PROPERTIES

      {

        Date=;

        Time=;

        Modified=Yes;

        Version List=;

      }

      PROPERTIES

      {

        SourceTable=Table18;

        DataCaptionExpr=Text10000000;

        PageType=CardPart;

      }

      CONTROLS

      {

        { 1101100000;0;Container;

                    ContainerType=ContentArea }

     

        { 1101100001;1;Field  ;

                    ControlAddIn=[Cronus.DynamicsNAV.NMediaPlayer;PublicKeyToken=dfcb4863cf7c4cb0] }

      }

      CODE

      {

        VAR

          Text10000000@1101100000 : TextConst 'ENU=LET NAV Play !';

        BEGIN

        {

          WARNING ----------------------------------------------------------------------------

          YOU NEED TO CHANGE THE PublicKeyToken WITH THE ONE ASSIGNED TO YOUR OBJECT !!!

          ------------------------------------------------------------------------------------

        }

        END.

      }

    }

    • Import the txt object
    • Compile the txt object newly created (Page 50100 Nav Media Player)
    • IMPORTANT: Create an AVI file called Presentation.avi in your C:\Tmp directory (create the directory as well, where needed)
    • Run Page 50100 Nav Media Player
    • Enjoy it!!!

    This simple client add-in project may be used in, e.g.

    • Customer general presentations
    • Stream MP3 files
    • ... and many more

    This simple client add-in project may be enlarged, e.g.

    • It could be possible to enlarge the project and bound this to a field in order to play whatever file in a share (no hardcoded c:\tmp\Presentation.avi)
    • ... and many more

    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

  • Microsoft Dynamics NAV Team Blog

    Outlook Synchronization and baseline implementation for Dynamics NAV 5.0 SP1 and Dynamics NAV 2009 SP1

    • 0 Comments

    Since the initial 5.0 release, so many patches were released by Microsoft that took care of Outlook Synchronization feature, that one could imagine that you are lost. This blog posting tells you what is required for Dynamics NAV 5.0 SP1 and Dynamics NAV 2009 SP1.

    Baseline Implementation for Dynamics NAV 5.0 SP1 systems:

    1. Dynamics NAV NAS of build 26084 or 30488
    2. Client PC of build 26084 or 30488, Dynamics NAV CSIDE Client of build 26084 or 30488, Office 2007 SP2 plus August 2010 Rollup patch for Office 2007 SP2 and Outlook Add-In of build 29763 (KB974523) and build 30991 (KB983614)

    974523 Error message when you synchronize multiple contact records in Microsoft Dynamics NAV 5.0 to Microsoft Office Outlook: "Access to path EntryIdStorage was denied"
    https://mbs.microsoft.com/knowledgebase/KBDisplay.aspx?scid=kb;EN-US;974523

    983614 "The related item for the synchronized Outlook item is not found in the specified folders" error message when you synchronize meetings from Microsoft Dynamics NAV 5.0 Service Pack 1 to Microsoft Outlook
    https://mbs.microsoft.com/knowledgebase/KBDisplay.aspx?scid=kb;en-US;983614

    3. ensure Text Constant Text120 of CU5300 is set to Links and not to a localized translated value

    Correction if text constant Text120 of CU5300 is not set to Links:

    • go to Tools / Object Designer
    • select Codeunit
    • select Codeunit5300 Outlook Synch. Setup Mgt.
    • press Design
    • select View / C/AL Globals
    • select Text Constants
    • select Text120
    • replace the translated value to the word Links
    • save and compile Codeunit 5300

    Now reset the default entities to default values:

    • go to Administration, Application Setup, Microsoft Office Outlook Integration
    • select Outlook Synch. User Setup
    • select everything and press F4
    • confirm the deletion
    • go to Administration, Application Setup, Microsoft Office Outlook Integration
    • select Outlook Synch. Entities
    • select Code and press F5
    • select CONT_SP Microsoft Dynamics NAV Salespeople
    • select Synch. Entity button and select Reset to Defaults…
    • repeat steps 8 and 9 for all other entities in order CONT_COMP, CONT_PERS, TASK and APP

      Results of this correction for APP entity:

      image

      image

      Results of this correction for TASK entity:

      image

      image

    NOTE: the whitepaper is wrong around this topic. We used to recommend to update the Outlook Collection for APP and TASK entity manually and then select Links from the lookup. This actually destroys the references as shown in the second screenshot (Outlook Synch. Entity APP 10000 – Outlook Synch. Fields) and fourth screenshot (Outlook Synch. Entity Element Task 30000 – Outlook Synch Fields).

    4. apply a performance update preventing the system to do a full table scan:

    2288271 A time-out error occurs when the Outlook Synchronization process is run from Microsoft Office Outlook to synchronize with Microsoft Dynamics NAV
    https://mbs.microsoft.com/knowledgebase/KBDisplay.aspx?scid=kb;en-US;2288271

    5. apply a hot fix that solves an issue with attendee validation:

    2291055 "Contact No. '[Contact_number]' does not exist" error message when you perform an Outlook synchronization to synchronize with Microsoft Dynamics NAV 2009 SP1
    https://mbs.microsoft.com/knowledgebase/KBDisplay.aspx?scid=kb;en-US;2291055

    6. before performing a Full Synchronization for the first time, switch the Synch. Direction for APP and TASK entity to Dynamics NAV to Outlook
    7. verify Table13 Salesperson/Purchaser do not list any E-mail addresses for the Outlook Synch users
    8. on the NAS server, log on as the user that is configured to start up the NAS Server service and verify the Regional Settings matches the language of the release of Dynamics NAV you are working with

    image

    9. verify the correct fin.stx and cronus.flf file exists in the %ProgramFiles%\Microsoft Dynamics NAV\Application Server folder

    Copy fin.stx from %ProgramFiles%\Microsoft Dynamics NAV\CSIDE Client\language
    Copy cronus.flf from %ProgramFiles%\Microsoft Dynamics NAV\CSIDE Client

    Follow the official whitepaper on page 55 (see extract below) for the other files: 
    https://mbs.microsoft.com/partnersource/downloads/releases/NAV50OutlookInt

    image

    10. for the first Outlook Synch user, only add CONT_SP entity and register CONT_SP entity in the Change Log via Setup button Register in Change Log Setup
    11. configure the Outlook Add-In and perform a Full Synchronization, populate the E-mail addresses for the synchronized contacts and perform a normal Synchronization to update Table13 Salesperson/Purchaser with correct E-mail addresses taken out of the Exchange Global Addresses
    12. continue and finish the setup of the Outlook Synchronization User Setup for all other users
    13. for each added line in the Outlook Synch User Setup, register the entities in the Change Log via Setup button and then select Register in Change Log Setup
    14. ensure the Outlook Add-In is configured with the following settings:

    image

    • do not use Schedule automatic synchronization every x minutes
    • ensure Show synchronization progress is enabled
    • ensure Show synchronization summary is enabled

    15. ensure the Outlook Synch users are aware the synchronization should not be stopped in between a Full Synchronization or normal Synchronization to prevent duplication of contacts

    Baseline Implementation for Dynamics NAV 2009 SP1 systems:

    1. Dynamics NAV NAS of build 29626 or Dynamics NAV NST of build 29626
    2. Client PC of build 29626, Dynamics NAV CSIDE Client of build 26084 or Role Tailored Client of build 29626, Office 2007 SP2 plus August 2010 Rollup patch for Office 2007 SP2 and Outlook Add-In of build 29626 plus mapihelper.dll of build 29958

    975339 You cannot synchronize meetings and tasks as expected between Microsoft Dynamics NAV 2009 Service Pack 1 and Microsoft Office Outlook
    https://mbs.microsoft.com/knowledgebase/KBDisplay.aspx?scid=kb;EN-US;975339

    3. ensure Text Constant Text120 of CU5300 is set to Links and not to a localized translated value

    4. apply a performance update preventing the system to do a full table scan:

    2288271 A time-out error occurs when the Outlook Synchronization process is run from Microsoft Office Outlook to synchronize with Microsoft Dynamics NAV
    https://mbs.microsoft.com/knowledgebase/KBDisplay.aspx?scid=kb;en-US;2288271

    5. apply a hot fix that solves an issue with attendee validation:

    2291055 "Contact No. '[Contact_number]' does not exist" error message when you perform an Outlook synchronization to synchronize with Microsoft Dynamics NAV 2009 SP1
    https://mbs.microsoft.com/knowledgebase/KBDisplay.aspx?scid=kb;en-US;2291055

    6. before performing a Full Synchronization for the first time, switch the Synch. Direction for APP and TASK entity to Dynamics NAV to Outlook
    7. verify Table13 Salesperson/Purchaser do not list any E-mail addresses for the Outlook Synch users
    8. on the NAS server, log on as the user that is configured to start up the NAS Server service and verify the Regional Settings matches the language of the release of Dynamics NAV you are working with
    9. verify the correct fin.stx and cronius.flf file exists in the %ProgramFiles%\Microsoft Dynamics NAV\Application Server folder
    10. if working with NST, then start up the Role Tailored Client and change language to match the language of the release of Dynamics NAV you are working with
    11. for the first Outlook Synch user, only add CONT_SP entity and register CONT_SP entity in the Change Log via Setup button Register in Change Log Setup
    12. configure the Outlook Add-In and perform a Full Synchronization, populate the E-mail addresses for the synchronized contacts and perform a normal Synchronization to update Table13 Salesperson/Purchaser with correct E-mail addresses taken out of the Exchange Global Addresses
    13. continue and finish the setup of the Outlook Synchronization User Setup for all other users
    14. for each added line in the Outlook Synch User Setup, register the entities in the Change Log via Setup button and then select Register in Change Log Setup
    15. ensure the Outlook Add-In is configured with the following settings:

    • do not use Schedule automatic synchronization every x minutes
    • ensure Show synchronization progress is enabled
    • ensure Show synchronization summary is enabled

    16. ensure the Outlook Synch users are aware the synchronization should not be stopped in between a Full Synchronization or normal Synchronization to prevent duplication of contacts

    System requirements of Dynamics NAV 5.0 SP1, Dynamics NAV 2009 and Dynamics NAV 2009 SP1 still lists Office 2003 SP3 as a minimum requirement. CSS confirms this but also acknowledges that some filter settings in localized releases of Office 2003 SP3 won’t work while these do work in Office 2007 SP2 and later releases of Office. That is why I would suggest to at least bring your Office release up to Office 2007 plus August 2010 Rollup patch for Office 2007 SP2!

    Truly hopes this helps to clear the confusion.

    Regards,

    Marco Mels
    CSS EMEA

    This posting is provided "AS IS" with no warranties, and confers no rights

  • Microsoft Dynamics NAV Team Blog

    Outlook Synchronization and some core features of Terminal Server

    • 0 Comments

    At the moment we see an incoming volume of support cases regarding Outlook Synchronization and core features of Terminal Server. That would be a good subject for a new blog. Partners would like to setup roaming profiles, mandatory profiles and maybe even setup Network Load Balancing so that the end user does not know to what Terminal Server they are logging on to. Let me shed some light of the difficulties we have encountered with this while analyzing if this scenario can be setup without too much troubles.

    The Outlook Add-In settings are stored in the following folder:

    Windows Vista %userprofile%\AppData\Local\Microsoft Dynamics NAV\OutlookSynch
    Windows 7 %userprofile%\AppData\Local\Microsoft Dynamics NAV\OutlookSynch
    Windows 2003 %userprofile%\Local Settings\Application Data\Microsoft Dynamics NAV\OutlookSynch
    Windows 2008 %userprofile%\AppData\Local\Microsoft Dynamics NAV\OutlookSynch

    As the folder path already suggested, the settings files are stored in the local part of the user profile. By default of the operating system, this part of the user profile does not roam. To workaround this issue, you could use a Group Policy where you configure the ExcludeProfileDirs registry or you configure a logon script in which you explicitly set this registry key on the clients PC or within the RDP-session. The local settings part of the user profile will then roam along with the user profile to the network server where all the roaming user profiles are stored.

    More information about this key and the corresponding Group Policy can be found here:
    http://technet.microsoft.com/nl-nl/library/cc728399(WS.10).aspx

    Many Terminal Servers administrators also want to configure a specific Group Policy Object called: Delete cached copies of roaming profiles. More information can be found here: 
    http://technet.microsoft.com/en-us/library/cc958989.aspx

    This policy may be used in combination with a Terminal Server farm where the user is load balanced across the several available Terminal Servers.

    However, in Dynamics NAV 5.0 SP1 and later releases of Dynamics the files that are stored in the OutlookSynch folder are encrypted with an an encryption key that is stored in the user profile as well.

    Windows Vista %userprofile%\AppData\Roaming\Microsoft\Crypto\RSA\%SID%
    Windows 7 %userprofile%\AppData\Roaming\Microsoft\Crypto\RSA\%SID%
    Windows 2003 %userprofile%\Application Data\Microsoft\Crypto\RSA\%SID%
    Windows 2008 %userprofile%\AppData\Roaming\Microsoft\Crypto\RSA\%SID%

    The files can be viewed with notepad and should contain a text value XML_ENC_OL_KEY.

    If there are problems with this key, then the following error message may show up:

    See the end of this message for details on invoking
    just-in-time (JIT) debugging instead of this dialog box.

    ************** Exception Text **************
    System.Security.Cryptography.CryptographicException: Bad Data.

       at System.Security.Cryptography.CryptographicException.ThrowCryptogaphicException(Int32 hr)
       at System.Security.Cryptography.Utils._DecryptKey(SafeKeyHandle hPubKey, Byte[] key, Int32 dwFlags)
       at System.Security.Cryptography.RSACryptoServiceProvider.Decrypt(Byte[] rgb, Boolean fOAEP)
       at System.Security.Cryptography.RSAPKCS1KeyExchangeDeformatter.DecryptKeyExchange(Byte[] rgbIn)
       at System.Security.Cryptography.Xml.EncryptedXml.DecryptKey(Byte[] keyData, RSA rsa, Boolean useOAEP)
       at System.Security.Cryptography.Xml.EncryptedXml.DecryptEncryptedKey(EncryptedKey encryptedKey)
       at System.Security.Cryptography.Xml.EncryptedXml.GetDecryptionKey(EncryptedData encryptedData, String symmetricAlgorithmUri)
       at System.Security.Cryptography.Xml.EncryptedXml.DecryptDocument()
       at Microsoft.Dynamics.NAV.OLSync.NAVSyncAddIn.DataSetEncryption.Decrypt(String encryptedDataSet)
       at Microsoft.Dynamics.NAV.OLSync.NAVSyncAddIn.PersistentStorage.<LoadSynchronizationEntityFilterDS>b__2(DataSet newSet, FileStream reader)
       at Microsoft.Dynamics.NAV.OLSync.NAVSyncAddIn.PersistentStorage.LoadDS(DataSet newSet, String setName, ReadDelegate specialRead)
       at Microsoft.Dynamics.NAV.OLSync.NAVSyncAddIn.PersistentStorage.LoadSynchronizationEntityFilterDS()
       at Microsoft.Dynamics.NAV.OLSync.NAVSyncAddIn.SettingsForm.LoadFolderControls()
       at Microsoft.Dynamics.NAV.OLSync.NAVSyncAddIn.SettingsForm.LoadSettings()
       at Microsoft.Dynamics.NAV.OLSync.NAVSyncAddIn.SettingsForm.SettingsForm_Load(Object sender, EventArgs e)
       at System.Windows.Forms.Form.OnLoad(EventArgs e)
       at System.Windows.Forms.Form.OnCreateControl()
       at System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
       at System.Windows.Forms.Control.CreateControl()
       at System.Windows.Forms.Control.WmShowWindow(Message& m)
       at System.Windows.Forms.Control.WndProc(Message& m)
       at System.Windows.Forms.ScrollableControl.WndProc(Message& m)
       at System.Windows.Forms.ContainerControl.WndProc(Message& m)
       at System.Windows.Forms.Form.WmShowWindow(Message& m)
       at System.Windows.Forms.Form.WndProc(Message& m)
       at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
       at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
       at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

    From development:
    If you experience it works on one machine but not on the other please check this setting on both machines- it might be as simple as the key not being copied. Only one file should exist with the above text value and it should be exactly the same file. If you find a difference I suggest you log the user off from all the machines, delete the outlook integration settings + machine key and recreate it by setting up the synchronization again.  If you're working on a "large sync data" user you can try, copying the key from a working machine to the non working machine or by moving keys out of the folder so there's only one.

    Currently it's not possible to disable encryption.

    From CSS perspective:
    Since it is not possible to disable encryption at this moment, we now suggest to move the Outlook Synch users to a specific Organizational Unit where you exclude them from having roaming profiles / mandatory profiles, etc. The user profile should be stored locally. There is too much work to do to correct a failure in the encryption of the files that are stored in the \OutlookSynch folder.

    Regards,

    Marco Mels
    CSS EMEA

    This posting is provided "AS IS" with no warranties, and confers no rights

  • Microsoft Dynamics NAV Team Blog

    NAV 2009 Tips and Tricks: Customize your Action Pane

    • 0 Comments

    You can make many customizations to the RoleTailored client Action Pane: You can create your own grouping of key tasks. You can add the actions and tasks you use most to your pages. You can combine those tasks in groups. And, you can change the size of icons so that the most important ones pop out!

    The Action Pane is a part of all RoleTailored pages, including list places, journals, and cards.

    1. To start customizing the Action Pane, click Customize .

    2.Click Customize Action Pane.

    3. To add a new Action Pane group, click Add to the right of Groups list.

     

    4. In the Name field, enter the name of your new actions group and click OK.

    5. Use Move Up, Move Down and Rename buttons to change the position and name of the group.

    6. To add a new action to a group, select the group you want to add the action to.

    7. Click Add to the right of Actions list.

    8. Browse to the action and click OK.

     

    9. Repeat steps 7 and 8 for every action you want to add.

    10. To change the size of an action icon, click Change Size. If small, the icon will increase in size. If large, the icon will decrease in size. Use Move Up and Move Down to change the position of the action.

    11. Click OK to close the Customize window.

     

    The following illustration shows a customized Action Pane for a sales order. It has an new action group, Approvals, two added tasks, and an icon with a largesize.

    For more information about usability and the RoleTailored client, see the blog post Useful, Usable, and Desirable.

Page 30 of 50 (745 items) «2829303132»