參考文件
語義說明
核心名詞
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"];