Salesforce
2022-02-22 17:50:07 0 举报
AI智能生成
Salesforce
作者其他创作
大纲/内容
salesforce
① 资料
开发者官网
https://developer.salesforce.com/
常见问题解答区
https://developer.salesforce.com/forums#!/feedtype=SINGLE_QUESTION_SEARCH_RESULT&id=906F00000008tGJIAY
安装IDE
https://developer.salesforce.com/tools/vscode
零基础学习
https://trailhead.salesforce.com/zh-CN
登录后Setup主要内容
https://trailhead.salesforce.com/zh-CN/content/learn/modules/starting_force_com/starting_tour
Apex开发者指南
https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_dev_guide.htm
Apex中文手册
http://www.dba.cn/book/apex/
② 数据表
查看数据表之间的关系 Schema Builder
Setup->Home->Quick Links->Schema Builder
字段类型是Lookup 表示关联字段
创建数据表和字段
Setup->Build->Create->Objects
点击New Custom Object
输入常用字段
Label:数据表的名称
Plural Label:数据表名称的复数形式
Data Type:字段类型
添加字段
Setup->Build->Create->Objects
找到我们创建的Label,点击打开
Custom Fields & realtionships -> New
选择Data Type——> next
填写字段名称->next
③ 开发语言Apex
数据类型
Primitive (Integer, Double, Long, Date, Datetime, String, ID, or Boolean) 原始(整数,双精度,长整型,日期,日期时间,字符串,ID或布尔值)
Collections (Lists, Sets and Maps)集合(列表,集合和地图)
Enums 枚举
Classes, Objects and Interfaces 类,对象和接口
变量
与java类似
初始值都为null
apex变量不区分大小写
DML
查
List<apex_invoice__c> invoiceList = [SELECT id, Name, APEX_Status__c, createdDate FROM APEX_Invoice__c WHERE createdDate = today];
增
APEX_Customer__c objCust = new APEX_Customer__C();
objCust.Name = 'Test ABC';
insert objCust;
改
update updatedInvoiceList;
删
delete updatedInvoiceList;
更新插入(有记录则更新,无记录则插入)
upsert CustomerList;
取消删除操作
undelete invoiceListToDelete;
数据库方法
Database.insert(listName,False),其中false表示不允许部分更新。
Database.update(updatedInvoiceList, false)
其他类似DML
SOSL
SOQL
遍历关系字段
[SELECT id FROM APEX_Customer__c WHERE Name = 'Customer Creation Test' LIMIT 1].id;
获取子记录
List<apex_customer__c> ListCustomers = [SELECT Name, Id, (SELECT id, Name FROM Invoices__r) FROM APEX_Customer__c WHERE Name = 'ABC Customer'];
List<apex_invoice__c> ListOfInvoices = ListCustomers[0].Invoices__r;
获取父记录
[SELECT Name, id, APEX_Customer__r.Name FROM APEX_Invoice__c LIMIT 10];
聚合函数
AggregateResult[] groupedResults = [SELECT AVG(APEX_Amount_Paid__c)averageAmount FROM APEX_Invoice__c WHERE APEX_Customer__r.Name = 'ABC Customer'];
绑定Apex变量
String CustomerName = 'ABC Customer';
List<apex_customer__c> ListCustomer = [SELECT Id, Name FROM APEX_Customer__c WHERE Name = :CustomerName];//Query Using Apex variable
触发器
语法
trigger triggerName on ObjectName (trigger_events) { Trigger_code_block }
执行触发器
insert
update
delete
merge
upsert
undelete
类型
Before trigger
通常用于在他们被保存在数据库以前更新或者校验数据
After trigger
通常用于保存后访问系统的字段(Id等)
上下文变量
isExecuting
当前Apex代码的上下文环境为trigger环境,而不是VF等则返回true,否则返回false;
isInsert
当前操作是否为正在执行添加操作,是返回true,否则返回false;
isUpdate
当前操作是否为正在执行修改操作,是返回true,否则返回false;
isDelete
当前操作是否为正在执行删除操作,是返回true,否则返回false;
isBefore
当前操作是否为在save以前操作,是返回true,否则返回false;
isAfter
当前操作是否为在save以后操作,是返回true,否则返回false;
isUndelete
当前操作是否为在回收箱中回复数据以后操作,是返回true,否则返回false;
new
返回sObject的记录的最新的数据的列表;
只适用于执行insert和update的trigger操作时并且类型为before的时候,才可以使用new返回列表;
newMap
返回一个ID映射到最新的数据列表的Map集合
只适用于before update,after insert以及after update的trigger操作时,才可以使用newMap返回map集合;
old
返回sObject的记录修改以前的数据的列表
适用于update和delete操作时,才可以使用old以及oldMap。
oldMap
返回一个ID映射到修改以前的数据列表的Map集合
适用于update和delete操作时,才可以使用old以及oldMap。
size
在触发器中调用的数据总数,包括new和old
测试
@isTest注释
TestMethod关键字
部署
参考VsCode部署
批处理
批处理的原因:salesforce对于数据操纵有限制
Number of SOQL queries: 100 -->一次执行SOQL的次数不能超过100次
Number of query rows: 50000 -->一次查出的数据行数不能超过50000条
Number of SOSL queries: 20 -->一次执行SOSL次数不能超过20次
Number of DML statements: 150 -->DML语句不能超过150条
Number of DML rows: 10000 -->一次操作数据行数不能超过10000行
Maximum CPU time: 10000 -->最大的CPU时间不能超过10000ms
Maximum heap size: 6000000 -->堆大小不能超过6000000B
Number of callouts:100 -->一次执行callouts次数不能超过100次
Number of Email Invocations: 10 -->Email调用次数不能超过10次
Number of future calls: 50 -->调用Future次数不能超过50次
Number of queueable jobs added to the queue:50 -->添加到队列的queueable job数量不能超过50次
Number of Mobile Apex push calls: 10 -->移动端Apex push调用最多不能超过10次
方式:异步
最多可以处理5000万条数据
步骤
新建一个实现了Database.Batchable接口的批处理类
接口封装了三个方法
start()
用于查询数据,并将查询数据封装到List中
execute()
形参中List为start()方法中返回的数据,可以直接对此List进行修改以达到批处理行为
finish()
进行一些后期处理,比如发邮件等操作。
注意事项
1.start()方法执行后,数据便无法修改;
2.execute()原则上可以执行多次,比如在调用的时规定执行次数,则按照规定次数执行execute();
3.finish()方法执行以后,批处理类用到的所有的变量对象都会恢复到最开始的状态,即值回滚到最开始状态;
4.如果批处理类不实现Database.Stateful接口,则变量只在相应方法起作用,当方法执行完成,变量则会回滚到初始状态
例子
json的使用
System.JSON
serialize
deserialize
JSONGenerator
1.public void close():当JSON Generator关闭以后,无法再写入内容。
2.public Boolean isClosed():判断JSON Generator是否关闭,如果关闭返回true,否则返回false。
3.public String getAsString():返回生成的JSON的内容;
4.public Void writeBoolean(Boolean blobValue):写入指定的布尔类型值;
5.public void writeXXX:详情请看API
JSONParser
④ VsCode配置开发环境
下载VsCode
配置VsCode开发插件
Salesforce Extension Pack
下载salesforce CLI
新建项目
打开命令面板Ctrl+Shift+P
输入SFDX:Create Project with manifest (自动提示)
选择标准项目Standard,输入项目名;创建成功
创建一个Apex Class
打开命令面板Ctrl+Shift+P
输入SFDX:Create Apex Class
输入名称
编写测试Apex class
类上加 @isTest
测试方法 static testMethod void main()
写完测试之后提交,然后测试 (如果不提交,会测试失败)
从线上拉取项目代码
打开命令面板Ctrl+Shift+P
输入SFDX:Authorize an Org
选择不同的环境 sandbox是测试环境
点击enter,触发网页请求登录
登录成功后返回VsCode,在manifest目录下的package.xml文件名上右键——>SFDX:Retrieve Source in Manifest from Org,这样会拉取线上代码到本地
提交代码
更新单个文件
在单个文件里右键->SFDX: Deploy this source to org
更新所有文件
在manifest下的package.xml右键-> SFDX: Deploy source in manifest to org
⑤ 字段类型(Data type)
Lookup Relationship
以从表查询主表信息
SELECT PRIVELEGEID__r.Id,PRIVELEGEID__r.PRIVELEGENAME__c, ROLEID__r.ROLENAME__c, Id FROM PRIVELEGEROLE__c
通过上面例子可以看出:PRIVELEGEROLE__c表中的PRIVELEGEID__c是表中的一个字段,通过LookUp关系关联到PRIVELEGE__c,则PRIVELEGEID__r则相当于PRIVELEGE__c表的一个引用,通过PRIVELEGEID__r则可以访问PRIVELEGE__c表中的数据,为了更加明确的了解,将数据表查询结果通过JSON形式显示,便会更加的一目了然。通过查询输出的json结果可以看出,PRIVELEGEID__r他的类型为PRIVELEGE__c,并且把此条记录中的PRIVELEGE__c需要的字段信息查出,ROLEID__r类型为ROLE__c,并且将此条记录中ROLE__c表需要的字段信息查出。推荐下方的网页查看json,它可以将输出的混乱的json格式变得整洁,增强可读性。
Picklist
声明一个列表类型,类似于HTML中的<select><option></option></select>关系
PickList的Value值获取
获取所有的对象的名称到tokens的映射
Map<String, Schema.SObjectType> sObjectDescribeMap = Schema.getGlobalDescribe();
获取字段的元数据
sObjectDescribeMap.get(sObjectName).getDescribe().fields.getMap();
Picklist(Multi-Select)
声明一个列表类型,区别上面的为允许多选
⑥ 页面构建
资料
https://resources.docs.salesforce.com/200/latest/en-us/sfdc/pdf/salesforce_pages_developers_guide.pdf
控件
<apex:page>
VF每个页面都是以<apex:page>标签起始</apex:page>结束,每个VF页面都有一个Controller用来控制其业务逻辑
<apex:inputText>
输入框,类似于HTML中的<input type="text"/>,绑定的value类型可以为任意类型;
<apex:inputFile>
输入框,类似于HTML中的<input type="text"/>,区别上者为value类型必须是sObject类型;
<apex:commandButton>
按钮,类似于<input type="button"/>;
<apex:selectList>
下拉框,类似于html中的<select>;
<apex:selectOptions>
下拉框下元素,类似于html中的<option>;
<apex:pageBlockTable>
表格元素,类似于html中的table。用法与jstl类似,可以指定items属性绑定列表,var属性指定变量;
<apex:column>
表格的列元素,用于显示表格每一列的值;
<apex:commandLink>
链接,类似于html中的<a>标签;
<apex:param>
参数传递使用,用于给Controller层传递参数,传递的参数通过键值对传递
<apex:form>
表单元素,类似于html中的form表单
{!object}
后台的值在前台可以通过{!object}形式(是不是类似EL表达式)来获取后台object的变量。
如何查看页面
找到响应的页面
点击Preview
分页
https://www.cnblogs.com/zero-zyq/p/5343287.html
⑦ Permission sets 讲解及设置
https://www.cnblogs.com/zero-zyq/p/5406352.html
⑧ 元信息
sObject
获取token
Schema.sObjectType t = Account.sObjectType;
Account a = new Account();
Schema.sObjectType t = a.getSObjectType();
field
获取token
Schema.DescribeFieldResult F = Account.Industry.getDescribe();
Schema.sObjectField T = F.getSObjectField();
Map<String, Schema.SObjectField> fieldMap = Schema.SObjectType.Account.fields.getMap();
describeSObjects
使用Schema类的describesSObjects方法获取描述sObject结果.使用此方法可以通过sObject类型名称描述一个或者多个sObject描述信息。
通过使用Schema类的getGlobalDescribe方法可以获取所有的sObject的描述信息token。
⑨ 自定义报表导出
https://www.cnblogs.com/zero-zyq/p/5507940.html
⑩ 访问数据
编写匿名代码块
Apex classes -> Developer Console --> Ctrr+E
REST方式
salesforce访问外界站点
添加需要访问的url
setup->Administer->Security Site Settings->Remote Site Settings。
GET方法获取数据
salesforce作为REST Service供外部访问
新建一个App,然后创建Connected App
设置Enable OAuth Settings为true
sfdc端rest service构建
测试 在workbench测试
/services/apexrest/Goods/getGoodsByIdGoodsList?GoodsId=
SOAP方式
https://trailhead.salesforce.com/zh-CN/content/learn/modules/apex_integration_services/apex_integration_soap_callouts
0 条评论
下一页