[{"title":"Dynamics 365 Word Templates 跨环境同步指南","summary":"问题背景 在 Dynamics 365 Customer Engagement 项目中，经常需要在开发、测试、生产等不同环境之间同步 Word Templates（文档模板）。\n一个常见的问题是：同一实体在不同环境中的 ObjectTypeCode 可能不同。Word Template 内部通过 ObjectTypeCode 来关联实体，如果直接导出导入，模板会因找不到对应的实体而失效。\n解决流程 步骤一：查询实体的 ObjectTypeCode 首先确认当前环境中目标实体的 ObjectTypeCode：\n复制 SELECT [ObjectTypeCode] FROM Entity WITH(NOLOCK) WHERE name = \u0026#39;EntityName\u0026#39; 将 EntityName 替换为实际实体名称，如 account、contact、new_customentity 等。\n分别在不同环境中执行此查询，记录各自的 ObjectTypeCode 值。\n步骤二：导出 Word 模板 在源环境中，通过 设置 → 模板 → 文档模板 下载需要迁移的 Word Template（.docx 文件）。\n步骤三：修改 .docx 文件 .docx 文件本质上是一个 ZIP 压缩包，内部包含多个 XML 文件。我们需要解压并修改其中的 ObjectTypeCode 引用。\n复制 # 解压 docx 文件 unzip template.docx -d template_extracted/ # 在 XML 文件中查找并替换 ObjectTypeCode # 将源环境的 ObjectTypeCode 替换为目标环境的值 grep -r \u0026#34;ObjectTypeCode\u0026#34; template_extracted/ 关键文件通常包括：\nword/document.xml — 主文档内容 word/settings.xml — 文档设置 使用文本编辑器打开这些 XML 文件，找到所有引用了源环境 ObjectTypeCode 的地方，替换为目标环境的值。\n复制 \u0026lt;!-- 示例：将 10285 替换为目标环境的 ObjectTypeCode --\u0026gt; \u0026lt;ObjectTypeCode\u0026gt;10285\u0026lt;/ObjectTypeCode\u0026gt; 步骤四：处理 customXml 引用 如果 Word Template 引用了 XML 数据源，还需要修改 customXml 文件夹中的两个文件：\ncustomXml/item1.xml — 自定义 XML 数据 customXml/itemProps1.xml — XML 属性定义 复制 # 查找 customXml 中的 ObjectTypeCode 引用 grep -r \u0026#34;ObjectTypeCode\u0026#34; template_extracted/customXml/ 同样将 ObjectTypeCode 替换为目标环境的值。\n","permalink":"http://www.yven.cn/posts/word-template-sync/","date":"2025-06-22","tags":["Word Template","ObjectTypeCode","SQL","XML","数据迁移","文档模板"],"categories":["Dynamics 365"]},{"title":"PCF Multiselect Records 控件配置笔记","summary":"背景 在 Model-driven App 中，原生的 Lookup 字段只支持单选。当需要实现多选记录关联时，可以借助社区优秀的 PCF 控件来扩展。本文记录使用 Víctor Sánchez 开发的 Multiselect Records PCF 控件时，字段配置过程中遇到的关键问题。\n配置要点 1. 绑定字段类型选择 不要直接绑定 Lookup 字段。 需要新建一个 Multiple Lines of Text（多行文本）类型字段来承载 PCF 控件的数据。\n复制 字段类型：Multiple Lines of Text → Text Area 绑定方式：将该字段拖入表单 → 配置为 PCF 控件 这样 PCF 控件会将选中的记录 ID 序列化存储在该文本字段中。\n2. Field Filter Values 写法 如果 Filter 条件绑定的是表单上的自定义 Lookup 字段，参数写法需要在字段名后加 _value 后缀：\n复制 // 自定义 Lookup 字段「新客户」的 filter 参数 _new_accountid_value // 而非 _new_accountid 这是因为 Lookup 字段在 DOM 中的实际值存储在 _value 属性中。\n3. Columns 参数格式 配置 Columns（显示列）时，Display Name 和 fieldName 缺一不可，且格式必须严格：\n复制 [ { \u0026#34;Display Name\u0026#34;: \u0026#34;客户名称\u0026#34;, \u0026#34;fieldName\u0026#34;: \u0026#34;name\u0026#34; }, { \u0026#34;Display Name\u0026#34;: \u0026#34;客户编号\u0026#34;, \u0026#34;fieldName\u0026#34;: \u0026#34;accountnumber\u0026#34; }, { \u0026#34;Display Name\u0026#34;: \u0026#34;城市\u0026#34;, \u0026#34;fieldName\u0026#34;: \u0026#34;address1_city\u0026#34; } ] ⚠️ 注意是 Display Name 和 fieldName，不能写成 displayName 或 display_name。\n参考资源 Multiselect Records PCF - GitHub Víctor Sánchez 的原始实现 总结 三个关键点：\n","permalink":"http://www.yven.cn/posts/pcf-multiselect-records/","date":"2025-06-22","tags":["PCF","Power Apps","Model-driven App","Lookup","JavaScript"],"categories":["Power Platform"]},{"title":"🍌 你好，小黄人博客！","summary":"欢迎来到我的技术博客 经过一番折腾，这个基于 Hugo + 小黄人主题 的个人技术博客终于上线了 🎉\n作为一个长期在微软技术生态中摸爬滚打的软件工程师，我一直想有一个地方来沉淀和分享自己的技术积累。这个博客就是这样一个空间。\n我会写些什么 这里的内容将主要围绕以下几个方向：\nPower Platform Power Apps：Canvas App 和 Model-driven App 的实战技巧 Power Automate：Cloud Flow 和 Desktop Flow 的自动化场景 Power BI：数据可视化与嵌入式分析 Dataverse：数据建模、安全模型、API 集成 Dynamics 365 Customer Engagement：Sales、Customer Service、Field Service 模块的定制开发 C# Plugin \u0026amp; Custom Workflow：服务端扩展开发最佳实践 JavaScript Form Script：前端表单脚本与 Ribbon 定制 System Integration：D365 与 ERP、第三方系统的集成方案 .NET \u0026amp; Azure ASP.NET Core：Web API 开发 Azure Functions：Serverless 集成场景 DevOps：CI/CD、ALM、Solution 管理 关于这个博客的技术栈 这个博客本身也是一个有趣的小项目：\n技术 说明 Hugo Go 语言编写的静态站点生成器，构建速度极快 自定义主题 从零手写的小黄人主题，SCSS + Vanilla JS GitHub Pages 免费托管，自动部署 Giscus 基于 GitHub Discussions 的评论系统 复制 // 作为一个 .NET 开发者，第一篇博文当然要有代码块 😎 public class MinionBlog { public string Author =\u0026gt; \u0026#34;Yven Yuan\u0026#34;; public string Theme =\u0026gt; \u0026#34;Banana! 🍌\u0026#34;; public List\u0026lt;string\u0026gt; Topics =\u0026gt; new() { \u0026#34;Power Platform\u0026#34;, \u0026#34;Dynamics 365\u0026#34;, \u0026#34;.NET\u0026#34; }; public void StartBlogging() { Console.WriteLine(\u0026#34;Hello, Minions! 👁️\u0026#34;); } } 写在最后 \u0026ldquo;君子务本，本立而道生。\u0026rdquo; —— 技术这条路，扎实走好每一步。\n感谢你的到访，欢迎通过 GitHub 或邮件与我交流。一起成长 🚀\n","permalink":"http://www.yven.cn/posts/hello-minions-blog/","date":"2025-01-01","tags":["博客","Hugo","GitHub Pages","Minions"],"categories":["技术随笔"]}]