zoukankan      html  css  js  c++  java
  • Dynamic CRM 2013学习笔记(五)禁止修改、删除审批通过后的单据

    审批通过后的单据,一般要对其进行控制,不能修改,不能添加,删除等,下面分别介绍下如何实现:

    一、 禁止修改:

    1. 主表控制,如果页面上审批状态为审批中或审批通过,就把整个页面都disable掉

      1: function controlReadonly() {
    
      2:     var status = Xrm.Page.data.entity.attributes.get("new_approval_status").getValue();
    
      3:     if (status == 2 || status == 3)//审批中或者审批通过
    
      4:     {
    
      5:         var controls = Xrm.Page.ui.controls.get();
    
      6:         for (var i in controls) {
    
      7:             var control = controls[i];
    
      8:             control.setDisabled(true);
    
      9:         }
    
     10:     }
    
     11: }

            

              2. 子表控制, 如果有子表,也要让其不能修改

              首先查找主表的approval status,如果是审批中或审批通过就disable整个子表

      1: function disableSubForm() {
    
      2:     var marketingPlan = Xrm.Page.getAttribute("new_marketing_planid").getValue();
    
      3:     if (marketingPlan != null) {
    
      4:         var filter = "new_marketing_planSet?$select=new_approval_status&$filter=new_marketing_planId eq guid'" + marketingPlan[0].id + "'";
    
      5:         var status = Query_ent(filter);
    
      6:         if (status != null && status.new_approval_status != null) {
    
      7:             if (status.new_approval_status.Value == 3 || status.new_approval_status.Value == 2) {
    
      8:                 controlReadOnly();
    
      9:             }
    
     10:         }
    
     11:     }
    
     12: }
    
    

    二、禁止添加及删除子表记录

    通过上面的js控制,页面上的所有字段确实被disable了,但子表的subgrid及子表页面上的添加及删除按钮没有被控制住。所以决定写一个通用的插件来控制添加及删除。
    1. 下图显示了如何在主表上注册这个通用插件
    image_thumb 

    这里 message为Delete,是对delete的控制;如果是Create,就要设置成post-operation,才能对添加进行控制。

    重点是右边的Unsecure Configuration的配置:

    • 传入的条件

    <filter type="or">
      <condition attribute="new_approval_status" operator="eq" value="2" />
      <condition attribute="new_approval_status" operator="eq" value="3" />
    </filter>

    • 如果满足这个条件就报这个error

    <check error="Cannot delete when approval status is approving or approved !">

    2. 子表上注册

    子表上没有approval status这个字段,这个字段只在主表上有,但又要依赖这个字段来控制子表,怎么办?

    这时就要指定进行如下的配置了:

      1: <check error="Cannot delete sub-form when main form is approving or approved!">    
    
      2:  <link-entity name="new_marketing_plan" to="new_marketing_planid">        
    
      3:   <filter type="or">            
    
      4:    <condition attribute="new_approval_status" operator="eq" value="2" />            
    
      5:    <condition attribute="new_approval_status" operator="eq" value="3" />        
    
      6:   </filter>    
    
      7:  </link-entity>
    
      8: </check>
    简单介绍下这里的配置,跟主表的配置相比,只是多了个link-entity:
    <link-entity name="new_marketing_plan" to="new_marketing_planid">   
    name指的是主表的实体, to指的是子表中link到主表实体的字段
     

    三、 技术实现

    1. 通过一个参数的构造函数来读取unsecure configuration里的配置
      1: public EntityCheck(string unsecure)
    
      2: {
    
      3:     m_Config = unsecure;
    
      4: }
    Microsoft Dynamics CRM 平台支持可选的插件构造函数,该函数接受一个或两个字符串参数。如果编写此类构造函数,则可以在运行时向插件传递任何信息字符串。
    以下示例显示构造函数的格式。在此示例中,插件类名为 SamplePlugin。
    public SamplePlugin()
    public SamplePlugin(string unsecure)
    public SamplePlugin(string unsecure, string secure)

    构造函数的第一个字符串参数包含公共(不安全)信息。第二个字符串参数包含非公共(安全)信息。在这里,安全是指加密的值,而不安全是指未加密的值。如果使用带脱机访问功能的 Microsoft Dynamics CRM for Microsoft Office Outlook,则 CRM for Outlook 脱机时安全字符串不会传递到执行的插件。

    在这些字符串中传递到插件构造函数的信息是在 Microsoft Dynamics CRM 中注册插件时指定的。使用插件注册工具注册插件时,可以在“注册新步骤”窗体提供的“安全配置”和“不安全配置”字段中输入安全信息和不安全信息。使用 Microsoft Dynamics CRM SDK 以编程方式注册插件时,SdkMessageProcessingStep.Configuration 包含不安全的值,SdkMessageProcessingStep.SecureConfigId 引用包含安全值的 SdkMessageProcessingStepSecureConfig 记录。

     
    2. 读取link-entity
      1: XmlNodeList linkEntityNodeList = linkEntityNode.SelectNodes("link-entity");
    
      2: if (linkEntityNodeList != null)
    
      3: {
    
      4:     foreach (XmlNode subLinkEntityNode in linkEntityNodeList)
    
      5:     {
    
      6:         LinkEntity subLe = GetLinkEntity(subLinkEntityNode);
    
      7:         le.LinkEntities.Add(subLe);
    
      8:     }
    
      9: }
     
    3. 从config里读取filter
      1: XmlNodeList filterNodeList = linkEntityNode.SelectNodes("filter");
    
      2: if (filterNodeList != null)
    
      3: {
    
      4:     foreach (XmlNode filterNode in filterNodeList)
    
      5:     {
    
      6:         FilterExpression filter = this.GetFilter(filterNode);
    
      7: 
    
      8:         le.LinkCriteria.AddFilter(filter);
    
      9:     }
    
     10: }
     
    4. 从config里读取condition
      1: XmlNodeList conditionNodeList = linkEntityNode.SelectNodes("condition");
    
      2: if (conditionNodeList != null)
    
      3: {
    
      4:     foreach (XmlNode conditionNode in conditionNodeList)
    
      5:     {
    
      6:         ConditionExpression condition = this.GetCondition(conditionNode);
    
      7: 
    
      8:         le.LinkCriteria.AddCondition(condition);
    
      9:     }
    
     10: }
     
    5. 最后合成一个QueryExpression对象,传入到RetrieveMultiple方法,进行查询,如果有记录存在,就抛出error:
      1: EntityCollection ec = AdminService.RetrieveMultiple(config.Query);
    
      2: if (ec != null && ec.Entities.Count > 0)
    
      3: {
    
      4:     throw new InvalidPluginExecutionException(config.Error);
    
      5: }

    Dynamic CRM 2013学习笔记 系列汇总

  • 相关阅读:
    二分查找算法
    Python基础二(基础数据类型)
    Python基础一
    mysql 数据库
    Scrapy (网络爬虫框架)入门
    列表推导式的使用
    Scrapy(爬虫框架)中,Spider类中parse()方法的工作机制
    vim 基础命令大全
    windows cmd 命令大全
    类与类的关系一
  • 原文地址:https://www.cnblogs.com/fengwenit/p/3990064.html
Copyright © 2011-2022 走看看