Walkthrough: Customizing Microsoft Dynamics 365 for Sales Integration in Dynamics NAV
This walkthrough introduces customizing the integration of Dynamics NAV and Microsoft Dynamics 365 for Sales. The walkthrough will guide you through setting up integration of campaigns in Dynamics NAV and campaigns in Microsoft Dynamics 365 for Sales.
The customization in this walkthrough is done entirely in Dynamics NAV, and does not describe how to modify your Microsoft Dynamics 365 for Sales solution, such as adding or modify entities and forms.
Prerequisites
To complete this walkthrough, you will need:
Microsoft Dynamics 365 for Sales, including the following:
Campaign entity.
URL of the Microsoft Dynamics 365 for Sales Server.
User name and password of a user account that has full permissions to add and modify entities.
Dynamics NAV, including the following:
CRONUS International Ltd. demonstration database.
Microsoft Dynamics 365 for Sales integration enabled, including the default synchronization setup and a working connection from Dynamics NAV to Microsoft Dynamics 365 for Sales.
For more information, see How to: Set Up a Microsoft Dynamics 365 for Sales Connection.
Microsoft Dynamics NAV Development Environment.
Microsoft Dynamics NAV Development Shell.
About This Walkthrough
This walkthrough illustrates the following tasks:
Creating an integration table object in Dynamics NAV for mapping a Microsoft Dynamics 365 for Sales entity to a Dynamics NAV record type (table).
Using a Microsoft Dynamics 365 for Sales integration table as source of a Dynamics NAV page to display Microsoft Dynamics 365 for Sales entity records.
Creating a page for coupling Microsoft Dynamics 365 for Sales entity records to Dynamics NAV table records.
Creating an integration table and field mappings between a Dynamics NAV table and an integration table for Microsoft Dynamics 365 for Sales entity.
Using events to develop custom code to transform data when synchronizing between Dynamics NAV and Microsoft Dynamics 365 for Sales.
Creating an Integration Table in Dynamics NAV for the Dynamics 365 for Sales Entity
To integrate data from a Microsoft Dynamics 365 for Sales entity into Dynamics NAV, you must create a Dynamics NAV table object that is based on the Microsoft Dynamics 365 for Sales entity, and then import the new table into the Dynamics NAV database. For this walkthrough, you will create a Dynamics NAV table object for the Microsoft Dynamics 365 for SalesCampaign entity. This table describes the schema of the Microsoft Dynamics 365 for Sales entity in Dynamics NAV database. The table can contain all or some of the fields from the Microsoft Dynamics 365 for Sales entity. However, if you intend to write back to Microsoft Dynamics 365 for Sales, you should include all fields in the table.
Apart from creating a table object for the entity, you must also create a table object for any relationships that the entity has. For example, the Campaign entity has a relationship to the ModifiedOn and CreatedBy fields of the Systemuser entity. Therefore, you will also have to create a Dynamics NAV table for this entity as well. However, the default Microsoft Dynamics 365 for Sales integration in Dynamics NAV already includes the integration table 5340 CRM Systemuser for the Systemuser entity. Therefore, you will only have to create the table object for the Systemuser entity to establish the relationships; you do not have to import this table into the Dynamics NAV database.
To create the integration table for the Microsoft Dynamics 365 for Sales Campaign entity
Open the Microsoft Dynamics NAV Development Shell.
At the command prompt, run the New-NAVCrmTable cmdlet as shown in the following example. Include parameters that specify the Microsoft Dynamics 365 for Sales Server URL, the logical names of the Microsoft Dynamics 365 for SalesSystemuser and Campaign entities, the ID and name of the corresponding business data table objects in Dynamics NAV, and the path in which to store the generated text files for the table objects.
New-NAVCRMTable –CRMServer MyOrg.Crm4.Dynamics.Com –EntityLogicalName systemuser,campaign –ObjectId 5340,50001 –Name “CRM Systemuser”,“CRM Campaign” –OutputPath c:\CRMObjects
Replace MyOrg.Crm4.Dynamics.Com with the URL to your Microsoft Dynamics 365 for Sales Server. Replace c:\CRMObjects with the path on your computer or network where you want to save the .txt files for the created tables.
When prompted, enter credentials of the Microsoft Dynamics 365 for Sales user account.
The process for creating the tables starts. When the process is completed, the output path contains the files TAB5342.txt and TAB50001.txt. The TAB50001.txt contains the description of the integration table 50001 CRM Campaign. These tables are set to the type CRM, as specified by the TableType Property.
In the Microsoft Dynamics NAV Development Environment, import the TAB50001.txt into the Dynamics NAV database to add the integration table 50001 CRM Campaign, and then compile the new object.
You can compile the object by using the development environment or by using finsql.exe. For more information, see Importing and Exporting Objects.
Creating a Page for Displaying Dynamics 365 for Sales Data
For scenarios where you want to view Microsoft Dynamics 365 for Sales data for a specific entity, you can create a page object that uses the integration table for the Microsoft Dynamics 365 for Sales entity as its source. For example, you might want to have a page that displays a list of the current records in a Microsoft Dynamics 365 for Sales entity. In this walkthrough, you will create a list page that uses table 50001 CRM Campaigns as its source.
To create a list page to display Dynamics 365 for Sales campaigns
In development environment, add a new List page.
Set the source table to the integration table 50001 CRM Campaign.
Add the table fields that you want to display on the page.
Save and compile the page. For purposes of this walkthrough, give the page the name CRM Campaign List and ID 50001.
Run the page to view the Microsoft Dynamics 365 for Sales campaign list.
Enabling Coupling between Dynamics 365 for Sales Campaigns and Dynamics NAV Campaigns
To establish a relationship between a Dynamics NAV table record and a Dynamics 365 for Sales entity record, you create a coupling. A coupling consists of the primary ID (typically a GUID) from Dynamics 365 for Sales record and the Integration ID (GUID) from Dynamics NAV.
To enable users to create couplings between records in the two systems, you implement a coupling page in Dynamics NAV for the Microsoft Dynamics 365 for Sales entity. The coupling page provides the user interface that users can use to couple a Dynamics NAV record to a Microsoft Dynamics 365 for Sales record. The default Microsoft Dynamics 365 for Sales integration includes several coupling pages. To create a coupling page for Microsoft Dynamics 365 for Sales Campaigns, you will use page 5241 CRM Coupling Customer and adapt it the campaign integration. The coupling page that you set up will use the integration table 50001 CRM Campaign to retrieve campaign data from Microsoft Dynamics 365 for Sales. It will use page 50001 CRM Campaign List that you created previously to display a list of the campaigns from which to choose.
Before you create the coupling page, you must enable integration records for Dynamics NAV table that will be used for integration with Microsoft Dynamics 365 for Sales, in this case, table 5071 Campaign. After you create the coupling page, you will add actions on the campaign card and list pages that open the coupling page. You will also have to modify codeunit 5331 CRM Coupling Management.
To enable integration records on the Dynamics NAV Campaign table
In development environment, open codeunit 5150 Integration Management.
In the IsIntegrationRecord trigger, add the code
DATABASE::Campaign
to the database list as illustrated in the following code example:EXIT(TableID IN [DATABASE::Campaign, DATABASE::Resource, DATABASE::"Payment Terms", DATABASE::"Shipment Method", ...
In the CreateIntegrationPageList trigger, add the code
AddToIntegrationPageList(PAGE::"Campaign Card",DATABASE::Campaign,TempNameValueBuffer,NextId);
as illustrated in the following code example:AddToIntegrationPageList(PAGE::"Contact Card",DATABASE::Contact,TempNameValueBuffer,NextId); AddToIntegrationPageList(PAGE::"Countries/Regions",DATABASE::"Country/Region",TempNameValueBuffer,NextId); AddToIntegrationPageList(PAGE::"Campaign Сard",DATABASE::Campaign,TempNameValueBuffer,NextId);
Restart the Microsoft Dynamics NAV Server instance.
For more information, see How to: Start, Stop, Restart, or Remove a Microsoft Dynamics NAV Server Instance.
When changes occur in the table 5071 Campaign, an integration record will be created or updated with a timestamp. You can now use the table to create a page for coupling Dynamics NAV records with Microsoft Dynamics 365 for Sales records.
To create actions on the campaign page for managing the coupling
Open page 5086 Campaign Card in Page Designer, and then open Action Designer.
For more information about how to add actions, see How to: Add Actions to a Page.
Add an ActionGroup control that is caption Dynamics 365 for Sales.
Add another ActionGroup control under Dynamics 365 for Sales that has the caption Coupling.
In the Coupling action group, add the following actions:
Name Caption ManageCRMCoupling Manage Coupling DeleteCRMCoupling Delete Coupling Open the C/AL code for the actions, and follow these steps:
In the code for the action
ManageCRMCoupling
, add a local variable that has name CRMIntegrationManagement and references codeunit 5330 CRM Integration Management as its subtype, and then add the following line of code:CRMIntegrationManagement.DefineCoupling(RECORDID);
In the code for the action
DeleteCRMCoupling
, add a local variable that has the name CRMCouplingManagement and references codeunit 5331 CRM Coupling Management as its subtype, and then add the following line of code:CRMCouplingManagement.RemoveCoupling(RECORDID);
Save and compile the page.
Open codeunit 5334 CRM Setup Defaults.
In the GetCRMTableNo function, add the following code as a case after the CRM Opportunity case:
DATABASE::Campaign:
EXIT(DATABASE::"CRM Campaign");
The coupling page is now available from the Campaign page.
To enable users to open the Microsoft Dynamics 365 for Sales Campaign record from the Dynamics NAV Campaign, the next step is to add an additional action to the Campaign Card page.
To add actions to open the Dynamics 365 for Sales campaign record
Open page 5086 Campaign Card in Page Designer, and then open Action Designer.
In the Dynamics 365 for Sales action group, before the Coupling action group, add a new action that has the name GotoCRMCampaign and caption Campaign.
In the C/AL code for the action, add a variable that has the name CRMIntegrationManagement and references codeunit 5330 CRM Integration Management, and then add the following line of code:
CRMIntegrationManagement.ShowCRMEntityFromRecordID(RECORDID);
Save and compile the card page.
Open codeunit 5334 CRM Setup Defaults in Codeunit Designer.
Add the following code to the
GetTableIDCRMEntityNameMapping
function to add an entity table mapping for table 5081 Campaign and integration table 50001 CRM Campaign:AddEntityTableMapping('campaign',DATABASE::Campaign,TempNameValueBuffer); AddEntityTableMapping('campaign',DATABASE::"CRM Campaign",TempNameValueBuffer);
Save and compile the codeunit.
The coupling and links between Microsoft Dynamics 365 for Sales Campaign records and Dynamics NAV Campaign records are now completed. Users can easily open the coupled Microsoft Dynamics 365 for Sales record directly from Dynamics NAV.
Creating an Integration Table Mapping for Synchronizing Dynamics 365 for Sales Campaigns and Dynamics NAV Campaigns
For synchronization of data between Dynamics NAV and Microsoft Dynamics 365 for Sales to work, mappings must exist to associate the table ID and fields of the integration table (in this case table 50001 CRM Campaign) with the Dynamics NAV business data table (in this case table 5081 Campaign). To accomplish this, you must create to types of mappings: integration table mapping and integration field mapping.
An integration table mapping links the Dynamics NAV business data table to the integration table for the Microsoft Dynamics 365 for Sales entity.
A field mapping associates a field in a Microsoft Dynamics 365 for Sales entity record with a field in a Dynamics NAV record. It basically determines which field in Dynamics NAV corresponds to which field in Microsoft Dynamics 365 for Sales. You will typically have multiple field mappings for an entity.
You can create the integration table mapping directly in table 5335 Integration Table Mapping and integration field mappings directly in table 5336 Integration Field Mappings or you can add the mappings by modifying codeunit 5334 CRM Setup Defaults. For a repeatable solution, we recommend that you integrate your changes in codeunit 5334 CRM Setup Defaults.
To Create an Integration Table Mapping
To create an integration table mapping directly in the table 5335 Integration Table Mapping, follow these steps:
Open the integration table 50001 CRM Campaign in Table Designer, and then make a note the field numbers of the CampaignId and ModifiedOn fields. You will use these numbers later in this procedure.
From Object Designer in the development environment, run table 5335 Integration Table Mapping to open it in the Microsoft Dynamics NAV Windows client.
Add a new record and fill in the following fields:
Field Value Name CAMPAIGN Table ID 5071 Integration Table ID 50001 Synch. Codeunit ID 5340 (CRM Integration Table Synch.) Integration Table UID Fld. No. [The field number of the primary key field CampaignId in table CRM Campaign] Int. Tbl. Modified On Fld. No. [The field number of the ModifiedOn field in the integration table CRM Campaign] Direction Bidirectional (synchronizes from Dynamics NAV to Microsoft Dynamics 365 for Sales and from Microsoft Dynamics 365 for Sales to Dynamics NAV).
To add an integration table mapping in codeunit 5334 CRM Setup Defaults, follow these steps:
Open the codeunit in Codeunit Designer.
Add a local function called ResetCampaignMapping with the following parameters:
Name DataType SubType Length IntegrationTableMappingName Code 20 EnqueueJobQueEntry Boolean Add the following local variables:
Name DataType SubType IntegrationTableMapping Record Integration Table Mapping IntegrationFieldMapping Record Integration Field Mapping CRMCampaign Record CRM Campaign Campaign Record Campaign Add the following code to the function:
InsertIntegrationTableMapping( IntegrationTableMapping,IntegrationTableMappingName, DATABASE::Campaign,DATABASE::"CRM Campaign", CRMCampaign.FIELDNO(CampaignId),CRMCampaign.FIELDNO(ModifiedOn), '','',TRUE); RecreateJobQueueEntryFromIntTableMapping(IntegrationTableMapping,30,EnqueueJobQueEntry);
For each integration table mapping entry, there must be integration field mapping entries to map the individual fields of the records in the business table and integration table. The next step is to add integration field mappings for each field in the Dynamics NAV Campaign table that you want to map to the Microsoft Dynamics 365 for Sales Campaign entity.
To Create Integration Fields Mappings
To create an integration field mapping directly in table 5336 Integration Field Mapping, follow these steps:
From Object Designer, run table 5336 Integration Field Mapping to open it in the Microsoft Dynamics NAV Windows client.
Add a new record and fill in the following fields:
Field Value No. [An identification number for the field mapping entry, such as 1] Integration Table Map Name CAMPAIGN Field No. [Field number for the Description field of the table Campaign, for example 2] Integration Table Field No. [Field number for the Name field of the integration table CRM Campaign, for example 3] Direction Bidirectional Repeat these steps for each field that you want to map.
Tip
If a field in one of the tables does not have a corresponding field in the other table, you can use a constant value. For an example of this, see the CONTACTS Integration Table Mapping.
To add an integration field mapping in codeunit 5334 CRM Setup Defaults, follow these steps:
Open the codeunit in Codeunit Designer.
In the function ResetCampaignMapping, add the following code. As an example, this code maps the
Description
field in the Campaign table to theName
field in the CRM Campaign integration table.InsertIntegrationFieldMapping( IntegrationTableMappingName, Campaign.FIELDNO("Description"), CRMCampaign.FIELDNO(Name), IntegrationFieldMapping.Direction::Bidirectional, '',FALSE,FALSE);
Repeat this step for all fields that you want to map.
After you make the changes to the CRM Setup Defaults, you can update the mappings by running the Microsoft Dynamics 365 for Sales Connection Setup page and choosing Use Default Synchronization Setup.
The next step is to add an action on page 5086 Campaign Card that lets users to manually synchronize data between coupled campaign records in Dynamics NAV and Microsoft Dynamics 365 for Sales.
To add an action for manual synchronization
Open page 5086 Campaign Card in Page Designer, and then open the Action Designer for the page.
In the Dynamics 365 For Sales action group, before the Coupling action group, add a new action that has the name CRMSynchronizeNow and the caption Synchronize Now.
In the C/AL code for the action, add a global variable that has the name CRMIntegrationManagement and references codeunit 5330 CRM Integration Management, and then add the following line of code:
CRMIntegrationManagement.UpdateOneNow(RECORDID);
Save and compile the page.
Users can now manually synchronize Dynamics NAV Campaign records with Microsoft Dynamics 365 for Sales Campaign entity records from the Dynamics NAV client.
Tip
If you want to learn how to schedule the synchronization by using a job queue entry, examine the code on the RecreateJobQueueEntry function in codeunit 5330 CRM Integration Management and see how it is called by the integration code for other Microsoft Dynamics 365 for Sales entities in the codeunit.
Customizing Synchronization
When synchronizing data, some entities may require custom code to successfully synchronize data. Other entities might require the initialization of fields, the validation of relationships, or the transformation of data.
During the synchronization process, certain events are published and raised by codeunit 5335 Integration Table Synch.. You can add code that subscribes to these events, which enables you to add custom logic at different stages of the synchronization process. The following table describes the events that are published by codeunit 5345.
Event | Description |
---|---|
OnFindUnCoupledDestinationRecord | Occurs when the process tries to synchronize an uncoupled record (new record). Use this event to implement custom resolution algorithms for automatic mapping between records. For example, you can use this event to automatically map records by fields. You can see an example in codeunit 5341 CRM Int. Table. Subscriber, which includes the event subscriber function CRMTransactionCurrencyFindUncoupledDestinationRecord. The event is used to resolve Dynamics NAV currency codes with ISO currency codes in Microsoft Dynamics 365 for Sales. |
OnBeforeApplyRecordTemplate | Occurs before applying configuration templates to new records, and can be used to implement algorithms for determining what configuration template to use. |
OnAfterApplyRecordTemplate | Occurs after configuration templates are applied to new records, and can be used to change data after configuration templates have been applied. |
OnBeforeTransferRecordFields | Occurs before transferring data in modified fields (which are defined in the Integration Field Mapping table) from the source table to the destination table. It can be used to validate the source or destination before the data is moved. |
OnAfterTransferRecordFields | Occurs after transferring modified field data (which are defined in the Integration Field Mapping table) from the source table to the destination table. It can be used to transfer additional data, validate lookups, and so on. Setting the AdditionalFieldsWereModified parameter will cause a destination record modification even if no fields were modified. |
OnBeforeInsertRecord | Occurs before inserting a new destination record, and can be used to initialize fields, such as primary keys. |
OnAfterInsertRecord | Occurs after new destination record is inserted, and can be used to perform post-insert operations such as updating related data. |
OnBeforeModifyRecord | Occurs before modifying an existing destination record, and can be used to validate/change data before modification. |
OnAfterModifyRecord | Occurs after an existing destination record is modified, and can be used to perform post-modify operations such as updating related data. |
OnTransferFieldData | Occurs before an existing destination field value is going to be transferred to a source field, and can be used to perform specific transformations of data when types of the source and the destination field are different but can be mapped. |
For the synchronization of campaigns, you will use an event to create a custom rule that sets the Comment field in a Dynamics NAV campaign to TRUE if the Message field in a Microsoft Dynamics 365 for Sales campaign has data. You do this by subscribing to the OnAfterTransferRecordFields event that is published by codeunit 5335 Integration Table Synch.
For more general information about how to subscribe to events, see Subscribing to Events.
To subscribe to the Integration Table Synch. OnAfterTransferRecordFields event
In the development environment, open the codeunit that has the ID 5341 and the name CRM Int. Table. Subscriber.
Add a new function with the name UpdateCampaignComment.
Add the following locals to the function:
Function Variable Name DataType SubType CRMCampaign Record CRM Campaign Campaign Record Campaign Function Return Value Name Return Type AdditionalFieldsWereModified Boolean Function Parameter Name Data Type SourceRecordRef RecordRef DestinationRecordRef RecordRef Add the following code to implement the logic to determine whether the Message field has a value:
SourceRecordRef.SETTABLE(CRMCampaign); DestinationRecordRef.SETTABLE(Campaign); IF (CRMCampaign.Message <> '') AND (NOT Campaign.Comment) THEN BEGIN Campaign.Comment := TRUE; AdditionalFieldsWereModified := TRUE; END ELSE BEGIN IF (CRMCampaign.Message = '') AND Campaign.Comment THEN BEGIN Campaign.Comment := FALSE; AdditionalFieldsWereModified := TRUE; END; END; IF AdditionalFieldsWereModified THEN DestinationRecordRef.GETTABLE(Campaign);
Locate the OnAfterTransferRecordFields function, which is an EventSubscriber. Add the following code as a case after the Unit of Measure case:
'CRM Campaign-Campaign': AdditionalFieldsWereModified := UpdateCampaignComment(SourceRecordRef,DestinationRecordRef);
Save and compile the codeunit.
When you choose Synchronize Now on the Campaign page, and then choose to synchronize from Microsoft Dynamics 365 for Sales to Dynamics NAV, the Comment field should be updated to indicate whether the Message field in the Microsoft Dynamics 365 for Sales campaign has a value.
See Also
Customizing Dynamics 365 for Sales and Dynamics NAV Integration
Introduction to Dynamics 365 for Sales Integration Customization in Dynamics NAV