精通微软 Dynamic365(五)_dynamic 365 power apps导入解决方案提示缺少sdk 消息处理步骤
原文:
annas-archive.org/md5/4b7740950c4db25f9fa2b4a0e4722a06
译者:飞龙
协议:CC BY-NC-SA 4.0
第十四章:监视、扩展和 CI/CD 与 Azure 函数
在上一章中,我们学习了如何使用 Visual Studio 和 Visual Studio Code 创建 Azure 函数,如何在 Azure 上发布函数,以及如何从 Dynamics 365 Business Central 扩展中调用 Azure 函数。
我们还学习了如何在 Azure 上使用 Azure 函数来实现无服务器流程,并通过实际示例了解了在 SaaS 环境中处理文件的.NET 代码的执行。理解这些主题非常重要,以便您能够在云环境中执行自定义代码,并以无服务器方式与外部服务交互。
在本章中,我们将探讨与 Azure 函数相关的其他重要方面,包括以下内容:
-
监视发布在 Azure 云中的函数
-
扩展 Azure 函数
-
将 DevOps 和 CI/CD 应用于 Azure 函数
到本章结束时,您将对 Azure 函数服务有一个完整深入的概述,并且您将对在 Microsoft Dynamics 365 Business Central 项目中使用此服务执行复杂代码和无服务器任务充满信心。
技术要求
要遵循本章内容,您需要具备以下条件:
-
有效的 Azure 订阅(您可以在
azure.microsoft.com/free/
上免费激活付费或试用订阅) -
在 Azure DevOps 中具有有效的帐户(
azure.microsoft.com/en-in/services/devops/
)
监视 Azure 函数
在 Azure 上管理无服务器服务时,监视 Azure 函数是一项重要任务。如果您希望拥有始终正常工作的可靠服务,您需要制定一个策略来检查函数的传入调用、错误、特定函数的可伸缩性需求等。
从 Azure 门户中选择您的 Azure 函数。通过单击监视,您将能够查看已记录的请求(成功和错误)。以下屏幕截图显示了这一点:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/05cf0678-fe0a-471d-81ca-605064a20eb0.png
如果您选择单个请求,您可以查看其调用详细信息:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/cfe06eb5-689d-4c93-be0b-e6d64b083079.png
对于更高级的日志记录,您可以单击在应用洞察中运行(必须从门户激活):
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/e90a8e1c-5570-4f66-8d7a-dc1f7d341447.png
在这里,您还可以在函数的遥测中执行自定义查询。例如,这是一个关于遥测日志的查询,显示过去 20 分钟内每个工作角色(函数)的请求次数:
requests| where timestamp > ago(20m)| summarize count() by cloud_RoleInstance, bin(timestamp, 1m)| render timechart
以下是此内容的输出:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/426a22b2-7716-4468-94bf-3d8182ea2ce0.png
下面是一个在应用洞察中执行的有用查询,用于检索函数中的错误:
traces | where customDimensions.LogLevel == \"Error\"
当配置了应用程序洞察(Application Insights)时,你将拥有一个漂亮的面板,能够立即查看函数中的所有事件(失败的请求、服务器响应时间、服务器请求次数、可用性等):
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/65e8297b-ea3f-47a4-942a-455b2aaca8bb.png
应用程序洞察是一个重要的检查部分,如果你希望发现故障并确定函数是否表现良好或需要扩展,可以查看此功能。以下截图展示了这一点:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/5f4040ef-a8e4-4faf-94b2-d52e0905ada0.png
有关如何高效使用应用程序洞察的更多信息,请访问docs.microsoft.com/en-us/azure/azure-functions/functions-monitoring
。
正如你所看到的,应用程序洞察是一个极其强大的工具,能帮助你监控实时服务并管理函数日志。我建议你始终启用它,以便将 Azure 上的无服务器平台保持在可控状态。接下来,我们来了解 Azure Functions 的工作原理。
扩展 Azure Functions
在生产环境中使用 Azure Functions 时,扩展性是一个重要的检查方面,因为它允许你优化服务,避免瓶颈或资源短缺。
Azure Functions 在两个不同的计划上执行:
-
消费计划:你为所消耗的资源付费。应用根据功率需求自动扩展或缩减。计费依据是执行次数、执行时间和应用使用的内存。
-
高级计划:这与消费计划非常相似(根据请求的功率自动处理扩展)。你的计费取决于每秒核心数和每秒使用的内存 GB 总量,涵盖了所有实例。高级计划增加了以下功能:
-
始终预热实例以避免冷启动
-
VNet 连接
-
无限执行时长
-
高级实例大小(一个核心、两个核心和四个核心实例)
-
可预测的定价选项
-
高密度应用分配,适用于包含多个函数应用的计划
-
你可以通过 Azure 门户中的概述选项卡查看函数使用的托管计划:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/539465e5-4323-412e-8b44-6f82e1b1b25c.png
你的 Azure 函数还可以在与其他云应用程序(如 App Service 应用)相同的专用环境中运行。这被称为应用服务计划,你为同一应用服务计划中的所有函数支付相同的配额。当你使用应用服务计划时,可以手动扩展(例如通过添加更多虚拟机实例)或自动扩展(通过启用自动扩展)。
有关此计划的更多信息,请参见docs.microsoft.com/en-us/azure/app-service/overview-hosting-plans
。
现在,您清楚地了解了在将函数部署到 Azure 时可用的扩展和相关计费选项。根据您的业务需求,您应选择您希望使用的计划。
Azure Functions 和 DevOps
在本节中,我们将讨论 DevOps 技术,特别是如何使用 Azure DevOps 为您的 Azure Functions 创建 CI/CD 过程。
首先,为了实现源代码管理,您的函数代码必须托管在 Git 仓库中。这里,我们使用 Azure DevOps 作为我们的 CI/CD 过程的仓库:
- 首先,在 Azure DevOps 中创建一个新项目。此项目将包含您的源代码的 Git 仓库。点击左侧的Repos菜单,您将看到此仓库的 URL。使用以下命令将其克隆到您的本地文件夹:
Git clone https://demiliani@dev.azure.com/demiliani/AzureFunctionDevOps/_git/AzureFunctionDevOps
- 在这个本地仓库中,我已将我们之前使用 Visual Studio 开发并提交的
EmailValidator
Azure 函数的所有项目文件放置其中。然后,我们将所有文件推送到我们的在线 Azure DevOps 仓库,如下图所示:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/510e9c6b-92f9-46be-bf4c-65550dc199af.png
我们的代码现在已在 Azure DevOps 上。
- 现在,我们想为我们的 Azure Functions 项目创建一个构建管道。从 Azure DevOps 项目页面,选择 Pipelines | Builds 并点击新建管道(New Pipeline)。在“您的代码在哪里?”页面,点击使用经典编辑器(Use the classic editor)以在没有 YAML 的情况下创建管道:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/4c015536-f3ca-48db-b124-c5ba489eb1a4.png
- 现在,您需要选择代码将托管在哪里。选择 Azure Repos Git,并从列表中选择一个仓库(您应该只为所选项目拥有一个仓库)以及一个分支:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/78fa0141-cdf0-43c1-92c5-99c9452dbfd6.png
- 点击继续(Continue)。在选择模板页面上,您需要为构建管道选择一个模板。向下滚动列表,选择适用于 .NET 的 Azure Functions,然后点击应用(Apply):
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/8262bb1f-f426-4f7e-9ab9-edc8e9d2ca0b.png
您的构建管道将根据您选择的模板创建。
- 点击保存并排队(Save & queue):
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/5f44f182-2778-4be5-82d9-512eaee995d0.png
- 现在,会出现一个新的保存构建管道和排队窗口。在这里,再次点击保存并排队(Save & queue):
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/86bd862d-5525-4d64-a006-024611c2b8ef.png
- 现在,您的构建管道已排队。在屏幕顶部,您应该看到类似以下的消息:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/8f045fcb-9b3b-449a-baa0-f25b537d1fa8.png
- 如果点击构建号,您将看到已执行的构建步骤:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/a50767a0-6580-4480-961e-63e6de95b50f.png
构建过程正在进行,而且好的一点是,您还会收到一封电子邮件,通知您构建结果。
我们手动触发了构建,但一个优秀的开发者通常是个懒开发者,因此我们希望在每次提交到主分支时自动触发构建。让我们来看一下如何做到这一点:
- 要定义构建触发器,选择构建管道并点击编辑(Edit):
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/26bdbf70-93fd-4f86-a15c-6eb79f8c6be1.png
- 在这里,选择触发器并点击启用持续集成:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/ce5f709d-86c3-44e5-a945-7c173bdef3fa.png
- 点击“保存并排队”并选择“保存”选项。
现在,当您向代码库推送新的代码修改时,构建会自动触发。
如果我们希望在每次提交时自动部署 Azure 上的函数项目,我们必须创建一个发布流水线。让我们来学习如何做到这一点:
- 要在 Azure DevOps 上创建发布流水线,请选择“流水线”|“发布”,然后点击“新建流水线”。接着,选择“Azure 应用服务部署”并点击“应用”:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/9fd56cd9-0493-4def-a520-fbd0a9c18a52.png
- 在下一屏幕中,点击左侧“工件”部分的“添加”:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/efdfe0a3-255c-4239-9c5c-d5e120124e6d.png
- 在“添加工件”页面上,选择“构建”作为源类型。然后,选择您的构建流水线并点击“添加”:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/bdc7ef01-e083-4fee-8237-2e8c873eb9fd.png
- 现在,点击“阶段 1”上的红色感叹号查看构建任务:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/850c9514-bfcf-4da5-a768-43c4ba892840.png
在这里,您需要选择一个 Azure 订阅,并将应用类型设置为 Windows 上的“函数应用”。
- 要使用 Azure 订阅,您需要在做出选择后点击“授权”按钮(如果弹出窗口拦截器已开启,需要禁用它):
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/f2b82741-dbbe-4f74-83b8-3f5ba500e3f7.png
- 当您的订阅已被授权后,选择应用服务名称:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/2dcb5795-76f4-4a74-8029-91846229016c.png
- 然后,点击“保存”。这样,您的发布流水线将被保存并准备好:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/f05f2be8-b987-436b-b273-fb56d7244b8a.png
- 要在 Azure DevOps 上手动创建一个新发布,请选择“流水线”|“发布”,然后点击“创建发布”。在“创建新发布”页面上,不要更改任何内容,只需点击“创建”:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/bf9f40d2-cdf9-4abb-8a15-210764fd97ec.png
- 新的发布将会被排队:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/d7779664-3140-49db-8af5-b1a02d12555d.png
- 如果您点击发布名称,您将被重定向到发布进度页面:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/323cb420-ff21-4c63-8e11-dd605d5616a0.png
- 如果您的发布流水线成功,您的函数将被自动部署到 Azure 应用服务:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/e0e1c441-86e5-463b-884c-ef8874152766.png
- 最后,为了完全启用持续部署流程,我们需要再次编辑发布流水线,并点击持续部署图标:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/6918920a-68b2-414f-8975-747f8f3d0068.png
- 在这里,我们需要启用“持续部署触发器”选项:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/decfb771-3ffd-4fbe-b0de-46b96bdb210c.png
就这样!我们已经为我们的 Azure 函数设置了 CI/CD 流程。
使用此过程,并通过 Azure DevOps,您可以自动构建并发布(部署)一个 Azure 函数到您的云环境中,整个过程都在一个托管平台上完成。
概要
在本章中,我们学习了如何监视 Azure 函数,如何监控传入的调用和日志,以及如何使用 Application Insights 进行高级分析。
总的来说,我们学习了如何为我们将在云端部署的功能选择最佳的服务计划,接着我们又学习了如何实施 CI/CD 技术,以创建一个智能的云端功能部署流程。
现在,您已经清楚地了解了可用于在 Azure 上部署和监控服务的选项,并且学会了如何为您的业务案例选择最佳的部署模型。您还学会了如何在开发流水线中激活 CI/CD 流程,从而在 Azure 上构建和部署功能。
在下一章中,我们将讨论如何将 Dynamics 365 Business Central 与Microsoft Power Platform集成,特别是如何使用Flow和PowerApps与 Dynamics 365 Business Central 配合,实施“零编码”业务流程。
第十五章:Business Central 与 Power Platform 的集成
在上一章中,我们看到如何使用 Azure 服务结合 Dynamics 365 Business Central 来实现现代无服务器业务流程,并且我们对如何从 AL 中使用 Azure Functions 进行了广泛的概述。
在本章中,我们将介绍 Dynamics 365 系列中的一个重要部分:Microsoft Power Platform。我们将涵盖以下主题:
-
Microsoft Power Platform 介绍
-
Microsoft Flow 和 PowerApps 概述
-
使用 Flow 和 PowerApps 与 Dynamics 365 Business Central 生态系统集成来实施现实场景的实现
本章结束时,您将对 Power Platform 有一个完整的概览,并能够以低代码方式使用 Flow 和 PowerApps 来实现与 Dynamics 365 Business Central 的自定义解决方案和工作流。
技术要求
为了跟随本章中的示例,您需要以下内容:
-
具有 Flow 和 PowerApps 访问权限的 Office 365 订阅
-
一个活跃的 Dynamics 365 Business Central 在线租户
Power Platform 介绍
Power Platform 将 Flow、PowerApps 和 PowerBI 等应用程序的功能结合成一个统一的商业应用平台。Satya Nadella 在他的演讲中多次直接解释了这个平台在 Microsoft 生态系统中的重要性。在现代商业应用程序的实现中,我们需要认真考虑 Power Platform。
该平台采用 分析、行动和自动化 范式。Power Platform 的每个组件都建立在 应用程序的通用数据服务(一个允许用户快速集成程序、构建新的自定义应用程序并创建自动化工作流的平台)之上,并且该平台将数据汇聚到一个叫做 通用数据模型 的结构中。
该平台的架构如以下图所示:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/cca5a98b-78ff-4c2c-82c8-90afbfe5268c.png
Flow 和 PowerApps 是基于低代码开发的平台,由 Microsoft 制造,为我们所说的 强大用户 提供强大的工具——这些用户通常没有技术背景,但完全参与并深入了解业务,他们熟知所有的业务规则、流程例外和其他业务方面,能够从最终用户的角度了解系统可以做什么。
所以,我们已经解释了 Power Platform 是什么以及它的构建块是什么。由于这些工具已经可以使用,为什么不将其与 Dynamics 365 Business Central 结合起来,为那些强大用户提供更多的能力,来创建应用程序、集成和业务逻辑工作流,并为我们的企业构建一个完全集成和管理的平台呢?
在接下来的部分中,我们将回顾 Flow 和 PowerApps 的概述,并展示一些涉及 Dynamics 365 Business Central 与 Power Platform 联动的真实世界解决方案。
了解 Flow
Flow 是一个平台,旨在通过连接器和触发器提供创建自动化工作流的方式,并将 Microsoft 和非 Microsoft 技术集成在一起。这些工具对最终用户开放,使他们可以以可视化的方式构建业务流程。更多信息请参见 us.flow.microsoft.com/en-us/
。
Flow 拥有超过 180 个不同的连接器,您可以通过操作和触发器使用它们来构建自动化工作流。这些连接器之一是 Dynamics 365 Business Central 连接器,它是从 Flow 与 Dynamics 365 Business Central 交互的标准连接器。该连接器可通过 us.flow.microsoft.com/en-us/connectors/?filter=business+central&category=all
获取。
使用 Flow 的最大优势之一是,它为我们提供了一种可视化的方式来构建自动化工作流,使我们能够将 Dynamics 环境中的数据与外部平台交互、创建审批流程、发送通知操作等应用程序,且操作简便。
如下图所示,Microsoft 还为我们提供了许多现有模板,帮助我们快速创建第一个 Flow 工作流:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/10546d37-2907-4e1e-aba9-e63548c7c0f9.png
更多信息请参见 us.flow.microsoft.com/en-us/templates/
。
通过按 business central
筛选模板,您可以看到所有可用的模板(您也可以提交您为技术社区创建的模板),如下所示:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/b937fad1-3309-4ee5-a6fb-c820b20be51b.png
通过这些模板,您可以玩转与其他平台集成的工作流,并且可以轻松地开始使用一个可以根据您的需求进行更改的模板。
这些模板始终由社区和 Flow 团队持续改进和开发。
开始使用模板创建工作流,了解其工作原理,然后通过添加其他操作和集成来根据您的需求进行更改。
如您所见,使用 Flow,您可以立即在现有的 Dynamics 365 Business Central 解决方案中使用大量现成的任务(工作流),而无需编写一行代码。只需使用连接器并通过几次点击即可启动工作流。
在下一部分,我们将概览 PowerApps,看看它在实现您的解决方案时能提供什么。
了解 PowerApps
PowerApps 是一个平台,旨在创建可在手机、平板电脑和网页浏览器上使用的商业应用程序,所有这些都使用非常简便的用户界面。它还通过连接器将这些应用程序与 Microsoft 和非 Microsoft 平台集成。
这些应用的分发、权限、许可和身份验证基于 Microsoft 365 许可证,因此它已经与您的 Microsoft 365 环境完全集成。
关于 PowerApps 及其许可的更多信息,请访问powerapps.microsoft.com/
。
在PowerApps Studio (web.powe
rapps.com)中,你可以轻松创建应用:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/8016d13f-432f-4906-bcd5-73c2483fd9bf.png
由于 PowerApps 也使用与 Flow 相同的连接器概念,我们还可以创建与 Dynamics 365 Business Central 环境中的数据连接并交互的应用,从而为我们提供了一种方式,创建可以在浏览器和移动设备上运行的业务应用,并且能够在 Dynamics 365 Business Central 中执行业务逻辑。
在接下来的部分中,我们将学习如何在实际场景中使用 Flow 和 PowerApps 与 Dynamics 365 Business Central 结合,并实现一个现代化的业务解决方案。
与 Power Platform 的集成场景
现在我们已经概览了Flow和PowerApps,并且知道它们可以让我们与 Dynamics 365 Business Central 结合,构建强大的集成解决方案,从而提供更多的控制、集成和扩展性,接下来让我们讨论并学习如何将这些技术结合起来,充分发挥环境的潜力。
以下场景仅为一些帮助你头脑风暴的想法,并展示了你可以使用的一些功能。然而,这些平台非常灵活,可以适应不同的使用场景,甚至需要一本完整的书籍才能涵盖所有内容,因此请记得利用这些场景为你的日常需求提取一些想法。
场景 1 – 创建人力资源招聘/入职流程
在这个场景中,我们将创建一个招聘/入职流程,便于人力资源部门将表单发送给新员工,让他们填写。此数据经过审批流程后,将自动注册到 Dynamics 365 Business Central。
使用的技术: Microsoft Forms、Flow、Teams 和 Dynamics 365 Business Central。
首先,让我们在 Microsoft Forms 上创建表单。目标是为人力资源经理提供一种方式,生成一个外部表单,通过链接发送给新员工,员工可以在上面填写他们的数据,从而避免了需要员工亲自填写表单的繁琐程序。
创建此表单的步骤如下:
-
使用你的 Office 365 帐户打开 Forms,
forms.microsoft.com
,然后点击“新建表单”。 -
添加表单的名称和描述。
-
现在,让我们在表单中添加一些字段,考虑到我们在 Dynamics 365 Business Central 中需要/想要的所有字段。要创建一个新字段,只需点击“+ 添加新字段”按钮:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/419de138-967b-4505-b7c4-82c8751cbefb.png
- 然后,选择要创建的字段类型(在这里,我选择了“选项”):
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/5186babd-cca6-4049-b06a-44eeca09e079.png
- 然后,选择标签:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/60ef0c19-1965-4903-a0d3-cd873a0b6c2d.png
让我们创建以下字段:
-
-
名字 (文本)
-
姓氏 (文本)
-
电子邮件 (文本)
-
地址 (文本)
-
地址城市 (文本)
-
地址状态 (文本)
-
地址邮政编码 (文本)
-
电话号码 (文本)
-
生日 (日期)
-
- 最终的表单将如下所示:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/a9f5f781-e3fa-4088-8da8-189ccb4ed9f5.png
在 Forms 上创建表单后,我们可以创建我们的 Flow 工作流:
-
打开 Microsoft Flow 网站(
flow.microsoft.com
),使用您的 Office 365 账户登录,然后进入我的流程(My Flows)。 -
点击“+ 新建 | 从空白创建”:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/483aeacb-a5d3-4de0-b547-292fe4ddf0e0.png
-
让我们寻找更多的触发器。点击“搜索数百个连接器和触发器”。
-
搜索
Microsoft Forms
,然后选择当提交新响应时触发器:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/283bde9a-85c5-4c99-842d-74e8740906c8.png
- 在触发器操作中,从“表单 Id”字段中选择你的表单(新的入职流程):
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/97e9a2b6-6e01-4396-b660-5340e774c1d5.png
- 现在,让我们添加一个新步骤。点击“+ 新步骤”:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/3d9bcd15-c3bc-4785-b6cf-a29d60eec859.png
- 选择“内置”然后选择应用于每个:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/34a77b57-73b1-4035-a1b4-199bfe9cb033.png
我们将选择当提交新响应时触发器中的表单响应作为此“应用于每个”操作的输出。基本上,对于每个提交的响应(在此情况下,总是一个响应,这是 Flow 执行方式),我们将在工作流执行时做一些操作:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/cfb12f1c-ec8d-495b-b9ec-ce7514ca9a97.png
- 现在,我们可以创建一个审批流程,在响应提交到 Dynamics 365 Business Central 之前进行验证。点击“添加一个操作”:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/e549f3ae-c267-4444-b59d-28272c72b2f9.png
- 搜索
Microsoft Forms
,并选择获取响应详情:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/af1f2f9c-5a2f-49cc-85df-c9445cd53fdd.png
- 在“表单 Id”字段中选择我们创建的表单,并将“响应 Id”添加为响应 Id。此操作将填写表单上的所有字段:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/d39e85c4-9e09-4d71-b396-fe978b54e4c5.png
- 现在,点击“添加一个操作”添加一个新步骤:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/fc761fc8-67c3-4647-89ec-a5e89d9bc053.png
- 搜索
Approvals
,然后选择开始并等待审批:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/ce414aab-79a9-4401-8fae-cc7d3a03d5ce.png
- 审批类型将是“批准/拒绝 - 第一个回应者”(如果你愿意,可以更改为其他选项):
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/ae917dd0-3be5-49e7-b209-eee8d16d52dd.png
- 你可以个性化审批信息,发送给负责做出审批决策的人力资源人员:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/aa18f045-c8e0-433b-839e-771ebd2233cb.png
在“分配给”字段中,我使用了固定的人员,但如果你愿意,你可以与其他应用程序创建集成,自动设置审批人。
- 配置完批准后,我们需要处理批准人完成审批流程时的情况。在此示例中,如果得到批准,我们将在 Dynamics 365 Business Central 中创建该条目。如果被拒绝,我们将向员工发送电子邮件要求重新填写表单。为此,添加一个动作:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/f7d7109e-dcf6-467f-a4c2-4b8037ad11ce.png
- 然后,选择条件:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/495d07bb-161e-4d51-8ec5-675beb466790.png
- 条件必须使用来自响应的值(这是当审批流程处理多个审批时的响应集合):
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/1305b680-e180-4d0a-bcf7-b500926adf14.png
- 我们需要检查该响应的值是否等于“批准”:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/2d9d585e-fefa-4b89-92e5-49c4b8653109.png
- 如果条件为真,我们将在 Dynamics 365 Business Central 中创建该条目,并将消息发布到我们的入职 Teams 频道。在 “如果是” 框中,我们添加一个动作:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/f5f6da37-86d7-49df-9718-1ec2c1c7ecd2.png
- 搜索
Dynamics 365 Business Central
然后选择创建项:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/94456ccf-bd8f-40f3-a37b-f975a0fa1287.png
- 选择你的公司名称。在 “表格名称” 下,你可以看到我们可以使用 Flow 交互的所有表格。对于此场景,我们将使用员工表:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/c2683bd4-11bd-431b-95a4-eb4403642b71.png
- 选择员工表后,我们将能够看到所有可用的字段(所有可以通过 Flow 发送信息的字段):
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/540fa12d-b281-4329-beb9-ff0c964dc874.png
- 让我们开始从表单响应中提取数据,并将其添加到 Dynamics 365 Business Central 动作的正确位置:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/bcf3d471-b8fb-485c-a0af-30cbf5f32648.png
- 现在,我们将在 Teams 频道中创建一条信息,通知人力资源团队,新的入职流程已提交并获得批准,且该条目已在 Dynamics 365 Business Central 中创建。点击添加一个动作:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/16ebcf7d-bf8f-4c7a-b359-0a8ee348c7b4.png
- 搜索
Microsoft Teams
然后点击 “以 Flow 机器人身份在频道中发布消息”。这将自动以 Flow 机器人用户身份发布到 Teams 频道:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/639d8a12-86a8-45d6-bc2c-1bfbac88c5f6.png
- 选择你要发布的团队和频道:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/60b25541-f92b-4f93-b822-59f139b58dfd.png
- 在 “消息” 下,你可以添加要发布到 Teams 的文本:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/b148cb75-f900-4036-8116-b386579f9c76.png
- 完成!现在,让我们添加一个动作,当审批流程被拒绝时。点击 “如果不是”,然后点击添加一个动作:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/d023a3d3-ae09-4730-b8e9-c6495f709db0.png
- 之后,搜索
Office 365 Outlook
然后选择发送电子邮件:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/f6371ae7-d01a-4bd3-82b1-23acf68c04f9.png
在 “收件人” 字段中,添加表单上的电子邮件(记住,我们是要给员工发送电子邮件,要求他们重新填写表单):
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/a827645f-0b26-4460-abe9-ebb8cebfcf19.png
你可以更改 “主题” 和 “正文” 使其包含你想要的内容:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/26b56743-38bd-4aae-8422-95d180216a5f.png
你也可以通过将“Is HTML”选项设置为“是”来更改配置,使该电子邮件能够处理 HTML 格式。
现在,我们已经有了最终的工作流,如下图所示。要保存它,请在顶部栏中为此工作流命名,并点击保存*。*如下所示:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/9f4517ce-e1de-42dc-8bb2-20f7ee81588c.png
现在,让我们试一下:
- 打开我们以预览模式创建的表单,填写内容并点击提交:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/84b09740-ce5c-4780-9cbd-1812a852ae36.png
提交后,这是你将获得的响应:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/d7df6a2d-e27f-4224-96ab-942612027736.png
- 访问人力资源帐户(你选择负责审批表单的帐户)以检查是否已收到审批电子邮件:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/6aff0c32-bb01-407d-8156-5a532457cbe0.png
如果你点击批准,工作流将继续在 Dynamics 365 Business Central 中创建该员工,并将表单中的所有数据添加进去,同时会发布到 Teams 上:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/25d5eb52-7a36-4ccd-9d10-c1619c2abf69.png
- 如果你可以访问你的 Dynamics 365 Business Central 租户,你将能够看到已创建的员工记录:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/5c4eba76-6df2-406f-86e7-2130b7d0bd61.png
- 然后,如果你访问你的 Teams 渠道,你将能够看到审批通知已经发布,如下所示:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/235ffdfb-f40e-492f-aafc-c936c49d5196.png
- 如果你点击拒绝,系统将向员工发送电子邮件,要求他们重新填写表单:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/85bacda6-b0d0-46af-a3e8-443d1f076258.png
这是发送给员工的电子邮件:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/ca3b81b6-eb32-4307-8d12-60fe1d895466.png
这样,我们就有了一个完全自动化的员工入职流程工作流,它可以与招聘流程连接。它可以在 ERP 系统中注册新员工,通知 IT 经理等。
创建 Dynamics 365 Business Central 中表格项的相同方法也可以用于销售订单信息、采购、税务和其他你在 Dynamics 365 Business Central 中拥有的数据类型。
在这一节中,你已经看到通过使用 Flow 与 Dynamics 365 Business Central,创建自定义工作流是多么简单。我们在没有编写一行代码的情况下成功完成了这个场景。
在接下来的章节中,我们将学习如何使用 Flow 在 Dynamics 365 Business Central ERP 中实现销售订单审批工作流。
场景 2 – 创建一个简单的销售订单审批工作流
在这个场景中,我们将在 Dynamics 365 Business Central 中使用 Microsoft 提供的模板创建一个简单的销售订单审批工作流来处理我们的销售订单审批。
使用的技术: Flow 和 Dynamics 365 Business Central。
要开始创建自定义审批工作流,你可以直接从 ERP 端开始,方法如下:
- 在 Dynamics 365 Business Central 上,进入销售菜单并点击销售订单。现在,点击新建,在新订单页面上点击请求审批,然后点击创建工作流:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/398f7097-35e2-426b-9418-2a124fcc3c51.png
- 会向你展示流程模板,你可以选择最适合你流程的模板。我们选择名为“请求审批”的工作流模板,用于 Dynamics 365 Business Central 销售订单:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/5387fd1b-22f2-4a28-b384-7eb0abf3d9ba.png
- 你可以更改工作流,使其完全符合你的流程需求,包括与销售订单相关的信息、审批流程中的审批人,以及工作流将采取的路径(取决于回复):
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/5236d149-aad2-41f2-a37f-ee7f671ac1ad.png
- 在这里,我们可以选择请求的详细信息(请参见以下截图中的字段):
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/bd7a3d0c-8e65-48ab-842f-2dddfe69b481.png
- 然后,我们可以选择行动(如果批准)并保存工作流:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/5764b34c-ae01-46ad-8db7-c6d12ff72a0d.png
- 现在,回到销售订单界面。我们选择一个现有的销售订单,选择请求审批,然后点击发送审批请求(Dynamics 365 Business Central 会检查是否已经配置了工作流,并在用户点击发送审批请求时使用它):
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/242b600c-2e93-4a7e-beac-544a237a01e1.png
- 工作流已经启动,审批人应该会收到通知以批准/拒绝该销售订单:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/ee27718f-4163-42c2-b170-fce599b514b8.png
最终结果是,我们通过几个简单的步骤创建了一个工作流,允许通过电子邮件直接审批 Dynamics 365 Business Central 文档(如销售订单)。如前所述,我们可以通过几次点击更改整个审批流程的行为,并使这个工作流按照最适合我们业务需求的方式运作。
这是创建销售订单工作流的一种简单方法,也可以轻松地应用于 Dynamics 365 Business Central 上的其他数据类型。
场景 3 – 创建一个简单的应用来列出所有客户和销售报价
在这个场景中,我们将在 PowerApps 上创建一个应用,它将连接到我们的 Dynamics 365 Business Central 环境,列出所有客户,并为选定的客户列出他们的销售报价。这个应用可以在浏览器或移动设备上使用。
使用的技术:PowerApps 和 Dynamics 365 Business Central。
要开始创建我们的应用,执行以下步骤:
- 使用你的 Office 365 账户打开 PowerApps Studio,访问
web.powerapps.com
。在 PowerApps 中有不同的应用构建方式;我们将使用Canvas应用从空白模板开始构建一个适用于手机布局的应用。点击从空白开始的 Canvas 应用:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/02dc42e4-a710-452c-a5b3-8de451cbcc76.png
- 给你的应用起个名字,选择你想要的格式(在此示例中,我们将使用“电话格式”),然后点击“创建”:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/1de352a9-f728-410e-91e6-a345bfe9af08.png
一旦应用创建完成,你将被重定向到 PowerApps Studio,在这里我们将开始构建应用的组件。
我们需要通过使用现有连接器在 PowerApps 中将我们的应用与 Dynamics 365 Business Central 连接。这里的连接器概念与 Flow 中的相同。Microsoft 在所有 Power Platform 应用中都使用相同的概念。
- 在顶部导航菜单中,选择“视图”,然后点击“数据源”:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/feaf755e-d5d8-4e1d-a4f1-8c3942a5d806.png
-
现在,添加数据源。如果你已经在任何其他 Power Platform 应用中与 Dynamics 365 Business Central(或其他平台)创建了连接,你可以直接从出现的列表中选择该连接。
-
如果你之前没有在任何其他 Power Platform 应用中与 Dynamics 365 Business Central(或其他平台)创建连接,点击+ 新建连接,搜索
Business Central
,然后选择 Business Central 连接器,如下所示:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/58ad9522-02c6-4121-ad35-fb886f45d320.png
- 现在,点击“创建”。通过创建连接(或选择现有连接)与 Dynamics 365 Business Central 连接,你需要选择要使用的数据集:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/86051d20-a3bf-45f2-9b3c-f3bdb8a2b195.png
- 现在,我们可以选择要在应用中使用的 Dynamics 365 Business Central 中的哪个表格。在我们的示例中,我们将选择客户表和销售报价表,然后点击“连接”:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/b86ecf70-632e-4141-bd4d-cb21a7d71dd2.png
连接已完成。现在,我们可以开始向应用中添加控件,以使用这些连接。
- 在顶部导航菜单中,进入“插入”选项卡,在“控件”中选择“下拉控件”:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/a91d7f5a-0384-4065-82c8-e7fbe6b793e9.png
- 默认情况下,这个下拉菜单的数据源将是一个示例,但我们可以通过进入右侧面板,进入“项目”属性,然后选择来自 Dynamics 365 Business Central 的客户表来更改它:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/9e3ae458-ccc0-4803-9a31-3ae9da677be3.png
- 在“值”属性中,我们可以选择从客户表中显示给最终用户的值;我们选择
displayName
:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/7ed7dfc5-7978-4a11-bc3d-73232b0adb6b.png
- 此时,我们将添加一个新控件,以显示所有针对选定客户的销售订单,这样每次我们在下拉菜单中更改客户时,它都会加载该客户的所有销售订单。在“插入”选项卡中,点击“画廊”并选择“垂直画廊”:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/6a7e1d33-9334-49ae-8b56-9aaf8130db91.png
选择画廊后,你需要为该画廊选择数据源。这与我们之前为下拉菜单介绍的概念几乎相同。
- 在
Items
属性中,选择salesOrder
数据源:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/0da2a900-4bdf-4eaf-b68e-2818c3a9fb10.png
- 现在,我们可以选择画廊将使用的布局以及显示在哪些字段。在
Layout
属性中,选择名为“标题、副标题和正文”的模板:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/2fc23548-b028-4a17-a78a-d036516efaf0.png
- 在数据部分,选择
number
作为Title2
属性。在Subtitle2
属性中,选择status
:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/e848e2fd-d93b-45f6-9c1d-7ea2a594bd18.png
同样,在 Body1 属性中,选择totalAmountExcludingTax
。
现在,我们需要确保应用筛选器,以便只显示从下拉框中选择的客户的销售订单。默认情况下,当我们选择数据源时,数据将被检索而不应用任何筛选。
要做到这一点,请参考以下截图:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/d69fd604-2cb6-4efd-9ecb-6438cc041438.png
点击画廊。在控制属性面板中,选择Items
属性。在函数条中,我们需要使用名为Filter()
的命令来筛选数据源中的数据。
你可以在docs.microsoft.com/en-us/powerapps/maker/canvas-apps/functions/function-filter-lookup
找到更详细的信息。
让我们使用以下Filter
公式:
Filter(salesOrders, Text(customerId) = Text(Dropdown1.Selected.id))
过滤器公式如下所示:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/5081c7cc-5115-4c0e-8037-20b75695d141.png
让我们看看这个公式到底是怎么回事。
Filter
函数要求数据源作为第一个参数,在这种情况下,数据源将是 Dynamics 365 Business Central 中的salesOrder
表。
Filter
函数的第二个参数是逻辑测试。在这种情况下,我们将检查customerId
是否等于从salesOrder
表中选择的Dropdown1
中的item
,即我们在 Dynamics 365 Business Central 的客户表中选择的项目。
在这种情况下,我们使用Text()
函数将两个参数转换为文本,以便进行比较。
现在,每当用户更改下拉框时,筛选器将会被应用,销售订单将按下拉框中选择的值进行筛选。
现在,我们只需要保存应用程序。为此,请按照以下步骤操作:
- 在顶部导航菜单中,进入文件,输入你的应用程序名称,改变图标(如果需要),然后点击保存:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/fdead6dc-8ae0-4684-a17d-b0fb71beac2a.png
- 现在,返回到应用程序并运行我们的应用程序。要启动应用程序,请点击右上角的播放图标:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/a9a9af5a-121a-49a4-852d-c9bc78519de8.png
- 从下拉框中选择其他客户,以检查筛选器是否已应用:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/7cb3b666-909a-447c-96bf-847b87c4e0b7.png
这样,我们就有了一个与 Dynamics 365 Business Central 集成的应用程序,可以根据我们业务的其他流程和需求进行更改。
使用 PowerApps,我们迅速实现了一个可以在浏览器和移动设备上运行的应用程序,能够与整个组织共享,并且可以由我们的 IT 管理员进行安全管理。
摘要
在本章中,我们概览了 Microsoft Power Platform,特别关注了两个重要的应用程序:Microsoft Flow 和 Microsoft PowerApps。
我们看到了通过将 Microsoft Dynamics 365 Business Central 与 Flow 和 PowerApps 集成,实现三个真实世界业务场景的应用,且这一切都在零编码的情况下完成。这就是这个商业平台的强大之处!
我们还学习了如何利用整个 Dynamics 365 平台,扩展我们的 ERP 解决方案并创建现代化的业务应用程序。
在下一章中,我们将探讨另一个有趣的集成场景:如何将 Dynamics 365 Business Central 与机器学习结合使用。
第五部分:将解决方案迁移到新扩展模型
本节将介绍将机器学习功能集成到 Dynamics 365 Business Central 解决方案中的方法,如何将现有的 ISV 解决方案(使用旧的 C/AL 代码编写)迁移到新扩展模型的过程,涉及的架构方面,以及如何正确开始这一过程的建议。我们还将介绍一套著名的 AL 开发者第三方工具集,这些工具对开发 Dynamics 365 Business Central 应用非常有用。
本节包含以下章节:
-
第十六章,将机器学习集成到 Dynamics 365 Business Central 中
-
第十七章,将现有的 ISV 解决方案迁移到新扩展模型
-
第十八章,AL 开发者的实用工具与高效工具
第十六章:将机器学习集成到 Dynamics 365 Business Central 中
在上一章中,我们概述了 Microsoft Power Platform,并且我们看到了如何结合 Flow 和 PowerApps 使用 Dynamics 365 Business Central 来解决无需编码的业务任务。
在本章中,我们将讨论一个近年来逐渐兴起的话题:机器学习(ML)与 Dynamics 365 Business Central。2019 年是人工智能(AI)的年份。你到处都能听到关于人工智能的讨论。世界告诉我们:如果你想保持领先,应用人工智能。但是,什么是人工智能?它与经典编程有何不同?幕后发生了什么?
本章的目标不是让你成为一名真正的数据科学家或机器学习大师,而是让你清晰理解人工智能的基础知识,并获得如何将人工智能嵌入 Dynamics 365 Business Central 项目中的一些经验。
本章将涉及以下主题:
-
机器学习是什么以及其主要过程概述
-
Dynamics 365 Business Central 机器学习框架概述
-
在你的 Dynamics 365 Business Central 应用程序中使用机器学习
-
了解预测 API
什么是人工智能(AI)和机器学习(ML)?
人工智能包含了人类智慧特征的任务,例如语言和语音理解、物体和声音识别以及规划。之所以使用任务这个词,是因为从技术上讲,你可以通过两种不同的方法来完成这些任务:经典编程和机器学习。
在 1990 年初,一些公司推出了光学字符识别(OCR)软件。他们投资了数百万美元,雇用了数百名开发人员编写代码以识别手写文本。这是使用简单工具(如if-else
)的经典编程方法。该方法有效,但结果相当糟糕。准确率低,错误率高。
为什么这种方法失败了?因为对人类大脑来说自然的事情对于编程来说非常困难。
那么,我们如何以另一种方式解决这个任务呢?答案是机器学习!
“机器学习是机器(计算机)展示未被明确编程的行为的过程”
– 阿瑟·塞缪尔,1959 年
或者换句话说:计算机从数据中学习以执行预测分析。
正如你所看到的,创建机器学习功能时,我们需要的不是编写代码,而是数据。
所以,让我们在接下来的章节中详细讲解这个过程。
机器学习过程概述
根据其定义,机器学习(ML)是人工智能(AI)的一种应用,它赋予系统从经验中自动学习和改进的能力,而不是通过显式编程来实现。
这是经典的机器学习过程。当你尝试根据先前的经验预测答案时:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/58038a1b-78bd-4958-9ffe-875c0de8ddb4.png
让我们详细了解前面的图示:
- 定义问题:机器学习不是一个魔法盒子。要获得答案,你应该知道问题,并构建一个能回答这个确切问题的模型。
记住:正确的问题是获得正确答案的关键!
-
查找数据:你需要找到能回答你问题的数据。数据在机器学习术语中通常被称为 数据集,它应当是相关的、完整的、准确的并且足够充分。在本章节中,我们将使用 Dynamics 365 Business Central 作为与业务相关的数据存储。
-
准备数据:为了使机器学习训练过程可行,你应该将所有表格合并成一个表格(数据集)。你需要定义你希望预测的字段(标签)以及哪些字段会影响预测(特征)。
-
训练机器学习模型:在这个步骤中,你通过将训练数据集应用到机器学习算法中来创建机器学习模型。
-
测试训练好的机器学习模型:为了了解预测质量并计算机器学习模型的准确度,你还需要一个 测试数据集。测试数据集应该与训练数据集不同,但具有相同的结构。
例如,以下是我们的训练数据集:
这是我们用来创建 F(day) = \"销售金额\"
机器学习模型的内容,以下是我们的测试数据集:
我们从测试数据集中提取特征,并将它们应用到训练好的机器学习模型中,以预测标签:
然后,我们将销售金额与预测销售金额进行比较,得出模型的准确性:
因此,我们的模型准确度为 97.9%。
- 将机器学习模型发布为 web 服务:当你对模型的准确度感到满意时,可以将模型发布为 web 服务,并可以从任何地方使用它来预测未来的新增特征。如果我调用发布的模型来预测未来日期,结果会显示未来日期的预测值,如下表所示:
使用经过良好训练的机器学习模型,你可以轻松地使用数据进行预测。
接下来,让我们看看 Business Central 机器学习框架是如何工作的。
理解 Business Central 机器学习框架
从头开始构建自己的(自定义)机器学习模型可能会比较复杂。通常需要在 Python、R 或者像 Azure ML Studio 这样的服务中具有一定的经验。如果你不想在这方面投资,但仍然希望利用 AI 和你的数据,你可以使用 Dynamics 365 Business Central 机器学习框架。
从技术上讲,它可以分为四个不同的框架:
-
时间序列 API
-
机器学习预测 API
-
自定义 Azure ML API
-
自定义视觉 API
每种框架都旨在完成各自的任务,并使用不同的算法:
-
例如,通过 时间序列 API,你可以使用回归算法的强大功能,仅凭过去的日期和数字来预测数字(如销售额和数量)。
-
使用 ML 预测 API,你可以预测类别,例如是/否或颜色。
-
自定义 Azure ML API 允许你连接到你在 Azure ML Studio 中构建的自定义模型。
-
自定义视觉 API 允许你连接到你在 自定义视觉 中构建的自定义模型。
在接下来的部分,我们将重点关注 时间序列 和 ML 预测 API,因为它们是最简单的,不需要 ML 经验,但依然强大。
时间序列 API
在这个例子中,假设你是一个餐厅的老板,你想预测客户在接下来 7 天内将从菜单中点多少个菜品。
你有以下销售历史记录:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/89864f7f-b462-4f56-a816-bab64e31d69a.png
在这个数据集中,你有 38,325 行和 11 列。销售历史记录从 2015 年 1 月 10 日到 2018 年 12 月 9 日。数据集可以在 dkatsonpublicdatasource.blob.core.windows.net/machinelearning/AML-restaurant-sales-by-menu-item.csv
找到。
你可以使用 AL 语言代码调用 时间序列 API,以获得关于 订单 的预测。然后,我们可以在显示给最终用户之前,程序化地检查预测的质量。让我们看看如何操作。
步骤 1 – 下载数据集到 Dynamics 365 Business Central
执行以下步骤将数据集下载到 Business Central 中:
- 在 Visual Studio Code 中创建一个新的 AL 项目,并克隆这个 GitHub 仓库:
github.com/dkatson/BC-ML-Framework
。你将获得一个新的RestSalesEntry
表(以及一个页面),在其中保存该数据集,并获得一个新的代码单元RefreshRestSales
,它将从外部源上传该数据集:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/cd3cfd6f-4880-47e0-ac13-9fab7a796498.png
- 当你发布这个应用程序时,你将看到这个页面:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/f23c9c76-5fb8-4014-bcbb-e2c47de8b35e.png
- 点击“刷新餐厅销售”按钮,你将看到该数据集出现在 Dynamics 365 Business Central 中:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/d876af65-f6a0-4467-b82a-6fd70287319f.png
现在,你已经有了数据,但要进行预测,你需要将一个 ML 模型发布为 web 服务,通过该服务你可以发送数据并返回预测结果。所以,为此我们将进入第二步。
步骤 2 – 从公共模板发布模型为 web 服务
只需几次点击,你就可以从公共模板创建一个模型,并发布一个仅满足你需求的端点。请在你喜欢的浏览器中输入以下网址:
gallery.cortanaintelligence.com/Experiment/Forecasting-Model-for-Microsoft-Dynamics-365-for-Financials-1
这是一个由 Microsoft ERP 团队准备的公开可用模型,旨在进行时间序列预测:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/4bfe2fd4-3cfe-4854-88b4-3178bd2ff72f.png
现在,按照以下步骤操作:
-
点击在 Studio 中打开按钮。
-
选择免费工作区或标准工作区。
-
登录到你的 Microsoft 账户。
-
点击确定按钮将实验从画廊复制。
-
保持区域和工作区字段的默认值,除非你是 Azure ML 的高级用户。
-
点击实验画布底部的运行按钮。
-
点击实验画布底部的**部署 Web 服务 | 部署 Web 服务(经典版)**按钮。
系统将 Azure ML 实验部署为 Web 服务,并提供可以被广泛设备和平台(包括 Dynamics 365 Business Central)消费的 RESTful API:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/993ae2f5-3c19-4b87-a9db-f1cc821c79e3.png
部署完成后,将打开 Web 服务仪表盘。
在这里,你可以看到 API 密钥和两个可用的 API:请求/响应和批量执行。当前与 Dynamics 365 Business Central 一起发布的时间序列 API 仅支持请求/响应 API。在 API 帮助页面底部,你可以找到输入输出定义和代码示例。然而,对于这个示例,你只需要请求 URI。
现在,按照以下步骤操作:
-
复制并粘贴 API 密钥到文本文件中保存,尽管你以后也可以再次访问它。
-
点击请求/响应链接打开 API 帮助页面:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/4657c5e4-8af4-4559-9f3e-f2ff9ab7f441.png
- 之后,复制并粘贴请求 URI 到文本文件中保存,尽管你以后也可以访问它:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/03ad5ede-9667-4c66-bbf0-b5a3fc8b8ff1.png
就这样。这个 ML 模型可以预测任何数据,包括我们示例中的订单,现在已发布,你可以通过 Dynamics 365 Business Central 时间序列 API 调用它。
第 3 步 – 将数据从 Business Central 发送到 ML 端点以获取预测
下一步是将数据发送到端点以接收预测。让我们看看这是如何发生的:
- 在 Visual Studio Code 中打开你的 AL 项目,该项目是从
github.com/dkatson/BC-ML-Framework
克隆的,然后切换到Time-Series-API
分支。在这里,按Ctrl + Shift + P 并输入checkout
:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/c1fc0bea-1b29-400a-9634-430d2d44e20e.png
- 现在,选择一个分支:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/f4953f68-f053-4762-a715-2d381842b84b.png
这是餐厅示例扩展的升级版。
这个版本与之前的版本的区别如下:
-
安装应用时,演示数据(演示项和销售历史)会自动加载。
-
在物料卡中会出现一个新操作——
Update Rest. Forecast
。
让我们看看它是如何工作的。
有一个新的代码单元,名为 Calculate Rest. Forecast
,其主要函数是 CalculateRestForecast
,并且有两个附加函数,getMLUri
和 getMLKey
*。*将你的 URI 和密钥(从 第 2 步 中复制)插入到这些函数中:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/02735bfa-4545-4539-96a8-f9952426e226.png
让我们调查一下 CalculateRestForecast
函数的变量:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/31ed2dec-85bd-4d50-8964-de9990df2ef7.png
从前面的截图中,我们可以理解以下内容:
-
TimeSeriesMgt
是一个时间序列库,它准备数据,将其提交给 Azure ML,并获取预测结果。 -
RestSalesEntry
是我们的历史数据集,我们将用它来准备数据,并将其发送到 Azure ML 网络服务以获取预测结果。 -
TempTimeSeriesForecast
是我们将发送到 Azure ML 网络服务以获取预测结果的准备数据。 -
TimeSeriesModel
是回归算法的名称(或组合),它将在 Azure ML 网络服务中应用于准备好的数据,以获取预测结果。 -
TempTimeSeriesBuffer
是我们从 Azure ML 网络服务获得的预测结果。
让我们调查一下 CalculateRestForecast
函数的业务逻辑。整个任务可以通过 Time Series Management
变量中的四个函数来完成。在这里,Initialize
用于建立连接:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/bca0c9ef-6c5f-464f-ba86-12894f88eda2.png
现在,准备你将用于预测的历史数据。在我们的案例中,我们将按项预测 orders
,这意味着一次调用 ML 网络服务将返回一个项的 orders
预测。因此,将销售历史数据集按单个项进行过滤是有意义的:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/46d4ee2a-6171-4fb5-bc26-53fa9547153a.png
PrepareData
将任何表格数据转换为可提交的数据集。指定源表格和用于分组的字段。请记住,时间序列 API 需要将日期作为第二个分组字段。选择一个标签——你希望预测的字段。它应该包含数值——小数或整数。
在我们的案例中,我们将指定 RestSalesEntry
中的 date
字段作为日期,menu_item_id
作为分组字段,orders
作为预测字段。
此外,我们指定 Period type
等于 day
(因为我们有每一天的历史交易数据),预测的 start day
将是当前的 work date
,用于计算 orders
预测的历史条目数量将是我们所拥有的所有条目:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/81b8bbc6-f425-447a-a69c-0fa20bf74a1f.png
历史周期的数量告诉系统应该从过去获取多少个周期,从预测日期开始。这意味着,如果你的历史数据集存在空缺,它也将包含在计算中。
在我们的例子中,我们的历史数据截止于 2018-12-09,且我们希望从 2019-01-05 开始进行预报。我们有约 6 个月的缺失数据。这意味着PrepareData
函数将用零填充这段缺失数据,因此会排除掉 6 个月的历史数据,从最开始(2015-01-10)算起:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/dacc2060-f6a4-4d7d-8e1b-51b9b4e90d63.png
你可以通过调整ObservationPeriod
参数来避免这种情况。
一旦数据准备好,你可以在将数据发送到 Azure 机器学习服务之前读取并修改它。例如,这里我们的RestSalesEntry
数据集中有一段缺失的时期。在PrepareData
阶段,会生成系统默认的零(0)条目。如果我们直接发送这个数据集,机器学习服务会认为这段时期没有销售,这将极大影响未来的销售预测。为避免这种情况,我们需要从准备好的数据集中排除零条目:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/639a8f49-d5ce-4003-8c25-f4317d2bcd26.png
Forecast
函数将最终准备好的数据集发送到 Azure ML Web 服务,后者根据指定的参数计算预报并返回预报结果。让我们来调查一下输入参数:
-
ForecastingPeriods
:这是你希望获得的未来预报天数/月数/年数——它对应于你在PrepareData
函数中指定的特定时间段类型。 -
ConfidenceLevel
:这是预报结果的最低概率。如果指定为 0,则会使用 80%的概率,或者你可以指定一个确切的百分比。你可以尝试不同的值,看看它如何变化。我们不建议使用高于 95 的值。 -
TimeSeriesModel
: 这是 Azure ML Web 服务使用的统计算法,用于根据你发送的历史数据集来创建预报。它可以是 ARIMA、ETS 或 STL,也可以是 ETS + ARIMA、ETS + STL,或三者的组合。
在我们的例子中,我们将计算未来 7 天的orders
预报,最低概率为 80%,并将应用所有统计算法计算平均结果:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/60e941a5-7a45-4158-a09c-92730e5566d8.png
GetForecast
将预报结果填充到TempTimeSeriesForecast
表中,之后你可以在任何地方使用这些结果:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/0a926237-2226-4d2a-8395-57423b571a16.png
调查结果最简单的方式是创建一个包含TempTimeSeriesForecast
表的列表页面:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/c6207ecd-0737-48df-a22e-ed3ee931bc05.png
让我们发布这个应用并调查结果。进入米布丁项目,字段 No. 2 为 34,点击操作 | 项目 | 餐厅 | 更新餐厅预报*:*
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/955643f6-523b-4978-b9ac-007450896279.png
结果将存储在临时表中,并显示在屏幕上:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/70c1ee2d-7344-46bd-93f6-32c2b2d786a2.png
增量约为 140%,这相当大。原因在于我们是从 2019 年 4 月计算的预测,但我们过去的最后一个数据条目来自 2018 年 9 月,如下所示:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/a8ac5949-ee3d-44ee-9bf7-10c396cf5146.png
如果我们将工作日期更改为 2018 年 9 月 24 日(即我们最后一次实际预测后的第二天),并运行预测,我们会看到增量减少到 65%:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/f8162faf-ebce-4d78-accb-855f8a114002.png
但增量百分比仍然相当大。为什么?那是因为预测中使用的特征过少。
时间序列预测仅使用两个特征,item no.
和 date
。但通常需要使用更多影响预测的特征。
在了解时间序列 API 框架如何工作的基础上,接下来让我们探索其预测 API。
理解 ML 预测 API
在上一节中,我们基于时间序列 API 训练了一个机器学习模型。由于仅有两个特征, resulting 模型的准确率较差。使用ML 预测 API,您可以设置任意数量的特征。这种方法为您提供了更多的灵活性和实验机会,让您可以通过改变特征和生成新特征来提高模型质量。
同时,ML 预测 API 允许您直接从 AL 训练一个自定义的 ML 模型。
如果您正在构建行业解决方案,可以将 train-ml-model
功能直接添加到您的 Dynamics 365 Business Central 应用中。
该 API 可在代码单元 2003 中找到,名为 ML 预测管理。让我们来看一下它是如何工作的。
在 Visual Studio Code 中,打开您从 github.com/dkatson/BC-ML-Framework
克隆的项目,并切换到 Train-ML-Model-From-AL-API
分支。这是之前餐厅示例扩展的升级版。
这与之前的不同之处如下:
-
我们不使用时间序列 API。
-
我们训练了一个具有八个特征的机器学习模型,直接从 AL 中获得订单预测。
步骤 1 – 从公共模板发布一个通用预测模型为 Web 服务
作为从 Business Central 进程进行训练的前提,您仍然需要将通用预测 ML Web 服务发布到您的 Azure 订阅中。
访问 gallery.azure.ai/Experiment/Prediction-Experiment-for-Dynamics-365-Business-Central
在您喜欢的浏览器中。
这是微软 ERP 团队准备的一个公开可用的模型,专门为 ML 预测管理使用而设计:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/14363075-e22e-4886-93c7-22a0d13c0c35.png
要发布它,请按照以下步骤操作:
-
在 Azure ML Studio 中打开此实验。
-
运行它,然后将其作为 Web 服务部署。
-
在 Web 服务仪表板中,复制 API 密钥。
步骤 2 – 从 AL 训练机器学习模型
在你之前克隆的 Visual Studio Code 项目中,有一张名为 Rest. ML Forecast Setup 的表格,包含两个额外的函数:getMLUri
和 getMLKey
.
将你的 URI 和密钥(从前一步复制)插入这些函数:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/093eea32-a7a7-4381-94d0-ea8be27d3b85.png
打开 Train Rest. Forecast ML
代码单元,找到 Train()
函数*.* 我们来看看它是如何工作的。定义的变量如下:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/7d79ad6a-b59b-42d6-ac90-13f89e46a955.png
从上面的截图中,我们观察到以下内容:
-
ML Prediction Management
:这是主要的代码单元,包含用于训练、保存和使用机器学习模型的功能。 -
MyModel
:这是训练后的模型,采用编码文本格式。 -
MyModelQuality
:这是训练模型的质量。 -
Setup
:这是存储训练模型的表格。 -
RestSalesEntry
:这是用于训练机器学习模型的历史数据。
如下所示,指定与你发布的预测机器学习 web 服务的连接:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/118bb55a-168b-4561-9ccb-216b7ce09953.png
现在,为训练过程准备历史数据。你可以过滤数据或添加新的列。
这里需要注意的要点如下:
-
训练数据集不应有空字段。如果有空字段,请用任何值填充它们,例如
0
或NA
。 -
如果你有
Date
字段,请将其拆分为两个字段(至少):日和月。通常,预测依赖于这些字段,而非日期本身。此 API 不支持日期格式。
请参考以下截图:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/c08662bb-b88a-4794-bebf-a25a39c5f80e.png
为模型指定特征。在这里,你指定影响预测的字段:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/5694bbe6-90d7-4800-9ca4-a5a32a3ccbf6.png
然后,我们指定标签。在这里,你指定你要预测的字段:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/3951631c-a0a3-45b9-a868-50409b6b3137.png
接下来,我们将训练模型。在这里,你将请求发送到 web 服务,并使用历史数据进行训练。作为结果,你将获得一个 Base64 文本格式的训练模型和模型质量:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/a9c4d83a-4eb2-4879-a116-f411946cbee9.png
保存你的训练模型。它将在后续的预测过程中使用:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/19047403-80f2-47f9-858b-002323158d5a.png
第 3 步 – 使用训练好的模型进行预测
打开 Calculate Rest. Forecast ML
代码单元,找到 Predict()
函数。让我们看看它是如何工作的:
- 检查是否已有训练好的模型:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/dd68325c-ecd2-4af3-b6da-1208b7d44e91.png
- 指定与你发布的预测机器学习 web 服务的连接:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/b4cff367-79cc-4ab5-9e12-16ad98e73c16.png
-
生成一个包含数据(特征)的临时表,用于获取 订单(预测)。该表的结构应与训练过程中使用的表相同,否则
Prediction
web 服务将无法正常工作。 -
然后,将此表传递到 ML 网络服务输入。重要的是要理解,预测将针对传递表的每条记录(行)进行计算:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/cabb485a-ec5e-40c2-b69c-4b0ac559ddaf.png
- 指定表中将成为特征的字段。按照训练模型时的相同顺序列出它们。否则,
Prediction
网络服务将无法正常工作:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/a4f9cd12-f1dd-45b6-a48c-d48b2f93754b.png
- 指定从传递表中将成为标签的字段。使用训练模型时使用的相同字段。这里只能提及一个字段:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/188fb2be-e7ea-4a4b-949f-4f1195f6b11a.png
ML 预测 API 可以使用分类或回归算法进行预测。您无法控制。如果标签字段的类型为整数或小数,则将应用回归树算法annova
。否则,它将使用分类算法。
如果使用分类算法预测值,那么还可以指定一个字段来保存预测的置信百分比。这对于回归算法不支持。
使用Predict
函数预测值并传递训练好的 ML 模型:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/35d9c6cd-09a1-453a-ad40-d895cf12ed5b.png
保存预测结果:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/ea9a5723-30c9-4b1d-8ea8-b751cbcffbcc.png
现在您有预测数据要检查。
第 4 步 - 深入了解 ML 的工作原理
当您从 ML 网络服务获取预测时,了解模型为何给出某些结果或作出这些决策总是很有趣。由于 ML 预测 API 使用基于树的 ML 算法,我们可以看到决策树:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/7d4df0a2-b6d6-40f7-9a86-d79666281368.png
重要的是要理解,决策树是训练模型的产物,而不是训练模型所做出的预测的产物。
打开 Train Rest. Forecast ML 代码单元并找到DownloatPlotOfTheModel
函数。让我们看看它是如何工作的:
-
连接到您发布的 ML 网络服务。
-
使用
PlotModel
函数获取带有决策树的.pdf
文件。您将以 Base64 文本格式获得它。 -
然后,使用
DownloadPlot
函数将.pdf
文件保存在本地。如果不需要保存它,只需跳过这行代码:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/7e5a3234-fd52-45be-8601-b77552e39d9b.png
您将拥有您的 ML 模型的绘图。
第 5 步 - 发布和运行预测
当您从 Item 卡发布和运行预测时,您将得到此屏幕截图:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/a3dbad0a-1071-4241-b8b2-95b4785461c7.png
如果您要将预测结果与先前的模型进行比较,您会注意到该模型比定制的 ML 模型结果差,但比时间序列 API 结果好:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/82d3e4cc-1132-41ce-b791-c3d09d3e128d.png
本节介绍了 ML 预测的工作原理及执行它所涉及的步骤。
摘要
在本章中,我们回顾了与 Dynamics 365 Business Central 一起使用的 ML API。我在下表中对三种 ML API 进行了对比分析:
此比较基于本章提供的示例。使用此表格作为指南,帮助你选择在应用程序中应用 AI 的最佳方式。
如我们在这里所学,构建定制的 ML 模型是一门艺术,需要创造力、时间和一定的数学技能。
在下一章,我们将探讨架构概述,并了解将现有 ISV 解决方案迁移到扩展中的最佳实践。
第十七章:将现有的 ISV 解决方案迁移到新的扩展模型
本章我们将重点介绍现有的 ISV 解决方案(主要基于 C/AL 语言)。我们还将探讨在将这些解决方案迁移到 Dynamics 365 Business Central 及新扩展编程范式时应采纳的技巧、窍门和最佳实践。
本章我们将涵盖的主题如下:
-
将 C/AL 解决方案迁移到基于扩展的架构的最佳实践
-
将现有 C/AL 代码转换为 AL
-
在 SaaS 环境中重新设计解决方案时需要检查和记住的事项
到本章结束时,你将更好地理解将现有 C/AL 解决方案迁移到 AL 所需的步骤,转换单体 C/AL 解决方案为扩展时的架构选择(这将影响你的最终应用程序以及如何销售它),以及在迁移过程中可以帮助你的工具(代码转换工具)。
准备从 C/AL 迁移到 AL 和扩展的过渡
毋庸置疑,Dynamics NAV 是国际市场上拥有最活跃的合作伙伴和用户社区之一。如果你是想实施 Dynamics NAV 的客户,实际上很容易找到符合并量身定制的解决方案。为此,只需搜索通过合作伙伴或 独立软件供应商(ISVs)多年来开发的多个附加组件。
所有这些解决方案都是使用 C/AL 语言编写的。通常,它们包含以下内容:
-
新对象(为满足客户业务需求而创建的对象)
-
修改过的标准对象(从标准应用基础代码中修改过的对象,以满足客户需求)
这些解决方案始终是单体解决方案(所有内容都打包成一个数据库内的单一代码库,其中一个对象可以引用解决方案中的所有其他对象)。
在 Dynamics 365 Business Central 中,CSIDE 开发环境和 C/AL 语言仅适用于版本 14.x,并且仅适用于本地部署环境。从版本 15(wave 2)开始,Microsoft 已移除这些开发工具,因此现有解决方案必须迁移到 AL 并转换为新的扩展模型。
将现有的 C/AL 基础解决方案迁移到 AL 扩展并不仅仅是一个简单的 代码转换 过程;通常,它需要重新设计并重新思考整个应用程序(这始终是 Microsoft 推荐的方法)。
在计划将现有 C/AL 解决方案迁移到 AL 扩展时,从技术角度来看,有三个主要方面需要考虑:
-
我应该编写多少个扩展才能最好地拆分 C/AL 解决方案?
-
如何重用我现有的 C/AL 代码?
-
针对基于 SaaS 的解决方案,哪些是允许的,哪些是不允许的?
在接下来的章节中,我们将学习这些方面如何影响从现有解决方案到新编程模型和新平台的过渡。
规划扩展的数量
正如我们在第五章中提到的,为 Dynamics 365 Business Central 开发定制解决方案,扩展 A 不能引用扩展 B 所暴露的对象和方法。只有当扩展 A 明确声明依赖于扩展 B 时,这才是可能的。
在将现有解决方案迁移到扩展时,您有两个主要选择:
-
创建一个单一的整体扩展
-
创建 N 个依赖扩展
让我们更详细地探索这些概念。
单一的整体扩展是一个更简单的选择,因为开发人员不需要考虑独立模块。相反,他们只需在一个巨大的 AL 扩展项目中创建所有对象和业务逻辑。最终,将会生成一个 .app
文件,该文件执行以下操作:
-
添加新对象
-
扩展标准对象
-
添加新的业务逻辑
-
触发事件
-
订阅由标准业务逻辑触发的事件
下图展示了这个解决方案:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/5c79b993-a83c-4495-aa8c-a33975d17a42.png
在这种情况下,开发人员无需考虑依赖关系(所有代码都在一个对象中)。然而,这种解决方案的缺点是,即使是扩展的小更新(比如增加一点代码变化)也需要撤销发布并重新发布整个应用程序。这意味着我们在 Dynamics 365 Business Central 中更新扩展:撤销发布旧版本并发布新版本。
其次,这不是一个可以拆分并作为模块销售的解决方案。然而,如果你希望拥有一个模块化的解决方案,将解决方案拆分为 N 个独立的扩展是一个不错的选择。在将现有的 C/AL 解决方案迁移到 N 个独立的扩展时,通常会有以下情况:
-
独立或独立运行的扩展(不依赖于其他模块的模块)
-
依赖扩展(需要其他模块的依赖的模块)
该解决方案的示意图如下:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/8e552814-a180-45d0-ac5b-ef10fcb65078.png
这里,扩展 A 是一个独立扩展(它只能引用基础模块中的对象)。扩展 C 依赖于扩展 A,而扩展 B 依赖于 A 和 C。
依赖关系有一些优点,例如:
-
它们帮助我们构建更复杂的部署场景
-
它们提高了代码和业务逻辑的可重用性(避免冗余)
-
它们增加了维护成本
-
它们增强了部署的灵活性
依赖关系的缺点如下:
-
当你发布扩展时,必须先发布没有任何依赖关系的扩展(所谓的主扩展或父扩展)。例如,如果你尝试先发布带有依赖关系的扩展(子扩展),它将抛出一个错误,指出数据库中不存在对象引用。
-
当你删除扩展时,必须先删除依赖的扩展(例如子扩展),然后再删除父扩展。
因此,我们可能会想知道哪种选择更好。
这是每个微软合作伙伴目前都在思考的问题。关于这个话题没有固定的规则,你想要实现的对象模块化目标以及你的市场营销策略,很大程度上取决于你现有的解决方案。
一个最佳实践和建议是不要跳过或避免依赖关系。将现有的 C/AL 解决方案迁移到 N 个不同的依赖扩展中是一个不错的选择,因为它保证了模块化和灵活性,但也建议不要创建过多的微型扩展。开发人员应该思考宏功能,并尝试将其隔离到可以在客户需要时安装的特色模块中。
在这个过程中需要记住的一点是,始终添加事件,以便让其他人能够钩取你现有的代码库。
只有通过引发事件(集成或业务事件),你才能拥有一个能够与系统中已安装的其他扩展进行交互的解决方案,并且该解决方案也可以被第三方(其他微软合作伙伴)扩展。
在接下来的章节中,我们将学习如何加速将现有基于 C/AL 的解决方案转换为 AL 的过程(在可能的情况下!)。
将现有解决方案转换为 AL
许多实际使用 Dynamics NAV 的微软合作伙伴多年来开发了大量的自定义解决方案(附加组件、客户解决方案等)。为了准备迎接新的 Dynamics 365 Business Central 平台,这些解决方案必须迁移到 AL 代码。
如果你有现有的代码库或现有的解决方案,关于将该解决方案迁移到扩展世界,首先可以做的事情是尝试将你的 C/AL 对象转换为 AL。
请记住,转换并不总是最好的做法,它只是一个起点(你可以照原样转换所有新的对象,但你应该注意并重构你现有解决方案中修改过的标准对象,这些对象是你现有解决方案中一定会有的)。
那么,你如何将 C/AL 解决方案转换为 AL 呢?
正如我们在第七章中提到的,使用 AL 进行报表开发,Dynamics 365 Business Central 本地版和 Docker 镜像自带一个工具,可以轻松帮助将 C/AL 对象转换为 AL 对象:Txt2AL.exe
。
使用此工具,你可以指定一系列任何类型的 C/AL 对象,将它们导出为 TXT 格式,并自动转换为 AL 格式。
为了熟练使用此工具,你应该执行以下步骤:
- 使用以下命令,将你新数据库中的所有基础对象导出为 TXT 文件(这里称为
MyBaseline.txt
):
finsql.exe Command=ExportToNewSyntax, File=MyBaseline.txt, Database=\"\", ServerName= ,Filter=Type=table;ID=
ExportToNewSyntax 命令的详细信息请参见:docs.microsoft.com/en-us/dynamics-nav/exporttonewsyntax
。
-
将你的 C/AL 解决方案导入到新创建的数据库中,编译对象,并使用前面的语法将所有新建和/或修改的对象导出到 TXT 文件中(例如,命名为
MyCustomObjects.txt
)。 -
执行
Set-ObjectPropertiesFromMenuSuite
cmdlet,以便从 MenuSuite 信息转换为生成的 AL 文件中的页面和报表(记住:MenuSuite 对象在 Dynamics 365 Business Central 中不可用)。 -
执行
Compare-NAVApplicationObject
cmdlet,以比较基础对象和修改后的对象,并创建包含它们之间差异的.DELTA
文件:
Compare-NAVApplicationObject -OriginalPath \"C:\\MyBaseline.txt \" -ModifiedPath \"C:\\ MyCustomObjects.txt \" -ExportToNewSyntax
- 执行
Txt2AL.exe
工具,使用以下语法:
txt2al –source= --target= --rename --type --extensionStartId --injectDotNetAddIns --dotNetAddInsPackage --dotNetTypePrefix --translationFormat –addLegacyTranslationInfo
以下表格包含了所有Txt2AL.exe
命令参数的描述(其中一些是可选的)。我们来看看每个参数是如何工作的:
--source=Path
.delta
文件的文件夹路径。此参数是必填的。--target=Path
.AL
文件的文件夹路径。此参数是必填的。--rename
.txt
对象。--type=ObjectType
--extensionStartId
--injectDotNetAddIns
--dotNetAddInsPackage=Path
--dotNetTypePrefix
--translationFormat=ObjectType
--addLegacyTranslationInfo
CaptionML
属性的 XLIFF 文件都会被提取。如果设置了此选项,生成的 XLIFF 文件中将添加一个注释,指定翻译项在 C/SIDE 中的 ID。这充当了一个映射,允许你将现有的翻译资源转换到你的应用程序中。现在我们已经解释了将代码从 C/AL 转换为 AL 的工具(Txt2AL),那么我们如何以半自动化的方式将现有的 C/AL 解决方案迁移到基于扩展的架构(AL 语言)中呢?
第一部并且良好的做法是,将现有的 C/AL 解决方案迁移到支持 CSIDE 开发环境和 C/AL 语言的最后一个累积更新(CU)的 Dynamics 365 Business Central 版本:Dynamics 365 Business Central 2019 年春季更新(平台 14.x)。
为了展示半自动化过程,我们将使用带有NavContainerHelper PowerShell 库的 Docker 容器,库可在github.com/microsoft/navcontainerhelper
获取。
创建一个新的 Docker 容器,使用你的 C/AL 解决方案所基于的 Dynamics NAV 版本(在此示例中,我们将使用 Dynamics NAV 2018 CU 16),并将自定义或修改过的 TXT 对象导入此容器。脚本可能如下所示:
# Environment Settings$auth = \"NavUserPassword\"$credential = New-Object pscredential \'admin\', (ConvertTo-SecureString -String \'P@ssword1\' -AsPlainText -Force)$licenseFile = \"C:\\temp\\license.flf\"$demoSolutionPath = \"C:\\ProgramData\\NavContainerHelper\\MyNAVSolution.txt\"*New-NavContainer -accept_eula `* *-imageName \"mcr.microsoft.com/dynamicsnav:2018-cu16\" `* *-containerName \"nav2018\" `* *-licenseFile $licenseFile `* *-auth $auth `* *-Credential $Credential `* *-updateHosts `* *-includeCSide* *# Import and compile objects* *Import-ObjectsToNavContainer -containerName \"nav2018\" -objectsFile $demoSolutionPath* *Compile-ObjectsInNavContainer -containerName \"nav2018\" -filter \"Modified=Yes\"*
现在,运行以下命令:
Export-ModifiedObjectsAsDeltas -containerName \"nav2018\" -openFolder
这将打开一个本地文件夹(通常是C:\\ProgramData\\NavContainerHelper\\Extensions\\nav2018\\delta
),该文件夹包含所有对基础代码的修改(称为deltas)。特别是,运行上述命令后,你将在这个文件夹中找到两种类型的文件:
-
.TXT文件是你的新对象(你可以直接使用它们)。
-
.DELTA文件是修改后的对象。
你应该始终检查.DELTA
文件,因为它们可能包含一些在 AL 中不再支持的自定义代码修改。一个不支持的自定义示例可能是之前直接插入到标准表触发器中的代码,或者写在标准过账程序中的代码。这些代码必须移动并封装在由 Dynamics 365 Business Central 平台本地触发的事件订阅者中(正如我们在第五章中解释的,为 Dynamics 365 Business Central 开发定制解决方案)。
在进行这个(强制性)代码重构之后,我们需要创建一个 Dynamics 365 Business Central 容器(在这里称为d365bc
),并且我们需要导入对象的增量。
脚本如下:
*# Environment Settings* *$imageName = \"mcr.microsoft.com/businesscentral/onprem:ltsc2019\"**$auth = \"NavUserPassword\"* *$credential = New-Object pscredential \'admin\', (ConvertTo-SecureString -String \'P@ssword1\' -AsPlainText -Force)* *$licenseFile = \"C:\\temp\\license.flf\"* *# Create Dynamics 365 Business Central container* *New-NavContainer -accept_eula `* *-imageName $imageName `* *-containerName \"d365bc\" `* *-licenseFile \"C:\\temp\\license.flf\" `* *-auth $auth `* *-Credential $Credential `* *-updateHosts `* *-includeCSide**# Import and compile Delta files* *Import-DeltasToNavContainer -containerName \"d365bc\" -deltaFolder \"C:\\ProgramData\\NavContainerHelper\\Extensions\\nav2018\\delta\"* *Compile-ObjectsInNavContainer -containerName \"d365bc\" -filter \"Modified=Yes\"*
现在,你有了一个包含 C/AL 解决方案的容器,在其中你可以测试你的代码,并且(最终)反复重构它。之前创建的 NAV 容器现在可以通过执行以下命令从系统中移除:
Remove-NavContainer -containerName nav2018
现在,我们准备好开始处理我们的基于 AL 的新解决方案。
在为 Dynamics 365 Business Central 开发(或迁移现有解决方案)应用程序时,我们现在有两种可能的情况:
-
C/AL 到 AL 的转换(不需要对标准基础对象进行修改,以支持产品的 SaaS 版本)
-
C/AL 到 AL 的代码自定义(基础 AL 对象将被更改;这仅适用于本地环境)
在接下来的章节中,我们将学习如何在这两种 C/AL 到 AL 的情况下进行操作。
C/AL 到 AL 转换
在这里,我们需要创建一个包含我们 AL 解决方案的 Dynamics 365 Business Central 开发容器。这个容器不再支持 C/AL。创建这个容器的脚本如下:
*# Environment Settings* *$imageName = \"mcr.microsoft.com/businesscentral/onprem-ltsc2019\"* *$auth = \"NavUserPassword\"* *$credential = New-Object pscredential \'admin\', (ConvertTo-SecureString -String \'P@ssword1\' -AsPlainText -Force)* *$licenseFile = \"C:\\temp\\license.flf\"**# Create Business Central container* *New-NavContainer -accept_eula `* *-imageName $imageName `* *-containerName \"d365bcdev\" `* *-licenseFile $licenseFile `* *-auth $auth `* *-Credential $Credential `* *-updateHosts*
现在,你已经有了一个可用的 Dynamics 365 Business Central 容器,不再包含我们将在接下来的步骤中使用的 C/AL 工具。
现在,打开 Visual Studio Code,创建一个新的 AL 项目(CTRL + Shift + P,然后选择AL:GO!),给它命名(这里命名为MyALSolution
),并修改你的解决方案中的launch.json
文件,以便连接到这个容器(这里容器名为d365bcdev
)。
在 PowerShell 中执行以下命令:
Convert-ModifiedObjectsToAl -containerName \"d365bc\" -sqlCredential $credential -alProjectFolder \"C:\\Packt\\MyALSolution\"
NavContainerHelper
模块有一个名为Convert-ModifiedObjectsToAl
的功能,允许你从选定的容器中导出所有修改过的对象(如果需要,你也可以应用对象过滤器),然后对结果文件运行Convert-Txt2Al
命令。执行该命令后,你将得到一个文件夹(由-alProjectFolder
参数指定),其中包含许多在从 C/AL 基础解决方案转换过程中生成的.al
文件。
输出结果不会始终达到 100%的完美;你需要做一些重构,并且需要为你的对象添加ApplicationArea
和UsageCategory
属性,但主要工作已经完成。现在,你可以编译你的 AL 解决方案并将其部署到你的d365bcdev
容器中。因此,你的解决方案是一个 100%的 AL 扩展,运行在 Dynamics 365 Business Central 上。
C/AL 到 AL 代码自定义
在将 C/AL 解决方案转换为 AL 时,你可能还会遇到一些必须严格修改标准 AL 代码的情况(我们建议尽量避免这样做,因为如果修改了微软的基础代码,你的解决方案将无法迁移到 Dynamics 365 Business Central 的 SaaS 环境中)。让我们开始吧:
- 如果你遇到这种情况,可以通过
-includeAL
选项创建一个 Dynamics 365 Business Central 开发容器(d365bcdev
):
*# Environment Settings* *$imageName = \"mcr.microsoft.com/businesscentral/onprem-ltsc2019\"* *$auth = \"NavUserPassword\"* *$credential = New-Object pscredential \'admin\', (ConvertTo-SecureString -String \'P@ssword1\' -AsPlainText -Force)* *$licenseFile = \"C:\\temp\\license.flf\"**# Create Business Central container* *New-NavContainer -accept_eula `* *-imageName $imageName `* *-containerName \"d365bcdev\" `* *-licenseFile $licenseFile `* *-auth $auth `* *-Credential $Credential `* *-updateHosts `* *-includeAL*
执行该命令时,你将会在一个新的文件夹中找到包含 AL 对象基线的文件夹,文件夹名称为Original---al
(例如,C:\\ProgramData\\NavContainerHelper\\Extensions\\Original-14.0.29537.0-W1-al
)。
- 现在,你可以使用从上一步中获取的所有基础 AL 对象创建一个新的 AL 项目。你可以通过执行以下脚本自动完成这一步:
Create-AlProjectFolderFromNavContainer -containerName \"d365bcdev\" -alProjectFolder \"C:\\ProgramData\\NavContainerHelper\\AL\\MyALSolution\" -useBaseLine -addGIT
在前面的代码中,我们使用了以下两个参数:
-
-
-useBaseline
选项用于将.AL
基础文件复制到我们的 AL 解决方案项目中。 -
-addGit
选项会在该文件夹创建一个离线 Git 仓库,并提交所有对象(你需要先安装 Git)。
-
- 现在,你可以使用 Visual Studio Code 打开这个文件夹,并在不发布的情况下编译解决方案(或者使用Ctrl + Shift + B快捷键)。这个编译过程可能需要几分钟。你也可以通过执行以下命令在不打开 Visual Studio Code 的情况下编译解决方案:
Compile-AppInNavContainer -containerName \"d365bcdev\" -credential $credential -appProjectFolder \"C:\\ProgramData\\NavContainerHelper\\AL\\MyALSolution\"
在编译过程中,你可能会看到一些弃用警告。编译后,你需要将这些修改提交到本地 Git 仓库。
现在你拥有一个完整的 AL 应用(包含所有标准 AL 对象)。
在下一步中,你需要将容器数据库中的 C/AL 对象替换为这个新编译的 AL 应用。为此,执行以下命令:
Publish-NewApplicationToNavContainer -containerName \"d365bcdev\" -appDotNetPackagesFolder \"C:\\ProgramData\\NavContainerHelper\\AL\\MyALSolution\\.netpackages\" -appFile \"C:\\ProgramData\\NavContainerHelper\\AL\\MyALSolution\\output\\SD_myalapp_1.0.0.0.app\" -credential $credential -useCleanDatabase
Publish-NewApplicationToNavContainer
是一个 cmdlet,卸载数据库中的所有应用,移除所有 C/AL 对象,并使用容器的开发端点发布新的 .app
文件。我们使用 -useCleanDatabase
标志来移除 C/AL 对象并卸载现有的应用。
现在你已经有了运行完整 AL 基础应用的 Docker 容器,你需要导入你的 AL 自定义解决方案(扩展)。为此,执行以下命令:
Convert-ModifiedObjectsToAl -containerName \"d365bc\" -sqlCredential $credential -doNotUseDeltas -alProjectFolder \"C:\\Packt\\MyALSolution\" -alFilePattern \"*.al,*.xlf\"
这将在你之前导入自定义 C/AL 解决方案的容器上运行(这里称为d365bc
)。现在,转换将作用于所有对象(完整的数据库,报表布局文件除外)。
完成此步骤后,你将拥有一个完整的基础应用,里面包含你的自定义对象和修改的标准 .AL
对象。你现在可以编译这些对象并将它们部署到你的 Dynamics 365 Business Central 容器中进行测试。你现在拥有一个代码定制的 AL 解决方案(再次建议如果可能的话避免这样做)。
这是如果你希望开始代码转换所需的步骤。通常,请记住始终以 SaaS 环境作为参考和目标点。
从 Dynamics 365 Business Central 版本 14 升级到版本 15
微软推荐的迁移路径是从已迁移到版本 14 的解决方案开始(迁移到版本 14 和 AL 是第一步),将你的解决方案迁移到新的重构版 Dynamics 365 Business Central 版本 15。
微软的官方迁移路径如下图所示:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/3b8b45c6-8feb-4620-b96b-1a7d03c3b8af.png
更多信息可以参考 docs.microsoft.com/en-us/dynamics365/business-central/dev-itpro/upgrade/upgrade-overview-v15
。
要从版本 14 数据库开始进行技术升级到版本 15,你可以执行以下 PowerShell 命令:
Invoke-NAVApplicationDatabaseConversion -DatabaseServer \\ -DatabaseName \"\"
转换将更新数据库的系统表到新的模式(数据结构),并提供最新的平台功能和性能提升。
对于迁移到版本 15,详细步骤可以参考以下官方 Microsoft 页面:
-
将未修改的应用程序升级到 Dynamics 365 Business Central 2019 Release Wave 2:
docs.microsoft.com/en-us/dynamics365/business-central/dev-itpro/upgrade/upgrade-unmodified-application
。 -
升级到 Dynamics 365 Business Central 2019 Wave 2 的技术升级:
docs.microsoft.com/en-us/dynamics365/business-central/dev-itpro/upgrade/upgrade-technical-upgrade-v14-v15
。
在下一节中,我们将探讨在为新的 Dynamics 365 Business Central 平台架构解决方案时需要考虑的另一个重要方面:如何处理客户定制需求。
处理客户特定的个性化需求
你已经付出了很大的努力,现在你的解决方案已经完成了从旧的 C/AL 到新扩展架构的迁移。现在,通常的商业场景是你将解决方案卖给客户:他们希望对你的解决方案做一些特定的定制,以满足他们的特定业务需求。在这里,我们立刻遇到一个问题:你如何处理客户的定制需求?
扩展模型有一些规则,你需要绝对避免以下图示所代表的情况:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/6bdb7c85-5a7f-4c9c-8d01-a6d89d1c9dc8.png
在前面的图示中,我们可以看到 EXT BASE 是标准解决方案,它的基础代码为每个购买该解决方案的客户所修改。
你不需要为每个客户直接定制你的扩展代码。分叉(Forking)你的解决方案基础代码绝对是一个坏习惯(它违反了扩展的原则;也就是说,基础代码永远不应被修改)。
你需要做的事情如以下图所示:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/b801ecb5-cf9f-4539-ac80-d1af396bfff7.png
在这里,你的扩展基础代码(在前面的图示中称为 EXT BASE)对于每个客户都是相同的。为了处理每个客户的定制需求,你需要为每个客户创建一个新的扩展(在前面的图示中称为 CUSTOM EXT),该扩展将会依赖于你的基础扩展(它将是标准层之上的新一层)。这是最佳实践,也是扩展模型的要求:你不修改基础代码,而是扩展基础代码。那么,除了这些,我们还需要记住其他哪些扩展方案呢?让我们一起来看看。
其他需要记住的事项
在将解决方案迁移到扩展时,还有其他需要记住的事项,以及你需要处理或重新考虑的方面。在接下来的章节中,你将看到一些最常见事项的总结。
处理 MenuSuite
在 Dynamics NAV 中,通过将页面和报告添加到 MenuSuite 对象(一个定义应用程序功能菜单的标准对象)中,Web 客户端可以对其进行搜索。而在 Dynamics 365 Business Central 中,MenuSuite
对象不再受支持,页面和报告可以通过设置 UsageCategory
和 ApplicationArea
属性来进行搜索和显示。
如果您从 C/AL 转换对象,则需要在转换的对象上设置这些属性。您可以使用名为TransitionMenuSuiteObjectsForSearch.psm1
的 PowerShell 模块自动设置对象上的这些属性,该模块可以在 Dynamics 365 Business Central DVD 映像中找到。
您可以在 PowerShell 中导入此模块,如下所示:
Import-Module -Name c:\\dvd\\WindowsPowerShellScripts\\WebSearch\\TransitionMenuSuiteObjectsForSearch.psm1
然后,执行以下命令:
Set-ObjectPropertiesFromMenuSuite -RoleTailoredClientFolder \"C:\\Program Files (x86)\\Microsoft Dynamics NAV\\140\\RoleTailored Client\" -DataBaseName \"YourDatabase\" -OutPutFolder \"C:\\temp\"
现在,在所有转换的对象上设置了UsageCategory
和ApplicationArea
。
.NET 变量和插件
如果您的现有代码使用.NET 变量,则这些对象不支持在 SaaS 环境中使用。如果要在 SaaS 上使用.NET,您需要将 DLL(或您的.NET 代码)包装到 Azure 函数中,并从 AL 代码中调用该函数。第六章中描述的高级 AL 开发和第十三章中描述的Serverless Business Processes with Business Central and Azure展示了如何处理这些情况。
如果你的扩展目标是在本地环境中(在app.json
文件中Target = Internal
),那么你可以在 AL 代码中使用.NET 程序集(但这些代码永远不能移到 SaaS 环境中)。关于如何在本地环境中使用.NET 变量的更多信息,请参见docs.microsoft.com/zh-cn/dynamics365/business-central/dev-itpro/developer/devenv-get-started-call-dotnet-from-al
和demiliani.com/2019/06/04/dynamics-365-business-central-using-dotnet-assemblies-on-a-docker-container-sandbox/
。
如果您的解决方案使用.NET 可视化插件,可能会遇到另一个问题,比如以下的销售订单页面:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/215a0c59-d19a-47fc-9fda-d4dd4c9a4dc2.png
下面是我们实施的自定义销售订单页面,它使用了在 C/AL 中声明的.NET Windows Presentation Foundation(WPF)插件:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/6212ecff-1f2c-43ab-9e5f-c1c22a769daa.png
要将此解决方案移植到 Dynamics 365 Business Central,您需要将可视化插件重做为 JavaScript 插件,如第六章中描述的高级 AL 开发。
文件管理
在 Dynamics 365 Business Central 中,仅支持本地环境中的文件处理。如果您的目标是 SaaS 环境,您应该通过使用流(如第六章中描述的高级 AL 开发的处理文件部分)或通过使用Azure Functions进行文件存储(在第十三章中描述的Serverless Business Processes with Business Central and Azure中提供了一个完整的解决方案)来处理文件。
打印
在 SaaS 环境中,无法进行直接打印(将文档直接发送到本地网络上的打印机)。一个可能的解决方案在这里描述:demiliani.com/2019/01/29/dynamics-365-business-central-and-direct-printing/
。
微软也在努力支持在不久的将来在 SaaS 环境中进行直接打印。wave 2 发布将包含一个名为 OnDocumentReady
的新报告事件,该事件暴露了文档的数据流和上下文。文档随后可以由能够处理打印的扩展程序拾取。
在下一节中,我们将学习 Dynamics 365 Business Central wave 2 发布架构如何在不久的将来影响你扩展的开发。
Dynamics 365 Business Central wave 2 发布变更
Dynamics 365 Business Central Wave 2 发布(平台 15)仅支持 AL 和 Web 客户端。你将不再找到对 C/AL 和 CSIDE 的支持。相反,如果你访问 Dynamics 365 Business Central 平台 15 中的 扩展管理 页面,你将看到以下两个微软扩展:
-
基础应用程序(版本 15.0..0):此扩展包含所有已迁移到 AL 的业务逻辑。
-
系统应用程序(版本 15.0..0):此扩展处理系统层。
除了简化整个代码库外,这种新结构的主要好处是,你可以摆脱代码定制,开始基于 Dynamics 365 Business Central 平台进行垂直或水平解决方案的开发。你可以设置一个预备环境,并通过以下两个官方文章来练习新版本中将正式引入的破坏性变更:
-
freddysblog.com/2019/07/31/preview-of-dynamics-365-business-central-2019-release-wave-2/
-
freddysblog.com/2019/08/02/organizing-your-al-files/
所有你为 Dynamics 365 Business Central 创建的新扩展必须依赖这些微软应用。在 Visual Studio Code 中,当你启动一个新的扩展项目时,你需要将以下依赖项添加到扩展的 app.json
文件中:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/cd5c9587-9274-4420-ad9b-b567ee02e403.png
如果你在 Visual Studio Code 中选择 4.0 作为目标平台,这些依赖项将自动添加。
之后,你可以从你的环境中下载符号并开始编码:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/b4784bfd-5470-48ae-93c3-74d86a979dc5.png
这是为 SaaS 和本地环境开发扩展的推荐方式。
在 Dynamics 365 Business Central 的第二波发布中,微软允许你修改基础代码(现在,所有代码已完全转换为 AL),本节开头的链接解释了如何将.al 文件提取到本地文件夹,并开始在这些文件上工作,以创建你自己的自定义BaseApp。
作为一个例子,这里我直接通过添加一个自定义函数来修改标准的Sales-Post代码单元:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/d0272c1a-d4c7-4e33-8c51-fa27c6c47e7d.png
更多关于如何修改Base Application的信息可以在这里找到:demiliani.com/2019/09/24/dynamics-365-business-central-wave-2-customizing-the-base-application/
。
正如我们之前提到的,许多社区专家的来源中提到,仅仅因为你可以,并不意味着你应该。修改基础代码实际上是被允许的,以帮助合作伙伴尽快将解决方案迁移到 AL 和新平台,但从长远来看,本地部署将遵循云规则,因此,微软的基础代码修改在未来可能会变得更加严格。
在新平台上,你还可以在System Application本身之上构建扩展。只需移除BaseApp的依赖,下载一些符号,就可以开始了。如下面的截图所示,现在,你只下载了两个应用包(没有 BaseApp):
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/2b366d94-43f0-4e54-b17b-9f17826d977f.png
现在,你可以开始编写仅依赖于System Application的扩展。
System Application实际上是一个正在进行的工作,未来可能会有所变化(将添加新的模块)。最新版本始终可以在 GitHub 上找到:github.com/Microsoft/alappextensions
。
如你在本节中看到的,从 Dynamics 365 Business Central 15.x 平台开始,所有的基础代码都已经迁移到 AL,你需要使用 AL 和 Visual Studio Code 来创建扩展,从 Microsoft 的基础和系统应用开始。
总结
在本章中,我们研究了将现有的单体 C/AL 解决方案迁移到新的扩展架构和 AL 语言的最佳实践。我们还看到了架构你的解决方案的最佳实践,比如如何以半自动化的方式将现有的 C/AL 代码转换为 AL,以及在迁移现有解决方案的过程中如何处理常见问题。
在本章的末尾,你学习了如何迁移到新的 Dynamics 365 Business Central 平台,以及在开始新解决方案的项目时应采用的最佳实践。现在,你已经清楚地了解了迁移现有代码到 AL 的工具,并知道了开始这一迁移活动所需的步骤。
在下一章,我们将学习第三方工具如何帮助我们使用 AL 和扩展,也将帮助我们将现有解决方案迁移到新的 Dynamics 365 Business Central 架构。
第十八章:对 AL 开发者有用且高效的工具
在上一章中,我们提供了将现有 ISV 解决方案迁移到基于扩展的全新 Dynamics 365 Business Central 开发模型的一些指导和最佳实践。
在使用扩展和 Visual Studio Code 时,拥有正确的工具可以节省大量的时间和精力。在本章中,我们将概述一些你可以在日常开发中使用的第三方开发工具,帮助你在 AL 开发中更加高效。我们将重点介绍微软 Dynamics ERP 世界中著名人物 Waldo 开发的工具。
本章将涵盖以下内容:
-
Waldo 是谁?
-
使用哪些工具
Waldo 是谁?
Waldo 的真实姓名是 Eric Wauters,他是 iFacto Business Solutions 和 Cloud Ready Software 的创始合伙人之一。凭借 18 年的技术经验,他每天都为开发团队提供灵感。作为开发经理,他持续推动 iFacto 和 CRS 的技术准备工作。
除此之外,Eric 还非常活跃于 Microsoft Dynamics 365 Business Central 社区,他在其中尝试解决技术问题,并与其他 Dynamics 爱好者分享知识。相信很多人都读过 Eric 的帖子,他通常都会署名 waldo
。
许多人使用并且还为他在 MiBuSo、GitHub、PowerShell Gallery 和 Visual Studio Marketplace 上免费分享的工具做出了贡献。
他凭借卓越的成绩,每年自 2007 年以来都获得了 微软最有价值专家 (MVP) 奖项。
了解了 Waldo 后,在下一部分中,我们将概述他为 AL 开发者提供的大多数工具。
使用哪些工具
多年来,Waldo 创建了许多工具。Waldo 第一个上线的工具是在 2004 年发布的 WaldoNavPad
,它是一个帮助在 Microsoft Dynamics NAV 中处理大文本的工具。它帮助将代码拆分成更小的部分,因为当时我们在一个字段中只能输入最多 250 个字符。
该工具在 MiBuSo 上已被下载超过 11,000 次。由于它的受欢迎程度,Waldo 将工具更新到了一个适用于 RTC 和作为 AL 扩展的版本,并在功能上进行了扩展,使其在 Business Central 内部拥有了一个 HTML 编辑器。
紧随其后的是一些较小的工具,它们被添加到了 MiBuSo 的下载列表中,你可以在 mibuso.com/downloads/results?keywords=waldo
找到这些工具。
自 2013 年微软发布越来越多的 PowerShell 构建模块以来,Waldo 决定深入研究,帮助社区的采用。这导致了一些非常广泛的辅助功能库,这些库经过分类并发布在 PowerShell Gallery 上。只需搜索waldo
(www.powershellgallery.com/packages?q=waldo
),你将找到六个 PowerShell 模块:
-
Ready.Software.SQL
:这些包括一些帮助你与 SQL Server(和 Business Central)一起工作的功能,例如备份和恢复。 -
Ready.Software.PowerShell
:这是一个非常小的函数集合,用于一些 PowerShell 相关的挑战。 -
Ready.Software.Windows
:这些包括与 Windows 相关的功能,如压缩和解压缩文件。 -
Ready.Software.NAV
:这个模块包含了大多数功能,全部与 NAV(Business Central)相关:-
与对象的工作(升级、版本列表、语言等)
-
与服务器的工作(例如权限和公司)
-
-
RemoteNAVDockerHostHelper
:这是一个帮助你在DockerHost
不在本地 PC 上的时候使用DockerHost
的模块(因此Remote
出现在RemoteNAVDockerHost
中)。 -
NavContainerHelperExtension
:这只是 Waldo 为了与 Docker 一起工作而创建的一组功能。类似于NavContainerHelper
,这些功能在当时创建时并不属于那个模块。
所有这些功能在 Waldo 作为开发人员的生活中都有一定的目的。他使用这些模块的每个脚本都在线上 GitHub 上: github.com/waldo1001/Cloud.Ready.Software.PowerShell
。你可以在这里找到所有模块和他将这些模块应用到的脚本。
许多这些 PowerShell 脚本的创建是为了帮助开发 V1 扩展。然而,当这些扩展被终止(为了更好的发展)时,一个新的工具出现了:Visual Studio Code,在这里我们可以开发我们称之为扩展 V2 的东西。在 Waldo 看来,这个工具在以下方面需要一些帮助:
-
自动命名文件
-
运行对象
-
代码片段
所以,Waldo 开始为 Visual Studio Code 构建一个扩展,帮助 AL 开发人员更加高效地完成工作。CRS AL 语言扩展应运而生:marketplace.visualstudio.com/items?itemName=waldo.crs-al-language-extension
。
这只是对 Waldo 工具的一个简短介绍,以及他是如何构建这些工具的。以下是一些你可以找到他工具的资源:
-
MiBuSo:
mibuso.com/downloads/results?keywords=waldo
-
PowerShell Gallery:
www.powershellgallery.com/packages?q=waldo
-
GitHub:
github.com/waldo1001
-
DevOps:
dev.azure.com/waldo1001/WaldoDemos
在这一章中,我们将讨论他的一些工具,重点是让你作为 AL 开发者的工作变得更加轻松。
AL 扩展包
Waldo 曾经构建的最小工具是 Visual Studio Code | 扩展包。事实上,它是 Waldo 在日常开发任务中使用并重视的所有 Visual Studio Code 扩展的集合。
你可以在 Marketplace 中找到这个扩展包,名称为 AL 扩展包。这里是直接链接:
marketplace.visualstudio.com/items?itemName=waldo.al-extension-pack
这是主页的样子:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/7bdff342-32f5-41cd-bae4-1caa35c34866.png
只需安装此扩展,它将自动安装包中的所有扩展,当 Waldo 添加新的扩展时,它也会自动安装到你的系统中。
如果你想拥有一个功能完备的 Visual Studio Code 环境,我们强烈推荐安装一个类似的包:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/07f95b71-c4e3-45a8-b9bf-df374bca0b2b.png
你可以通过以下链接找到这个工具:
marketplace.visualstudio.com/items?itemName=StefanoDemiliani.sd-extpack-d365bc
CRS AL 语言扩展
Waldo 为社区编写的一个稍大的扩展是CRS AL 语言扩展:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/e3d26504-2b2e-4ebd-90c8-0b9e5b9c9f94.png
可以通过以下链接找到此扩展:
marketplace.visualstudio.com/items?itemName=waldo.crs-al-language-extension
许多人使用它的主要原因是它管理文件名约定:开发人员不再需要担心如何命名文件——这个扩展可以自动处理这个问题。但它还做了很多其他事情。
让我们来概览一下它的功能。
运行对象
我们都知道,我们可以通过修改launch.json
文件中的一些设置,在发布应用时运行表或页面,但这并不方便。
从某种意义上讲,我们需要能够做到以下几点:
-
运行 Windows、Web、平板或手机客户端中的任何对象。
-
直接运行一些工具,例如以下内容:
-
测试工具
-
事件订阅者
-
数据库锁定页面
-
-
运行当前在客户端中打开的对象。
launch.json
方式运行对象在这里帮不上忙。
CRS AL 语言扩展带有这些新命令,可以在命令面板中找到:
-
CRS: 运行对象(Web 客户端)。
-
CRS: 运行对象(平板客户端)。
-
CRS: 运行对象(手机客户端)。
-
CRS: 运行对象(Windows 客户端)。
-
CRS:运行当前对象(Web 客户端)(Ctrl + Shift + R)——此命令会运行打开文件中的对象(扩展需要先发布)。你也可以从状态栏(在 Web 客户端中运行)和资源管理器的上下文菜单运行此命令。
-
CRS:在 Web 客户端中运行 CAL 测试工具。
-
CRS:在 Web 客户端中运行事件订阅页面。
-
CRS:在 Web 客户端中运行数据库锁页面。
好的一点是,它会在 launch.json
中找到设置并使用这些设置来运行实际的对象。
重命名/重新组织文件
如前所述,这是该工具最广泛使用的功能:
-
重命名
是仅重命名文件。 -
重新组织
是重命名文件并且
将其放入与对象类型匹配的子文件夹中。
本质上,这些命令被归纳为四个命令,可以通过 Visual Studio Code 命令面板再次访问:
-
CRS:重命名 - 当前文件。
-
CRS:重命名 - 所有文件。
-
CRS:重新组织 - 当前文件。
-
CRS:CRS:重新组织 - 所有文件——请注意,
重新组织
将会把测试代码单元移动到测试文件夹。
还有一个设置,可以在保存 .al
文件时自动启动文件重命名/重新组织:
\"CRS.OnSaveAlFileAction\": \"Rename\"
重命名/重新组织的另一个有趣功能是能够更改文件名模式:
\"CRS.FileNamePattern\": \"..al\", \"CRS.FileNamePatternExtensions\": \".-Ext.al\", \"CRS.FileNamePatternPageCustomizations\": \".-PageCust.al\"
这是所有可用工具设置的概览:
-
CRS.nstfolder
:这是 NST 的文件夹。 -
CRS.WebServerInstancePort
:这是 Web 客户端的端口号。 -
CRS.WinServer
:这是 Windows 客户端连接的服务器。 -
CRS.WinServerInstance
:这是 Windows 客户端连接的服务器实例。 -
CRS.WinServerInstancePort
:这是 Windows 客户端连接的服务器实例的端口号。 -
CRS.PublicWebBaseUrl
:如果需要运行来自 VS Code 的对象,可以通过此设置覆盖Launch.json
设置。 -
CRS.ExtensionObjectNamePattern
:这是对象名称的模式;如果设置了(默认未设置),它将为扩展对象执行自动命名:-
-
-
-
:对象类型的简短表示
-
:与
ObjectTypeShort
相同,但为大写字母 -
-
:移除奇怪的字符——不包括前缀或后缀
-
:不包括前缀或后缀
-
:如果你希望此功能正常工作,你需要在基本名称后加上
Id
注释
-
-
CRS.FileNamePattern
:这是非扩展对象文件名的模式。可以使用以下变量:-
:仅单独的前缀
-
:仅单独的后缀
-
-
:对象类型的简短表示
-
:与
ObjectTypeShort
相同,但为大写字母 -
-
:移除奇怪的字符,包括前缀和后缀
-
-
-
CRS.FileNamePatternExtensions
:这是扩展对象文件名的模式。可以使用以下变量:-
:仅单独的前缀
-
: 仅后缀部分
-
-
: 对象类型的简短表示
-
: 与
ObjectTypeShort
相同,但为大写字母 -
-
: 移除奇怪字符,包括前缀和后缀
-
-
: 移除奇怪字符,但不包括前缀和后缀
-
: 不包括前缀和后缀
-
: 如果希望此功能生效,您需要在基本名称后面加上
Id
注释,如本例所示:
-
tableextension 50100 \"Just Some Table Extension\" extends Customer //18{ fields { // Add changes to table fields here field(50100;\"Just Some field\";Code[10]){ TableRelation=\"Just Some Table\".\"No.\"; } } }
-
CRS.FileNamePatternPageCustomizations
: 这是页面自定义文件名的模式。可以使用以下变量:-
: 仅前缀部分
-
: 仅后缀部分
-
-
: 对象类型的简短表示
-
: 与
ObjectTypeShort
相同,但为大写字母 -
: 移除奇怪字符——包括前缀和后缀
-
: 包含前缀和后缀
-
: 移除奇怪字符,不包括前缀和后缀
-
: 不包括前缀和后缀
-
: 与之前的说明相同
-
-
CRS.ObjectNamePrefix
: 使用重组/重命名命令时,此设置将确保对象名称(和文件名)有前缀:-
提示 1:将其用作工作区设置
-
提示 2:如果希望前缀与后缀之间有空格,请使用结束空格
-
-
CRS.ObjectNameSuffix
: 使用重组/重命名命令时,此设置将确保对象名称(和文件名)有后缀:-
提示 1:将其用作工作区设置
-
提示 2:如果希望后缀与前缀之间有空格,请使用起始空格
-
-
CRS.RemovePrefixFromFilename
: 使用重组/重命名命令时,此设置将移除文件名中的任何前缀(但保留在对象名称中)。提示:将其用作工作区设置。 -
CRS.RemoveSuffixFromFilename
: 使用重组/重命名命令时,此设置将移除文件名中的任何后缀(但保留在对象名称中)。提示:将其用作工作区设置。 -
CRS.AlSubFolderName
: 这是可变子文件夹名称。“None”表示您希望禁用将文件移动到子文件夹的命令。 -
CRS.OnSaveAlFileAction
: 此操作将自动重命名/重组您正在编辑的文件。它也会考虑前缀和后缀。 -
DisableDefaultAlSnippets
: 禁用随Microsoft.al-language
扩展提供的默认片段。更改此设置后,您需要重启 Visual Studio Code 两次——第一次是禁用激活时的片段(此时片段仍然加载),第二次是彻底不再加载片段。 -
DisableCRSSnippets
: 禁用随此扩展提供的 CRS 片段。更改此设置后,您需要重启 Visual Studio Code 两次——第一次是禁用激活时的片段(此时片段仍然加载),第二次是彻底不再加载片段。 -
RenameWithGit
:使用git mv
重命名文件。这样可以保留文件的历史记录,但会暂存重命名,你应该单独提交它。该功能仍处于预览模式,因此默认值为false
。
在 Google/Microsoft 文档上搜索
一个小的新增功能,但在编码时非常方便,能够通过命令面板中的两个新命令轻松查找文档:
-
CRS:搜索 Microsoft 文档
-
CRS:搜索 Google
它将获取选中的单词,并在 Google 或 Microsoft Docs 上搜索该单词,以 Business Central 作为主要话题。
代码片段
最后但绝对不容忽视的是,多个代码片段已包含在 CRS AL 语言扩展中。
首先,Microsoft 的代码片段已经得到了改进:
-
删除了未使用的触发器
-
改进了制表符停靠
-
改进了无法编译的代码
-
删除了默认全局变量
还有一些新的代码片段实现了某些默认设计模式:
-
tmynotifications
(CRS):为你自己的通知实现我的通知功能 -
tassistedsetup
(CRS):为你自己的向导实现辅助设置功能 -
tcodeunit
(CRS 方法):用于实现默认封装方法设计模式的代码片段,默认实现OnBefore
和OnAfter
事件
探索所有代码片段并熟悉它们是件好事。
反馈
如果你有反馈,或者你想为这个项目做贡献,请不要犹豫,分叉或者在 GitHub 上的 CRS AL 语言扩展的代码库中创建问题,你可以在github.com/waldo1001/crs-al-language-extension
找到它。
WaldoNavPad
WaldoNavPad
的目标一直是能够轻松处理无限量的文本,通过将文本轻松分割成多个片段,以便将其保存在 Business Central(或 NAV)数据库中(不仅仅是将其作为 BLOB 保存,而是以文本形式保存),这样你仍然可以过滤和搜索文本的部分内容。
在此基础上,文本应该智能地分割,保留段落、换行符和完整的单词。这仍然尽可能地保留文本格式,使其在 NAV 所能使用的小字段长度中尽可能可读。
如何使其正常工作
WaldoNavPad
的最新版本可以在 Waldo 的 GitHub 上找到:
github.com/waldo1001/Waldo.NAV.Pad
它可以轻松地从那里下载、分叉或克隆。
如果你这么做,你将拥有一个实现了WaldoNavPad
的应用程序的 AL 代码:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/faca539c-f2cb-414d-b467-c26cd6788c2c.png
这组文件旨在允许你复制、重新编号、重命名,并对自己的项目进行更多操作。它并不打算作为一个应用程序创建,也没有上传到 AppSource,因此你可以将它作为你自己应用程序的依赖项使用。
第一次运行应用程序
一旦进入 Visual Studio Code,应用程序按原样构建并发布。你只需创建 launch.json
,下载符号,并立即构建应用程序。这将带你到客户列表页面,其中有以下两个新操作:
-
打开 WaldoNAVPad 文本:一个常规页面,包含一个多行文本框来处理大文本
-
打开 WaldoNAVPad HTML:一个基于 JavaScript 的 HTML 编辑器(基于 TinyMCE)
操作显示如下:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/b24d2744-2bcb-4d55-8565-6025b7f082f5.png
这是常规页面上的文本编辑器:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/3b240969-8ba7-4843-a79c-5136e374638e.png
HTML 文本编辑器如下:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/e0f3bda7-fe66-48f4-a6b9-13999d65efef.png
接下来,让我们看看文本的背景是如何显示的。
背景
当你深入查看代码时,你会看到应用程序由两部分组成:
-
NAVpad 处理:此子文件夹包含处理 NAVpad 的代码。其思路是你只使用
WaldoNAVPad
类代码单元,在其中你可以展示/保存/获取来自 NAVpad 的文本。为了保存文本,它将使用文本处理功能。 -
文本处理:此子文件夹包含用于智能处理需要保存到数据库或从数据库加载的文本的代码。如果你想使用 NAVPad 文本表格,则无需使用这些方法。然而,如果你想将文本保存到自己的表格中,你可以直接使用
WaldoNAVPad
文本类代码单元中的函数,这些函数允许你获取文本并循环处理它,将其保存到你自己的表格中。
通过循环处理文本,系统会在空格或回车符处切割句子,尽量保留文本的格式。
在下面的示例中,你可以看到 NAVPad 处理程序通过循环文本来保存文本:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/075dd6a5-8ce8-4105-80a4-d7e9bb82f053.png
默认情况下,系统将文本保存到两个表格中:
-
WaldoNAVPad
二进制大对象存储:这是一个包含格式化 HTML 标签的表格,用于保留用户对文本所做的所有格式化。 -
WaldoNAVPad
文本存储:这是一个表格,其中所有 HTML 标签都被去除,以便能够在 Business Central 中体面地显示。
为了显示这些表格的内容,应用程序在 _JustForTexting
文件夹中有两个页面:
-
页面 82,150 WaldoNAVPad 二进制大对象
-
页面 82,149 WaldoNAVPad 文本
这是运行名为 WaldoNAVPad 文本的页面时,记录如何被保存的示例:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/2e2ea6a1-8cd2-48f0-9c5b-5d7e275c55c9.png
接下来,我们将看到如何实现这些操作。
实现逻辑
为了向你展示如何在自己的业务逻辑中实现这一点,应用程序有一个 _JustForTesting
子文件夹,包含页面 22(客户列表)的页面扩展,展示了如何在页面上简单地创建一个操作,并通过调用类函数实现 WaldoNAVPad
:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/adfbdb05-5721-4fab-806c-960572909af2.png
Initialize
函数将加载与当前记录关联的文本。ShowAndSaveTexts
方法将在用户选择查看时,显示文本(在这种情况下,是在 HTML 编辑器中)。
MostUselessAppEver
Waldo 有一个并非特别重要,但相当有趣的仓库,名为 最无用的应用程序。它是一个 AL 应用程序,旨在用于演示、原型设计、试验或测试——你可以任意定义。它包含了 AL 开发中许多不同部分和主题的尝试和演示。
以下是几个示例:
-
翻译
-
不同的 .NET 封装
-
一些与 Visual Studio Code 配合使用的编辑技巧
-
包含 SQL 文件以检查应用程序的表
-
发布 Web 服务
-
包含用于检查 Web 服务的 HTTP 文件
-
函数重载
-
租户管理代码单元
你可以在 Waldo 的 GitHub 上找到 MostUselessAppEver
:github.com/waldo1001/MostUselessAppEver
。
你可以简单地克隆仓库并开始使用。这里没有一块有用的业务逻辑,但它会向你展示一些关于 AL 开发的技巧。
PowerShell 工具
如前所述,Waldo 已经深入使用 PowerShell 进行开发。虽然重点放在 C/AL 上,包括合并、升级等,但在 AL 上,PowerShell 的使用需求目前还不大(暂时)。
但让我们指出他脚本中一些在 AL 开发中可能有用的地方。
GitHub
Waldo 的所有 PowerShell 模块和脚本都可以在 GitHub 上找到:github.com/waldo1001/Cloud.Ready.Software.PowerShell
。
你将看到两个文件夹:
-
PSModules
:此文件夹包含所有模块的代码。这些模块也可以在 PowerShell Gallery 上找到:www.powershellgallery.com/packages?q=waldo
。 -
PSScripts
:此文件夹包含大多数使这些模块功能得以实现的脚本。
Docker 脚本
Waldo 在多种方式中使用 Docker。首先,他在自己的笔记本电脑上运行了一个 Windows 2016 服务器虚拟机,并在其中安装了 Docker——因此,从某种程度上说,它是一个远程 Docker 主机。接着,他转向了在自己 PC 上使用 Docker,这使得开发体验有所简化。他管理 Docker 的所有脚本都位于 PSScripts
/NAVDocker
文件夹中。
在这里,你会找到创建容器的脚本,也有一些在 Docker 容器中与应用程序交互的脚本,例如:
-
CleanApp
:这将从 Docker 容器中移除所有应用程序。 -
InstallApp
:这将使用 PowerShell 安装一个应用程序。 -
ExportObjectsAsAL
:这将把对象导出为 AL 文件。它对于报告非常方便,可以轻松导出、重命名和替换。
发布者
在另一个代码库(blog.CALAnalysis
)中,Waldo 记录了从某个版本的 NAV 或 Business Central 中的所有发布者,这将生成一个列出所有事件发布者及其调用位置的文件。
以下是发布者的示例:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/55221a07-06a4-4972-a857-438a33f790d1.png
这些是它们被调用的地方:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/46e2d0e9-d4d5-4d4a-a05c-eb128c0fe342.png
很多人会参考这个内容,试图确认他们即将使用的事件是否在预期的位置被调用。
ALOps
ALOps 是 Waldo 当前正在开发的工具。该工具的目标是为 Dynamics 365 Business Central 合作伙伴提供一种尽可能简单的方式,以便在 Azure DevOps 中设置构建和发布管道。
本质上,构建和发布管道是 持续集成/持续部署(CI/CD)的重要组成部分,但这离 AL 开发者的日常知识相去甚远。ALOps
的作用就是弥合这座桥梁:即使知识有限,你也可以在几分钟内设置自己的构建管道。
DevOps 扩展
ALOps 是一个可在 Azure DevOps 市场上获取的 DevOps 扩展:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/d9fedc9d-97c7-4c57-914f-240ff1f0d79a.png
对于任何开源代码库,都是免费的。
该扩展实际上是一个结构化的 PowerShell 脚本集合。更棒的是,用户无需具备任何 PowerShell 知识即可设置最复杂的构建管道,包括应用签名、编译、测试等。
步骤
ALOps
用于设置管道,它包含我们所称的步骤。今天它包含的步骤如下:
-
编译应用
-
签名应用
-
验证已签名的应用
-
发布应用
-
测试应用
-
从环境中清除应用
-
在不同环境之间复制应用
-
导入 RapidStart 包
-
导入许可证
-
构建 Docker 容器
-
等待 Docker 容器构建完成
-
移除 Docker 容器
-
导入 用于并行开发(fob)
-
导出对象(
txt
或fob
) -
编译(C/AL)
所有这些步骤都可以在 Docker 或非 Docker 环境中运行,视你需要而定。
GitHub 上的文档
Waldo 在 GitHub 上记录 ALOps,代码库也用于收集问题或其他反馈。你可以在 github.com/HodorNV/ALOps
找到它。
该代码库实际上只是描述 DevOps 扩展的一组文档。
应用模板
为了让应用开发者更容易设置构建和发布管道,已有一个不断发展的代码库,里面有模板应用和构建管道,应用开发者可以直接使用这些模板导入,这样他们就可以从一套现成的文件开始,包括一个可工作的构建管道。
所有代码库都托管在这个公共 DevOps 项目中:
dev.azure.com/HodorNV/ALOps%20Templates
使用 ALOps 的示例
我们之前提到的WaldoNavPad
应用实际上已经在 Azure DevOps 中设置了一个有效的构建管道,即使WaldoNavPad
的仓库是在 GitHub 上。Waldo 已在这个公共仓库中进行了设置:
dev.azure.com/msdyn365bc/WaldoGitHubBuilds/
只需导航到构建页面并点击其中一个构建,就可以查看详细信息:
https://github.com/OpenDocCN/freelearn-devops-pt4-zh/raw/master/docs/ms-ms-dyna365/img/5c3a4d34-9961-4aa1-9820-812ab9a5b819.png
对于此构建的设置,你需要在仓库中打开azure-pipelines.yml
文件:
github.com/waldo1001/Waldo.NAV.Pad
它为你提供了一个可读的、即刻可用的构建管道,并且它是仓库的一部分。所有构建应用所需的设置和步骤都在那里:
name: $(Build.BuildId)variables:- group: \'ALOps Build Pipeline Variables\'- name: \'AppVersion\' value: \'1.0.[yyyyWW].*\'- name: \'dockerimage\' value: \'mcr.microsoft.com/businesscentral/sandbox\'pool: name: WaldoHetznersteps:- checkout: self clean: true- task: ALOpsDockerStart@1 inputs: docker_image: $(dockerimage) docker_pull: true docker_login: \'Insider Docker Registry\'- task: ALOpsDockerWait@1 inputs: search_string: \'Ready for connections!\'- task: ALOpsLicenseImport@1 inputs: usedocker: true license_path: $(bc.license)- task: ALOpsAppCompiler@1 inputs: usedocker: true nav_app_version: $(AppVersion) failed_on_warnings: true- task: ALOpsAppPublish@1 inputs: usedocker: true nav_artifact_app_filter: \'*.app\' skip_verification: true- task: ALOpsDockerRemove@1 enabled: true condition: always() inputs: docker_login: \'Insider Docker Registry\'- task: PublishBuildArtifacts@1 enabled: false inputs: PathtoPublish: \'$(Build.ArtifactStagingDirectory)\' ArtifactName: \'Base\' publishLocation: \'Container\'
关于如何设置的更多信息,请查看市场上的应用或之前提到的 GitHub 仓库,它们可以为你提供所有需要的设置信息。
摘要
在本章中,我们看到了一些有趣的第三方工具,可以帮助你在为 Dynamics 365 Business Central 开发扩展时提高生产力。
这是本书的最后一章。在所有这些章节中,我们涵盖了掌握每个 Dynamics 365 Business Central 实施所需的所有主题,从基础到最复杂的内容。现在轮到你了:开始开发扩展,拥抱 SaaS,并将这些主题付诸实践。