Dynamics CRM中的地址知多D?

关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复169或者20151105可方便获取本文,同时可以在第一时间得到我发布的最新的博文信息,follow me!

CRM中的地址以前不是很了解,定制我家 素格格新疆特产店 的CRM系统的时候发现在联系人界面录入的地址,在订单界面使用 查找地址 功能的时候找不到,难道要手工再次录入发货的地址,收货人和电话等信息吗?当时没有深究,但是今天我打算仔细研究下,与大家分享,也好完善我家素格格新疆特产店的CRM。
 
首先我们通过 MetadataBrowser 解决方案来查看下有多少与地址相关的实体,我搜索下 addre ,看到结果如下,看来地址相关的实体还挺多的,这次我们主要关注 地址 (CustomerAddress) 这个实体。
 
这个实体的主要信息截图如下,主要属性是name,唯一键字段是customeraddressid,显示名称为地址的除了主键以外还有一个,那就是composite,这个是一个复合字段,是你输入地址各个部分组合后的值。还有一个字段类型为选项集的字段 objecttypecode ,它不可以定制,而且也只有 客户 和 联系人 两个选项。
 
那这个地址是属于哪个客户或者联系人呢?是通过字段parentid来关联的。关联到联系人是这个字段,关联到客户也是这个字段,这中行为是我们自定义字段无法做到的。
 
 值得注意的是地址实体有个限制就是无法与其他建立关系,无论是 1:N, 还是 N:1 ,还是 N:N 的关系,比如你建立查找字段就会发现无法找到实体:
 
我们来继续测试怎么利用,我这里建立一个联系人,并且输入了地址如下。
 
那么这里输入的地址会进入到地址实体(CustomerAddress)吗?我们直接用SQL来看看就知道了:

select CustomerAddressId,ParentId,ObjectTypeCode,AddressNumber,Line1,
City,StateOrProvince,Country,Composite,DATEADD(HOUR,8,CreatedOn) as createdon
from CustomerAddress
where ParentId='A58C6780-8783-E511-80FD-000D3A80A5AB' and ObjectTypeCode=2

结果如下,可以知道是进入了地址实体(CustomerAddress),而且一次新增了三行,其中AddressNumber等于1的那行就是我录入的地址,其余两行主要内容都是空的。
 
那我有个疑问,如果我创建的联系人没有录入地址呢,它会自动帮我创建三条记录吗?带着这个疑问,我创建了一个联系人,没有录入地址保存后验证结果是会的,不过主要字段内容都是空的。
 
继续我的疑问,那我如果修改联系人界面的地址,地址实体的记录值会跟着自动修改吗?我把我的地址改成老家的地址,再去看看,发现自动同步了,这个功能还不错。
 
还有疑问,那就是每个客户或者联系人只能有3个地址吗?我可以增加1个地址吗?所以我用了如下的代码来做试验:
static void Main(string[] args)
{
try
{
var service = GetOrganizationService();
var custaddr = new Entity("customeraddress");
custaddr["addressnumber"] = 4;
custaddr["parentid"] = new EntityReference("contact", new Guid("A58C6780-8783-E511-80FD-000D3A80A5AB"));
custaddr["country"] = "中国";
custaddr["stateorprovince"] = "新疆";
custaddr["city"] = "昌吉";
custaddr["line1"] = "呼图壁县";
custaddr["composite"] = "新疆昌吉呼图壁县";//这个字段要自己赋值,囧
custaddr["name"] = "代码增加的地址";
service.Create(custaddr);
Console.WriteLine("程序运行完成!");
Console.ReadKey();
}
catch (Exception ex)
{
Console.WriteLine("程序运行遇到异常." + ex.Message);
Console.ReadKey();
}
}

 

答案是增加成功,我们用sql可以看到:
 
当然用高级查询也是可以看到的,我是用的查询条件如下
 
查询结果如下:
 
