Dynamics 365新功能:可編輯的網格(行內編輯)


關注本人微信和易信公眾號: 微軟動態CRM專家羅勇 ,回復238或者20161127可方便獲取本文,同時可以在第一間得到我發布的最新的博文信息,follow me!我的網站是 www.luoyong.me 。

很多Dynamics CRM用戶有個呼聲,就是CRM網格中的內容能直接編輯。從Dynamics CRM 2013開始,訂單產品,商機產品,報價單產品,發票產品等子網格是可以進行有限行內編輯的,可以參考我的文章  微軟Dynamics CRM 2013介紹系列之Q & A ,但是不能自己進行客制化,所以其可編輯能力還是比較有限的。
Dynamics 365開始就提供了強大的可編輯的網格,我們今天來看看這個特性。首先我們需要一個可以使用的Dynamics 365環境,最快的辦法是申請試用,包括中國大陸的手機號碼也能申請試用了,需要試用的朋友請根據DTCC的原創技術貼  如何注冊 Dynamics 365 試用賬號 進行申請,沒有加入DTCC的朋友趕緊加入吧,推薦人可以填寫我的賬號 luo.yong@hotmail.com 。我這也申請了一個試用版: https://lycrm365.crm5.dynamics.com 。
申請好Dynamics 365試用后,我們根據MSDN上的文章  Use editable grids 來看看可編輯的網格,按照官方的說法,通過瀏覽器訪問Dynamics CRM 365的時候在列表網格(homepage grid),表單網格(form grids)和子網格(subgrids)上都支持可編輯的列表,通過移動端訪問則在儀表盤和表單網格中支持可編輯的網格。
首先一個問題,所有實體都支持可編輯網格嗎?NO!那哪些支持呢?MSDN上列出了如下標准,這些標准都滿足才支持通過瀏覽器訪問CRM的可編輯網格:
1. 實體是可定制的 (IsCustomizable = true)
2. 實體是刷新后的實體(IsAIRUpdated = true)或者自定義的實體(IsCustomEntity = true)
3. 實體不是子實體(IsChildEntity = false)
查看實體的元數據則可以通過導入SDK中的MetadataBrowser解決方案來查看。我們以客戶實體為例:
 
 
可以知道客戶實體是支持可編輯網格的。從條件來看,客制化的實體除了子實體以外都是支持可編輯網格的。
一個一個去看太累,MSDN上提供了代碼可以導出來看看,我稍微修改下如下:
static void Main(string[] args)
{
    try
    {
        var crmSvc = new CrmServiceClient(ConfigurationManager.ConnectionStrings["CRM365"].ConnectionString);
        if (crmSvc.IsReady)
        {

            //<snippetDumpEditableGridEntityInfo1>
            RetrieveAllEntitiesRequest request = new RetrieveAllEntitiesRequest()
            {
                EntityFilters = EntityFilters.Entity,
                RetrieveAsIfPublished = true
            };

            // Retrieve the MetaData.
            RetrieveAllEntitiesResponse response = (RetrieveAllEntitiesResponse)crmSvc.Execute(request);

            // Create an instance of StreamWriter to write text to a file.
            // The using statement also closes the StreamWriter.
            // To view this file, right click the file and choose open with Excel. 
            // Excel will figure out the schema and display the information in columns.

            String filename = String.Concat("EditableGridEntityInfo.xml");
            using (StreamWriter sw = new StreamWriter(filename))
            {
                // Create Xml Writer.
                XmlTextWriter metadataWriter = new XmlTextWriter(sw);

                // Start Xml File.
                metadataWriter.WriteStartDocument();

                // Metadata Xml Node.
                metadataWriter.WriteStartElement("Metadata");

                foreach (EntityMetadata currentEntity in response.EntityMetadata)
                {
                    // Start Entity Node
                    metadataWriter.WriteStartElement("Entity");

                    bool canBeDisplayedInSitemap = currentEntity.IsCustomizable.Value;

                    if (canBeDisplayedInSitemap)
                    {
                        metadataWriter.WriteElementString("LogicalName", currentEntity.LogicalName);
                        metadataWriter.WriteElementString("DisplayName", currentEntity.DisplayName.UserLocalizedLabel?.Label);
                        metadataWriter.WriteElementString("CanEnableEditableGridWeb", (!(bool)currentEntity.IsChildEntity && ((bool)currentEntity.IsAIRUpdated || (bool)currentEntity.IsCustomEntity)).ToString());
                        metadataWriter.WriteElementString("CanEnableEditableGridMobile", (currentEntity.IsVisibleInMobileClient.Value || currentEntity.IsVisibleInMobileClient.CanBeChanged).ToString());
                    }

                    // Write the Entity's Information.

                    //End Entity Node
                    metadataWriter.WriteEndElement();
                }

                // End Metadata Xml Node
                metadataWriter.WriteEndElement();
                metadataWriter.WriteEndDocument();

                // Close xml writer.
                Console.WriteLine("Dumped information in the EditableGridEntityInfo.xml file");
            }
        }
        else
        {
            Console.WriteLine("連接CRM出錯:" + crmSvc.LastCrmError);
        }
        Console.WriteLine("程序運行完成!");
        Console.ReadKey();
    }
    catch (FaultException ex)
    {
        Console.WriteLine("程序出現異常:ex.Message=" + ex.Message);
        Console.ReadKey();
    }
}

 

