当前位置: 首页 > 知识库问答 >
问题:

如何创建Apex类?

韩季
2023-03-14

通过大量的试验和错误,我已经在我的沙盒中创建了功能触发器。我的问题是,我现在想把它应用到我的实时组织中,但我似乎无法理解整个顶点类的事情。

如何创建类?

我的触发器背后的想法是,当保存opportunity记录时,soql查询将查看在“类别”字段中选择的选取列表值,并找到具有匹配名称的活动供应商或成员服务帐户类型,并带出其salesforce id。将该sfid拖到“我的供应商名称查找”字段中,将允许我在opportunity和供应商/成员服务帐户之间建立关系,我需要该关系来更新其他工作流规则和字段。

    trigger Find_Vendor on Opportunity (before insert)
    {
       for(Opportunity u:trigger.new)
       {
          if(u.Vendor_Name__c == null)
          {
              u.Vendor_Name__c =   [Select Id From Account
                             Where (Account_Type__c = 'Vendor'
                             OR Account_Type__c = 'Member Services')
                             AND Status__c = 'Active'
                             AND Name = :u.Category__c limit 1].Id;
          }
       }
    }

共有2个答案

南门宇
2023-03-14

在建议您将其部署到live org之前,我想指出您的代码存在的一些问题。

>

  • 您在for循环中使用SOQL语句。在SF环境中,每个事务只能进行101个SOQL查询。当您对您的OPP进行大规模更新并且超过101个时,您将遇到SOQL LIMIT:查询太多。此处描述

    为了能够部署到生产orrg,您需要具有测试覆盖率。因此,为了能够将此触发器部署到生产环境中,您需要创建一个测试。这里有基本资源。不要忘记运行一些批量测试。

    我建议您不要使用触发器来实际执行功能。你的组织中会有大量的触发器,你很难管理触发器的执行顺序。尝试采用触发器不包含任何逻辑的模型,除了是否在更新之前或之后等等。基本解释可在此处找到

    了解更多关于SF限制和最佳实践的重要资源sfdc99.com.

  • 邢硕
    2023-03-14

    我不会将此触发器部署到生产环境中,它有很多问题,并且可能会中断,因为您正在for循环中进行SOQL查询,而且逻辑似乎没有经过深思熟虑。看到您似乎不太精通编写触发器,您可能应该查看声明性解决方案,例如流程生成器和无头流程,您可以在其中获得相同的结果。如果您坚持使用触发器,我建议使用以下内容:

     trigger Find_Vendor on Opportunity (before insert)
    {
       Set<String> categories = new Set<String>();
       Map<String, Id> categoryAccountIdMap = new Map<String, Id>();
       for(Opportunity u:trigger.new)
       {
          if(u.Category__c != null)
          {
               categories.add(u.Category__c);
          }
       }
       List<Account> categoryAccounts = [Select Id From Account
                             Where (Account_Type__c = 'Vendor'
                             OR Account_Type__c = 'Member Services')
                             AND Status__c = 'Active'
                             AND Name IN :categories];
       for(Account acct : categoryAccounts){
           if(!categoryAccountIdMap.containsKey(acct.Name)){
                categoryAccountIdMap.put(acct.name, acct.Id);
           }
       }
       for(Opportunity u:trigger.new)
       {
          if(u.Vendor_Name__c == null && categoryAccountIdMap.containsKey(u.Category__c))
          {
              u.Vendor_Name__c =   categoryAccountIdMap.get(u.Category__c);
          }
       }
    }
    

    您还需要一些触发器的测试覆盖率才能发布,但只需在测试中插入一个机会就足够了

    @IsTest
    private class SomeTestClassName {
    
    @isTest
    static void testOppVendor() {
     //you may need to add required fields to these objects to actually insert  them
        Account a = new Account(Name = 'Category 1');
        insert  a;
        Opportunity o = new Opportunity(Name = 'test', StageName = 'Closed Won', Category__c = 'Category 1');
        insert o;
        o = [SELECT Vendor_Name__c FROM Opportunity where Id = :o.Id];
        System.assertEquals(a.Id, o.Vendor_Name__c);
    }
    

    也就是说,这里没有使用许多最佳实践,例如测试数据工厂和将业务逻辑从触发器移动到您绝对应该熟悉的域类中。

     类似资料:
    • 每当我试图保存页面时,我总是得到一个ORA-01722。当我试图: > 将区域创建为交互式报告:尝试了3个不同的表,从自动创建到自己键入sql;1列或全部列;甚至从双打中选择1 colX; 将任何经典报表更改为交互式报表,然后单击保存。 如果我从模板向导创建交互式报告,请更改为经典并尝试返回,同样的问题。 我已经只尝试了varchar列,禁用了IR中的所有功能,给它静态id,基本上关闭和打开了所有

    • 我们创建一个IDWriteFactory7 CComPtr接口: 创建工厂工作。但如果我们尝试创建IDWriteTextLayout4,则使用以下工厂: CreateTextLayout(..)方法不能使用IDWriteTextLayout4,而是需要IdWriteTextLayout。 有人能举个例子吗?

    • 所以我知道如何创建映射值列表

    • 先看看JDK中对DataSource的描述: 作为 DriverManager 工具的替代项,DataSource 对象是获取连接的首选方法。 基本实现 - 生成标准的 Connection 对象 连接池实现 - 生成自动参与连接池的 Connection 对象。此实现与中间层连接池管理器一起使用。 简单来说,就是获取数据库连接的一个通用接口, 常见的dbcp,c3p0,druid都是DataSo

    • 问题内容: 我想给一些用户提供一百万个密码,例如: 必须至少包含6个字符 它必须包含数字和字母 我应该在这里使用吗?怎么样? 问题答案: Apache Commons Lang的RandomStringUtils提供了一些生成随机字符串的方法,该字符串可用作密码。 以下是8个字符的密码创建示例: 这将产生以下结果: 当然,您也可以使用一些方法来限制密码生成所允许的字符集: 将仅创建以下字符的密码:

    • 使用: Visual Studio-2019 要安装,我使用-tunnelvisionlabs/antlr4cs//github.com 我在这里使用了语法-antlr/grammars-v4//github.com 语法: -csharplexer.g4; -csharpparser.g4; -csharppreprocessorparser.g4; 问题。更新-1. 1。我说的对吗? 2。我可