如何创建Apex Class?沙盒触发器部署至生产环境遇Apex类创建困惑
Hey there! Let's break down how to create the Apex class you need for your Opportunity trigger, step by step. I'll tie it directly to your specific use case so everything makes sense.
First, let's cover the basics of creating an Apex class in Salesforce, then build out the exact logic you need to sync matching Account IDs to your Opportunities.
Step 1: Create a New Apex Class in Setup
- Open Salesforce Setup (click the gear icon in the top-right corner)
- In the Quick Find bar, type
Apex Classesand select the matching result - Click the New button to start your class
Step 2: Write the Class with Your Sync Logic
Below is a tailored Apex class that handles your requirement—finding active Vendor/Member Service Accounts matching the Opportunity's Category picklist value and syncing their ID. I added comments to explain each part:
public class OpportunityAccountSyncHandler { // This method will hold the core sync logic called by your trigger public static void syncMatchingAccountId(List<Opportunity> newOpportunities) { // Collect all unique Category values from the incoming Opportunities Set<String> opportunityCategories = new Set<String>(); for(Opportunity opp : newOpportunities) { if(opp.Category__c != null) { opportunityCategories.add(opp.Category__c); } } // Query for active Accounts that match our Category values and type criteria Map<String, Id> categoryToAccountMap = new Map<String, Id>(); for(Account matchingAccount : [ SELECT Id, Name FROM Account WHERE Name IN :opportunityCategories AND Type IN ('Vendor', 'Member Service') AND IsActive = true ]) { categoryToAccountMap.put(matchingAccount.Name, matchingAccount.Id); } // Update each Opportunity with the corresponding Account ID for(Opportunity opp : newOpportunities) { if(categoryToAccountMap.containsKey(opp.Category__c)) { opp.AccountId = categoryToAccountMap.get(opp.Category__c); } // Optional: Add error handling if no matching Account exists // else { // opp.addError('No active Vendor/Member Service Account found for Category: ' + opp.Category__c); // } } } }
Step 3: Update Your Trigger to Use This Class
Best practice is to keep triggers thin and delegate logic to handler classes. Modify your existing trigger to call this handler:
trigger OpportunityAccountSyncTrigger on Opportunity (before insert, before update) { OpportunityAccountSyncHandler.syncMatchingAccountId(Trigger.new); }
Critical Notes for Production Deployment
- Test Coverage: Salesforce requires at least 75% test coverage for Apex classes to deploy to production. Here's a quick test class to cover your logic:
@isTest public class OpportunityAccountSyncHandlerTest { @isTest static void testAccountSync() { // Create a test Vendor Account Account testVendor = new Account( Name = 'Software Vendor', Type = 'Vendor', IsActive = true ); insert testVendor; // Create an Opportunity with a matching Category Opportunity testOpp = new Opportunity( Name = 'New Software Deal', StageName = 'Prospecting', CloseDate = Date.today(), Category__c = 'Software Vendor' ); insert testOpp; // Verify the Account ID was synced correctly testOpp = [SELECT AccountId FROM Opportunity WHERE Id = :testOpp.Id]; System.assertEquals(testVendor.Id, testOpp.AccountId); } } - Validation & Sharing: Double-check that your production org doesn't have validation rules blocking Account ID updates, and that the trigger's running user has access to the Accounts being queried.
- Sandbox Testing: Test the full flow in a sandbox that mirrors your production environment before deploying to avoid surprises.
内容的提问来源于stack exchange,提问作者Gabe Mejia

