一、CRM基本知識
1.CRM2001 有幾個服務端點?
答:對外公開的服務,如Web服務,WCF,Restful API
2.一個ERP系統,要訪問CRM的數據,CRM2011有哪些現有的服務入口提供給我
答:從JS訪問CRM數據,用的是REST。
CRM2011並不提供現成的數據庫方式的訪問服務。
端口就兩個:rest soap
一共3個:
a.發現服務。b.組織服務。c.組織數據服務。
CRM設置—>自定義—>自定義項—>開發人員資源

三個各提供啥服務,有啥區別?

從JS訪問CRM數據,用的是REST。 這個rest的原理是什么?
2).TCP/IP
3).Socket編程
4).相關知識 OData的微軟的REST自定標准
UDP(User Data Protocol,用戶數據報協議)是與TCP相對應的協議。它是屬於TCP/IP協議族中的一種。
這里有一張圖,表明了這些協議的關系。
3.常見的兩個錯誤:
1) 未將對象引用到對象實例
2) 關鍵字不在字典中
聲明字符串變量時未賦空值就應用變量。
未用new初始化對象。
4.MSCRM_CONFIG庫有啥用?
答:存儲的組織信息;MSCRM_CONFIG是安裝CRM時,第一個生成的庫。
保存服務器配置、服務器角色、組織信息、組織配置、用戶信息、用戶配置等。
5.組織發現服務是干什么用的?
答:發現組織的
6.http 和https(Hypertext Transfer Protocol over Secure Socket Layer) 對比:
1) https協議需要到ca申請證書,一般免費證書很少,需要交費。
2) http是超文本傳輸協議,信息是明文傳輸,https 則是具有安全性的ssl加密傳輸協議。
3) http和https使用的是完全不同的連接方式,用的端口也不一樣,前者是80,后者是443。
4) http的連接很簡單,是無狀態的;HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網絡協議,比http協議安全。
5) https是http的安全版。
7.內部(默認)和ADFS 對比:
1).配置成ADFS(IFD)后,初始化WebService時的方式如下:
IFD 的服務前面的段必須是https,不分內部和外部。
Uri orgServiceUri = new Uri("https://192.168.1.101/MicrosoftDynamicCRM/XRMServices/2011/Organization.svc"); ClientCredentials credentials = new ClientCredentials(); credentials.UserName.UserName = CRMUserName; credentials.UserName.Password = CRMUserPassword; OrganizationServiceProxy crmServiceProxy = new OrganizationServiceProxy(orgServiceUri, null, credentials, null); crmService = (IOrganizationService)crmServiceProxy;
2). on-premise 內部部署(AD認證),初始化WebService時的方式如下:
服務前面的段可以是https,也是可以http
如果沒有路由映射 外網是訪問不了 只能內網訪問
Uri organizationUri = new Uri("http://192.168.1.101/MicrosoftDynamicCRM/XRMServices/2011/Organization.svc"); IServiceConfiguration<IOrganizationService> orgConfigInfo = ServiceConfigurationFactory.CreateConfiguration<IOrganizationService>(organizationUri); var Orgcreds = new ClientCredentials(); Orgcreds.Windows.ClientCredential = new System.Net.NetworkCredential("administrator", "admiN123", "DynamicCRM.com"); OrganizationServiceProxy _serviceproxy = new OrganizationServiceProxy(orgConfigInfo, Orgcreds); return (IOrganizationService)_serviceproxy;
這樣也可以:
Uri orgServiceUri = new Uri(Config.CrmWebServiceUrl); var credentials = new ClientCredentials(); credentials.Windows.ClientCredential = new System.Net.NetworkCredential(Config.CrmServerAccount, Config.CrmServerPSW, Config.CrmServerDomain); OrganizationServiceProxy _serviceproxy = new OrganizationServiceProxy(orgServiceUri, null, credentials, null); return (IOrganizationService)_serviceproxy;
8.防火牆要開起來,不要關了,關了服務安全有問題。
9.權限最大的部門業務部門是根部門。
10.怎么添加示例數據?如下圖:

11.VMware vSphere Client 要學會怎么使用,這個工具很強大,可以和Hyper-V,Oracle VM VirtualBox對比下。安裝服務器的時候選windows Server 2008 R2 Enterprise(完全安裝) ,選自定義。如圖:

