2014-10-09 56 views
0

我有一個名爲「文檔訪問」的實體。現在,此實體文檔訪問與事件(N = 1)的關係(一個事件可以有許多文檔訪問)。CRM 2013 - 根據條件防止刪除記錄

當有人創建新的文檔訪問記錄時,我有一個JS來檢查創建記錄的人(當前登錄的用戶)是否與事件的所有者相同。如果不是,我不允許創建(這是在記錄的保存中設置的)。

文檔訪問記錄的所有者可以是任何人(不一定是事件的所有者)。如何確保防止刪除這些文檔訪問記錄,除非事件的所有者完成該記錄?

  1. 我可以通過安全角色來實現嗎?我無法想出可通過安全角色實現此目的的解決方案,以便在顯示「視圖」或「表單」時甚至不會顯示「刪除」按鈕。
  2. 作爲 功能區的一部分,我可以通過JavaScript連接到刪除按鈕來實現相同的功能嗎?如果是這樣,我怎樣才能得到被選中刪除的事件ID?如果我們做了批量刪除,它也會被觸發嗎?
  3. 如果它是一個插件,它是否應該在刪除操作的預驗證階段?

回答

5

我會嘗試回答,並限定每個你自己的選擇:

  1. 使用安全角色。否,因爲您想根據相關實體的所有權來控制刪除,而這是不可能的。
  2. 使用JavaScript。您可以使用將事件所有者與文檔訪問記錄所有者進行比較的自定義JavaScript功能區規則隱藏按鈕。但是,這種方法不會支持包括批量刪除在內的所有用例。
  3. 使用插件。這是正確的方法,並且在預先驗證上註冊是可以的。無論刪除請求來自何處,它都會強制執行您的業務規則。這可能來自用戶通過UI,批量刪除或平臺操作(如外部集成請求)。確保您在解釋業務規則的例外中返回有意義的消息。
1

最好的方法是通過刪除文檔訪問記錄上的插件來完成此操作。

在你的代碼可以按照下列步驟操作:

  1. 檢索事件與文檔訪問相關業主:

    Guid incidentId --> You get this form the lookup field, you have in Document Access to Incident Entity incident = service.Retrive("incident", incidentId, new ColumnSet("onwerid"));

  2. 檢查誰觸發插件用戶是事件的擁有者

    // context --> execution plugin context Guid ownerIncident = ((EntityReference)incident.Attributes["ownerid"]).Id; if(ownerIncident != context.InitiatingUserId) { throw new InvalidPluginExecutionContext("Can't delete Documet Access record"); } // otherwise let the record to be deleted