課時四:Action操作

參考文檔

語義說明

核心名詞

FetchXML:是基於Xml的查詢語言,可以把它簡單理解成SQL語句,通過它可以查詢Dynamics 365 CRM的數據。開發人員可以在WebAPI或者Organization Service執行FetchXML查詢來獲取數據,類似於SqlHelper.QueryTable(sql)

Action:Dynamics 365 流程中的一種,允許開發人員進行自定義開發,用來訂製並組合各種業務邏輯,比如商機贏單、訂單提交。我們可以把它簡單理解成C#中的一個方法,有輸入參數、輸出參數。操作的註冊模式分為兩種:一個是全局,一個是綁定到實體,可以獲取到實體ID

Web API:是客戶端連接服務端的一種方式,擁有良好的平台兼容性,不管什麼平台都可以調用,與開發語言無關。它是基於OData v4.0實現,提供了各種現代化的Restful Web服務

Organization Service:是客戶端連接服務端的另外一種方式,它是基於WCF技術實現,數據傳輸採用XML,僅使用於.NET客戶端

Action

​ 操縱類似與我們常用的方法,用於擴展系統的標準功能,用來實現項目中的業務邏輯。操作可以針對單個實體,也可以是全局(也就是任意實體都可使用)全局方法/局部方法

​ 工作流中可以調用操作,JS也可以調用操作,通過後端C#程式碼也可調用操作。始終在組織範圍內執行操作,不支援執行限制到用戶、業務部門或組織的範圍。

​ 和Plugin類似,都需要簽名,註冊到CRM中

自定義操作

新建Action流程

打開D365,進入我的流程中心

在流程中心頁面,點擊左上角新建按鈕,輸入流程名稱(全英文),類別選擇操作(Action),實體選擇無(全局)/實體(局部),建議全局,點擊確定創建

可選:定義輸入參數及輸出參數,完成後點擊保存,發布,激活

新建Action項目

打開VS,新建類庫項目(.NET 版本與D365版本對應)

新建類,繼承IPlugin介面,並實現Execute方法

簽名:右鍵項目,屬性,簽名,勾選為程式集簽名,新建,填寫文件名稱,取消使用密碼保護密鑰文件,確定

編譯:右鍵項目,清理,重新生成

註冊/綁定Action

打開註冊工具,登錄,新建Assembly

在步驟一中選擇Action項目編譯的DLL文件

在步驟二中勾選添加(使用)的Action(一個類庫可有多個action),點擊選擇添加

新建執行時機:找的上一步添加的類庫集合,點擊展開,右鍵添加的Action,選擇添加Step

Message:與action流程名一致;Primary Entity:關聯實體,若為實體則此Action為局部(實體),none為全局;其次,執行時期為PostOperation,完成

使用Action

JS調用

// 調用全局帶參方法
function createEntity() {
	var entity = new Object();
	entity['name'] = '21586625'
	entity['area'] = '21586625'
	entity['phone'] = '21586625'
    
	var req = new XMLHttpRequest();
	req.open('post', Xrm.Page.context.getClientUrl() + "/api/data/v9.0/new_wyg_cone", false)
	req.setRequestHeader("Accept", "application/json");
	req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
	req.setRequestHeader("OData-MaxVersion", "4.0");
	req.setRequestHeader("OData-Version", "4.0");

	req.onreadystatechange = function() {
		if (this.readyState == 4) {
			if (this.status == 200) alert(1)
		}
	}
	req.send(JSON.stringify(entity));
}

調試Action

與插件(Plugin)方式一致,詳情

接收參數

字元串類型

string name = context.InputParameters["name"].ToString();
string area = context.InputParameters["area"].ToString();
string phone = context.InputParameters["phone"].ToString();

整數類型

string name = context.InputParameters["name"].ToString();
int money = (int)context.InputParameters["money"];
int age = (int)context.InputParameters["age"];

布爾類型

string name = context.InputParameters["name"].ToString();
bool gender = (bool)context.InputParameters["gender"];
int age = (int)context.InputParameters["age"];

日期類型

string name = context.InputParameters["name"].ToString();
bool gender = (bool)context.InputParameters["gender"];
int age = (int)context.InputParameters["age"];
DateTime time = (DateTime)context.InputParameters["time"];

選擇列表

Entity(實體)類型

// Entity類型的參數建議指定@data.type (可以不指定,若是lookup到具體實體,不是customer,partylist類型),格式為Microsoft.Dynamics.CRM.實體邏輯名稱
// 需要指定記錄主鍵值,還有需要用到的該記錄的其他欄位值
var cus = {}
cus['@data.type'] = 'Microsoft.Dynamics.CRM.new_customer'
cus.new_customerid = '1377FF4A-B494-E811-8ACD-005056948ABE'
cus.new_name = 'libai'
cus.new_area = '上海市'
entity['cus'] = cus
Entity cus = (Entity)context.InputParameters["cus"];

EntityReference(查找)類型

// EntityReference類型的參數指定記錄ID就可以,在流程參數類型中已執行實體
var cus = {}
cus.new_customerid = '56C134ED-A433-EB11-B392-005056993F73'
entity['cus'] = cus 
EntityReference cus = (EntityReference)context.InputParameters["cus"];
// or
var s = context.InputParameters["cus"];

EntityCollection(實體列表)類型

var cusitem = {}
cus['@data.type'] = 'Microsoft.Dynamics.CRM.new_customer'
cus.new_customerid = '1377FF4A-B494-E811-8ACD-005056948ABE'
cus.new_name = 'libai'
cus.new_area = '上海市'
entity['cus'] = [cusitem]
EntityCollection cus = (EntityCollection)context.InputParameters["cus"];
// or
var s = context.InputParameters["cus"];