MS CRM 2011中,对于多实体数据文件的导入

    在之前的文章中,我已经介绍了如何使用MS CRM 2011中提供的数据管理功能完成数据的导入,有兴趣的同学可以看《

MS CRM 2011 RC中的新特性(8)—数据管理》进行了解。

    在实际应用中,很多时候,我们都面临着一个数据文件包含多个实体记录的情况。如果不经加工处理,直接利用“数据导入”功能进行导入,那么,是无法达到我们的目标的。下面是测试过程和结果。

    首先,设定数据文件“省份.csv”,该文件中的数据内容如下表所示。

省份名称 负责人 城市名称
广东 广州
广东 深圳
河北 石家庄
河北 秦皇岛

    点击Ribbon工具条的导入按钮,启动“导入数据向导”,在“上载数据文件”页面设定“数据文件名”为”省份.csv”文件,在“选择数据映射”页面中,选择“默认(自动映射)”作为本次导入的数据映射,如下图所示

SNAGHTML1acba13

    点击“下一步”按钮,进入“映射字段”页面,你会看到在左侧的“CRM记录类型”列表中,只出现了“省份”,而没有“城市”,那么也就意味着源文件中的城市数据是无法导入进CRM系统的,而且,由于系统在导入时,认为csv文件中每一条数据对应一条省份记录,所以,系统不会认为记录中出现了重复,最终的导入结果就是省份多了四条记录,分别是两条“广东”,两条“河北”,显然,这是不能够接受的,那么如何解决这个问题呢?

    第一个方法,笨方法——将文件进行分割,然后逐个实体数据的导入。无疑这是非常繁琐的事情,不过也可以解决问题;

    第二个方法,建立数据映射文件,而后在导入时,选择该数据映射为当前导入所使用的映射。从而可以帮助系统识别出数据文件中包含的所有实体类型。下面是具体的步骤。

    首先,创建数据映射,点击“设置”—> “数据管理”-->“数据映射”,系统将会显示数据映射列表。很不幸的,截至我现在使用MS CRM 2011 RTM版本,还没有开放数据映射的创建入口,在Grid上方的工具条中没有“新建”这个按钮,只有“导入”按钮。如下图所示。

image

    没有办法,只好手动创建一个数据映射文件,而后导入到系统中了。

    创建数据映射文件的步骤如下:

    打开Visual Studio 2010,点击“文件”> “新建”>“文件”,在弹出的模板分类中选择“常规”,在右侧的模板列表中选择“XML文件”,如下图所示。

image

    点击“打开”按钮,返回编辑界面。xml文件创建好了,那么映射文件的架构内容在哪里呢?经过作者一番查找,原来位于crm站点的_resources文件夹下,该架构文件的名称为“ImportMapSchema.xsd”。好,下面借助这个架构文件,可以了解数据映射文件中到底有哪些内容,以指导我们编写映射文件。

    通过分析架构文件,可以得出映射文件的大致结构是这样子的:

<Map Name="映射文件的名称">
  <EntitiesPerFile>数据文件是否包含多个实体数据</EntitiesPerFile>
  <Description>描述文字</Description>
  <EntityMaps>
    <EntityMap TargetEntityName="CRM系统中的实体架构名称" SourceEntityName="显示在导入向导‘映射字段’页面左侧CRM记录类型列表中的名称" Dedupe="进行重复检测时的处理方式">

       <AttributeMaps><AttributeMap>…</AttributeMap></AttributeMaps>

    </EntityMap>
  </EntityMaps>

</Map>

其中,

  • Name="映射文件的名称",代表了该映射的显示名称,那么无论是在数据映射列表还是导入向导的“选择数据映射”页面中,都会以该设定值显示此数据映射;
  • <EntitiesPerFile>数据文件是否包含多个实体数据</EntitiesPerFile>,在架构文件中,对该属性的描述为

<xs:simpleType name="EntitiesPerFileEnum">
  <xs:restriction base="xs:string">
    <xs:enumeration value="Single" />
    <xs:enumeration value="Multiple" />
  </xs:restriction>
</xs:simpleType>

也就是说,一个数据文件中,每行可以只包含一个实体的数据,也可以包含多个实体的数据。使用Multiple值标明当前数据文件包含了多个实体的数据;

  • <Description>描述文字</Description>,描述文字,不多说了;
  • TargetEntityName="CRM系统中的实体架构名称",当前文件中数据所对应的CRM系统中的实体名称,如果有多个实体,那么就需要创建多个<EntityMap>节点;
  • SourceEntityName="显示在导入向导‘映射字段’页面左侧CRM记录类型列表中的名称",一个能够准确反映文件中数据的名称;
  • Dedupe="进行重复检测时的处理方式",该属性的定义如下:

<xs:simpleType name="DedupeEnum">
  <xs:restriction base="xs:string">
    <xs:enumeration value="Ignore" />
    <xs:enumeration value="Eliminate" />
  </xs:restriction>
</xs:simpleType>

    从定义中可见,如果检测到了重复性数据,可以使用的操作包括有忽略Ignore,以及清除Eliminate。

    在单实体数据文件中,一般而言都是选择清除。那么对于多实体数据文件,如何处理呢,很明显,多实体数据文件中,很大的可能是主实体数据会出现重复,这一点很容易理解,我不多说了。

    而子实体数据出现的重复,可能未必是真正的重复,为什么这么说呢,因为子实体是依附于主实体的,举例来说,北京市有朝阳,而辽宁省也有朝阳,显然,这两个地方并非重复记录,而是两条不同的记录,所以,对于子实体不能够使用清除Eliminate。

    对于AttributeMaps节点以及其下的子节点,是为了导入向导的映射字段时使用的,若此时不进行设置,在向导的字段映射界面,也可以进行设置,为了简单起见,我就不设置了。

    ok,通过上面的分析、研究,最后形成的映射文件的内容如下:

<Map Name="针对省份以及城市的数据映射">
  <EntitiesPerFile>Multiple</EntitiesPerFile>
  <Description>我做的一个样例以及测试</Description>
  <EntityMaps>
    <EntityMap TargetEntityName="new_city" SourceEntityName="城市" Dedupe="Ignore">

    </EntityMap>
    <EntityMap TargetEntityName="new_province" SourceEntityName="省份" Dedupe="Eliminate">

    </EntityMap>
  </EntityMaps>

</Map>

    将该文件保存为“针对省份以及城市的数据映射.xml”。

    点击“数据映射”列表工具条中的导入按钮,导入该映射文件。如下图所示。

image

    接下来,点击Ribbon工具条的“导入数据”按钮,导入“省份.csv”文件,在“选择数据映射”页面,可以看到最下方,我们刚刚导入的数据映射已经赫然在列了。如下图所示。

image

    点选该映射,点击“下一步”,进入“映射字段”页面。此时,左侧的CRM记录类型列表中,不再是“省份”一条记录,而是“省份”、“城市”两条记录了。如下图所示。

image

    设定“城市”的映射字段,如下图所示。

image

    设定“省份”的映射字段,如下图所示。

image

    一路“下一步”下去,直至提交。

    转到“工作区”-->“导入”,查看导入结果。

posted on 2011-02-24 21:12  石头居  阅读(3133)  评论(2编辑  收藏  举报