12.CRM 2011 中的早期綁定 和晚期綁定 怎么理解?
晚期綁定 指實體類型到實例化時通過參數確定。
或強類型與弱類型的理解。
早期和晚期綁定之間的關鍵區別涉及類型轉換。早期綁定提供所有類型的編譯時檢查,以便不會發生隱式轉換,而晚期綁定僅在創建對象或對類型執行操作時檢查類型。Entity 類需要明確指定類型以防止隱式轉換。
使用早期綁定實體類的優點是在編譯時檢查所有類型引用。已編譯的可執行文件包含調用類型的屬性、方法和事件所需的代碼。
13.CRM中的元數據?
元數據是數據的定義。一個實體有哪些字段,哪個字段是主屬性,哪個字段是ID,哪個字段什么類型,實體有什么關系等,這些定義就是元數據。
14.plugin 的異步和同步?
原則:能用同步的就不要用異步。
同步就是立即執行 異步就是不立即執行。
如果不是實時驗證就用異步,大多時候是同步的。
如果我們要同步一個表單的狀態給另外一個表單 那么就可以設置為異步
因為同步的是需要占用資源的,異步可以排隊的執行,這樣就可以節省很多資源了。
同步也是排隊的 根據注冊插件的順序。
二、基本問題:
1. explain in details about the event execution pipeline.
事件執行管道可以通過同步或異步方式處理事件。
平台核心操作和為同步執行注冊的所有插件都會立即執行。為事件注冊的同步插件按明確定義的順序執行。
為異步執行注冊的插件由異步隊,列代理放入隊列中並在稍后由異步服務執行。
具體可以看SDK。Request,Reponse 請求和響應,然后執行(Excute)
2. when do we register a plugin in child pipeline. give examples
CRM 2011中沒有,不區分父管道和子管道,就是父管道。
CRM 4.0里面有,就是plugin中觸發plugin,子管道。
3. What are images. Why are they used.
前期鏡像,后期鏡像,就是操作之前的值和操作之后的值。
比如執行Delete操作的時候,只能獲取當前記錄的ID,而不能獲取當前實體的其他屬性的值。用iamges就可以。
4. What is early binding and late binding. How is it used in CRM
早期綁定 指實體類型直接由類確定。
晚期綁定 指實體類型到實例化時通過參數確定。
目前我們主要使用晚期綁定,和PLUGIN沒關系,體現在實體,也就是數據上。
客戶在系統里是一個實體,一條實體記錄就是一條數據。早期綁定,晚期綁定指的是實體類的實現方式,實體類是保存實體數據的
5.How do you debug a plugin
利用Plugin注冊工具 參考:Microsoft Dynamics CRM 2011 Plugin 插件開發和調試
6. What is PrinciplalObjectAccess table, why is it used.
主要對象訪問,設計到權限,配置權限。
7. What is the use of stringmap(字符串映射) table.
字符串映射就是實體的選項集(OptionSetVaue),每個int類型會對應一個字符串(中文)
比如:狀態,草稿(10000),已提交(10001),已審批(10002)
1).select case pd.new_status when 10000 then '草稿' when 10001 then '已提交' when 10002 then '已審批' end as狀態
from new_test as pd
2).select (select Value from stringmap S where attributename='new_status'
and objecttypecode =(select objecttypecode from metadataschema.entity
where logicalname='new_test')
and langid='2052' and AttributeValue=pd.new_status) as 狀態
from new_test as pd
8.How do you set a recurrening activity in CRM
可以通過新建實體,下面勾選定義為活動實體。
9. when can infinite loop occur in a plugin. How do you avoid infinite loops in plugin code.
發生在一個插件時,可以無限循環。如何避免在插件代碼無限循環。
1).自己盡量寫好,可以使用preOperate和驗證前,localContext.PluginExecutionContext.InputParameters["Target"]= target_entity;
2).注冊plugin的時候,選擇你要觸發的具體哪個字段(Filtering),一般很多人這里都全選了,最好不要這樣。
10. How do you avoid sql deadlock.
可以再sql的查詢語句中加,with nolock.數據庫要設計好。盡量避免使用觸發器,用plugin處理。
11. How many types of relationships are available in crm
4種(1:n,m:n,n:1,自引用)
12. What is the difference when the ownership is user vs organizaion for a custom entity.
用戶或團隊和組織,一般用web服務創建一個記錄,用戶為8,給這個用戶有權限只有這個用戶才可以看,團隊為9,給這個團隊附加權限,該團隊下的所有用戶都可以看到。a.用戶 按用戶區分權限,比如控制A的東西不能讓用戶B看到。
b.組織 按組織區分權限,要么可以看到,要么不可以看到,不區分用戶,只按角色區分。
用戶和團隊:角色權限有:空心圓(無權限)、1/4分圓(用戶級別),1/2分圓(部門級別)、3/4分圓(上下級部門:只能看本級和下級,不能看上級) 全心圓(組織級別)。
組織:角色權限有空心圓(無權限)和全心圓(組織級別)。
像客戶實體,是按用戶級別,我的客戶可以不讓你看到。
像省份、城市之類的基礎數據,一般按組織級別,把一個省份分給一個用戶是沒有意義的。
這個建實體時要想好,因為實體建完之后不可以改這個屬性的。
13. what are filtered views?
篩選視圖,一般在reporting service中,有select * from A as CRMAF_FilteredA,考慮到權限的問題,就需要加Filtered
14. if you delete a record from UI, what happens in database. can you bring the record back?
在數據庫中會執行deleg from A where AId='{11}',刪除操作,刪除了,不能bring the record bakck。
15. what is deletion service? can you change its schedule(運行)?
就是一個deleteRequest,deleteReponse,傳遞給 Execute 方法,不能。
三、CRM必備知識:
1.你如何對CRM的數據庫進行優化?
答:建索引,優化SQL語句,通過SQL Server Profiler來調試。
2.怎么做報表開發?報表開發工具有哪些?SSIS、SSRS是什么?
答:1) CRM的報表一般是.rdl,也就是sql reporting service 報表。可以參考: 【Reporting Services 報表開發】— 總結
2) 利用Visual Studio或ReportBuilder3工具,比如安裝SQL Server 200 R2之后,有對應的Visual Studio 2008。
3) SSIS是Microsoft SQL Server Integration Services的簡稱,是生成高性能數據集成解決方案(包括數據倉庫的提取、轉換和加載 (ETL) 包)的平台。
SSRS是Microsoft SQL Server Reporting Services (SSRS),是一個實用的開發、發布報表的工具。這個用的
3.如何時在CRM中嵌入web頁面,如Asp.net。
將寫好的.aspx文件,放在CRM安裝目錄的ISV文件下,然后IFrame嵌入。
4.如何限制視圖的記錄數?如何讓視圖記錄條數不顯示? 參考:MSCRM 2011 修改顯示記錄數
1)這個記錄數是指 lookup 彈出來是視圖的記錄以及Homepage頁面的記錄
a.每頁的記錄數。
use 組織名_MSCRM
update UserSettings
set PagingLimit = 60 --默認為50
b.數據庫修改的是一共可以查詢的記錄數(針對全局的顯示記錄數最大值設置),
MSCRM_Config數據庫中表名為DeploymentProperties的系統級的參數設定表,找到ColumnName為PagingLimt的記錄,修改IntColumn的值,修改完成后重啟IIS(iisreset)生效.如下:
use MSCRM_CONFIG
update DeploymentProperties
set IntColumn = 600 --默認為500
where ColumnName='PagingLimit'

