課時四:Action操作

位永光發表於2020-12-01

參考文件

語義說明

核心名詞

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"];

相關文章