Salesforce classic 小知识点记录

部分内容参考自 https://www.cnblogs.com/zero-zyq/category/798149.html

  • There is one minor problem to fix first, which is that the workflow field update wont work with a lookup relationship.
  • 触发workflow rule的方式:

There are a few different ways you can make this update. You could do this in Apex code, or by creating a Flow, or by creating another workflow rule.

  • 在salesforce中所有App都是共用一个平台,所以在做项目时,涉及到公共资源的要注意不能影响到其他App
  • Salesforce中分页,后端只能最多两千条数据,页面只能1万条数据,所以要实现分页效果,就需要自己在代码逻辑实现。
  • 根据Record Type来区分属于哪个App和数据类型
  • Profile中的不能选中view all 和 modify all,否则自定义规则不会生效;
  • Role控制访问权限,sharing setting如果设置了public那么不会根据自定义Role设置规则(sharing rules设置)来显示,会显示所有数据,所以要设置成private.
  • Public groups共享分组下role角色的数据
  • Profile和permission set是用来控制功能权限;role、sharing setting和public groups都是数据权限
  • Custom object 是不共享的,standard object是共享的
  • 执行顺序:Validate Rule > workflow rule > Trigger (如果中间有一步中断,则不会执行后面的步骤)
  • Profile控制大范围的权限,permission set控制细微权限,sharing Setting控制对象的可访问性
  • Record Type Name一般为项目名,每个对象都应该创建Record Type和Page Layout以免影响其他项目。
  • 每条Rule指定前都应该加上Record Type的验证,也是为了避免不会影响其他App。
  • 循环中不能使用sql操作,否则会报错。
  • 数据操作

  • DML语句:

查找:[queryString]    添加:insert    修改:update    删除:delete    添加或修改:upsert

  • Database类的方法:

查找:Database.query()    添加:Database.insert()    修改:Database.update()    删除:Database.delete()   添加或者修改:Database.upsert()

两者区别:

  1. 使用DML语句进行批量操作时,比如批量添加,当有一个有错误的时候,便会报错,之前添加的内容便添加失败,但是使用Database的方法时,可以设置参数来控制,当有错误出现的时候是否跳过本条记录进行下一条记录的操作;
  2. 使用Database的方法可以进行事务处理,使用DML语句没法实现此功能。

 

  • 如何选择DML和Database方法这两种方式

             a.普通增删改查,遇到异常就抛出的可以选择DML语句,毕竟写起来方便

             b.如果需要用到批处理,需要使用Database类

                        c.在批处理中,遇到错误继续下一条处理的使用Database类的方法

                        d.需要用到事务,对操作有可能进行回滚操作的使用Database类的方法

  • Database类方法部分介绍

1. public static sObject[] query(String queryString)

String fetchAccount = 'select Id from Account limit 10';

List accountList = Database.query(fetchAccount);

system.debug(JSON.serialize(accountList));

注意:使用List接收查询结果,如果查询结果为空的情况下,上面的accountList并不是null,而是()代表长度为空,所以如果判断当前查询是否有值,不能只通过accountList == null来判断,而是需要通过accountList.size() == 0来判断

2.public static Database.SaveResult insert(sObject recordToInsert, Boolean allOrNone)

               public static Database.SaveResult[] insert(sObject[] recordsToInsert, Boolean allOrNone)

 这两个方法功能与DML语句中的insert相似,区别为多了一个allOrNone参数,当设置成false的情况下,允许部分插入成功,当设置成true的情况下,其功能和DML的insert相同。当需求中要求可以部分插入成功,将不成功的信息显示出来情况下,使用Database.insert是最好不过了,Database.SaveResult类用于保存插入,修改的记录是否成功,如果失败情况下的失败信息等讯息。此种方式可以常常用于批处理操作中。

  • 事物篇

Database类的方法可以实现数据库的事务处理,主要通过两个方法实现:

public static System.Savepoint setSavepoint():此方法用于设置一个事务的保存点,返回类型为Savepoint类型。

public static Void rollback(System.Savepoint databaseSavepoint):此方法用于回滚到指定的保存点。

例:

SavePoint sp1 = Database.setSavePoint();

List goodsList;

Goods__c goods = new Goods__c();

goods.GoodsName__c = 'goodsNameTest';

goods.GoodsPrice__c = 200;

goods.GoodsCostPrice__c = 100;

insert goods;