上面程序使用的連接字符串如下:
<add name="CRM365" connectionString="AuthType=Office365;Username=crmadmmin@lycrm365.onmicrosoft.com; Password=Pasor@d1;Url=https://lycrm365.crm5.dynamics.com" />
運行完畢后生成了一個名稱為EditableGridEntityInfo.xml 的文件,用Excel打開如下:
 
可以知道導出了143個標准實體和1個客制化實體,哪些支持哪些不支持篩選下就知道了。
下面我們來配置下客戶實體的可編輯網格,首先在解決方案中加入客戶實體,然后點擊客戶實體,選擇 控件 這個tabpage,注意這個Tabpage是新增的,然后再點擊 添加控件 ,如下圖所示:
 
點擊后出現界面如下,選擇可編輯網格,點擊添加按鈕。
 
然后點擊 添加查找功能 ,我這里做的設置如下:
 
最后將 可編輯網格 那行的Web列選中,保存后發布。
 
然后再去我的可用客戶視圖查看,可以看到文本列可以編輯:
 
查找字段列也可以編輯:
 
我自己創建一個個人視圖,也是可以編輯的,日期時間字段的編輯效果如下:
 
選項集字段的編輯效果如下:
 
當然,可編輯網格也遵守權限控制,如果用戶只有讀的權限就不能編輯,也遵從字段級安全設置和業務規則的限制。我這里做個業務規則來看看,業務規則很簡單就是客戶名稱不能包括test,可以看到Dynamics 365創建業務規則的頁面變化挺大的:
 
激活業務規則后我去看看效果,如果我在客戶名稱中輸入了test,則會有信息提示:
 
 點擊客戶名稱旁邊的圖標,就會將我在業務規則中設置的消息顯示出來:
 
當然業務規則能設定規則比較簡單,如果復雜的話需要寫JavaScript來實現,這個也是支持的,可以參考MSDN上的文章   Editable grid objects and methods (client-side reference) 和  Execution context (client-side reference) 來做,我這里寫個簡單的例子,就是客戶名稱如果包括測試二字則提示錯誤不能保存,代碼如下:
function accountNameOnchangeHandler(execObject) {
    var entityObject = execObject.getFormContext().data.entity;
    var nameAttr = entityObject.attributes.getByName('name');
    var isNameContainstest = nameAttr.getValue().indexOf('測試') === -1;
    // nameField will be an Xrm.Page control if invoked from a form OnChange event;
    // nameField will be a editable grid GridCell object if invoked from editable grid OnChange event.
    var nameField = nameAttr.controls.getByIndex(0);
    if (!isNameContainstest) {
        nameField.setNotification('客戶名稱不能包括測試二字!', 'nameNotification');
    }
    else {
        nameField.clearNotification('nameNotification');
    }
}

 

設置代碼和可編輯網格關聯的界面如下:
 
需要注意的是設定客戶名稱OnChange的時間執行程序的時候需要 將執行上下文作為第一個參數傳遞 這個選中。
 
發布以后看到的效果如下:
 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM