如何将企业内部数据库同步到Dynamics 365网上

Ana Neto 公司新闻, 连接器, 产品和解决方案, 技术方面 3评论

文章最后更新于2020年05月05日

一家成长中的公司一直在使用微软Dynamics CRM,与他们的ERP(Dynamics NAV)、SharePoint和一个会计系统集成。当然,他们看到了转移到D365在线和Azure云的好处。但微软并没有提供一个实用的解决方案来同步Dynamics CRM的内部数据库和Dynamics 365的在线数据库。如果微软不帮忙,他们怎么能与Dynamics 365同步数据? 这是他们连接Dynamics 365数据库的解决方案。

将Dynamics CRM On-prem移动到D365在线上

虽然仍有可能有一个 Dynamics 365内部部署,从微软Dynamics CRM内部迁移到Dynamics 365在线,对现在大多数公司来说似乎更有吸引力。

当他们考虑Dynamics 365在线与内部的时候,他们看到了 Dynamics 365在线的软件即服务(SaaS)模式带来了明显的优势。

  • 您不必购买硬件或基础设施,也不必维护它。
  • 该软件通常是以持续的现收现付模式进行授权,而不是一次性按座位大批量购买。
  • SaaS通常提供通用访问,允许你从任何有互联网连接的地方的任何设备(台式机、笔记本电脑、手机)连接到软件。
  • 初始价格通常比购买内部设备和软件低得多。
  • 高可用性SLA(即微软Dynamics 365 99.9%正常运行时间SLA)。

所以,将企业内部的数据库同步到Dynamics 365网上应该很容易吧?

理想情况下,如果要从Microsoft Dynamics CRM On-Premise迁移到D365在线,你就可以直接将数据从本地的Microsoft Dynamics CRM SQL数据库后台转移到远程的Microsoft D365 SQL数据库。而如果碰巧你已经有了D365,想把Dynamics 365内部迁移到网上,应该就更简单了。

然而,在实际操作中,却不是那么简单。

从微软搬到Dynamics 365网上能得到什么?

目前,为了帮助客户部署微软云解决方案,微软通过FastTrack页面提供支持。拥有符合条件的Microsoft 365、Dynamics 365或Azure订阅的客户,可以在其订阅期内免费使用FastTrack(文章末尾的链接)。 你需要检查你正在尝试迁移的东西的当前资格标准。微软有时以座位数为基础,有时以收入为基础。

2019年4月,微软还发布了 "Microsoft Dynamics CRM内部部署到Dynamics 365在线迁移",这是一份长达45页的PDF文件,描述了你需要做的事情(下载链接在文章末尾)。在这份文件中,他们坦言,"直到最近,还没有任何机制可以让客户轻松地将其企业内部部署转移到Dynamics 365(在线)"。

与在线数据库同步的问题。

您认为理想的解决方案是找到一个Dynamics 365数据库与您的Dynamics CRM on-prem同步。

问题是,一般来说,将SaaS服务的后端数据库暴露给外界被认为是不好的做法,会带来相当大的安全风险。因此,微软不提供对D365在线的后端数据库的访问。相反,为了与D365在线进行数据交互,微软提供了官方的API服务。

API服务带来的好处是不破坏内部业务规则和约束。通过这种方式,API服务确保客户端应用程序不会妨碍性能。此外,它们还有助于维护后端数据库的数据完整性和一致性。
开发通过API操纵数据的过程需要编程技巧和时间。特别是,需要时间去研究文件,以设置正确的参数,并对这些接口提供的方法或功能进行适当的调用。

如果你可以简单地利用你的SQL技能,并与D365 API进行交互,就像你与普通的DBMS(数据库管理系统)一样,会怎么样呢?

如果你能让Dynamics 365与SQL Server Management Studio同步数据库就好了?

从本地DBMS或任何客户端应用程序连接到D365在线。

欢迎来到 ■▄D365 Database Sync Solution!这是一个特定的解决方案,用于将企业内部的数据库同步到D365云中。它是基于Connecting Software的集成平台Connect Bridge。

Connect Bridge 将ANSI标准SQL语法翻译成适当的API调用。通过确保对数据的访问是通过API调用完成的(尽管你不必担心这个问题),使你的目标系统的完整性得到保障。此外,你还可以通过标准的SELECT、INSERT、UPDATE和DELETE语句与任何目标系统进行轻松的交流。

因此,从你的本地DBMS或任何客户端应用程序,你可以在线连接到D365并将数据放入其中。

对于从Dynamics CRM on-prem迁移到D365在线的公司来说,当他们有整个流程针对on-prem SQL数据库编写的情况下,它是特别方便的。幸运的是,现在可以通过将Connect Bridge添加到他们的产品组合中来重用它们。

现在是举一个实际例子的时候了。

从任何数据库到Dynamics 365在线