2)不顯示記錄數是用第三方。
5.銀行賬號的部分顯示(即 **** **** **** 9331)如何做?
1).可以在crm的客戶實體上新建兩個字段銀行賬號(new_bankaccount),文本型,和賬號(new_account),通過配置new_bankaccount的字段安全性配置可以達到這樣的效果,然后拼接new_bankaccount和account字符串。
具體如下圖:
a.設置->管理->字段安全性配置文件
b.字段安全性配置

下面的用戶必須不是擁有系統管理員權限的用戶,比如為ang。

配置讀取為否

然后以ang登陸,查詢查看客戶記錄,發現銀行賬號都為......和(****差不多),然后拼接兩個字段,就達到效果了。

2).可以用插件監控實體的Retrieve,對OutputParameter進行修改。具體怎么做,我還不知道。
retrieve的plugin很影響性能 每次打開都得觸發 我們不到萬不得已都避免用。
6.怎么按角色顯示不同的窗體?
權限配置。
7.用戶權限等級有哪些?團隊與用戶有什么區別,如何應用?
1) 用戶權限等級有空心圓(無權限)、1/4分圓(用戶級別),1/2分圓(部門級別)、3/4分圓(上下級部門:只能看本級和下級,不能看上級) 全心圓(組織級別)。
用戶或團隊和組織,一般用web服務創建一個記錄,用戶為8,給這個用戶有權限只有這個用戶才可以看,團隊為9,給這個團隊附加權限,該團隊下的所有用戶都可以看到。
a.用戶 按用戶區分權限,比如控制A的東西不能讓用戶B看到。
b.組織 按組織區分權限,要么可以看到,要么不可以看到,不區分用戶,只按角色區分。
用戶和團隊:角色權限有:空心圓(無權限)、1/4分圓(用戶級別),1/2分圓(部門級別)、3/4分圓(上下級部門:只能看本級和下級,不能看上級) 全心圓(組織級別)。
組織:角色權限有空心圓(無權限)和全心圓(組織級別)。
像客戶實體,是按用戶級別,我的客戶可以不讓你看到。
像省份、城市之類的基礎數據,一般按組織級別,把一個省份分給一個用戶是沒有意義的。
這個建實體時要想好,因為實體建完之后不可以改這個屬性的。
8.說說對PreEntityImages,PostEntityImages、InputParameters、OutputParameters的了解,平時如何使用?
1) PreEntityImages 前期實體鏡像集合
private readonly string preImageAlias = "image";
Entity preImageEntity = (context.PreEntityImages != null && context.PreEntityImages.Contains(this.preImageAlias)) ? context.PreEntityImages[this.preImageAlias] : null;
2) PostEntityImages 后期實體鏡集合
private readonly string postImageAlias = "PostImage";
Entity postImageEntity = (context.PostEntityImages != null && context.PostEntityImages.Contains(this.postImageAlias)) ? context.PostEntityImages[this.postImageAlias] : null;
3) InputParameters 輸入參數集合
Entity targetEntity = localContext.PluginExecutionContext.InputParameters["Target"] as Entity;
4) OutputParameters 輸出參數集合
可以用插件監控RetrieveMultiple,和監控Create、Update一樣的
EntityCollection conn = localContext.PluginExecutionContext.OutputParameters["BusinessEntityCollection"] as EntityCollection;
string message = Parentcontext.MessageName;
if (Parentcontext.PrimaryEntityName == "實體名")
比如執行Delete操作的時候,只能獲取當前記錄的ID,而不能獲取當前實體的其他屬性的值。用鏡像就可以取到屬性的值。
9.CRM的JS API中Xrm.Page.context、Xrm.Page.data.entity、Xrm.Page.ui、Xrm.Utility分別用於哪些開發?
1) Xrm.Page.context

