分享方式:


撰寫 Microsoft Dynamics CRM 2015 表單的程式碼

 

發佈日期: 2016年11月

適用對象: Dynamics CRM 2015

表單程式設計提供方式與實體表單互動,使用的是 JavaScript (針對發生在表單中的事件執行)。

本主題內容

何時使用表單程式設計

使用表單程式設計時要考慮的因素

管理程式庫相依性

撰寫可以正常執行的表單指令碼

呈現不同的表單

開發工具

何時使用表單程式設計

Microsoft Dynamics 365 提供許多選項來控制商務程序。 表單程式設計是一種選項。 但是,請記住您有其他選項:商務規則。 商務規則提供一個方法給不了解 JavaScript 以及非表單中的商務程序邏輯開發人員使用。 如需詳細資訊,請參閱自訂指南主題:TechNet:建立和編輯商務規則

表單程式設計和商務規則的主要好處為立即可以看到成果。 其不需要資料來提交給伺服器,且因此針對許多方案提供最佳效能。 因為它們允許人工互動,它們也是最具彈性的選項。

因為商務規則可以建立並由非開發人員維護的優點,所以也有某些限制,且不能取代表單指令碼。 表單程式設計可讓您達成無法使用商務規則進行的動作。

使用表單程式設計頻繁執行的工作包括:

  • 資料驗證

  • 自動化

  • 處理強化和執行

資料驗證

可能的話,您應該在編輯資料後執行資料驗證。 表單欄位定義會為您執行最常見的資料驗證。 例如,若為電子郵件地址格式的 Single Line of Text 欄位,將不允許輸入無效值。

針對與您的組織,使用表單程式設計做為唯一的其他資料驗證。 例如,組織可能含有一些關於電話號碼格式或服務活動 Subject 欄位相關的最短長度之類的特殊規則。

自動化

使用表單指令碼來自動執行一般工作時,您可以大大強化產能。 您可以設定欄位值,依照資料輸入表單,這可協助節省使用者輸入資料的寶貴時間。 使用表單程式設計進行自動化處理十分有用,因為它可讓使用者在特例中驗證標準處理是否有效的。 使用者可以在儲存記錄前做必要的調整。

處理強化和執行

您可以自訂表單中的資料顯示或表單配置,為組織中使用者執行的特定工作最佳化表單。 您可以使用表單程式設計顯示或隱藏特定表單元素,或開啟已為實體定義的不同表單。 您可以根據表單或相關紀錄中顯示的資料來控制哪些欄位是必要的。

在 Microsoft Dynamics CRM 2015 和 Microsoft Dynamics CRM Online 2015 更新,您可撰寫程式碼,控制顯示在表單頂端的商務程序流程。其他資訊:為商務程序流程撰寫指令碼

使用表單程式設計時要考慮的因素

此套用在表單程式設計的邏輯僅能在某個瀏覽器在 Microsoft Dynamics 365 應用程式實體表單中互動時執行。 因此,您不應該只依靠表單程式設計來啟動或執行與您的資料相關的程序。 記錄可直接透過 Web 服務 API 或透過在表單的內容外的工作流程建立或更新。 表單程式設計應該透過使用外掛程式和程序補充商務邏輯,如此一來所有建立或更新的紀錄將會依照相同的處理程序。

Microsoft Dynamics CRM 2015 和 Microsoft Dynamics CRM Online 2015 更新 商務規則可定義在實體範圍執行,使相同邏輯應用在伺服器,不管動作的來源。其他資訊:TechNet:建立和編輯商務規則

因為表單編輯器中提供隱藏表單欄位的功能,故使用者將無法檢視或更新某些實體資料,這不是一種強制值安全性需求的完整解決方案。 一名使用者可以透過使用不同的方法,例如 [進階搜尋] 來看到並非顯示在表單上的實體資料。其他資訊:Microsoft Dynamics CRM 2015 的安全性模型

管理程式庫相依性

為了獲得最佳效能,Microsoft Dynamics 365 表單會以非同步的方式平行載入 JavaScript Web 資源。 這表示,表單程式庫的設定順序無法保證程式庫一定會完整下載,並且在另一個程式庫可能嘗試使用當中定義的其中一個物件之前初始化。