双击记录是可以修改并保存的,在这个高级查询界面也是可以删除的,可是在这里没有办法新增。也有一个办法,随便双击一条记录进去,点击 保存并新建 是可以新增当前的联系人或者客户的地址的,这里增加的地址的composite字段是没有值的,addressnumber会自动增加。还有一个办法,后面使用订单的查找地址功能时候,也可以新建地址。这个地址表单最好稍微客制化一下,增加街道2,街道3,地址等的显示,增加地址编号列作为只读字段显示。
 
默认联系人创建了3个地址行,其他两个呢,我猜想应该对应联系人的地址2和地址3字段,于是将其放到联系人的主窗体上面,如下所示:
 
然后我去录入这两个地址信息如下:
 
 
 你会发现真的是对应他的地址实体的AddreeNumber字段为2和3的记录。
 
 
当然,如果你喜欢,也可以在联系人界面插入一个子网格来显示地址,这样就可以方便的新增地址了,也方便修改地址,为地址的 地址名称 字段录入值以后,这个地址就会显示在 查找地址 功能中(后文有说明)。我这里子网格使用的 所有客户地址 视图是自己定制过的,去掉了所有筛选条件(因为默认的筛选条件有误),修改了显示列。
 
 
下面我们来测试下订单可否使用上面的地址,我这里创建了一个订单,订单的潜在顾客(这个翻译不好,应该是顾客好点吧)就是我前面创建的联系人,我自己。我们使用命令栏的查找地址看看:
 
可以看到能找到两个地址,其他的地址为啥没有呢?
 
我们从这个视图 -- 客户地址查找视图 来着手吧。顺便提一句,如果我切换成 客户所有地址,不但不是更多,而是更少了,只有地址名称为 代码增加的地址 这一个地址了,伤不起。
 
打开 客户地址查找视图 的筛选条件如下,这下明白了,4个地址只有两个可以看到,因为它只显示字段 地址名称 列包含值的地址,所以地址录入以后最后设置一个地址名称。我把这个删选条件删除,保存并发布,就会显示所有的地址吗?不会,我测试结果是这样,囧。
 
然后我们来看看 所有客户地址 视图的筛选条件如下,居然说 显示该条件时出错,哎,bug,我的做法是删除这些筛选条件。
 
我选择一个地址来看看效果:
 
真的帮我把地址填入了送货地址,效果如下:
 
如果我到联系人界面更改了这个地址,订单这里会有所反应吗?也就是会自动更新订单的送货地址吗?答案是不会。因为这个值是直接填入了订单实体。订单的ShipTo_AddressId记载了送货地址来自哪个地址,地址相关的字段映射到了 ShipTo_City,ShipTo_Composite,ShipTo_Country,ShipTo_Line1,ShipTo_Line2,ShipTo_Line3,ShipTo_PostalCode,ShipTo_StateOrProvince 等字段。
但是地址中的直接联系人(primarycontactname) 并没有映射到订单的 ShipTo_ContactName,地址中的主要电话(telephone1) 并没有映射到订单中的ShipTo_Telephone字段,地址中的地址地址名称(name)并没有映射到订单中的ShipTo_Name字段。
我也搞不懂开发Dynamics CRM的人为什么留下几个字段不做对应映射呢?而这些没有映射的字段又比较重要。怎么办?如果想用实时工作流或者插件来做,发现都有问题,就是都不能监控 ShipTo_AddressId 这个字段的变化,搞么子哦。没有条件创造条件也要上,看我如何解决它。
其实解决办法非常简单,就是讲没有映射到的字段拉出来放到订单界面上就可以了,如下
 
有个小问题就是,如果上面的 送货地址 选择 自提 的话,系统默认会隐藏下面的送货地址,而不会隐藏我添加的 送货地的电话号码 和 送货地的联系人姓名 字段,这个简单,我们用个业务规则轻松解决.
posted @ 2019-12-17 17:49  微软MVP(15-18)罗勇  阅读(351)  评论(0编辑  收藏  举报