2) Xrm.Page.data.entity
用的最多的就是
獲取當前記錄的GUID: Xrm.Page.data.entity.getId();
獲取當前記錄的實體名:Xrm.Page.data.entity.getEntityName();

3) Xrm.Page.ui
用的最多的是Xrm.Page.ui.getFormType() 獲取當前表單的操作類型。比如:create,update

4)Xrm.Utility

10.前期綁定和晚期綁定的區別是什么?
答:早期綁定 指實體類型直接由類確定。
晚期綁定 指實體類型到實例化時通過參數確定。
目前我們主要使用晚期綁定,和PLUGIN沒關系,體現在實體,也就是數據上。
客戶在系統里是一個實體,一條實體記錄就是一條數據。早期綁定,晚期綁定指的是實體類的實現方式,實體類是保存實體數據的。
11.自定義工作流如何開發?和Plugin類似,基本一致。
12.Plugin調試有哪些方式?參考:Microsoft Dynamics CRM 2011 Plugin 插件開發和調試
13.解決方案(Solution)托管和非托管的區別?
托管的是可以修改的,非托管的是不可修改的。
二者的區別體現在再次部署,導入后的行為上面。參考:MS CRM2011中的解決方案—托管與非托管
托管的可以修改非托管的 意思:解決方案為托管狀態的時候,可以修改方案下非托管的實體。
14.高級查找將數據導成XML,查詢FetchXml。
這個直接使用高級查找,查詢之后,導出來。
15.Plugin各執行階段的差異?前期驗證是否一定在事務外?
1) 
2) 否

16.一般你是否會將配置保存在web.config中?你如何保存平時開發中使用的各種配置?
會的,比如需要使用一些連接CRM數據庫的字符串,組織服務。
可以通過xml獲取它的值。
比如:修改域用戶密碼,自定義頁面的開發。
17.解決方案導入后如何撤消它?
托管的解決方案是可以,非托管的解決方案是不可以的。
18.Filtered視圖和視圖的區別?Filtered視圖的弊端?
篩選視圖,一般在reporting service中,有select * from A as CRMAF_FilteredA,考慮到權限的問題,就需要加Filtered。
視圖就是CRM中的實體英文名,在CRM2011中,它是由Base表和ExtensionBase表組成的。
區別就是有權限設置。
弊端就是查詢Filtered視圖效率很慢。
四、這都是CRM開發必須要知道的知識,如有不正確的地方,希望各位大俠指出來,謝謝。