如果您的程式碼需倚賴另一個程式庫完整下載並初始化,最直接的方式會是將兩個程式庫結合在單一 JavaScript Web 資源內,且您的程式碼位於程式庫程式碼下方。 較為複雜的方法是使用程式庫,像是 head.jsrequire.js 來控制個別程式庫載入的方式。

撰寫可以正常執行的表單指令碼

當您針對在表單撰寫指令碼時,請依循下列運作協助達到最佳效能:

  • 避免包含不必要的 JavaScript Web 資源程式庫
    越多指令碼加入至表單,下載這些表單需要越多時間。 通常指令碼在第一次載入後於瀏覽器中快取,不過,第一次顯示表單時的效能通常令人印象最深刻。

    如需特定範例,請不要因為您要使用 XMLHttpRequests,就在表單指令碼內包含 JQuery。 因為 jQuery 有許多人熟悉並用於執行這些請求的 $.ajax 函數,這是開發人員的喜好設定,並非必要。 您可以使用可以在所有瀏覽器 (Microsoft Dynamics 365 支援) 中可發現的原生 XMLHttpRequest 物件執行這些請求。其他資訊:使用 jQuery

  • 避免在 Onload 事件中載入所有指令碼
    如果您有只支援欄位之 OnChange 事件或 OnSave 事件的程式碼,請確保設定具有這些事件之事件處理常式的指令碼程式庫,而不是 OnLoad 事件。 如此一來,當表單載入時,載入這些程式庫可以順延並提升效能。

    我們不建議為求方便而在 OnLoad 事件常式中使用 addOnChange 方法。 因為這會減少增加事件常式所需的步驟,所以也會導致載入得更慢。

  • 使用摺疊的索引標籤,將 Web 資源載入順延
    當 Web 資源或 IFRAME 包含在摺疊索引標籤內的區段中,如果索引標籤摺疊,它們不會載入。 當這個索引標籤展開時,它們會載入。 當索引標籤狀態變更時,會發生 TabStateChange 事件。 支援摺疊的索引標籤內 Web 資源或 IFRAME 所需的所有程式碼都可以使用 TabStateChange 事件的事件處理常式,而減少 OnLoad 事件可能必須產生的程式碼。

  • 設定預設可視性選項
    避免在 OnLoad 事件中使用隱藏表單元素的表單指令碼。 而是針對表單載入時預設會隱藏的表單元素,設定預設可視性選項。 然後,在 OnLoad 事件中使用指令碼以顯示您要顯示的表單元素。

呈現不同的表單

有數個呈現表單的不同方法。 這會影響您能使用的代碼或可用事件的類型。

舊版表單顯示

在 Microsoft Dynamics CRM Online 2015 更新 1 中有一項新的系統設定:使用舊版表單顯示。 在此版本中,表單顯示的方式有了改善,且頁面的內部結構也已變更。 因此,使用不支援方法的表單指令碼將無法存取舊版中可用的 DOM 項目。 如果您升級至此版本之後出現新的錯誤,請嘗試套用此設定,看看錯誤是否會消失。 如果可行的話,很可能表示造成這些錯誤的指令碼是使用不支援的方法。

您可以設定 [使用舊版表單顯示] 以便有更多時間解決這些問題,不過,您將不會感受到新的表單顯示基礎結構帶來的效能提升。

備註

[使用舊版表單顯示] 設定將在下一次發行的主要版本中移除。 到時所有表單指令碼都必須能夠處理新的表單顯示方式。

更新的實體

所有自訂實體和某些系統實體具有一項已更新的使用者介面,包括命令列和新的表單 API。 更新的系統實體如下表所列:

客戶​​

約會​​

行銷活動

行銷活動方式

行銷活動回覆

案例​​

競爭者

連絡人​​

合約

合約服務內容

電子郵件

權利

權利範本

傳真

發票

潛在客戶​​

信件

行銷名單

商機​​

商機產品

訂單

通話​​

位置

價目表項目

產品

產品關聯

產品關聯

佇列