goodsList = [select Id,GoodsName__c,GoodsPrice__c,GoodsCostPrice__c from Goods__c where Id = :goods.Id];

if(goodsList != null && goodsList.size() > 0) {

    Goods__c currentGoods = goodsList.get(0);

    system.debug('rollback以前 : ' + JSON.serializePretty(currentGoods));

}

Database.rollback(sp1);

goodsList = [select Id,GoodsName__c,GoodsPrice__c,GoodsCostPrice__c from Goods__c where Id = :goods.Id];

if(goodsList != null && goodsList.size() > 0) {

    Goods__c currentGoods = goodsList.get(0);

    system.debug('rollback以后 : ' + JSON.serializePretty(currentGoods));

} else {

    system.debug('rollback 以后,不存在刚才添加的记录');

}
  • TYPEOF在SOQL中主要是运用在一个字段关联几个对象的时候,用作区分是哪个对象的查询数据。E.g.:
SELECT

TYPEOF What

WHEN Account THEN Phone

ELSE Name

END

FROM Event

WHERE CreatedById IN

(

SELECT CreatedById

FROM Case

)
  • 当使用limit或者offset(偏移量必须不大于2000)之后,一次查询数据不能超过2000条数据,否则会报错。
  • 在SOQL中如果使用了聚合函数(查询时,记得给聚合函数字段加别名),那么在代码中接收查询数据的对象不能用原来的普通对象,而是使用AggregateResult,在查询结果中再通过该对象获取相关的值。e.g.:
AggregateResult[] groupedResults = [SELECT AVG(Amount) aver FROM Opportunity];

Object avgAmount = groupedResults[0].get('aver');
  • 在salesforce中查询结果不能超过5万条,在for循环中不能使用sql操作
  • 在Trigger中如果处理Trigger中的对象数据时,在循环中直接对Trigger的对象进行字段更新操作即可,操作完可不用再insert或者update操作,但是操作的不是Trigger中的对象,则循环完成后需要update或者insert操作。
  • With sharing 和with out sharing的设置,是关系到设置的sharing规则能否生效,但是在代码中也要控制(确保成功)。
  • Transient关键字,Some Apex objects are automatically considered transient, that is, their value does not get saved as part of the page's view state.如果是使用了list集合之类的,存储数据量大的,最好加上transient关键字,加上后不会把该值传到页面上。
  • Trigger中使用限制:

·  new只适用于执行insert和update的trigger操作时并且类型为before的时候,才可以使用new返回列表;

·  newMap只适用于before update,after insert以及after update的trigger操作时,才可以使用newMap返回map集合;

·  old以及oldMap只适用于update和delete操作时,才可以使用old以及oldMap

  • 常用的Global variable
    1. $CurrentPage通过CurrentPage变量你可以获取当前页面的页面名称,URL以及参数(param)值,例:


  此页面的页面名称: {!$CurrentPage.Name}
此页面的URL:{!$CurrentPage.URL}
通过在URL中对此页面传递一个参数,key为paramName,此paramName对应的value为:{!$CurrentPage.Parameters.paramName}

注:paramName是url中传递的参数名字。

   2.$Label:通过此变量可以获取custom labels中配置的自定义label,自定义label分成静止的内容以及动态的内容。如:



    

    此种方式为动态形式的label value显示:

    

        

        

    

    

    

        此种方式为静态形式的label value显示:

        

        

    

注:Label.后面的名字是自定义的Label名称。

3.$ObjectType类似apex中的SObjectType类的功能:通过此对象可以获取类或者字段的meta data,比如label名称等.项目中有的时候需要获取字段的label信息,通过此种方式获取的label信息可以直接实现国际化功能,而不用自己创建多套内容来维护国际化;如:



    

         Account的Label : 
Account表中的字段为Name的Label :

4.$Page :类似apex中的pageReference功能,绑定在标签等上面实现链接跳转功能。如:



    跳转到其他页面

注:此处的pageName是自定义的visualforce page的名字。

5.$Resource此变量经常用到,我们有时候需要引入某个css文件或者js文件,或者显示某些文件图片等,需要先上传到static resources中,然后通过$Resource.file_name即可引入,如:



       

    字体比较
字体比较

6.$User获取当前登陆的用户信息:



     

         
邮箱地址为:{!$User.Email}

 

  • 工作流程:

Salesforce classic 小知识点记录_第1张图片

你可能感兴趣的:(salesforce)