在这个例子中,我们将使用微软著名的Adventure Works DW(Datawarehouse)数据库(在此下载).我们将展示你如何轻松地将你的现有流程与微软Dynamics 365在线(这里的信息)使用Connect Bridge平台。

如果您使用的是SSMS (SQL服务器管理工作室)来管理你的SQL Server数据库,你可以在对象资源管理器窗口中看到数据库的模式。

对象资源管理器窗口中的数据库模式

Connect Bridge平台 允许你通过连接器毫不费力地创建链接服务器连接到任何目标系统。有400多个连接器可供选择。我们将专注于Dynamics 365连接器。下面是CRM/ERP/会计领域的连接器的选择。

连接器 - CRM/ERP/会计领域

下面你可以找到已经在SSMS中创建的链接服务器连接。

已在SSMS中创建的链接服务器连接

需要注意的是,我们特意将链接的服务器连接命名为 """。D365_CRM.而且,通过展开TreeView中的目录节点,我们可以看到Dynamics 365提供的整个模式,就像访问传统数据库一样。

有了这一点,你就可以创建任何类型的集成或利用可用性定制任何现有的流程。

On-prem对D365云同步解决方案的适用性

现在,你可能想知道:为什么我首先要这样做?

以下是两种常见的情况,你可能会有所体会。

情景1:

我在一家使用Microsoft Dynamics CRM On-Premises的公司工作,我们正在向Microsoft Dynamics 365 Online迁移。我们有几个集成直接从我们的SQL Server数据库到Microsoft Dynamics CRM On-Premises的SQL Server数据库。

但是,我不能直接与微软Dynamics 365在线数据库连接。

  • 我是否需要使用微软的Dynamics CRM SDK从头开始创建所有的流程?
  • 我是否必须使用Web API从头开始创建所有的流程?
  • 我一定要学C#才行吗?

情景2:

我在一家公司工作,该公司有一个专有的ERP系统,以SQL Server数据库作为后台。我们决定采用微软Dynamics 365 CRM作为我们的客户关系管理系统。

我们希望能够以一种自动的方式将ERP系统中的现有数据填充到CRM中,并保持双方的一致性。

手动操作似乎几乎是不可能的,因为我们讨论的是每个实体(账户、联系人、产品等)的数万条记录。此外,使用SQL语言(结构化查询语言)工作也很方便。

但是,我们对其他编程语言和框架(C#、Web API、Rest Services等)没有深厚的经验。

  • 我們是否要聘請顧問公司代勞呢?
  • 当我的业务发生变化/增长时,我是否会依赖这家咨询公司来维护和增加新功能?

值得庆幸的是,以上的答案都是否定的。这时,上面例子的用法可能就会响起了。

通过所介绍的方法,您可以大规模地利用您现有的技能和流程。

你还不相信吗?你为什么不看看下面的分步骤例子呢?

从冒险工程数据库表DimCustomer中填充Dynamics 365在线账户。

准备工作
创建以下触发器:

--*****************************************************************************

CREATE TRIGGER [dbo].[OnDimCustomerInsert] ON [dbo].[DimCustomer] AFTER INSERT

AS

BEGIN

       SET                               NOCOUNT ON

 

       DECLARE @SQL                      VARCHAR(255)

       DECLARE @AccountId                VARCHAR(255)

       DECLARE @FirstName                VARCHAR(255)

       DECLARE @LastName                 VARCHAR(255)

       DECLARE @MiddleName               VARCHAR(255)

      

       SELECT @FirstName       = [FirstName],

              @LastName        = [LastName],

              @MiddleName      = [MiddleName]

       FROM INSERTED;

       SELECT @SQL = FORMATMESSAGE('INSERT INTO ACCOUNT (Name) VALUES(''%s''); SELECT SCOPE_IDENTITY();',

       @FirstName + '-' + '-' + @LastName)

      

       CREATE TABLE #AccountId(ID VARCHAR(255))

       INSERT #AccountId

       EXEC(@SQL) AT D365_CRM

 

       SELECT @AccountId = ID from #AccountId

       UPDATE DimCustomer SET CustomerAlternateKey = @AccountId where FirstName = @FirstName and MiddleName = @MiddleName and LastName = @LastName

 

       PRINT @FirstName + ' ' + @MiddleName + ' ' + @LastName;

END

--*****************************************************************************

CREATE TRIGGER [dbo].[OnDimCustomerUpdate] ON [dbo].[DimCustomer] AFTER UPDATE

AS

BEGIN

       SET                               NOCOUNT ON

 

       DECLARE @SQL                      VARCHAR(255)

       DECLARE @AccountId                VARCHAR(255)

       DECLARE @FirstName                VARCHAR(255)

       DECLARE @LastName                 VARCHAR(255)

       DECLARE @MiddleName               VARCHAR(255)

      

       SELECT @AccountId       = [CustomerAlternateKey],

              @FirstName       = [FirstName],

              @LastName        = [LastName],

              @MiddleName      = [MiddleName]

       FROM INSERTED;

 

       SELECT @SQL = FORMATMESSAGE('UPDATE ACCOUNT SET Name=''%s'' WHERE ACCOUNTID=''%s''', @FirstName + '-' + '-' + @LastName, @AccountId)

       EXEC(@SQL) AT D365_CRM;

       PRINT @FirstName + ' ' + @MiddleName + ' ' + @LastName;

 

END


你的SSMS对象资源管理器窗口现在应该包含以下两个新的触发器。

在SSMS对象资源管理器窗口中新增了两个触发器。

打开您的Dynamics 365在线实例,导航到销售->账户模块。

Dynamics 365账户

测试。

在SSMS中打开一个新的查询窗口并粘贴以下内容。


INSERT INTO [AdventureWorksDW].[dbo].[DimCustomer] (FirstName, MiddleName, LastName, CustomerAlternateKey) values ('ABC Technology', '' ,'GMB', 'CT0001');

INSERT INTO [AdventureWorksDW].[dbo].[DimCustomer] (FirstName, MiddleName, LastName, CustomerAlternateKey) values ('Billy Charity', '' ,'SA', 'CT0002');

INSERT INTO [AdventureWorksDW].[dbo].[DimCustomer] (FirstName, MiddleName, LastName, CustomerAlternateKey) values ('Tom Cat', '' ,'ORG', 'CT0003');

 

SELECT * FROM DimCustomer WHERE FirstName = 'ABC Technology';

SELECT * FROM DimCustomer WHERE FirstName = 'Billy Charity';

SELECT * FROM DimCustomer WHERE FirstName = 'Tom Cat';


在SSMS中按F5或执行按钮运行脚本。

现在你应该有3条额外的记录插入到DimCustomer表中。

在DimCustomer表中插入三个额外的记录。

导航回到你的Dynamics 365销售->账户,刷新屏幕。找到了!

在Dynamics 365中设立了三个新账户

Dynamics 365中新增了3个账号,很酷吧?

但是等一下,在表DimCustomer中,字段CustomerAlternateKey有一个奇怪的数字。这不是我们一开始插入的值。

而我们却在Dynamics 365中生成了账户的唯一ID。这怎么可能呢?

如果你仔细观察触发器OnDimCustomerInsert,你会注意到SELECT SCOPE_IDENTITY();是负责返回将用于更新表DimCustomer的账户id。

这对于在Dynamics 365中对现有账户进行更新至关重要,当表DimCustomer中的记录发生变化时。

为了证明我们的观点,更新在SSMS中执行以下代码创建的记录。

在对3个账户执行更新后,这里是Dynamics 365的结果。

UPDATE [AdventureWorksDW].[dbo].[DimCustomer] SET LastName = 'LTD' WHERE CustomerAlternateKey = 'account(9a1bc5cb-6ad7-e811-a96f-000d3a2cb90b)';

NOTE: REPLACE THE STRING account(9a1bc5cb-6ad7-e811-a96f-000d3a2cb90b) WITH THE VALUES GENERATED IN YOUR ENVIRONMENT.

Dynamics 365 执行更新后的账户

真好!

结论

上面的例子非常简单,但是,我们不难想象出这样的做法的好处。

  • 流程的维护是集中的、孤立的。
  • 通过修改触发器来增强流程是轻而易举的事
  • 无需学习任何新的技术/编程语言。

就这样吧希望你能喜欢。

如果你有意见、建议,请写在下面的空格里,我们会尽快回复。

希望您在使用Connect Bridge平台的过程中,能像我写这篇文章一样开心。

客户为什么使用Connect Bridge

看一段短片就知道了。

Connect Bridge演示视频

文章最后更新于2020年05月05日

Ana Neto - 技术顾问,作者

Ana Neto
Connecting Software的技术顾问"""。

作者:

我从1997年开始做软件工程师,最近比较喜欢写作和公开演讲。  您对本篇文章或对Connect Bridge有什么疑问或意见? 我很希望得到您的反馈!

 ana@connecting-software.com


撰稿人: 杰斐逊高桥健治,MBA

评论 3

  1. 看起来很有趣--业务规则的执行情况如何? 例如,我们需要从我们的POS机(SQL表中的数据)获取交易到业务中心--那么销售涉及到D365中不存在的客户和/或产品的用例呢?

  2. 帖子
    作者

    嗨,保罗。

    如果你能从你的POS机的SQL表中获得数据,并且它遵循一个你能理解的结构,那么你可以使用 Connect Bridge 来将所有的东西都放到Business Central中。如果销售涉及的客户和或产品在D365中并不存在,你需要决定怎么做,例如,你可以使用一个通用的客户或产品,或者你可以在飞行中创建新的客户或产品。

    我们将通过您指定的电子邮件与您联系,与您探讨这个方案。

    Ana Neto

发表评论

电子邮件地址不会被公开。 必填项已用*标注