快速行銷活動

報價

週期性約會

銷售文宣

SLA

SLA KPI 執行個體

社交活動

社交設定檔

工作​​

團隊

使用者

備註

有些更新實體包括複合屬性。 這些需要一些特殊考量。其他資訊:為複合屬性撰寫指令碼

更新的實體表單也可以包含協同控制項,提供存取附註、活動以及文章,如果已為實體啟用。 Xrm.Page 物件不提供您存取和協同控制。 您可以存取此包含協同控制項的區段元素,如果您想要用指令碼來顯示或隱藏。

表單程式設計方法及已更新的實體 PreSearch 事件

下表列出可使用的表單程式設計方法 (僅限更新的實體)。

方法

描述

Xrm.Page.context.client.getClient

回傳一個值指出指令碼在哪一個用戶端中執行。

Xrm.Page.context.client.getClientState

回傳一個值指出用戶端的狀態。

Xrm.Page.context.getUserName

傳回目前使用者名稱。

Xrm.Page.data.entity.getPrimaryAttributeValue

取得實體的主要屬性值的字串。

Xrm.Page.data.重新整理

非同步重新整理表單的資料,而不必重新載入頁面。

Xrm.Page.data.儲存​​

在儲存作業完成後,以非同步形式儲存紀錄,搭配項目設定回撥函數來執行。

Xrm.Page.data.entity attribute.getIsPartyList

決定查詢屬性是否代表 partylist 查詢。

Xrm.Page.ui control.clearNotification

針對控制項移除已顯示的訊息。

Xrm.Page.ui control.setNotification

顯示鄰近控制項的訊息,指出該資料為無效。

Xrm.Page.ui.clearFormNotification

使用此方法移除表單層級通知。

Xrm.Page.ui.setFormNotification

使用此方法顯示表單層級通知。

Xrm.Page.ui control.addCustomFilter

使用 fetchXml 新增其他篩選至查詢顯示結果。 每個篩選會使用任何先前新增的篩選做為「AND」條件。

Xrm.Page.ui control.setShowTime

指定日期控制是否要顯示日期的時間部分。

Xrm.Utility.alertDialog

使用回撥函數顯示非阻塞的警示對話方塊。

Xrm.Utility.confirmDialog

搭配不同的回撥顯示非阻塞確認對話方塊,依照使用者按下的按鈕。

PreSearch 事件

在您設定查詢值時,新的 PreSearch 事件 在搜尋對話方塊開啟前發生。 在此應用程式中,此事件不使用使用者介面設定事件常式,只能使用 Xrm.Page.ui control.addPreSearch 方法設定。 當使用者搜尋一筆紀錄以設定為查詢欄位的值,使用此事件搭配 addCustomFilteraddCustomViewsetDefaultView 方法來控制檢視表開啟。

使用傳統表單的實體

使用傳統表單介紹不更新系統實體。 如果這些實體表單在 CRM 2011 中使用功能區且沒有存取在此版本中新增的 API 的權限,則會繼續使用。 這些實體如下表所列:

地址

文章

文章註解

大量刪除作業

業務單位

關係

折扣

折扣清單

文件位置

電子郵件附件

追蹤

目標

目標計量

匯入來源檔案

發票產品

訂單產品

價目表

佇列項目

報價產品

彙總欄位

彙總查詢

已儲存的檢視表

服務

服務活動

SharePoint 網站

地點

領域

單位

單位群組

平板電腦用 CRM 啟用的實體

只有選取的系統實體和自訂實體可以使用 平板電腦專用 Microsoft Dynamics CRM 來顯示。 下列系統實體在 平板電腦適用的 CRM有可編輯的表單。

客戶​​

活動

約會​​

案例​​

競爭者

關係

連絡人​​

潛在客戶​​

附註

商機​​

商機產品

通話​​

佇列項目

社交活動

社交設定檔

工作​​

因為 平板電腦適用的 CRM 在 Web 應用程式中沒有行為相同表單,有些 API 無法使用。 例如,在 平板電腦適用的 CRM 標籤無法展開或摺疊,因此 索引標籤 TabStateChange 事件 不會發生,且 Xrm.Page.ui tab.setDisplayState 無法用來展開或摺疊索引標籤。其他資訊:為平板電腦版本的 CRM 撰寫指令碼並偵錯

