转载原文链接:http://blog.csdn.net/itsme_web/article/details/53976204
1、使用SOQL语句查询时,字符串类型的只能使用‘单引号’,否则报错:Unknown error parsing query;
eg:SELECT Id, Subject, CaseNumber, Status, Priority
FROM Case
WHERE CaseNumber = '00001036' //注意此处autoNumber类型数字为String类型
使用SOQL其他注意事项:
a、尽量使用Order By,保证查询结果的稳定性;
b、使用LIMIT,防止数据量超过50000而报错;
c、使用Offset偏移时,一定放在该查询语句的最后面,其限制及应用场景见:https://developer.salesforce.com/docs/atlas.en-us.soql_sosl.meta/soql_sosl/sforce_api_calls_soql_select_offset.htm?search_text=offset
2、标准字段的API Name即为该标准字段的Field Name;
eg:Case标准对象的Subject API Name即为 Subject
3、计算两个日期之间相隔的天数:
eg:TODAY() - DATEVALUE( CreatedDate )
Implementd__Date__c - DATEVALUE( CreatedDate )
注意:只有当日期为标准字段时,才使用DATEVALUE()来转化
4、在terminal中使用curl方式查看json数据(通常使用workbench>utilities>REST Explorer),通常会用到sessionId,获取方法如下:
String sessionID = UserInfo.getSessionId();
System.debug(sessionID);
5、完整版REST services demo
- @RestResource(urlMapping='/Cases/*')
- global with sharing class CaseManager {
- @HttpGet
- global static Case getCaseById() {
- RestRequest req = RestContext.request;
- String caseId = req.requestURI.substring(req.requestURI.lastIndexOf('/')+1);
- Case result = [SELECT CaseNumber, Subject, Status, Origin, Priority
- FROM Case
- WHERE Id = :caseId];
- return result;
- }
- /*
- HttpGet步骤:
- 1、创建RestRequest类型的req对象(RestContext.request的返回值类型就是RestRequest)
- 2、通过req对象的requestURI属性利用字符串检索技术拿到caseId
- 3、创建Case对象result,并将通过caseId查到的记录赋值给该对象,注意“WHERE Id = :caseId”
- 4、返回Case对象
- */
- @HttpPost
- global static ID createCase(String subject, String status,
- String origin, String priority) {
- Case thisCase = new Case(
- Subject=subject,
- Status=status,
- Origin=origin,
- Priority=priority);
- insert thisCase;
- return thisCase.Id;
- }
-
-
-
-
-
-
- @HttpDelete
- global static void deleteCase() {
- RestRequest req = RestContext.request;
- String caseId = req.requestURI.substring(req.requestURI.lastIndexOf('/')+1);
- Case thisCase = [SELECT Id FROM Case WHERE Id = :caseId];
- delete thisCase;
- }
-
-
-
-
-
-
-
-
-
- @HttpPut
- global static ID upsertCase(String id, String subject, String status, String origin, String priority) {
- Case thisCase = new Case(
- Id = id,
- Subject = subject,
- Status = status,
- Origin = origin,
- Priority = priority
- );
- upsert thisCase;
- return thisCase.Id;
- }
-
-
-
-
-
-
- @HttpPatch
- global static ID updateCaseFields() {
- RestRequest req = RestContext.request;
- String caseId = req.requestURI.substring(req.requestURI.lastIndexOf('/')+1);
- Case thisCase = [SELECT Id FROM Case WHERE Id = :caseId];
- Map params = (Map)JSON.deserializeUntyped(req.requestBody.toString());
- for(String fieldName : params.keySet()) {
- thisCase.put(fieldName, params.get(fieldName));
- }
- update thisCase;
- return thisCase.Id;
- }
-
-
-
-
-
-
-
-
-
-
- }
-
-
-
-
-
-
区别:put vs patch
the same:You can update records with the put or patch methods.
the difference: put can either create new resouce or update the existing resource; patch can update the existing resouce exclusively.
6、Apex中在使用类继承时需要使用到的关键字:extends,super,virtual,override.跟Java继承不同的是,超类必须使用virtual修饰,子类使用override和extends修饰,如果需要重写父类的方法,父类中该方法需要用virtual修饰,子类需要使用override。另外如果子类需要使用超类的域或者方法则需要使用super关键字,注意构造方法的复用不需要用成对的virtual和override关键字修饰超类的构造方法和子类的构造方法。
7、利用公式字段插入图片:IMAGE(path,img_title,height,width)
8、在report中使用The "Power of One" technique来统计不重复的数据
9、在Apex中使用静态资源加载jquery:
10、简单的使用vf标准控制器来展示Contact列表,并实现点击名称跳转详细页面。方法有三种:
11、增强lookup查找功能:我们通过lookup进行对父记录Name进行搜索时,通常默认只能使用Name来搜索,有时候比如我们在子记录中想要通过Phone来搜索Account的Name,这个时候可以在setup->enter 'Search Settings' in Quick Search Box中即可增强搜索
12、将使用html编辑的前端网站放到force.com平台上的方法:将做好的网站,比如shangpinhui/Bootstrap所有文件打包成zip上传到salesforce的Static Resources中,比如拿shangpinhui为例,目录结构为:shangpinhui->images/js/css/index.html,打包上传后命名为ShangpinhuiZip(名字不能一数字开头),之后在Visualforce Pages中编辑如下代码:
- action="{!URLFOR($Resource.ShangpinhuiZip, 'shangpinhui/index.html')}">
-
在action里面通过URLFOR表达式来将页面加载进去。这样就不用考虑修改网站页面资源引用的路径了,注意在Developer Edition里面由于每个账号限制只允许放一个网站绑定一个url,所以要实现多个网站同时上传作为作品展示,可以再做一个列表,分别通过超链接映射到相应的网站上,这样就可以将您的所有作品都绑定在一个页面上分别访问。
13、在Company Information中可以查看User Licence的使用次数,如下图:
14、recordSetVar与的适用场景比较:
recordSetVar保存的是SOBject的List,一般会与以及的熟悉standController(即可以传标准对象也可以传自定义对象)连用,常用于输出性质的组件,而对于输入性质的组件,若强行使用需要加[0],这种场景推荐使用标签,来将比较长的api名称用变量存储。
15、15位Id与18位Id的区别?
C:Q:: what is the difference 18 digit id and 15digit?
Ans: When we create record in the object salesforce will create 18 digit unique to recognize it.
This is a case insensitive
Same 18 digit is represented as 15 digit id as case sensitive
Id 001—9000001—1o2Of in this 15/18 digit id first 3digits indicate Object and last 5 digits indicate record
16、两种方法获取组件id:
a、{!$Component.idName} - eg. var el1 = document.getElementById('{!$Component.name}').value;// 该方法不需要写嵌套的id,若要指明则:$Component.bk.age
b、pg:fm:bk:name - eg. var el2 = document.getElementById('pg:fm:bk:name').value;// 该方法每个组件均需要指明id,并按嵌套关系依次书写,id间以:隔开
上述方法除在js中应用外也可用于css,若不指定id系统自动生成id,并在相对应组件中自动添加嵌套关系。
17、apex:page组件与apex:sectionHeader组件属性的相互影响:
apex:page组件中比较少用到的属性:
如果page中用到了setup="true"属性,那么sectionHeader中就不能显示对象图标。
18、创建visualforce的4种方法:
a、导航法 - setup->developer->visualforce page;
b、developer console;
c、IDE - eg. sublime text / eclipes - 安装eclipes并配置forceIDE插件视频 - https://www.youtube.com/watch?v=ufe62nGecMg
d、打开developer mode(两种方式:1. 在User里面-Edit-Development Mode;2. 在My Setting-Personal-Advanced User Details-Edit-Development Mode)后,通过url方式创建。
19、
为
pageBlockTable中的
column组件设置宽度不生效
的解决方案:
a、嵌套关系1: form>pageBlock>pageBlockTable>column,可以直接为column增加width的style或者styleClass,需要的话pageBlockTable设置个width:100%;
b、嵌套关系2: form>pageBlock>pageBlockSection>pageBlockTable>column,这个时候添加style和styleClass是不生效的,此时只需要在pageBlockTable中设置columnsWidth="width1,width2...";
20、图解批准进程approval process,理解队列,多级审批:http://blog.csdn.net/itsme_web/article/details/732509
21、ApexPages.currentPage().getUrl().contains('st'),apex查看当前页面url是否包含某个字符串。
22、Decimal.valueOf(ApexPages.currentPage().getParameters().get('st')),将字符串形式转换成Decimal格式;
23、DateTime.getTime()获取时间戳,单位为ms;
24、使用apex处理日期:
- DateTime nowTime = System.now();
- String now_date = nowTime.format('yyyy-MM-dd');
- String now_dateTime = nowTime.format('yyyy-MM-dd HH:mm:ss');
- System.debug(now_date+'<------>'+now_dateTime);
debug信息:
- 14:23:00:002 USER_DEBUG [4]|DEBUG|2017-07-26<------>2017-07-26 14:23:00
25、
限制点击自定义按钮的简档:
-
-
-
-
-
-
-
- public static Boolean isValidUser(String userId){
- Set profileSet = new Set{'品牌专员','事件行销专员','物料制作专员','线上媒介专员','线下媒介专员','展览展示专员','子公司企划专员'};
- String profileName = [SELECT Profile.Name FROM User WHERE Id = :userId].Profile.Name;
- return profileSet.contains(profileName);
- }
-
- if(!isValidUser(UserInfo.getUserId())){
- result.code = '1';
- result.msg = '只有相关专员才能发起定向谈判!';
- return JSON.serialize(result);
- }
26、Apex实例化一个内部类:
- public class OuterClass {
- public class InnerClass {
- String name = '';
- Blob body = '';
- }
- }
-
- OuterClass outer = new OuterClass();
- OuterClass.InnerClass inner = new OuterClass.InnerClass();
-
- global class SyncInterface {
-
- global class SyncResults{
- global List responses;
- }
-
- global class Response{
- public String TYPE;
- public String MSG;
- public String BUSINESS_ID;
- public String SALESFORCE_ID;
- public String PROC_TYPE;
- }
- }
-
-
- SyncResults syncResponseList = new SyncResults();
- syncResponseList.responses = new List();
27、使用Database.query()查询数据集合:
- filterStr = 'AND Type__c = \'Text\' ';
- query = 'SELECT Name, Type__c, Message__c, Msgpic__c, Mediaid__c, VioceRecognition__c, VoiceFormat__c, VoiceSrc__c ' +
- 'FROM BD_CaseDetail__c ' +
- 'WHERE Case__c = :caseId ' + filterStr + 'ORDER BY CreatedDate ASC LIMIT 500';
- caseDetailList = Database.query(query);
- caseDetailList = [SELECT Name, Type__c, Message__c, Msgpic__c, Mediaid__c, VioceRecognition__c, VoiceFormat__c, VoiceSrc__c
- FROM BD_CaseDetail__c
- WHERE Case__c = :caseId AND Type__c = 'Text' ORDER BY CreatedDate ASC LIMIT 500];
28、
Live Agent
配置:
1、先启用live agent - setup -> live agent settings -> enable
2、My Settings -> Advanced settings -> Live Agent User(勾选上)
29、根据自定义地理定位数据类型字段API名表示经纬度:
现有API名称为:Geographic_Coordinates__c的地理位置坐标字段,要表示经度使用:Geographic_Coordinates__Longitude__s, 要表示纬度使用:Geographic_Coordinates__Latitude__s
- Select Id, Address__c, Geographic_Coordinates__Longitude__s, Geographic_Coordinates__Latitude__s From Store__c
30、创建Task:
- 任务:
- Task task = new Task();
- task.Subject = ‘A信息修改申请';
- task.status = 'open';
- task.priority = 'High';
- task.whatId = '0017F00000CfcdsQAB';
- task.ownerId = '0057F000000pe6uQAA';
-
- task.IsReminderSet = true;
- task.ReminderDateTime = System.now();
- insert task;
31、Apex中List、Map、Set集合总结:
List:有序、可重复;
Map:无序,key重复则value覆盖;
Set:无序,不可重复;即使重复了,取前面的值,如:
- Set s = new Set {1,2,3,2,1};
- system.debug('s: ' + s);
DEBUG INFO:s: {1,2,3}
Sample:
- List accs = [select id, name from account limit 3];
- map m = new map();
- String lastId = '';
- if(accs != null && !accs.isEmpty()) {
- Integer i = 0;
- for(Account a : accs) {
- System.debug('a['+i+'] : ' + a);
- lastId = a.Id;
- m.put(a.Id, a);
- i++;
- }
- }
-
- System.debug(m);
- System.debug(m.get(lastId));
- Map m1 = new Map {
- 'key1' => 'value1',
- 'key2' => 'value2',
- 'key1' => 'value2',
- 'key2' => 'value3',
- 'key1' => 'value3'
- };
- System.debug('m1: ' +m1);
- System.debug('m1.key1: ' + m1.get('key1'));
32、Partner User对Quote Tab不可见,Quote无Sharing Rule,它的共享受Opportunity的控制,如果对Partner User的Quote的OLS设置为View且Opportunity页面布局的Quote放出来了,如果共享Opp的Owner没有创建Quote记录,Partner User不可见Quote相关列表,需要创建一条Quote,才可以看见。
33、salesforce soql中不能对公式字段使用Group By;
34、封装Map>技巧 + 去重 | 参考资源:How to Send More than 10 E-mails
- Map> userCaseMap = new Map>();
- List allCaseLoggedToday = new List();
- List salesIds = new List();
- List salesRep = [SELECT Id , Name , Email , ManagerId
- FROM User
- WHERE Profile.Name = 'System Administrator'];
- for(User u : salesRep) {
- salesIds.add(u.Id);
- }
- allCaseLoggedToday = [SELECT Id, CaseNumber,CreatedById, Owner.Name , Account.Name , Contact.Name
- FROM Case
- WHERE CreatedDate = TODAY AND CreatedById in : salesIds];
- for(Case c : allCaseLoggedToday) {
- if(userCaseMap.containsKey(c.CreatedById)) {
-
- List tempList = userCaseMap.get(c.CreatedById);
- tempList.add(c);
-
- userCaseMap.put(c.CreatedById , tempList);
- }else {
-
- userCaseMap.put(c.CreatedById , new List{c});
- }
- }
35、使用apex获取IP地址:ApexPages.currentPage().getHeaders().get('X-Salesforce-SIP');
36、在为输入元素赋初始值时,我们经常会使用url将参数写入该输入元素的Name属性,我们通常会担心,在Org迁移时,这些Name值是不是会改变,从而增加我们的维护负担?经调研,Vf画面的Name不会随着Org的改变而改变。
37、Salesforce获取某个日期所在月份的天数:
- Date d = System.today();
- Integer numberDays = date.daysInMonth(d.Year(), d.Month());
- System.debug(numberDays);
38、Salesforce布局特性:如果相关列表上无任何按钮,那么相关列表面板只有在有记录时才会显示。
39、Lead Home Page调整经验之谈:
a、没有配置方法实现Home页面布局调整,比如将Tools和Reports换个位置;
b、无法用自定义报表链接替换Reports里面的标准报表链接-无法编辑标准报表,无法将自定义报表移至Lead Reports Folder;
c、如果必须实现只能重写标准Lead Tab按钮;
40、如果记录锁定,用户需要更新记录,则必须使用Webservice,比如:报价锁定非系统管理员需自动同步报价时,我们需要在Trigger里面调用Webservice,这时就需要使用到@future异步方式了。
41、Opportunity和Quote为Master-Detail关系,在导入历史数据时,Opportunity和Quote的Owner未同步,事后同步时,不可使用apex方法更新Quote Owner,错误信息为:"Can't change quote owner. Enable quotes without parent opportunities."。
42、System.debug('result: ' + rtMap.get(myRt).equals(qt.RecordTypeId) + '--qt.RecordTypeId: ' + qt.RecordTypeId + '--rtMap.get(myRt): ' + rtMap.get(myRt));Id为18位。
43、去重Sample - 看似怪诞,实则大有用处:
- Map accIDs = new Map();
- for(Quote qt: (List
)Trigger.New){
- if(!accIDs.containsKey(qt.Quote_To_Account__c))
- accIDs.put(qt.Quote_To_Account__c,'');
- }
- Map accs = new Map([SELECT id,BillingStreet,BillingCity, BillingState, BillingPostalCode, BillingCountry FROM Account WHERE Id IN : accIDs.keySet()]);
44、启用或禁用内联编辑 - 有时候我们希望禁用用户默认的行内编辑功能,直接去user interface中将Enable Inline Editing关掉即可。
45、问题:System Administrator的Profile中Home的Tab Settings显示Default On,在Tab面板和Tab的customize列表中并没有看到Home?- 先禁用profile的enhanced profile user interface,之后在profile的Tab settings中勾上下图1,保存即可。
参见资料:https://help.salesforce.com/articleView?id=Home-Page-Tab-is-Missing-for-Users&language=en_US&type=1
46、在apex中启用记录锁来锁定或解锁记录。
- select count() from DTT__Geographic_Region__c
- select count() from DTT__Geographic_Region__c
- select count() from DTT__Geographic_Region__c
- select count() from DTT__Geographic_Region__c
- select count() from DTT__Geographic_Region__c
47、如何配置实现超级管理员下次登录salesforce org不需要输入验证码:Profile -> System Administrator -> Login IP Ranges,设置IP Start Address:0.0.0.0,IP End Address:255.255.255.255即可。
48、使用Mavensmate同步DEV与UAT环境中简档的字段级别权限:在环境迁移时,部分元数据会存在丢失,导致两环境存在差异,比如简档中档FLS。
【Step by Step】:先登陆到DEV环境,利用Mavensmate retrieve Profile和Custom Object(标准对象也在里面),然后勾选某对象如Order的fields和简档明细,点击Update后,在Sublime中打开文件;使用同样档方法将UAT相关文件下载到本地,然后直接复制粘贴简档文件档元数据覆盖UAT即可。