zoukankan      html  css  js  c++  java
  • CRM 2011 Plugin 知识点小总结 plugin初学者必备知识

    1.??的使用,就是判断值是否为null,为null的话,给赋初值,否则就直接取值。

    decimal new_amount = 0;
    if (targetEntity.Contains("字段1")) 
    {
       //?? 判断(targetEntity["字段1"] as Money为null的话,赋值为0
       new_amount = (targetEntity["字段1"] as Money ?? new Money(0M)).Value;
    }
    
    注:字段1为货币(Money)类型。

    2. 一般从Targt 中取值,必须先判断是否存在,然后在判断不为null.不然会报错,因为字段1有可能不在Target里面,意思

    targetEntity.Contains("字段1")为False,那么直接写targetEntity["字段1"] != null,就会报错。不信,大家可以试试。
    decimal new_amount = 0;
    if (targetEntity.Contains("字段1") && targetEntity["字段1"] != null)
    {
        new_amount = (targetEntity["字段1"] as Money).Value;
    }
    而不能
    if (targetEntity["字段1"] != null && targetEntity.Contains("字段1"))
    {
        new_amount = (targetEntity["字段1"] as Money).Value;
    }
    
    注:字段1为货币(Money)类型。

    3.可以将Entity取出的字段放在AttributeCollection 属性集合中去,然后可以直接从这个属性集合中取值。

    /// <summary>
    /// 获取属性集合
    /// </summary>
    /// <param name="dataEntity">Entity</param>
    /// <returns>返回属性集合</returns>
    public AttributeCollection GetTriggerData(Entity dataEntity)
    {
        AttributeCollection parames = new AttributeCollection();
        
        if (dataEntity != null)
        {
            //先将字段放在一个字符串数组中
            string[] arrayStr = { "new_actiontype",
                "new_po_status", "new_sort", 
                "new_detailitem","new_costfrom","new_bgcontrolperiod" };
            //foreache 循环判断,把dataEntity的索引赋给parames中去。
            foreach (var item in arrayStr)
            {
                if (dataEntity.Contains(item) && dataEntity[item] != null)
                {
                    parames[item] = dataEntity[item];
                }
            }
        }
        return parames;
    }
    调用:AttributeCollection parmes = GetTriggerData(dataEntity);

     4.根据很多条件,查询一个实体的实体集合,除了fetchxml,也可以用QueryByAttribute。

    /// <summary>
    /// 根据所属预算品类、费用项目、费用归属和预算控制期间获取预算费用项实体
    /// </summary>
    /// <param name="service">crm组织服务</param>
    /// <param name="parmes">属性集合</param>
    /// <returns>返回Entity</returns>
    public Entity GetBugetByParmes(IOrganizationService service, AttributeCollection parmes)
    {
        QueryByAttribute query = new QueryByAttribute("new_buget");查询的实体
        query.ColumnSet = new ColumnSet("new_bugetid");//查询的列
        query.AddAttributeValue("statecode", 0);//查询的条件
        query.AddAttributeValue("new_sort", (parmes["new_sort"] as EntityReference).Id);
        query.AddAttributeValue("new_expenseitem", (parmes["new_detailitem"] as EntityReference).Id);
        query.AddAttributeValue("new_bugetunit", (parmes["new_costfrom"] as EntityReference).Id);
        query.AddAttributeValue("new_bedgetsheet", (parmes["new_bgcontrolperiod"] as EntityReference).Id);
    
        EntityCollection acc_new_buget = service.RetrieveMultiple(query);
    
        Entity new_bugetEntity = null;
    
        if (acc_new_buget.Entities.Count > 0)
        {
            new_bugetEntity = acc_new_buget.Entities[0] as Entity;
        }
    
        return new_bugetEntity;
    }

    5.Double? 类型+? 这个暂时不说明

    //查询
    QueryByAttribute query = new QueryByAttribute("new_exp_undertaker");
    query.ColumnSet = new ColumnSet("new_ratio_undertaker");
    query.AddAttributeValue("new_pe_undertaker", new_promotion_peid);
    
    EntityCollection accEntityColls = service.RetrieveMultiple(query);
    
    if (accEntityColls.Entities.Count == 0) return;
    
    foreach (Entity accEntity in accEntityColls.Entities)
    {
        Double? new_ratio_undertaker = accEntity.Contains("new_ratio_undertaker")
        ? accEntity["new_ratio_undertaker"] as Double? : new Double?(0);
        //更新
        UpdateNew_deficit(service, new_ratio_undertaker, new_writeoff, accEntity.Id);
    }
    取值:(decimal)((new_ratio_undertaker.Value)

    6. 如果一个实体上其他字段汇总到另外字段上,比如字段a,b,c,d 需要d = a+b*c,当进行这样子操作的时候,只有Create和Update,而且都为Pre_validation操作,能放到

    Pre_validation(10)处理,尽量放到Pre_validation处理,因为这样子性能比较好,至于具体原因可以看SDK。

    还有一般做check,或者导入数据根据一个lookup字段的带出值,赋给另外一个字段,也可以放在这里处理。CRM4的话是context.Stage == 10,Pre前期处理。这里暂不说明。

        
    Entity targetEntity = context.InputParameters["Target"] as Entity;
    
    //消息名称
    string messageName = context.MessageName;
    
    decimal sumNew_budgetbalance = 0;
    
    switch (messageName)
    {
        case "Create":
                sumNew_budgetbalance = DoCreateSumNew_budgetbalance(targetEntity);
                break;
        case "Update":
                sumNew_budgetbalance = DoUpdateSumNew_budgetbalance(targetEntity, preImageEntity);
                break;
    }
    
    targetEntity["new_budgetbalance"] = new Money(sumNew_budgetbalance);
    
    context.InputParameters["Target"] = targetEntity;//把提交的值放到Target中,当保存之后,就会把这些值保存到数据库中。
    
    }
    
    2.RegisterFile.crmregister:
    
     <Plugin Description="Plug-in to New_bugetUpdatenew_CalcuBudgetbalance" FriendlyName="New_bugetUpdatenew_CalcuBudgetbalance" Name="Frensworkz.LibyCrm.Plugins.New_bugetUpdatenew_CalcuBudgetbalance" Id="b5985a39-e284-e311-ad3b-00155d386b48" TypeName="Frensworkz.LibyCrm.Plugins.New_bugetUpdatenew_CalcuBudgetbalance">
              <Steps>
                <clear />
                <Step CustomConfiguration="" Name="New_bugetUpdatenew_CalcuBudgetbalance" Description="New_bugetUpdatenew_CalcuBudgetbalance Create" Id="b6985a39-e284-e311-ad3b-00155d386b48" MessageName="Create" Mode="Synchronous" PrimaryEntityName="new_buget" Rank="1" SecureConfiguration="" Stage="PreOutsideTransaction" SupportedDeployment="ServerOnly">
                  <Images />
                </Step>
                <Step CustomConfiguration="" Name="New_bugetUpdatenew_CalcuBudgetbalance" Description="New_bugetUpdatenew_CalcuBudgetbalance Update" Id="b9985a39-e284-e311-ad3b-00155d386b48" MessageName="Update" Mode="Synchronous" PrimaryEntityName="new_buget" Rank="1" SecureConfiguration="" Stage="PreOutsideTransaction" SupportedDeployment="ServerOnly">
                  <Images>
                    <Image Attributes="new_quotabudget,new_ratio,new_saletarget,new_standardbuget,new_programholdbudget,new_noprogramhold,new_sales_app,new_pe_ch_money,new_po_ch_money,new_sales_release,new_adjust_fee,new_send_in,new_adjust_reduce" EntityAlias="PreImage" Id="bc985a39-e284-e311-ad3b-00155d386b48" MessagePropertyName="Target" ImageType="PreImage" />
                  </Images>
                </Step>
              </Steps>
            </Plugin>
    View Code 1  

    大家肯定会问,为什么会这样子写Plugin,这里暂不说明。

    7.将明细中的金额汇总到主表上的一个字段时,很多人都没有考虑到SetStateDynamicEntity这个步骤。  

        
    base.RegisteredEvents.Add(new Tuple<int, string, string, Action<LocalPluginContext>>(40, "Create", "new_po", new Action<LocalPluginContext>(ExecuteNew_po_New_po_status_SumNew_tt_budget)));
                base.RegisteredEvents.Add(new Tuple<int, string, string, Action<LocalPluginContext>>(40, "Update", "new_po", new Action<LocalPluginContext>(ExecuteNew_po_New_po_status_SumNew_tt_budget)));
                base.RegisteredEvents.Add(new Tuple<int, string, string, Action<LocalPluginContext>>(40, "Delete", "new_po", new Action<LocalPluginContext>(ExecuteNew_po_New_po_status_SumNew_tt_budget)));
                base.RegisteredEvents.Add(new Tuple<int, string, string, Action<LocalPluginContext>>(40, "SetStateDynamicEntity", "new_po", new Action<LocalPluginContext>(ExecuteNew_po_New_po_status_SumNew_tt_budget)));
    
    
    protected void ExecuteNew_po_New_po_status_SumNew_tt_budget(LocalPluginContext localContext)
    {
    if (localContext == null)
    {
        throw new ArgumentNullException("localContext");
    }
    
    IPluginExecutionContext context = localContext.PluginExecutionContext;
    
    IOrganizationService service = localContext.OrganizationServiceAll;
    
    Entity dataEntity = null;
    switch (context.MessageName)
    {
        case "Create":
            dataEntity = context.InputParameters["Target"] as Entity;
            break;
        case "Update":
        case "SetStateDynamicEntity":
            dataEntity = context.PostEntityImages[this.postImageAlias] as Entity;
            break;
        case "Delete":
            dataEntity = context.PreEntityImages[this.preImageAlias] as Entity;
            break;
    }
    
     New_po_New_po_status_SumNew_tt_budgetAction(service, dataEntity);
    
    }
    View Code  

    8.从DataRow中取值的时候,需要判断row["new_sort"].ToString()不能为空。

    foreach (DataRow row in ds.Tables[0].Rows)
    {
      if (!string.IsNullOrEmpty(row["new_sort"].ToString()))
      {
         new_sort = new Guid(row["new_sort"].ToString());
      }
    }

    9.新建(Create)的时候,需要判断preImageEntity != null。

    private readonly string preImageAlias = "image";
    Entity preImageEntity = (context.PreEntityImages != null && context.PreEntityImages.Contains(this.preImageAlias)) ? context.PreEntityImages[this.preImageAlias] : null;
    
    if(messageName =="Create")
    {
     if(preImageEntity != null)
     {
       if(preImageEntity.Contains("new_promotion_pe"))
       {
         new_promotion_peId = (preImageEntity["new_promotion_pe"] as EntityReference).Id;
       }
     }
    }
  • 相关阅读:
    「LibreOJ NOI Round #2」不等关系
    Atcoder Grand Contest 036 D
    「CTS2019」氪金手游
    「CTS2019」珍珠
    「APIO2016」烟花表演
    「PKUWC2018/PKUSC2018」试题选做
    「PKUWC2018」猎人杀
    「WC 2019」数树
    CodeForces 794 G.Replace All
    「BZOJ 4228」Tibbar的后花园
  • 原文地址:https://www.cnblogs.com/delen/p/4236116.html
Copyright © 2011-2022 走看看