開發工具

使用良好的工具時,您撰寫 JavaScript for CRM 表單的經驗將會大幅提升。

使用良好的撰寫工具

因為 JavaScript 是已翻譯的語言,不需要特殊開發工具。JavaScript 為文字,因此可以在應用程式或在文字編輯器 (如記事本) 編輯。 不過,您可以在使用撰寫工具時達到極大的產能,撰寫工具提供專門支援編輯 JavaScript 檔案的功能,例如 Microsoft Visual Studio 和 Microsoft Visual Studio Express。 您可以取得免費的 Visual Studio Community 2013

使用瀏覽器開發人員工具

所有現代化的瀏覽器都提供內建工具,可執行偵錯指令碼。 這些工具也能在撰寫 Dynamics 365 表單的指令碼時提供相當大的幫助。 這些開發人員工具常稱為 F12 工具,因為這是用來開啟這些工具的按鍵。 如需使用這些工具的詳細資訊,請參閱 W3Schools JavaScript 偵錯

使用開發人員工具確認您將上傳做為 Web 資源的指令碼的語法。 這些工具還可讓您更了解做為程式設計依據的物件模型。 例如,當您撰寫程式碼來存取表單中的特定物件時,常會需要依名稱存取這些物件。 但您不需要在表單編輯器中查詢物件的名稱,而是使用開發人員工具中的主控台詢問 Xrm.Page 物件模型,以取得您要存取的屬性或控制項的名稱。 例如,如果您要依名稱存取特定子格控制項,可以使用瀏覽器開發人員工具主控台撰寫下列程式碼。

Xrm.Page.ui.controls.get(
function(ctrl,i){
 if(ctrl.getControlType() == "subgrid")
  console.log(ctrl.getName()
  );
});

所有子格控制項的名稱都會寫入主控台的輸出窗格中。 此指令碼利用功能將匿名委派函數傳遞至集合中找到的 get 方法,以及物件上找到的其他方法,並依類型篩選以及傳回物件名稱,例如此範例中使用的 Xrm.Page.ui control.getControlType 和 Xrm.Page.ui control.getName

重要

Dynamics 365 表單由數個框架組成。 若要讓程式碼在主控台中運作,您必須選取正確的框架。 若是 CRM Online 2015 更新 1 表單,請選取名為 ClientApiWrapper.aspx 的框架。 若是舊版,請使用名為 main.aspx 的框架。

以下列出一些範例。

  • 在表單中依類型顯示所有屬性的名稱

    Xrm.Page.getAttribute(
    function (att, i) {
     console.log(att.getName() + " : " + att.getAttributeType())
    });
    
  • 顯示 optionset 屬性的有效選項值

    Xrm.Page.getAttribute(
    function (att, i) {
     if (att.getAttributeType() == "optionset") {
      console.log(att.getName())
      var options = att.getOptions();
      var optionsLength = options.length;
      for (var i = 0; i < optionsLength; i++) {
       var option = options[i];
       console.log("   value: " + option.value + " Label: " + option.text)
      }
     }
    });
    

另請參閱

撰寫用戶端應用程式擴充功能
使用 URL 開啟表單、檢視表、對話方塊和報表
表單指令碼快速參考
使用 JavaScript 搭配 Microsoft Dynamics CRM 2015
Microsoft Dynamics CRM 2015 適用的 JavaScript 程式庫
Microsoft Dynamics CRM 2015 開發人員自訂指南
使用表單和欄位事件
使用 Xrm.Page 物件模型
為平板電腦版本的 CRM 撰寫指令碼並偵錯
為複合屬性撰寫指令碼
為商務程序流程撰寫指令碼
撰寫子格的指令碼
使用執行內容和表單事件準銷售案源
在表單使用 IFRAME 和 Web 資源控制
使用 OData 端點搭配 AJAX 和 JScript Web 資源

© 2017 Microsoft. 著作權所有,並保留一切權利。 著作權