Apex 快速入门:动手构建你的第一个 Apex 应用
Apex 快速入门实战教程:通过五步从零构建你的第一个 Apex 应用。创建 Book 自定义对象和 Price 字段,编写 MyHelloWorld 类实现自动折扣逻辑,创建 HelloWorldTrigger 在记录插入前触发业务逻辑,编写 HelloWorldTestClass 达到 100% 代码覆盖率,使用 Change Set 将完整应用部署到生产环境。适合 Apex 初学者的动手实践指南。
本课程共有 19 个章节
同学们,这一节我们来看一个分步教程。它会手把手教你,怎么创建一个最简单的Apex类和触发器,再把它们部署到正式的生产环境里去。 你只要有一个开发者版组织,或者沙盒环境,就可以跟着我一起动手,感受一下Apex的核心概念。先简单回顾一下基础,然后我们就马上开始写你的第一个Apex程序——一个简单的类、一个触发器,还有一个单元测试。 因为Apex的写法跟Java很像,所以你如果之前接触过Java,一看就会觉得很熟悉,大部分功能都能轻松认出来。 这套教程会围绕一个叫“Book”的自定义对象来展开。第一步,我们就是要先创建这个“Book”对象,然后再通过触发器去更新它。 是不是听起来很简单?我们一步一步来,先从创建对象开始。
同学们,今天我们来快速过一下Apex开发中一个非常典型的流程,咱们一共会讲到五个核心步骤。别担心,我尽量讲得简单点,就像在聊天一样。 第一步呢,我们先在Salesforce里创建一个自定义对象,给它起个名字叫Book,就是“书”的意思。然后在这个Book对象上,加一个自定义字段,叫Price,也就是价格,用来存放每本书的价钱。这一步很简单,就是在设置里点点鼠标,把对象和字段建好就行。 第二步,咱们要写代码了。我们需要添加一个Apex类,这个类里面会包含一个方法,这个方法专门用来更新图书的价格。注意哦,这个方法后面会被触发器调用,所以它只负责干具体的活儿,比如接收一本书的ID和新的价格,然后把价格改掉。这样设计是为了让代码结构更清晰,触发器只管什么时候调用,类只管怎么执行。 第三步,就是创建一个触发器,这个触发器是挂在Book这个自定义对象上的。触发器的作用是什么呢?比如说,当一本书的某些信息发生变化时,触发器就会自动启动,然后去调用我们刚才写的那个类里的方法,把价格更新一下。这样我们就可以在一些特定的时机,自动执行价格更新的逻辑了。 第四步,非常关键,我们要写一个测试类。这个测试类里面会有一个测试方法,它会去模拟一些数据,然后主动调用触发器和类里面的代码,看看它们是不是按照我们预期的那样工作。写完之后,我们运行这个测试,并且要验证代码覆盖率。我们的目标是达到100%的代码覆盖率,也就是说,我们写的每一行代码都要被测试执行到,确保没有隐藏的错误。这一步是对代码质量的保障,也是Salesforce强制要求的,不然代码没办法部署到生产环境。 第五步,也是在最后,当一切都测试通过以后,我们就要把做好的Apex代码和自定义对象,通过一个叫做“变更集”的工具,从当前这个开发环境部署到真正的生产组织里去。变更集就像是一个打包好的快递,把所有相关的组件都放在一起,然后发布到生产环境。这样用户就能真正用到我们开发的功能了。 好了,这就是这五个核心步骤的一个简单介绍。是不是听上去并不复杂?其实就是:创建对象字段、写类和方法、加触发器调用、测试达到100%覆盖率、最后用变更集部署上线。后面我们会带着大家一步步实际操作这些内容,现在先有个整体印象就好。
同学们,我们现在正式开始动手操作。首先是第一步,这一步非常简单,我们要在 Salesforce 里创建一个叫 Book 的自定义对象,并且给它加上一个 Price 字段,也就是价格字段。 在开始之前,有一点要特别留意,就是你用的 Salesforce 账户必须要有合适的权限和版本。你要么是在一个 Professional、Enterprise、Performance 或者 Unlimited Edition 的沙箱组织里操作,要么就在一个专门的 Developer 开发者组织里进行。如果你不确定自己是什么版本,可以看一下设置菜单里的公司信息,那里会写明,只要不是你用的是 Group 或者 Essentials 这种基础版,一般都没问题。因为这些版本才支持我们创建自定义对象。 好,环境确认没问题,我们就进到设置里面。点击右上角的齿轮图标,选择 “Setup” 进入设置。然后在左边的快速查找框里输入 “Object Manager”,也就是对象管理器,点进去。 进到对象管理器之后,我们点击右上角的 “Create” 按钮,选择 “Custom Object” 自定义对象。这个时候就要开始填信息了。首先,在 Label 标签这一栏里输入 “Book”,然后下面的 Object Name 对象名会自动填为 Book。接下去,Plural Label 复数标签就让它自动变成 Books 就好了,因为一本书是 Book,多本书就是 Books。 再往下,我们把这个 “Allow Reports” 允许报表的复选框勾上,这样未来我们就能用 Book 这个对象的数据做报表了。其他选项都保持默认就可以,然后点击 “Save” 保存。这样,Book 这个对象就创建好了。 紧接着,系统会自动跳转到这个对象的详情页,我们现在就要马上给它加上 Price 字段。在这个页面找到 “Fields & Relationships” 字段和关系这个区域,点 “New” 新建字段。 我们要记录的是一本书的价格,所以字段类型选 “Currency” 货币。点下一步,在 Field Label 字段标签这里输入 “Price”,下面的 Field Name 会自动变成 Price。然后 Length 长度就保留默认的 16 就行,其他都不用改,一直点下一步,直到保存。 现在,一个叫 Book 的自定义对象,还有里面的 Price 价格字段,就都建好啦。是不是很简单?这就是我们动手实践的第一小步。环境准备好、Build 起来,后面才能往里面填有意思的数据。好,那接下来我们就准备进入第二步了。
同学们,我们一起来创建第一个自定义对象。请先登录你的沙盒或者开发者版本的组织。登录后,进入设置,找到自定义对象的管理页面。如果你还在用Salesforce Classic,直接点“新建自定义对象”;如果是在Lightning Experience里,就选“创建”,然后点“自定义对象”。 接下来,在标签这一栏输入“Book”,复数标签自动会变成“Books”,确认无误后,点保存。你看,一个简单的自定义对象就建好了。 创建完你会发现,对象里已经默认包含了一些标准字段,比如Name、CreatedBy,这些是Salesforce自动帮你配好的。以后你还能根据实际业务需求,继续往里加其他更具体的字段。好,这就是自定义对象的入门操作,很简单对吧?
同学们,我们来看这一页内容。它教我们如何给一个名为Book的自定义对象,添加上价格字段,好让后面的Apex代码能够读取和使用它。 假设你已经在Salesforce里创建好了Book这个自定义对象,现在我们在它上面做扩展。首先,我们进到Book对象的“图书详细信息”页面,这其实就是这个对象的配置页面,里面有个板块叫“自定义字段和关系”。你在这儿点一下“新建”按钮。 接下来要选字段的数据类型,价格当然要用数字啦,所以我们选择“Number”,然后点“下一步”。在字段标签里,输入“Price”,这个标签就是你在页面上看到的字段名称,Salesforce会自动帮你生成对应的API名字,默认就是Price。 然后是一些数字格式的设置。长度我们填16,这表示整个数字最多可以有16位,包括小数点前面的整数部分和小数部分。在小数点后几位这里,我们填2,意思是价格要保留两位小数,比如显示成99.99这种格式。填好后点“下一步”。 再往后一步是字段级安全性,它决定了哪些用户能看到或编辑这个字段。我们这是做教程,就接受默认值,直接点“下一步”,最后点“保存”。这样,一个叫Price的自定义字段就成功添加到Book对象上了。 这个Price字段虽然现在空空的,但它已经属于Book对象的一部分。我们在接下来的步骤里,会编写一个Apex类,用代码去访问和操作这个字段,比如查询书的价格、修改价格等等。所以,这一步就是简单地为我们接下来要写的Apex类铺好路。 好,这一页的重点就讲完了,你明白了吗?我们继续往前。
同学们,我们接着上一步继续。上一步我们已经创建好了一个叫做“Book”的自定义对象,也就是一个“图书”的数据表。注意,你的工作环境得是沙箱或者Developer版组织,并且你已经有了Salesforce账户。 现在,我们进入步骤二,这节课我们要写一段Apex代码,也就是Apex类,用来更新图书的价格。这个类里会包含一个方法,很快我们会在下一步创建一个触发器,来调用这个方法。 简单来说,我们一会儿要写的这个类,就是一段自动计算和修改图书价格的程序。你可以想象成,当某些条件满足时,系统自动帮我们调整书价,比如批量打折之类的。 那这个类具体怎么写呢?我先大概说下结构,你不用急着敲代码,先理解思路。我们会创建一个独立的类,在里面定义一个公开的、静态的方法,这个方法会在被触发器调用时,接收一系列图书记录,然后在这些记录上做价格更新,最后更新到数据库。 等下我们进入实际操作时,会详细写出每一行,讲解每个关键字的意思。现在你只需要记住:我们要做的是一个工具类,里面放着价格更新的逻辑,等着被触发器召唤。准备好了吗?下一步我们就开始敲代码。
我们现在来讲一下,怎么在Salesforce里创建你的第一个Apex类,并且写一个简单的方法。整个过程非常简单,跟着我一步步做就好。 首先,我们进到“设置”里面。在左侧的快速查找框里,输入“Apex Classes”,然后从搜索结果里选择“Apex Classes”。点进来之后,你会看到一个“新建”按钮,点一下。 屏幕上会打开一个类编辑器,这就是我们写代码的地方。现在,我们先写一个最基本的类定义: ```apex public class MyHelloWorld { } ``` 注意看,这个类前面有一个 `public` 关键字。它的意思是,这个类是公开的,可以被其他Apex类和触发器访问到。如果你不加public,那它的访问范围就会受限,其他地方可能就用不了它了。 接下来,我们要在大括号里面添加一个方法。我们给它起名叫 `applyDiscount`,就像这样: ```apex public class MyHelloWorld { public static void applyDiscount(List<Book__c> books) { } } ``` 我解释一下这里的关键点: 首先,这个方法也是 `public` 的,所以其他地方可以调用它。 其次,它是一个 `static` 方法,也就是静态方法。静态方法的好处是,你不需要先创建这个类的实例对象,就可以直接通过类名来调用这个方法。比如你可以在别的地方直接写 `MyHelloWorld.applyDiscount(...)`,非常方便。 然后看它的参数:`List<Book__c> books`。这里 `List` 表示它是一个列表,里面装着很多条记录。而 `Book__c` 是记录的类型。你注意到后面有 `__c` 这个后缀了吗?在Salesforce里,凡是自定义对象,API名称后面都会带 `__c`。所以 `Book__c` 就表示这是一个叫做“Book”的自定义对象。如果你用的是标准对象,比如“Account”或者“Contact”,那就没有这个后缀了。 这个参数的作用是,当我们调用这个方法时,可以传入一批Book记录,方法里面就可以对这些书的数据进行处理,比如打个折什么的,我们后面会继续往里面加逻辑。 现在,我们只需要把这些代码写好,保存一下,你的第一个Apex类就创建完成了。很简单吧? 好了,这一页的内容我们就讲解到这儿,你可以在自己的开发环境里动手试一试。
同学们,咱们现在来看一段 Apex 代码,一起把它弄明白。 首先你会注意到,代码里有个对象叫 `Book__c`。对,后面带了两个下划线和一个 c,这个 `__c` 后缀就是 Salesforce 里的一个命名约定,用来告诉我们:这是一个,自定义对象,。如果是标准对象,像 Account、Contact 这些,就没有这个后缀,直接写名字就行。所以一看到 `__c`,你就知道,哦,这是咱们自己建的。 同样,`Price__c` 这个字段,后面也带着 `__c`,说明它也是一个,自定义字段,。但是你看,像 Name 这种每个对象都有的标准字段,我们直接点出来用就可以了,不需要加任何后缀。很简单,对吧? 好,再看这一行核心的运算:`b.Price__c *= 0.9;` 这句话在做什么呢?它是在拿 `Price__c` 字段原来的值,乘以 0.9,也就是说,给价格打了九折,然后把打折后的新值再存回到这个字段里去。这里的 `*=` 是一种,复合赋值运算符,,就是一个写代码的快捷键。你要是不用这个快捷方式,完全写成 `b.Price__c = b.Price__c * 0.9;`,效果是一样的,只是更啰嗦一点。 所以,整个类的逻辑就是:把一堆书遍历一遍,每本书的价格都打九折,然后更新。你看,单击保存之后,这个类就能用来批量更新书的价格了,是不是很直观? 有没有什么不清楚的地方?我们下次会继续深入,今天先把这个基础结构吃透。
好了,同学们,我们来到步骤3。这一步,我们要给Book这个自定义对象创建一个触发器。这个触发器会去调用我们上一步写好的那个叫MyHelloWorld的类里的方法,让代码在合适的时机自动跑起来。 那触发器到底是什么呢?你可以把它想象成一个自动响应的程序:只要你在系统里插入一条Book记录、修改它、或者删除它,这些操作发生之前或者之后,我们写的触发器就会被自动触发,执行里面的代码。 每个触发器运行时,系统都会提供一些上下文变量,通过这些变量,你就能拿到那些引发这次触发器运行的记录。比如说,是哪些书被添加了、哪些被改动了,你都可以在代码里直接访问。 需要特别记住的一点是,所有触发器都是批量运行的。也就是说,不会因为一次只改一条记录就跑一次,而是同一批操作里的多条记录会一起被处理。所以写代码的时候要养成批量思维,别写成单条记录处理的逻辑。 好,现在我们就动手,给Book对象建一个触发器,把之前HelloWorld的方法调用起来,感受一下触发器到底是怎么工作的。
好,同学们,我们来看一下这张幻灯片上演示的,怎么从头创建一个最简单的Apex触发器。 首先,我们要从 Salesforce 里自定义对象“书籍”的管理设置页面,找到“触发器”这个选项,然后点击“新建”按钮。 这时候会弹出一个触发器编辑器,里面有一些默认的模板代码,我们不用它,直接全部删掉,然后自己来写触发器的定义。 第一行就是触发器的声明,我们写: `trigger HelloWorldTrigger on Book__c (before insert)` 这一行就给触发器起了个名字,叫 `HelloWorldTrigger`,它作用的对象是 `Book__c`,也就是我们的书籍对象;括号里的 `before insert` 表示这个触发器会在新书记录被保存进数据库“之前”触发。 接下来,我们声明一个列表变量,名字叫 `books`,并且把 `Trigger.New` 赋值给它。 `Trigger.New` 是一个系统提供的上下文变量,在 `insert` 或 `update` 的时候,它里面就装着所有即将被保存的新记录。所以这一行,我们就把所有刚准备插入的新书,都装进了 `books` 这个列表里。 最后一行,我们调用了一个已经写好的类和方法:`MyHelloWorld.applyDiscount(books);` 把刚才那个装着新书的列表当作参数传了进去。 这样一来,以后只要有人往书籍对象里插入新记录,系统在保存之前就会自动执行这个触发器,它再把书单传递给 `MyHelloWorld` 类的 `applyDiscount` 方法,让这个方法去做具体的业务处理,比如给新书打个折。 好,这张幻灯片的内容其实就是展示了一个触发器最简单的架子,我们把名字、对象、事件定义好,拿到触发上下文的记录,再交给封装好的方法来处理,这个模式很常用,大家把它记住就可以了。
咱们现在来看看这个触发器的每一行都做了什么。 首先,第一行是触发器的声明。你看,`trigger ApplyDiscount on Book__c (before insert)`。我们给这个触发器起了个名字,叫`ApplyDiscount`;然后告诉系统,这个触发器绑定在`Book__c`这个自定义对象上;括号里的`before insert`是说,当有新书记录,要插入数据库之前,,这个触发器就运行起来。所以它是在数据落盘的前一刻触发的。 那它触发之后,要做的事写在下面。这里有一句`MyHelloWorld.applyDiscount(Trigger.New);`。这是什么意思呢?其实就是调用了一个叫`applyDiscount`的方法,咱们可以想象它是个提前写好的折扣处理工具。而我们传进去的`Trigger.New`,是每个触发器都自带的上下文变量,它就像个篮子,里面装着所有即将插入的新书。也就是说,当有书要进来时,我们把这个“新书篮子”整个交给折扣方法去处理。 这里要特别注意一个概念:触发器是,批量运行,的。可能你一次插入一本书,也可能一次插入好几本,但触发器跑起来时,都是在这一个事务里,同时处理整体的那批记录。所以`Trigger.New`里可能不止一本书。 那在`applyDiscount`这个方法内部,通常就会使用,循环,,比如`for (Book__c oneBook : books)`,把篮子里每本书一一取出来,逐个去应用折扣。这样一来,不管这次进来一本书还是两百本书,都能被同样的逻辑正确地处理到。 总结一下,这段代码最核心的工作流程就是:每次有书要入库之前,拦截它们,把所有新书一股脑交给折扣方法,由那个方法逐个处理,处理完之后才正式存入数据库。 好了,这张slide的内容我们就说到这里。
我们现在进入第4步,这一步非常关键,我们要为之前编写的代码添加测试类。 在这个测试类里,会有一个测试方法,它就像是一个小实验,用来专门练习和验证我们的触发器和类里面的代码是不是按照预期运行的。 写完测试方法之后,我们可以运行这个测试,然后系统会告诉我们代码覆盖率。通过运行测试,我们能确保触发器和类都达到了100%的代码覆盖率,也就是每一行代码都被测试到了。 测试是开发过程中绝对不能少的一环。在Salesforce里,你想要把Apex代码部署出去,或者打包发布到AppExchange上,有一个硬性要求:总的代码覆盖率至少要达到75%,而且每个触发器都必须要有一些测试覆盖。另外,所有的类和触发器都必须能够顺利编译通过,不能有错误。 这么说吧,测试就像是给你的代码上了一道保险,既能让代码更可靠,也是上线的通行证。我们接下来就动手写这个测试类。
同学们,我们来看看这一页幻灯片的内容,主要是关于怎么创建Apex的测试类。 首先,我们打开Salesforce的“设置”页面,在左边的快速查找框里输入“Apex Classes”,然后点进去,再单击“新建”按钮,这样就打开了类编辑器。 在这里,我们要定义一个测试类。注意啊,这个类要用 `@isTest` 这个注解来标注。用 `@isTest` 定义的类,里面应该只包含测试方法,以及为了支持这些测试方法所需要的其他辅助方法。这么做有个很大的好处:用 `@isTest` 定义的类,不会计入你组织的6MB Apex代码限制,等于帮你节省了宝贵的空间。 接着,在类里面写测试方法,比如 `testHelloWorld` 这个方法,也要给它加上 `@isTest` 注解。这样做意味着,如果测试方法里对数据库做了任何更改,执行完成后,这些更改会自动回滚,就好像什么都没发生过一样。所以你根本不需要手工去删除测试数据,非常省事。 其实,方法上的 `@isTest` 注解就等同于过去我们用的 `testMethod` 关键字。现在的官方最佳实践,就是统一使用 `@isTest` 注解。好,这一页的核心要点就是这些。
好,我们来看这个测试方法具体是怎么运作的。你可以把它想象成一个小型的实验,用来验证某个业务逻辑是不是真的按照设计跑了。 首先,代码会创建一条 Book 记录,把它的 Price 字段设成 100,然后把它临时插进数据库里。但你要注意,在插入这本书的,之前,,有一个叫做 HelloWorldTrigger 的触发器会立即被触发。这个触发器在核心数据落盘前,会调用一个叫 MyHelloWorld 类里的 applyDiscount 方法。这个方法做的事情很简单:把这本书的价格乘以 0.9,也就是打九折,价格就从 100 降到了 90。这之后,记录才会带着折扣后的价格正式存进数据库。 接下来,我们怎么验证这一步真的发生了呢?测试代码会拿着刚才插入时系统自动分配的 ID,重新把这条 Book 记录从数据库里拽出来。然后,它会使用一条断言语句 `System.assertEquals(90, b.Price__c)` 来检查:现在价格是不是确确实实变成了 90。如果这个条件成立,测试就通过,这就实实在在地证明——那条 10% 的折扣逻辑被正确触发并执行了。要是价格不对,测试就会报错,提醒你折扣没打对或者根本没生效。 所以你看,这个小小的测试方法,不动声色地完成了从数据准备、触发逻辑、到结果验证的全过程,帮我们牢牢锁住了代码的质量。
我们来看一下怎么在开发人员控制台里运行测试,看看代码的覆盖率。 首先,打开你的开发人员控制台。找到上面的菜单,点击“Test”测试,然后选“New Run”新运行。这时候会弹出一个窗口,里面列出了所有测试类。我们从列表里找到“HelloWorldTestClass”,选中它。然后点“Add Selected”添加选定项,这个动作会把测试类里的所有测试方法都加到这次运行里。接着,直接点击“Run”运行。 等测试跑完,结果就会显示在“Tests”测试选项卡里。你会看到一个“Overall Code Coverage”总体代码覆盖率的区域。这里可以看到百分比。你双击“HelloWorldTrigger”这一行,就能看到它达到了100%的覆盖率。之所以触发器有100%覆盖,是因为它在执行时调用了“MyHelloWorld”这个类里的方法,所以这个类也跟着被完全覆盖了,同样是100%。 另外,如果你想看更详细的日志,就去“Logs”日志选项卡的“Inbox”收件箱里,双击最近的一条日志记录。执行日志里会记录触发事件、方法调用过程,还有触发前后相关数据的变化情况,这些信息对调试和验证逻辑很有帮助。 以后你每写一个触发器和相关的类,都要像这样跑一次测试,确保代码被充分测试到,争取达到至少75%以上的覆盖率——当然100%最好,这样你部署到生产环境时才更安全。
好的同学们,我们现在来到第五步。这一步的目标,就是把我们在沙盒里写好的 Apex 代码,还有之前配好的自定义对象,部署到生产组织里去。使用的工具叫“变更集”。 不过要用变更集,有几个前提条件,大家先听一下。 首先,你的沙盒组织必须是 ,Performance、Unlimited 或 Enterprise 版本,,不能是 Developer Edition。因为变更集这个功能只在刚才说的那些版本里才有。 第二,你的沙盒里要有我们之前写好的那个 `HelloWorldTestClass` 测试类,就是我们用来保证代码覆盖率的那一个。 第三,沙盒和生产组织之间要已经建好,部署连接,,就是在部署设置里事先连通的。 最后一点,你自己的用户要有,创建和上传变更集,的权限。 这四个条件都满足了,我们才能用变更集。 这里要特别强调一下:如果你用的是 Developer Edition 组织,对不起,这一步暂时做不了。因为变更集只在 Performance、Unlimited、Enterprise,还有 Database.com 这些版本中可用,开发版里没有这个功能。那如果你正好是开发版,也不用急,后面我们还会学到别的部署方式,比如用元数据 API 或者 Ant 工具。 好了,等你条件都齐了,我们就可以开始创建变更集,把需要的 Apex 类和自定义对象打成一个包,上传到生产组织,然后再去目标环境里部署。这个过程就是步骤五的核心内容。后面我们会一起操作一遍。 现在大家对这一步的要求和限制清楚了吧?我们稍微休息一下,然后动手做起来。
我们现在来看看怎么把我们在沙盒里写好的Apex代码搬到生产环境中。在Salesforce里,这个搬运工就叫“更改集”。听起来有点专业,但其实很简单,就和我们打包行李一样,把要带的东西装好,然后送到目的地。 首先,我们得进到“设置”里。在右上角的“查找”框里输入“更改集”三个字,搜索一下,然后选择“删除更改集”。注意,这里虽然叫“删除更改集”,其实是进入一个管理更改集的页面,不用被名字吓到。如果弹出一个启动页面,你就大大方方点“继续”。 进来之后,你会看到一个“更改集”列表,现在我们要建一个新的包裹。点“新建”按钮,给这个更改集起个名字,比如就叫“BookApp”,方便以后记得。描述可写可不写,然后点“保存”。 现在包裹建好了,但里面还是空的。我们要往里面装东西。看“更改集组件”这个区域,点那个“添加”按钮。这时候会弹出一个小窗口,让你选要带走的组件类型。我们从“收件箱”里找到“Apex Class”,因为咱们这次要搬的是Apex类。然后勾选上“MyHelloWorld”和“HelloWorldTestClass”,这两个类就是咱们之前写好的代码和测试类。选好后点“添加到更改集”。 添加完组件,系统可能会提醒你还有一些相关的附属组件没有加,比如这些类里用到的自定义字段或者其他依赖。这个可不能漏,否则搬到生产环境可能就跑不起来。所以,点一下“查看/添加附属组件”,它会列出所有需要一起带上的东西。我们把它全选上,然后点“添加到更改集”。这样包裹就打包完整了。 最后一步,咱们来投递这个包裹。回到“更改集详细信息”那里,点“上传”按钮。系统会让你选一个目标组织,也就是我们的生产环境。选中它,点“上传”。稍微等一会儿,上传完成。然后,我们就可以去生产环境那边,把这个更改集部署上去,代码就在正式系统里跑起来啦。 整个过程就是新建‑打包‑上传‑部署,是不是还挺直白的?后面你真正操作的时候,跟着指引走,基本不会出错。
好,同学们,我们接着看这一页。说的是变更集上传完成之后,怎么把它部署到你的生产环境里。 首先,你得登录到生产组织。进去之后,点右上角的齿轮,进到“设置”页面。在左侧的快速查找框里,输入“更改集”三个字,然后从结果里选择“入站更改集”。入站更改集就是别人上传给你、等你部署的变更集包。如果这时候弹出一个启动介绍页面,别管它,直接点“继续”就好。 接下来,你会看到一个“等待部署的变更集”列表,里面就有你刚刚从沙盒上传过来的那个变更集。点一下它的名字,打开详情页。在页面上方,你会看到一个“部署”按钮,点击它,系统就会开始验证和部署。整个过程跑完之后,你的Apex代码、自定义对象,就稳稳当当地进入生产组织,正式上线了。 最后提一句,如果你用的是Developer Edition开发者版,除了变更集,还可以用一些更现代的方法部署,比如VS Code搭配Salesforce扩展包、元数据API,或者Salesforce CLI。这些工具往往更灵活,特别适合日常开发迭代。好了,这一个要点就讲到这里。
同学们,这一节我们来做个小结。 回想一下,咱们刚刚完成了一个“Hello World”的完整示例。你别看它简单,它可是帮你把一条完整的开发路径都走了一遍。我们具体做了什么呢? 首先,你创建了自己的自定义对象,还在上面加了自定义字段,也就是说,你学会了怎么在 Salesforce 里定义自己的数据表结构。 接着,我们写了一个 Apex 类,里面放了一个静态方法。这个方法还不是一次只处理一条记录,而是能批量处理多条记录。这其实就是你业务逻辑的核心部分了。 有了逻辑,怎么让它自动运行呢?我们又写了一个 Apex 触发器。这个触发器很简单,只是在记录被插入之前触发一下,然后调用你刚才写的那个静态方法。这样一来,每当有新数据进来,你的代码就会自动执行。 代码写完了,不能光自己觉得没问题,还得有证据。于是我们写了测试类。注意,测试类上面用了 @isTest 这个标注。我们通过测试,让代码覆盖率达到了百分之百,确保每一行逻辑都被验证过了。 最后,开发完成,要上线了。我们学会了用变更集,把自定义对象和代码一起,稳妥地部署到生产环境里。 所以你看,从建对象、写逻辑、配触发器、做测试,再到部署上线,这一整套流程,就是你做任何 Apex 开发都会用到的基础框架。这个“Hello World”就像是一张地图,帮你搭好了骨架。接下来,你完全可以在《Apex 开发人员指南》里,去探索更复杂的模式和功能了。 基础已经打好,我们可以放心往前走啦。