65.9K
CodeProject 正在变化。 阅读更多。
Home

Microsoft Dynamics CRM 4.0 创建 - 更新日历 - 第二部分

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.25/5 (4投票s)

2009 年 10 月 30 日

CPOL

4分钟阅读

viewsIcon

42008

downloadIcon

601

使用 Microsoft Dynamics CRM 4.0 Web Services SDK 示例。

引言

在本系列的第二部分中,我们将继续演示如何使用 CRM Web 服务创建然后更新特定用户的日历信息。在此示例中,用户作为参数传递给我们使用 C# 在 Visual Studio 2008 中开发的控制台应用程序,我们将使用他/她分配的日历作为模板,因为它包含有关工作时间/天数和休假的信息,这些信息将被复制/克隆到同样作为参数传递的另一个目标用户。

这种做法有助于自动化分配新日历的过程,这些日历将从现有日历复制而来,用于新添加的用户。这些用户属于现有的业务部门,并被分配了需要标准工作日/时间等日历的特定角色。

背景

我们在第一部分中展示了一种直接的方法,该方法创建了一个 C# 控制台应用程序,该应用程序使用 Microsoft Dynamics CRM 4.0 SDK Web 服务进行发现和 CRM 主服务来连接、查询和定位特定用户,并检查他/她的分配的角色,以查找销售人员角色作为示例角色。

Using the Code

附加的代码下载是使用 Visual Studio 2008 创建并在 Debug 构建模式下编译的第一部分控制台应用程序的延续。但是,由于我使用了一种方法(Main 方法)来包含大部分代码,以便于跟踪对不同 SDK API 的调用步骤,因此在此下载的 C# 源文件中,我使用了 Visual Studio 的 #region 编辑器指令将所有代码分隔在可折叠和展开的容器中,以便代码阅读者可以根据需要进行操作。所有区域的名称都足够描述性,可以解释代码块的功能,我希望这能让每个人都能理解从连接到 CRM 服务器 Web 服务到所有 API 调用,直到将日历从模板用户复制到目标用户的步骤。

此外,为了自动化此控制台应用程序的使用,此第二部分代码具有个参数,而不是第一部分中的两个。第一个和第二个参数 args[0]args[1] 用于针对使用 Active Directory 身份验证的本地 CRM 服务器运行控制台应用程序。第三个参数 args[2] 是一个域格式的登录名,格式为 Domain\LogOn Name,用于作为模板用户复制日历信息给具有相同角色和同一业务部门的其他用户(在我们示例中是Salesperson角色)。第四个也是最后一个参数 args[3] 是目标用户登录名,用于克隆新日历(从模板用户)。

下面的 Visual Studio 编辑器快照显示了所有代码区域,并逐步解释了如何创建然后更新目标用户的日历,以便将从另一个用户信息读取的工作日/时间复制过来作为模板。

CodeRegions.jpg

如上面所有代码区域的快照所示

  • 代码从处理四个传入参数开始。
  • 连接/配置 CRM 4.0 Discovery 和 CRM Web Services。
  • 检查源/模板用户的角色。
  • 读取并复制模板用户的日历。(带有额外的单元测试代码。)
  • 读取并存储模板用户 ID。
  • 读取并存储相关的业务部门。
  • 读取并存储目标用户信息。
  • 创建一个新的日历实体以供将来使用。
  • 使用来自模板用户的日历规则更新新创建的日历实体。
  • 将新创建/更新的日历附加到目标用户。

关注点

  • 值得一提的是,理解 Microsoft Dynamics CRM 4.0 内部如何存储日历及其关联的日历规则相当复杂,从长远来看,不应依赖 CRM 的 SQL Server 后端架构,因为它是 Microsoft 拥有的,对其或其数据关系进行手动临时更改可能会在下一次 CRM 4.0 的 Rollup 更新或产品版本中失效。
  • -----------
  • 因此,处理日历及其规则的最佳方法是基本上使用 WYSWYG GUI 界面来更改或创建用户日历的规则,然后使用任何标准的(可能是虚拟的)用户日历作为模板,用于创建属于同一业务部门并具有相同角色的新用户,就像此代码项目所演示的那样。
  • -----------
  • 负责此任务的 CRM 实体 SQL Server 表是 CalendarBaseCalendarRuleBase
  • -----------
  • 最后,以下关键的伪代码片段演示了我们如何创建日历然后为其分配日历规则。

注意:我们不直接访问日历规则上的 CreateUpdate 方法,而是使用它们的日历集合/数组属性,如下所示:

/* Now we create a new Calendar Entity for the target user */
calendar myCalendar = new calendar();
myCalendar.businessunitid = ...;
myCalendar.description = ...;
myCalendar.isshared = new CrmBoolean();
myCalendar.name = "Work Days Hours";
Lookup tmpLookup = new Lookup();
tmpLookup.Value = ...;
tmpLookup.type = EntityName.businessunit.ToString();
myCalendar.organizationid = tmpLookup;
myCalendar.primaryuserid = new UniqueIdentifier();
myCalendar.primaryuserid.Value = targetUserId;
Guid newCalendarGuid = service.Create(myCalendar);

        
/* For data Consistency Update Calendar so that all 
   Calendar rules have the new Calendar Id Reference */
calendar targetCalendar = new calendar();
tmpLookup = new Lookup();
tmpLookup.type = EntityName.calendar.ToString();
tmpLookup.Value = newCalendarGuid;
targetCalendar.calendarrules = new calendarrule[fromCalendar.calendarrules.Length];

for (int i = 0; i < fromCalendar.calendarrules.Length; ++i)
{/* Note: All Calendar rules associated with this Calendar are copied along */

        targetCalendar.calendarrules[i] = fromCalendar.calendarrules[i];
        targetCalendar.calendarrules[i].calendarruleid = new Key();
        targetCalendar.calendarrules[i].calendarruleid.Value = System.Guid.NewGuid();
        targetCalendar.calendarrules[i].businessunitid = new UniqueIdentifier();
        targetCalendar.calendarrules[i].businessunitid.Value = myBusinessUnit.Value;
        targetCalendar.calendarrules[i].calendarid = tmpLookup;
}

targetCalendar.calendarid = new Key();
targetCalendar.calendarid.Value = new Guid(newCalendarGuid.ToString());
Console.WriteLine("Calender Update Key: " + newCalendarGuid.ToString());
service.Update(targetCalendar);

历史

  • 发布了本文的第 1.0 版。
© . All rights reserved.