微软CRM系统的二次开发主要包括四个方面:1)自定义实体的设置;2):站点图的设置;3)ISV.Config文件(实体页面导航条以及功能菜单)的配置;4)客户端JavaScript的设计。
特别注意:对系统中进行的二次开发之后一定要在自定义界面选择“发布”,不然是不能使用的。
一:自定义实体的设置
微软CRM系统提供按照自己需求要求,对CRM系统功能进行扩充,因此也涉及到用户自定义实体的设计工作,在白沙集团,按照烟草行业的需求,以及结合微软CRM系统的要求,做出了一个烟草行业的自定义实体的数据库文件,见《微软CRM自定义实体》,在该文件中定义了31张自定义数据库表。
进入自定义设置的方法是依次按照系统导航条选择:设置→设置→组织设置→系统设置→自定义,进入自定义设置界面,然后“新建”,按照系统以及自定义实体数据库表的要求,对系统进行表的添加,注意的是:对于自定义的表名系统是要提供默认前缀的,系统默认的是new_,同时系统要求提供一个真正的数据库表的名称和一个显示名称,还要注意的是系统只提供数据库的一对多,和多对一的关系,不提供多对多关系的数据库设计。
添加完表后,就要添加相关的表字段的设置,一般的字段设置直接添加,涉及到表与表之间的关联字段,则是通过字段之间的关系设置完成的,有专门的“关系”菜单进行设置,如果要想直接通过关系,直接在页面上直接显示,则要把关系字段进行影射,注意的是在做关系和影射时,两个字段的类型要一定一样才行。
以下为在实体定义中的关系和影射设置图:
定义完好表以及字段之后,则要对表单和视图进行设计,以便在页面上进行显示操作,以下是设置表单的页面界面:
在上图中的Add a Tab表示添加一个标签,如上图中的Detail;Add a Section表示添加一个节,如上图中的“Business Information”,Add Fields表示在那个节中添加具体的字段,如“Ownership”;Add an IFrame表示添加一个页面框架,跟html中的IFrame是一致的,用来引用外部的页面。如果要删除以上的标签,节或字段,直接选中某个字段或节,选Remove即可。要改变某属性,先选中该控件,选择“Change Properties”进入属性配置页面,如下图(其中一部分)所示:
自定义实体的操作,主要是要直接操作,微软CRM系统提供的接口,直接在该接口中进行添加,完成设置后系统会自动生成相关的页面表单,但还需要对表单以及视图进行相关的配置,当配置好后就可以在系统中使用了。
二:站点图的配置
站点图只要是一个XML的配置文件,通过配置站点图的方法,可以调整在系统主页面中的站点导航显示功能,其结构如下所示:
1.Area中的各个属性的含义
属性名 |
描述 |
类型 |
值 |
是否必须 |
ID |
ASCII唯一标示(不含空格) |
CRM_Identifier |
[a-zA-Z0-9_]+ |
是 |
Title |
标签显示名称,覆盖 ResourceId. |
String |
例如"Sales" |
否 |
ResourceId |
被用于默认标签显示的名称 |
String |
[a-zA-Z0-9_]+ |
否 |
Icon |
有效的图象URL地址 |
String |
URL |
否 |
Url |
在Outlook点击目录时弹出的页面的URL |
String |
有效的URL |
否 |
ShowGroups |
在导航栏中的子目录中是否显示组名称 |
Boolean |
True | false |
否 |
2.Group中的各个属性的含义
属性名 |
描述 |
类型 |
Values |
是否必须 |
ID |
ASCII唯一标示(不含空格) |
CRM_Identifier |
[a-zA-Z0-9_]+ |
是 |
Title |
标签显示名称,覆盖 ResourceId. |
string |
例如"Sales" |
否 |
ResourceId |
被用于默认标签显示的名称 |
String |
[a-zA-Z0-9_]+ |
否 |
URL |
在Outlook点击组名称时弹出的页面的URL |
String |
有效的 URL |
否 |
IsProfile |
控制是否要在个性化工作区进行选择,然后在我的工作区进行显示 |
Boolean |
true | false |
否 |
3.SubArea中的各个属性的含义
属性名 |
描述 |
类型 |
是否必须 |
ID |
ASCII唯一标示(不含空格) |
CRM_Identifier |
是 |
Title |
标签显示名称,覆盖 ResourceId. |
string |
否 |
ResourceId |
被用于默认标签显示的名称 |
String |
否 |
Icon |
显示的Icon图标的URL |
String |
否 |
URL |
指向子目录页面的URL |
String |
否 |
Client |
客户端类型 Defaults 或 All |
CRM_Client |
否 |
AvailableOffline |
控制该自目录是否离线可用 |
Boolean |
否 |
Entity |
Schema名称 |
string |
否 |
4.Privilege中的各个属性的含义:
属性名 |
描述 |
类型 |
是否必须 |
Entity |
实体Schema 名称 |
string |
是 |
Privilege |
自目录显示所需要的权限 |
CRM_PrivilegeId |
否 |
注:CRM_PrivilegeId的值为Read,Write,Append,AppendTo,Create,Delete,Share,Assign,All中的一项或者是多项组合。如果是组合用“,”间隔,中间不能有空格。
5.操作方法
1)导出站点图:设置→自定义→导出自定义项,选择“站点图”,然后选择“其他动作”→“导出所选自定义项”。或者之间使用
http:// 站点名/Tools/SystemCustomization/ExportCustomizations/exportCustomizations.aspx
2)修改导出的XML文档:使用Visual Stdio.net 2003直接修改该XML文档,各个标签的含义如上所示。
3)导入站点图:设置→自定义→导入自定义项,选择要导入的站点图XML文档,然后点“上载”,等该文件显示在列表中时,点“导入所有自定义项”或“其他动作”→“导入所选自定义项”。也可以通过
http://站点名/Tools/SystemCustomization/ImportCustomizations/importCustomizations.aspx
6.站点图实例
<!--客户服务管理-->
<AreaId="CS"Title="客户服务管理"ResourceId="Area_Service"ShowGroups="true"Icon="/_imgs/services_24x24.gif"DescriptionResourceId="Customer_Service_Description">
<GroupId="CS"Title="客户服务管理"IsProfile="true">
<SubAreaId="nav_managekb"ResourceId="Homepage_KBManager"Icon="/_imgs/ico_18_126.gif"Url="/cs/home_managekb.aspx" Client="Web">
<PrivilegeEntity="kbarticle"Privilege="Read,Write,Create"/>
</SubArea>
<SubAreaId="nav_contracts"Title="客户请求跟踪"Entity="contract"/>
</Group>
</Area>
三:ISV.Config文件(实体页面导航条以及功能菜单)的配置
ISV.Config文件同样是一个XML文件,通过配置该文件,可调整页面导航条的设置以及功能菜单的设置,注意:不过页面导航条的设置,系统默认的导航条是不能改变的。自定义只能添加在系统默认导航条的下方或导航条中。
1.ISV.Config菜单及工具条设置XML文档结构图如下所示:
2.系统主菜单ROOT结构图如下所示:
3.系统实体相关页面Entities结构图如下所示:
注:1)在“Entity”字段中,Name属性为在系统定义的实体的Schema名称,如“Account”表示的客户表。
2)在“NavBarItem”字段中,Area属性为在系统中的站点图区域要显示的区域名称,如“Sales”。
3)在“Entity”节中,自定义的菜单和工具条显示在两个地方,一个是在系统的主页面,是定义的Grid节中的部分,为列表页面的工具条和菜单;另外的部分显示在表单的页面部分,主要是菜单,工具条,页面导航条等。
4)“MenuBar”为实体表单页面的主菜单部分,可以自定义菜单。
5)“ToolBar”为实体表单页面的工具条部分,可以自定义工具条。
6)“NavBar”为实体表单页面的导航条部分,可以自定义导航条。
4.Toolbar结构图以及相关属性设置如下所示:
注:1)在“Toolbar”节中,“ValidForCreate”说明该工具条在实体表单中,新建实体信息时是否显示,ValidForCreate=“0”说明在新建实体信息时不显示该工具条,ValidForCreate=“1”说明在新建实体信息时显示该工具条。
2)在“Toolbar”节中,“ValidForUpdate”说明该工具条在实体表单中,更新实体信息时是否显示,ValidForUpdate =“0”更新在新建实体信息时不显示该工具条,ValidForUpdate =“1”更新在新建实体信息时显示该工具条。
3)ToolBarSpacer为工具条分隔条,以便对工具条进行分组。
4)Button节中各个属性说明:
属性名 |
描述 |
类型 |
是否必须 |
Title |
Botton显示的名称 |
string |
是 |
ToolTip |
鼠标指向Botton时显示的提示信息 |
string |
否 |
Icon |
Botton中显示的图标的Url地址 |
string |
否 |
URL |
点Botton指向的URL地址 |
string |
否 |
JavaScript |
点Botton触发的JavaScript的执行代码 |
string |
否 |
PassParams |
说明实体类型或ID号是否在URL中传递 |
String(0或1) |
否 |
WinMode |
显示的界面类型(0-Window(默认),1-模态对话框,2-非模态对话框) |
String(0,1或2) |
否 |
Client |
该Botton显示在Outlook或Web程序中,默认是Outlook与Web都显示,可填“Outlook”,“Web” |
String |
否 |
AvailableOffline |
该Botton在离线是否显示,默认是false |
true或false |
否 |
5.NavBar结构图以及相关设置如下所示:
注:1)在“NavBar”节中,“ValidForCreate”说明该导航条在实体表单中,新建实体信息时是否显示,ValidForCreate=“0”说明在新建实体信息时不显示该导航条,ValidForCreate=“1”说明在新建实体信息时显示该导航条。
2)在“NavBar”节中,“ValidForUpdate”说明该导航条在实体表单中,更新实体信息时是否显示,ValidForUpdate =“0”更新在新建实体信息时不显示该导航条,ValidForUpdate =“1”更新在新建实体信息时显示该导航条。
3)NavBarItem节中各个属性说明:
属性名 |
描述 |
类型 |
是否必须 |
ID |
NavBarItem的唯一标识 |
string |
是 |
Title |
NavBarItem显示的名称 |
string |
否 |
Icon |
NavBarItem中显示的图标的Url地址 |
string |
否 |
URL |
点NavBarItem指向的URL地址 |
string |
否 |
Area |
NavBarItem显示的导航栏区域,值为Sales,Marketing,Service,Info(Details)(默认) |
string |
否 |
Client |
该NavBarItem显示在Outlook或Web程序中,默认是Outlook与Web都显示,可填“Outlook”,“Web” |
String |
否 |
AvailableOffline |
该Botton在离线是否显示,默认是false |
true或false |
否 |
6.Menu结构图以及相关属性设置如下所示:
注:1)在“Menu”节中,“ValidForCreate”说明该菜单在实体表单中,新建实体信息时是否显示,ValidForCreate=“0”说明在新建实体信息时不显示该菜单,ValidForCreate=“1”说明在新建实体信息时显示该菜单。
2)在“Menu”节中,“ValidForUpdate”说明该菜单在实体表单中,更新实体信息时是否显示,ValidForUpdate =“0”更新在新建实体信息时不显示该菜单,ValidForUpdate =“1”更新在新建实体信息时显示该菜单。
3)在“Menu”节中,“Title”属性表示显示的菜单名称。
4)“SubMenu”说明还有下级菜单。
5)“MenuSpacer”表示为菜单分隔条。
6)MenuItem各属性说明:
属性名 |
描述 |
类型 |
是否必须 |
Title |
MenuItem显示的名称 |
string |
是 |
URL |
点MenuItem指向的URL地址 |
string |
否 |
JavaScript |
点MenuItem触发的JavaScript的执行代码 |
string |
否 |
PassParams |
说明实体类型或ID号是否在URL中传递 |
String(0或1) |
否 |
WinMode |
显示的界面类型(0-Window(默认),1-模态对话框,2-非模态对话框) |
String(0,1或2) |
否 |
Client |
该MenuItem显示在Outlook或Web程序中,默认是Outlook与Web都显示,可填“Outlook”,“Web” |
String |
否 |
AvailableOffline |
该MenuItem在离线是否显示,默认是false |
true或false |
否 |
7.操作方法
1)导出站点图:设置→自定义→导出自定义项,选择“站点图”,然后选择“其他动作”→“导出所选自定义项”。或者之间使用
http:// 站点名/Tools/SystemCustomization/ExportCustomizations/exportCustomizations.aspx
2)修改导出的XML文档:使用Visual Stdio.net 2003直接修改该XML文档,各个标签的含义如上所示。
3)导入站点图:设置→自定义→导入自定义项,选择要导入的站点图XML文档,然后点“上载”,等该文件显示在列表中时,点“导入所有自定义项”或“其他动作”→“导入所选自定义项”。也可以通过
http://站点名/Tools/SystemCustomization/ImportCustomizations/importCustomizations.aspx
四:客户端JavaScript的设计
客户端JavaScript代码主要完成对表单中的一些字段值进行验证,以及对表单进行初始化等工作。微软CRM系统提供三个事件的客户端Javascript代码的编写,三个事件是分别是OnLoad事件,OnSave事件和OnChange事件,在编写完事件后,必须选择事件已启用选择框,才能使用事件信息。
在实体定义页面,如下图选择“Form Properties”就进入表单属性设置页面,进行JavaScript的代码编写。
书写JavaScript代码的界面如下所示,特别注意的问题是:写完JavaScript一定要选择事件已启动复选框,如果不选中的话所写的JavaScript代码是不可以使用的,同时写完后还要在实体定义界面,选择“发布”。
五:系统报表的制作
在微软CRM中报表的制作有好几种方法,一是通过Office套件,如Word、Excel等,二是通过SQL Server Report Services工具进行报表的开发。Office套件的生成的报表比较简单,通过拖放的方式即可实现。SQL Server Report Service报表的制作方法是利用Visual Stdio.net 2003与报表开发工具一起使用,报表开发工具作为Visual Stdio.net 2003的一个组件的形式实现的,在Visual Stdio.net 2005下开发的报表好象不能在SQL Server Report Service2000下使用,如果要想在微软CRM系统中能够提供报表筛选条件,必须要在微软CRM系统中上传做好的报表,通过微软CRM系统上传报表,有一个系统检查的过程,验证是不是合乎微软CRM自定义报表的语法要求,注意:如果要在使用的报表中使用筛选器,在自定义报表的数据集的SQL语句中,实体要使用别名,别名的前缀为CRMAF_。如果上传成功自定义的报表,也可以编辑筛选的条件,在报表页面点”其他动作”→”编辑默认筛选器”,进入筛选器设置页面。具体报表制作见《SQL Server Reporting Services制作》文档。以及在白沙制作的一些自定义报表和在后台管理系统中开发的报表的文件。
六:注意事项
2. 权限您可以向用户分派权限,这些权限决定用户可以对实体执行哪些操作。Microsoft CRM 包括了以下适用于核心区域的权限:
权限 |
说明 |
创建 |
创建实体 |
读 |
查看实体 |
写 |
为用户更改实体 |
删除 |
为用户移除实体 |
追加 |
将所选实体与另一实体相关联 |
追加到 |
将某个实体与此实体相关联 |
分派 |
向另一个用户授予对实体的访问权限 |
共享 |
向另一个用户授予对实体的访问权限,同时保留您自己的访问权限 |
重定父级 |
为实体分派其他父实体 |
启用/禁用 |
允许或取消权限 |
4 访问级别 使用权限集,您可以对记录执行操作。但是,访问级别决定了您可以对哪些特定的记录执行这些操作。
在 Microsoft CRM 中,可以为以下记录分派访问级别:“角色”表单底部的“标志”包括以下访问级别:
未选择内容。此访问级别拒绝任何级别的用户权限。不会为安全角色添加权限。
用户。这一初级访问级别允许用户处理其所负责的记录类型、与该用户共享的记录类型和与用户所在团队共享的记录类型。例如,如果为用户分派了“用户读取客户”权限,则该用户只能查看其所负责或共享的客户。
业务部门。这一中级访问级别允许用户处理其业务部门中的记录类型。拥有“业务部门”访问权限的用户也将自动拥有“用户”访问权限。例如,如果用户具有“业务部门读取客户”权限,则该用户可以读取本地业务部门中的所有客户。
上:下级业务部门。这一高级访问级别允许用户处理其所在业务部门中的记录类型,以及该业务部门下属的所有业务部门中的记录类型。拥有“上:下级业务部门”访问权限的用户也将自动拥有“业务部门”和“用户”访问权限。例如,如果用户具有“上:下级业务部门读取客户”权限,则该用户可以读取其所在业务部门的所有客户,以及该业务部门下属的任何部门的所有客户。
组织。这一全局访问级别允许用户处理整个组织中的所有记录类型,无论实体或用户所属的业务部门层次级别。拥有“组织”访问权限的用户也将自动拥有“上:下级业务部门”、“业务部门”和“用户”访问权限。
11 微软CRM系统不能实现多对多的关系,只能实现一对多关系,或者是多对一的关系,一对多与多对一关系其实是一样的意思,只是在两个实体之间针对的实体不同而已。
12 用户自定义的实体中分为用户表和组织表两种形式,用户表和组织表的区别是在分配系统角色时,用户表有“ 未选择内容”,“ 用户”,“ 业务部门”,“ 上:下级业务部门”,“ 组织”;而组织表只有“ 未选择内容”,“ 组织”。
13 微软不支持直接修改页面或数据库,原因是微软没有经过测试,也不支持升级。
14 用户自定义的视图默认的是共享给所有的系统用户,可以通过共享给组,实现视图的私有,方法是打开“操作”→“共享”→“添加团队”,分配给一个团队即可。
15 系统中默认的视图是不能删除的,但可以通过分配给一个没有用户的虚拟组进行私有化来隐藏该view。
16 系统中生成的各个视图的作用是:“默认公共视图”为系统公用视图,在用户进入某个实体的页面时显示的视图,可以通过“其他动作”→“设为默认值”来更改默认公共视图;“公共视图”为系统所有用户都可以访问的视图,可以通过把公共视图共享给某个团队的方法使其私有化,如果不想让系统的已有的公共视图显示,可以把该视图设置成一个虚拟的团队来实现;“预览视图”为在其他视图中选择某条具体记录,点该箭头变成所显示的视图;“关联视图”为在与该实体相关联的其他实体的页面进入该实体的页面的视图,如在新建“联系人”后,可在该页面中调出“客户”页面,此时显示的客户列表为客户实体的关联视图;“查找视图”为在实体之间中添加的一对多或多对一的关系时,然后把该关系作为字段使用时用到,即可以通过点“查找”按钮,在查找界面进行选择值时显示的视图;“高级查找视图”为在工具条上选择“高级查找”按钮时,给出查询条件,显示数据列表的视图;“快速查找视图”在进入实体的相关页面时,在查找框中输入值后点“查找”按钮的视图。
17 映射为在父记录创建时,在子记录被自动创建,但映射只仅仅在创建时保持数据同步,但不能在修改时进行数据的实时同步。
18 POST URL在3.0版本以后不再支持。
19 在做数据的导入导出时,应尽量把工作流的功能关闭(所有的工作流让其停止工作)。
20 自定义报表时在数据库中必须选择以Filtered开头的视图为数据源,如果要做过滤条件的报表,则必须在数据库查询的SQL语句中在数据库表名前加上CRMAF_,如CRMAF_表名。
21 如果要设置查看微软CRM中的错误信息,可在Web.Config中设置<add key="DevErrors" value="Off"/>中的value=“true”即可,此时如果在CRM中出现错误,将以错误提示的页面显示。
22 如果要在微软CRM中设置自定义的菜单或工具条,则必须在Web.Config中设置<add key="ISVIntegration" value="None"/>中的value的值,可以使用的值有All,Outlook,OutlookLaptopClient,OutlookWorkstationClient,Web,None
值 |
含义 |
All |
ISV配置同时对Outlook与Web客户端开放 |
Outlook |
ISV配置只对Outlook开放 |
OutlookLaptopClient |
ISV配置只对OutlookLaptopClient开放 |
OutlookWorkstationClient |
ISV配置只对OutlookWorkstationClient开放 |
Web |
ISV配置只对Web端客户开放 |
None |
ISV配置不对外开放 |