본문 바로가기

개발자정보

세일즈포스 Apex Basics & Database

반응형

Apex 시작하기

학습 목표

이 단원을 완료하면 다음을 수행할 수 있습니다.

  • Apex 프로그래밍 언어의 주요 기능을 설명합니다.
  • Apex 클래스를 저장하고 Anonymous.Apex로 메서드를 호출합니다.
  • 개발자 콘솔을 사용하여 디버그 로그를 검사합니다.

Apex 시작하기

Apex는 Java와 유사한 구문을 사용하고 데이터베이스 저장 프로시저처럼 작동하는 프로그래밍 언어입니다. 

Apex를 통해 개발자는 버튼 클릭, 관련 레코드 업데이트 및 Visualforce 페이지와 같은 시스템 이벤트에 비즈니스 로직을 추가할 수 있습니다.

언어로서의 Apex는 다음과 같습니다.

  • 호스팅됨 - Apex는 서버인 Lightning Platform에서 저장, 컴파일 및 실행됩니다.
  • 개체 지향 - Apex는 클래스, 인터페이스 및 상속을 지원합니다.
  • 강력한 형식 - Apex는 컴파일 타임에 개체에 대한 참조의 유효성을 검사합니다.
  • 다중 테넌트 인식 - Apex는 다중 테넌트 플랫폼에서 실행되기 때문에 코드가 공유 리소스를 독점하는 것을 방지하는 제한을 적용하여 폭주 코드를 철저히 보호합니다.
  • 데이터베이스와 통합 - 레코드에 액세스하고 조작하는 것이 간단합니다. Apex는 레코드 및 해당 필드에 대한 직접 액세스를 제공하고 해당 레코드를 조작하기 위한 명령문 및 쿼리 언어를 제공합니다.
  • 데이터 중심 - Apex는 데이터베이스에 대한 트랜잭션 액세스를 제공하여 작업을 롤백할 수 있도록 합니다.
  • 사용 용이성 - Apex는 친숙한 Java 관용구를 기반으로 합니다.
  • 테스트 용이성 - Apex는 단위 테스트 생성, 실행 및 코드 검사에 대한 기본 제공 지원을 제공합니다. Salesforce는 플랫폼 업그레이드 전에 모든 단위 테스트를 실행하여 모든 사용자 정의 Apex 코드가 예상대로 작동하는지 확인합니다.
  • 버전 관리됨 - 사용자 지정 Apex 코드는 API의 다른 버전에 대해 저장할 수 있습니다.

Apex 언어 하이라이트

다른 개체 지향 프로그래밍 언어와 마찬가지로 다음은 Apex가 지원하는 언어 구성 중 일부입니다.

  • 클래스, 인터페이스, 속성 및 컬렉션(배열 포함).
  • 객체 및 배열 표기법.
  • 표현식, 변수 및 상수.
  • 조건문(if-then-else) 및 제어 흐름 문(for 루프 및 while 루프).

다른 객체 지향 프로그래밍 언어와 달리 Apex는 다음을 지원합니다.

  • Apex로서의 클라우드 개발은 클라우드에서 저장, 컴파일 및 실행됩니다.
  • 데이터베이스 시스템의 트리거와 유사한 트리거.
  • 데이터를 쿼리하고 검색하기 위해 직접 데이터베이스 호출 및 쿼리 언어를 만들 수 있는 데이터베이스 문.
  • 트랜잭션 및 롤백.
  • NS 글로벌 액세스 수정자보다 더 관대합니다. 공공의 수정자를 사용하고 네임스페이스와 애플리케이션 전반에 걸쳐 액세스를 허용합니다.
  • 사용자 정의 코드의 버전 관리.

또한 Apex는 대소문자를 구분하지 않는 언어입니다.

개발 도구

Salesforce 사용자 인터페이스를 사용하여 브라우저에서 직접 Apex를 작성하고 디버깅 정보에 액세스할 수 있습니다. 귀하의 이름 또는 빠른 액세스 메뉴( 

) 에서 개발자 콘솔을 엽니다 .

Visual Studio Code용 Salesforce 확장을 사용하여 클라이언트에서 Apex를 작성할 수도 있습니다.

Salesforce Visual Studio 코드 확장을 참조하십시오 .

데이터 유형 개요

Apex는 Salesforce에 특정한 데이터 유형인 sObject 데이터 유형을 포함하여 다양한 데이터 유형을 지원합니다.

Apex는 다음 데이터 유형을 지원합니다.

  • Integer, Double, Long, Date, Datetime, String, ID, Boolean 등과 같은 프리미티브.
  • 일반 sObject 또는 계정, 연락처 또는 MyCustomObject__c와 같은 특정 sObject로서의 sObject(sObject에 대한 자세한 내용은 이후 단원에서 설명합니다.)
  • 다음을 포함한 컬렉션:
    • 기본 요소, sObject, 사용자 정의 개체, Apex 클래스에서 생성된 개체 또는 컬렉션의 목록(또는 배열)
    • 프리미티브 세트
    • 프리미티브에서 프리미티브, sObject 또는 컬렉션으로의 맵
  • 열거형 이라고도 하는 형식화된 값 목록
  • 사용자 정의 Apex 클래스
  • 시스템 제공 Apex 클래스

Apex 컬렉션: 목록

목록은 정렬된 개체 컬렉션을 보유합니다. Apex의 목록은 배열과 동의어이며 두 가지를 서로 바꿔서 사용할 수 있습니다.

다음 두 선언은 동일합니다. NS그림 물감 변수는 List 구문을 사용하여 선언됩니다.

List<String> colors = new List<String>();

복사

또는 그림 물감 변수는 배열로 선언될 수 있지만 배열이 아닌 목록에 할당됩니다.

String[] colors = new List<String>();

복사

일반적으로 목록은 할당해야 하는 요소의 수를 미리 결정할 필요가 없기 때문에 배열보다 목록을 만드는 것이 더 쉽습니다.

목록을 만들 때 또는 목록을 만든 후에 다음을 호출하여 목록에 요소를 추가할 수 있습니다. 추가하다()방법. 이 첫 번째 예는 목록에 요소를 추가하는 두 가지 방법을 모두 보여줍니다.

// Create a list and add elements to it in one step
List<String> colors = new List<String> { 'red', 'green', 'blue' };
// Add elements to a list after it has been created
List<String> moreColors = new List<String>();
moreColors.add('orange');
moreColors.add('purple');

목록 요소는 배열 요소와 마찬가지로 대괄호 사이에 인덱스를 지정하여 읽을 수 있습니다. 또한 다음을 사용할 수 있습니다.가져 오기()목록 요소를 읽는 방법입니다. 이 예제는 이전 예제에서 만든 목록을 기반으로 하며 두 방법 중 하나를 사용하여 목록 요소를 읽는 방법을 보여줍니다. 

이 예제에서는 배열 요소를 반복하는 방법도 보여줍니다.

// Get elements from a list
String color1 = moreColors.get(0);
String color2 = moreColors[0];
System.assertEquals(color1, color2);
// Iterate over a list to read elements
for(Integer i=0;i<colors.size();i++) {
    // Write value to the debug log
    System.debug(colors[i]);
}

기본을 넘어

Apex는 Set 및 Map의 두 가지 다른 컬렉션 유형을 지원합니다. Apex 개발자 가이드  컬렉션 섹션 에서 이에 대해 자세히 알아볼 수 있습니다 .

Apex Classes

Apex 클래스의 이점 중 하나는 코드 재사용입니다. 클래스 메서드는 트리거 및 기타 클래스에서 호출할 수 있습니다. 

다음 자습서에서는 조직에 예제 클래스를 저장하고, 이 클래스를 사용하여 이메일을 보내고, 디버그 로그를 검사하는 방법을 안내합니다.

Apex 클래스 저장

을 살리다 이메일매니저 조직의 수업:

  1. 귀하의 이름 또는 빠른 액세스 메뉴( 
    ) 에서 개발자 콘솔을 엽니다 .
  2. 개발자 콘솔에서 파일 | 새로운 | Apex 클래스 , EmailManager클래스 이름으로 를 입력 한 다음 확인 을 클릭 합니다.
  3. 기본 클래스 본문을 다음으로 바꿉니다. 이메일매니저 수업 예.NS 이메일매니저 클래스에는 공개 메서드(메일을 보내다()) 이메일을 보내고 Apex 클래스 라이브러리의 내장 메시징 메서드를 사용합니다. 또한 이 클래스에는 개인 도우미 메서드(검사 결과()), private이기 때문에 외부에서 호출할 수 없지만 클래스 내에서만 사용됩니다. 이 도우미 메서드는 이메일 보내기 호출의 결과를 검사하고 다음에서 호출됩니다.메일을 보내다().
    public class EmailManager {
        // Public method
        public void sendMail(String address, String subject, String body) {
            // Create an email message object
            Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage();
            String[] toAddresses = new String[] {address};
            mail.setToAddresses(toAddresses);
            mail.setSubject(subject);
            mail.setPlainTextBody(body);
            // Pass this email message to the built-in sendEmail method 
            // of the Messaging class
            Messaging.SendEmailResult[] results = Messaging.sendEmail(
                                     new Messaging.SingleEmailMessage[] { mail });
            
            // Call a helper method to inspect the returned results
            inspectResults(results);
        }
        
        // Helper method
        private static Boolean inspectResults(Messaging.SendEmailResult[] results) {
            Boolean sendResult = true;
            
            // sendEmail returns an array of result objects.
            // Iterate through the list to inspect results. 
            // In this class, the methods send only one email, 
            // so we should have only one result.
            for (Messaging.SendEmailResult res : results) {
                if (res.isSuccess()) {
                    System.debug('Email sent successfully');
                }
                else {
                    sendResult = false;
                    System.debug('The following errors occurred: ' + res.getErrors());                 
                }
            }
            
            return sendResult;
        }
    }
  4. Ctrl+S를 클릭하여 수업을 저장합니다.기본을 넘어Salesforce는 클래스를 저장할 때 클래스를 컴파일합니다.
  5. 방금 저장한 클래스는 객체 지향 프로그래밍(OOP)을 사용합니다. 이 클래스는 이메일 관리와 관련된 메소드를 캡슐화합니다. OOP의 완벽한 예가 되기 위해 클래스에는 해당 속성에 액세스하기 위한 멤버 변수(속성) 및 접근자 메서드도 포함되지만 단순성을 위해 클래스에는 이러한 요소가 없습니다.

이메일을 보내는 메소드 호출

public 메소드를 호출해보자. 이를 위해 익명의 Apex 실행을 사용합니다. Anonymous Apex를 사용하면 코드 줄을 즉석에서 실행할 수 있으며 특히 기능을 테스트하기 위해 Apex를 호출하는 편리한 방법입니다. 다른 Apex 실행과 마찬가지로 디버그 로그 결과가 생성됩니다.

메모

예를 들어 트리거를 통해 Apex를 호출하는 다른 방법이 있습니다. 다른 모듈에서 트리거에 대해 자세히 알아볼 것입니다.

  1. 개발자 콘솔에서 디버그 | 익명 실행 창을 엽니다 .
  2. 열리는 창에서 다음을 입력합니다. 'Your email address'이메일 주소로 바꿉니다 .
    EmailManager em = new EmailManager();
    em.sendMail('Your email address', 'Trailhead Tutorial', '123 body');
  3. 실행 을 클릭 합니다 .이제 이 방법이 실행되었으므로 받은 편지함에서 이메일을 받았을 것입니다. 이메일을 확인!

Inspect Debug Logs

디버그 로그는 코드 디버깅에 유용합니다. 

Apex 메서드가 실행되면 호출이 디버그 로그에 기록됩니다. 또한 로그에 고유한 디버그 메시지를 작성할 수 있으므로 오류가 있는 경우 코드를 디버깅하는 데 도움이 됩니다. 

NS검사 결과() 에 의해 호출되는 도우미 메서드 메일을 보내다(), 다음을 사용하여 로그에 메시지를 씁니다. 

System.debug()이메일 보내기 작업이 성공했는지 또는 오류가 있었는지 여부를 나타내는 메서드입니다. 

메서드를 실행할 때 생성된 디버그 로그에서 이러한 메시지를 찾을 수 있습니다.

  1. 개발자 콘솔에서 로그 탭을 클릭하고 목록에서 가장 최근 로그를 두 번 클릭합니다.
  2. 디버그 전용  선택 하여 로그를 필터링하여 다음에 대한 로그 행만 System.debug() 진술이 표시됩니다.DEBUG|이메일이 성공적으로 전송되었습니다.
  3. 이메일이 오류 없이 전송되었다고 가정하면 필터링된 로그 보기에 다음 메시지가 표시됩니다.

  4. 또한 필터 필드 에서 키워드를 검색 하거나 다른 옵션을 선택 하여 디버그 로그를 필터링할 수 있습니다. 자세한 내용은 Log Inspector 도움말을 참조하십시오 .

정적 메서드 호출

왜냐하면 메일을 보내다()클래스의 메서드는 클래스 멤버 변수에 액세스하지 않으므로 인스턴스 메서드일 필요가 없습니다. 다음을 추가하여 정적 메서드로 변경해 보겠습니다.공전키워드를 선언합니다. 정적 메서드는 클래스의 인스턴스에서 호출할 필요가 없지만 클래스 이름에서 직접 호출되기 때문에 인스턴스 메서드보다 호출하기 쉽습니다.

  1. 개발자 콘솔에서 열려 있는 탭을 찾습니다. 이메일매니저 클래스의 첫 번째 줄을 수정합니다. 메일을 보내다() 메서드 정의는 다음과 같습니다(유일한 변경 사항은 공전 예어.)
    public static void sendMail(String address, String subject, String body)
  2. Ctrl+S를 눌러 클래스를 저장합니다.
  3. 익명 실행 창에서 문을 수정하여 클래스 이름에 대한 정적 메서드를 호출합니다.
    EmailManager.sendMail('Your email address', 'Trailhead Tutorial', '123 body'); 
  4. 실행 을 클릭 합니다 .이제 이 방법이 실행되었으므로 이전 단계에서와 같이 이메일을 확인하고 선택적으로 디버그 로그를 확인할 수 있습니다.

Create an Apex class with a method that returns an array (or list) of strings.

Create an Apex class with a method that returns an array (or list) of formatted strings ('Test 0', 'Test 1', ...). The length of the array is determined by an integer parameter.

  • The Apex class must be called StringArrayTest and be in the public scope
  • The Apex class must have a public static method called generateStringArray
  • The generateStringArray method must return an array (or list) of strings
    • The method must accept an incoming Integer as a parameter, which will be used to determine the number of returned strings
    • The method must return a string value in the format Test n where n is the index of the current string in the array
public class StringArrayTest
{
    public static List<String> generateStringArray(Integer n)
    {
        List<String> List1 = new List<String>();
        for(Integer i =0; i < n; ++i)
            List1.add('Test ' + i);
        return List1;
    }
}

sObject 사용

학습 목표

이 단원을 완료하면 다음을 수행할 수 있습니다.

  • sObject와 Salesforce 레코드 간의 관계를 설명합니다.
  • 특정 sObject 변수를 만들고 사용합니다.
  • 일반 sObject를 특정 sObject로 캐스트합니다.

sObject 사용

Apex는 데이터베이스와 긴밀하게 통합되어 있으므로 Apex에서 직접 Salesforce 레코드 및 해당 필드에 액세스할 수 있습니다. Salesforce의 모든 레코드는 기본적으로 Apex 에서 sObject  표시됩니다 . 예를 들어 Acme 계정 레코드는 Apex의 계정 sObject에 해당합니다. 사용자 인터페이스에서 보고 수정할 수 있는 Acme 레코드의 필드는 sObject에서도 직접 읽고 수정할 수 있습니다.

다음 표에는 Acme 계정 예제 레코드의 일부 채워진 필드가 나열되어 있습니다. Account sObject는 계정 레코드의 추상화이며 메모리에 계정 필드 정보를 개체로 보유합니다.

표 1. 검색된 레코드에 대한 계정 sObject계정 필드값

ID 001D000000JlfXe
Name Acme
Phone (415)555-1212
NumberOfEmployees 100

각 Salesforce 레코드는 Salesforce에 삽입되기 전에 sObject로 표시됩니다. 마찬가지로 지속형 레코드를 Salesforce에서 검색하면 sObject 변수에 저장됩니다.

Salesforce의 표준 및 사용자 정의 개체 레코드는 Apex의 sObject 유형에 매핑됩니다. 다음은 표준 개체에 사용되는 Apex의 몇 가지 일반적인 sObject 유형 이름입니다.

  • 계정
  • 연락하다
  • 선두
  • 기회

조직에 사용자 지정 개체를 추가한 경우 Apex에서 사용자 지정 개체의 API 이름을 사용하십시오. 예를 들어 Merchandise라는 사용자 지정 개체는 Apex의 Merchandise__c sObject에 해당합니다.

sObject 변수 생성

sObject를 생성하려면 변수를 선언하고 sObject 인스턴스에 할당해야 합니다. 변수의 데이터 유형은 sObject 유형입니다.

다음 예에서는 Account 유형의 sObject 변수를 만들고 이름이 Acme인 새 계정에 할당합니다.

Account acct = new Account(Name='Acme');

복사

sObject 및 필드 이름

sObject의 이름은 해당 표준 또는 사용자 정의 개체의 API 이름에 해당합니다. 마찬가지로 sObject 필드의 이름은 해당 필드의 API 이름에 해당합니다.

객체 및 필드의 API 이름은 레이블과 다를 수 있습니다. 예를 들어 직원 필드에는 직원이라는 레이블이 있고 계정 레코드 페이지에 직원으로 표시되지만 해당 API 이름은 NumberOfEmployees입니다. Apex에서 이 필드에 액세스하려면 필드의 API 이름인 NumberOfEmployees를 사용해야 합니다.

다음은 사용자 정의 개체 및 사용자 정의 필드의 API 이름에 사용되는 일부 규칙의 하이라이트입니다.

사용자 정의 개체 및 사용자 정의 필드의 경우 API 이름은 항상 __c 접미사로 끝납니다. 사용자 지정 관계 필드의 경우 API 이름은 __r 접미사로 끝납니다. 예를 들어:

  • Merchandise라는 레이블이 있는 사용자 정의 개체의 API 이름은 Merchandise__c입니다.
  • 레이블이 설명인 사용자 정의 필드의 API 이름은 Description__c입니다.
  • 항목 레이블이 있는 사용자 지정 관계 필드의 API 이름은 Items__r입니다.

또한 레이블의 공백은 API 이름의 밑줄로 대체됩니다. 예를 들어 Employee Seniority의 사용자 정의 필드 이름에는 Employee_Seniority__c라는 API 이름이 있습니다.

개체 및 필드 이름 찾기

Apex에서 사용할 표준 개체 및 해당 필드의 이름을 찾으려면 Salesforce 및 Lightning Platform용 개체 참조를 참조 하십시오 .

사용자 정의 개체의 경우 조직에서 개체 및 필드 API 이름을 조회합니다. 설정 Objects에서 빠른 찾기 상자에 입력 한 다음 개체 를 선택한 다음 개체 이름을 클릭합니다.

sObject 생성 및 필드 추가

Salesforce 레코드를 삽입하기 전에 먼저 메모리에 sObject로 생성해야 합니다. 다른 개체와 마찬가지로 sObject는 다음을 사용하여 생성됩니다.새로운 운영자:

Account acct = new Account();

복사

API 개체 이름은 Apex에서 sObject 변수의 데이터 유형이 됩니다. 이 예에서는 계정 의 데이터 유형입니다. 계정 변하기 쉬운.

에서 참조한 계정 계정아직 필드를 채우지 않았기 때문에 변수가 비어 있습니다. 필드를 추가하는 방법에는 두 가지가 있습니다. 생성자를 통하거나 점 표기법을 사용하는 것입니다.

필드를 추가하는 가장 빠른 방법은 생성자 내에서 이름-값 쌍으로 필드를 지정하는 것입니다. 예를 들어, 이 문은 새 계정 sObject를 만들고 해당 이름 필드를 문자열 값으로 채웁니다.

Account acct = new Account(Name='Acme');

복사

이름 필드는 계정의 유일한 필수 필드이므로 새 레코드를 삽입하려면 먼저 채워야 합니다. 그러나 새 레코드에 대해 다른 필드도 채울 수 있습니다. 이 예에서는 전화번호와 직원 수도 추가합니다.

Account acct = new Account(Name='Acme', Phone='(415)555-1212', NumberOfEmployees=100);

복사

또는 점 표기법을 사용하여 sObject에 필드를 추가할 수 있습니다. 다음은 몇 줄의 코드가 더 필요하지만 이전 예제와 동일합니다.

Account acct = new Account(); acct.Name = 'Acme'; acct.Phone = '(415)555-1212'; acct.NumberOfEmployees = 100;

복사

일반 sObject 데이터 유형 작업

일반적으로 sObject로 작업할 때 표준 개체의 계정 또는 Book이라는 사용자 정의 개체의 Book__c와 같은 특정 sObject 데이터 유형을 사용합니다. 그러나 메서드가 처리하는 sObject의 유형을 모르는 경우 일반 sObject 데이터 유형을 사용할 수 있습니다.

일반 sObject 데이터 유형으로 선언된 변수는 표준 또는 사용자 정의 개체 레코드에 관계없이 모든 Salesforce 레코드를 참조할 수 있습니다.

이 예는 계정 및 Book__c라는 사용자 정의 개체와 같은 Salesforce 개체에 일반 sObject 변수를 할당하는 방법을 보여줍니다.

sObject sobj1 = new Account(Name='Trailhead'); sObject sobj2 = new Book__c(Name='Workbook 1');

복사

대조적으로 특정 sObject 데이터 유형으로 선언된 변수는 동일한 유형의 Salesforce 레코드만 참조할 수 있습니다.

Generic sObjects를 특정 Specific sObject으로 캐스팅

일반 sObject를 처리할 때 sObject 변수를 특정 sObject 유형으로 변환해야 하는 경우가 있습니다. 이렇게 하면 얻을 수 있는 이점 중 하나는 점 표기법을 사용하여 필드에 액세스할 수 있다는 것입니다. 이는 일반 sObject에서는 사용할 수 없습니다. sObject는 모든 특정 sObject 유형의 상위 유형이므로 일반 sObject를 특정 sObject로 캐스팅할 수 있습니다. 이 예는 일반 sObject를 계정으로 캐스트하는 방법을 보여줍니다.

// Cast a generic sObject to an Account
Account acct = (Account)myGenericSObject;
// Now, you can use the dot notation to access fields on Account
String name = acct.Name;
String phone = acct.Phone;

 

 

좀 더 이야기 해줘...

특정 sObject 유형과 달리 일반 sObject는 newSObject()방법. 또한 일반 sObject의 필드는 다음을 통해서만 액세스할 수 있습니다.놓다() 그리고 가져 오기() 행동 양식.

이 단원에서는 sObject가 무엇이고 어떻게 사용하는지 배웠습니다. 그러나 sObject를 생성해도 데이터베이스의 레코드로 유지되지 않습니다. sObject를 레코드로 저장하고 이를 사용하여 다른 작업을 수행하려면 DML(데이터 조작 언어)을 사용합니다. 레코드를 검색하려면 SOQL(Salesforce Object Query Language)을 사용합니다. DML 및 SOQL에 대해 알아보려면 이후 단원을 확인하세요.

Quiz

1. Describe the relationship between sObjects and Salesforce records.

A.The name of an sObject field in Apex is the label of the field in Salesforce.

B.A custom object's API name and label are the same.

C.Every record in Salesforce is natively represented as an sObject in Apex.

2. You can obtain an instance of an sObject, such as Account, in one of the following ways:

A.By creating the sObject only.

B.Either by creating the sObject or by retrieving a persistent record from Salesforce using SOQL.

C.By retrieving the sObject only.

3. Which of the following is correct about a generic sObject variable?

A.A generic sObject variable can be assigned only to another generic sObject.

B.Generic sObjects can't be created.

C.A generic sObject variable can be assigned to any specific sObject, standard or custom. Such as Account or Book__c.

 

DDML로 레코드 조작

학습 목표

이 단원을 완료하면 다음을 수행할 수 있습니다.

  • DML을 사용하여 레코드를 삽입, 업데이트 및 삭제합니다.
  • 대량으로 DML 문을 수행합니다.
  • upsert를 사용하여 레코드를 삽입하거나 업데이트합니다.
  • DML 예외를 잡아라.
  • Database 메서드를 사용하여 부분 성공 옵션이 있는 새 레코드를 삽입하고 결과를 처리합니다.
  • DML 문을 사용해야 하는 경우와 데이터베이스 메서드를 사용해야 하는 경우를 알고 있습니다.
  • 관련 레코드에 대해 DML 작업을 수행합니다.

DML로 레코드 조작

Data Manipulation Language(약칭 DML)를 사용하여 Salesforce에서 레코드를 만들고 수정합니다. DML은 레코드를 삽입, 업데이트, 병합, 삭제 및 복원하는 간단한 명령문을 제공하여 레코드를 관리하는 간단한 방법을 제공합니다.

Apex는 데이터 중심 언어이고 Lightning Platform에 저장되기 때문에 Salesforce의 데이터에 직접 액세스할 수 있습니다. 데이터 소스에 연결하기 위해 추가 설정이 필요한 다른 프로그래밍 언어와 달리 Apex DML을 사용하면 기록 관리가 쉬워집니다! DML 문을 호출하여 Salesforce 레코드에 대한 작업을 빠르게 수행할 수 있습니다.

이 예에서는 Acme 계정을 Salesforce에 추가합니다. 계정 sObject가 먼저 생성된 다음 인수로 전달됩니다.끼워 넣다 Salesforce에서 레코드를 유지하는 문.

// Create the account sObject 
Account acct = new Account(Name='Acme', Phone='(415)555-1212', NumberOfEmployees=100);
// Insert the account by using DML
insert acct;

DML 문

다음 DML 문을 사용할 수 있습니다.

  • insert
  • update
  • upsert
  • delete
  • undelete
  • merge

각 DML 문은 단일 sObject 또는 sObject 목록(또는 배열)을 허용합니다. sObject 목록에 대한 작업은 레코드를 처리하는 더 효율적인 방법입니다.

몇 가지를 제외한 모든 명령문은 친숙한 데이터베이스 작업입니다. NSupsert 그리고 병합 문은 Salesforce에만 해당되며 매우 편리할 수 있습니다.

NS upsert DML 작업 c단일 명령문 내에서 새 레코드를 만들고 sObject 레코드를 업데이트합니다. 지정된 필드를 사용하여 기존 개체의 존재 여부를 확인하거나 필드가 지정되지 않은 경우 ID 필드를 사용합니다.

NS 병합 문은 동일한 sObject 유형의 레코드를 최대 3개까지 레코드 중 하나로 병합하고 다른 레코드를 삭제하고 관련 레코드를 다시 부모로 지정합니다.

새 레코드에 자동 할당된 ID 필드

레코드를 삽입할 때 시스템은 각 레코드에 ID를 할당합니다. 데이터베이스에서 ID 값을 유지하는 것 외에도 ID 값은 DML 호출에서 인수로 사용한 sObject 변수에도 자동으로 채워집니다.

이 예는 삽입된 계정에 해당하는 sObject에서 ID를 가져오는 방법을 보여줍니다.

// Create the account sObject 
Account acct = new Account(Name='Acme', Phone='(415)555-1212', NumberOfEmployees=100);
// Insert the account by using DML
insert acct;
// Get the new ID on the inserted sObject argument
ID acctID = acct.Id;
// Display this ID in the debug log
System.debug('ID = ' + acctID);
// Debug log result (the ID will be different in your case)
// DEBUG|ID = 001D000000JmKkeIAF

 

기본을 넘어

예제의 sObject 변수에는 DML 호출 후 ID가 포함되어 있으므로 이 sObject 변수를 재사용하여 업데이트와 같은 추가 DML 작업을 수행할 수 있습니다. .

데이터베이스에서 레코드를 검색하여 ID 필드를 포함하여 해당 필드를 가져올 수 있지만 DML에서는 이 작업을 수행할 수 없습니다. SOQL을 사용하여 쿼리를 작성해야 합니다. 다른 단원에서 SOQL에 대해 배웁니다.

대량 DML

단일 sObject 또는 sObject 목록에서 대량으로 DML 작업을 수행할 수 있습니다. 대량 DML 작업을 수행하는 것은 Apex 트랜잭션당 DML 문 150개 제한과 같은 거버너 제한에 도달하는 것을 방지하는 데 도움이 되기 때문에 권장되는 방법입니다. 이 제한은 Lightning Platform의 공유 리소스에 대한 공정한 액세스를 보장하기 위한 것입니다. sObject 목록에서 DML 작업을 수행하는 것은 각 sObject에 대한 하나의 명령문이 아니라 하나의 DML 명령문으로 계산됩니다.

이 예에서는 한 통화에 연락처 목록을 삽입하여 연락처를 대량으로 삽입합니다. 그런 다음 샘플은 해당 연락처도 대량으로 업데이트합니다.

  1. Anonymous Apex를 사용하여 개발자 콘솔에서 이 스니펫을 실행합니다.
    // Create a list of contacts
    List<Contact> conList = new List<Contact> {
        new Contact(FirstName='Joe',LastName='Smith',Department='Finance'),
            new Contact(FirstName='Kathy',LastName='Smith',Department='Technology'),
            new Contact(FirstName='Caroline',LastName='Roth',Department='Finance'),
            new Contact(FirstName='Kim',LastName='Shain',Department='Education')};
                
    // Bulk insert all contacts with one DML call
    insert conList;
    // List to hold the new contacts to update
    List<Contact> listToUpdate = new List<Contact>();
    // Iterate through the list and add a title only
    //   if the department is Finance
    for(Contact con : conList) {
        if (con.Department == 'Finance') {
            con.Title = 'Financial analyst';
            // Add updated contact sObject to the list.
            listToUpdate.add(con);
        }
    }
    // Bulk update all contacts with one DML call
    update listToUpdate;
  2. 조직에서 최근에 만든 연락처를 검사합니다.재무 부서에 있는 두 명의 연락처는 제목이 로 채워져 있어야 합니다 Financial analyst.

기록 갱신

새 레코드와 기존 레코드가 혼합된 목록이 있는 경우 다음을 사용하여 목록의 모든 레코드에 대한 삽입 및 업데이트를 처리할 수 있습니다. upsert성명. Upsert는 중복 레코드 생성을 방지하고 어떤 레코드가 먼저 존재하는지 결정할 필요가 없으므로 시간을 절약할 수 있습니다.

NS upsert문은 한 필드의 값을 비교하여 sObject를 기존 레코드와 일치시킵니다. 이 문을 호출할 때 필드를 지정하지 않으면upsert문은 sObject의 ID를 사용하여 sObject를 Salesforce의 기존 레코드와 일치시킵니다. 또는 일치에 사용할 필드를 지정할 수 있습니다. 사용자 정의 개체의 경우 외부 ID로 표시된 사용자 정의 필드를 지정하십시오. 표준 개체의 경우 idLookup 속성이 true로 설정된 모든 필드를 지정할 수 있습니다 . 예를 들어 연락처 또는 사용자의 이메일 필드에는 idLookup 속성이 설정되어 있습니다. 필드 속성을 확인하려면 Salesforce 및 Lightning Platform용 개체 참조를 참조 하십시오 .

Upsert 구문

upsert sObject | 객체[]

upsert sObject | sObject [] 필드

선택적 필드는 필드 토큰입니다. 예를 들어, MyExternalID 필드를 지정하는 명령문은 다음과 같습니다.

upsert sObjectList Account.Fields.MyExternalId;

복사

Upsert는 sObject 레코드의 기본 키(ID), idLookup 필드 또는 외부 ID 필드를 사용하여 새 레코드를 생성해야 하는지 아니면 기존 레코드를 업데이트해야 하는지를 결정합니다.

  • 키가 일치하지 않으면 새 개체 레코드가 생성됩니다.
  • 키가 한 번 일치하면 기존 개체 레코드가 업데이트됩니다.
  • 키가 여러 번 일치하면 오류가 생성되고 개체 레코드가 삽입되거나 업데이트되지 않습니다.

이 예에서는 upsert가 기존 연락처 레코드를 업데이트하고 한 통화에 새 연락처를 삽입하는 방법을 보여줍니다. 이 upsert 호출은 기존 Josh 연락처를 업데이트하고 새 연락처 Kathy를 삽입합니다.

메모

upsert 호출은 ID를 사용하여 첫 번째 연락처와 일치시킵니다. NS조롱변수가 upsert 호출에 재사용되고 있습니다. 이 변수는 이전 삽입 호출의 레코드 ID로 이미 채워져 있으므로 이 예에서 ID를 명시적으로 설정할 필요가 없습니다.

  1. 개발자 콘솔의 익명 실행 창에서 이 스니펫을 실행합니다.
    // Insert the Josh contact
    Contact josh = new Contact(FirstName='Josh',LastName='Kaplan',Department='Finance');       
    insert josh;
    // Josh's record has been inserted
    //   so the variable josh has now an ID
    //   which will be used to match the records by upsert
    josh.Description = 'Josh\'s record has been updated by the upsert operation.';
    // Create the Kathy contact, but don't persist it in the database
    Contact kathy = new Contact(FirstName='Kathy',LastName='Brown',Department='Technology');
    // List to hold the new contacts to upsert
    List<Contact> contacts = new List<Contact> { josh, kathy };
    // Call upsert
    upsert contacts;
    // Result: Josh is updated and Kathy is created.
  2. 조직의 모든 연락처를 검사합니다.upsert 작업이 새 연락처 레코드를 만드는 대신 기존 레코드를 찾아 업데이트했기 때문에 조직에는 두 개가 아닌 하나의 Josh Kaplan 레코드만 있습니다. 하나의 Kathy Brown 연락처 기록도 있을 것입니다.

또는 일치하는 레코드에 사용할 필드를 지정할 수 있습니다. 이 예제에서는 idLookup 속성이 설정 되어 있으므로 연락처의 이메일 필드를 사용합니다 . 이 예에서는 Jane Smith 연락처를 삽입하고 두 번째 연락처 sObject를 만들고 동일한 이메일로 채운 다음 호출합니다.upsert 일치를 위해 이메일 필드를 사용하여 연락처를 업데이트합니다.

메모

만약에 끼워 넣다 대신 이 예에서 사용되었습니다. upsert, 중복된 Jane Smith 연락처가 삽입되었을 것입니다.

  1. 개발자 콘솔의 익명 실행 창에서 이 스니펫을 실행합니다.
    Contact jane = new Contact(FirstName='Jane',
                             LastName='Smith',
                             Email='jane.smith@example.com',
                             Description='Contact of the day');
    insert jane;
    // 1. Upsert using an idLookup field
    // Create a second sObject variable.
    // This variable doesn’t have any ID set.
    Contact jane2 = new Contact(FirstName='Jane',
                             LastName='Smith',  
                             Email='jane.smith@example.com',
                             Description='Prefers to be contacted by email.');
    // Upsert the contact by using the idLookup field for matching.
    upsert jane2 Contact.fields.Email;
    // Verify that the contact has been updated
    System.assertEquals('Prefers to be contacted by email.',
                       [SELECT Description FROM Contact WHERE Id=:jane.Id].Description);
  2. 조직의 모든 연락처를 검사합니다.조직에는 업데이트된 설명이 포함된 Jane Smith 연락처가 하나만 있습니다.

기록 삭제

다음을 사용하여 지속 레코드를 삭제할 수 있습니다. 삭제 성명. 삭제된 레코드는 Lightning Platform에서 영구적으로 삭제되지 않지만 복원할 수 있는 위치에서 15일 동안 휴지통에 보관됩니다.

이 예는 성이 Smith인 모든 연락처를 삭제하는 방법을 보여줍니다. 대량 DML에 대한 샘플을 실행한 경우 조직에 이미 성이 Smith인 두 개의 연락처가 있어야 합니다. Anonymous Apex를 사용하여 Developer Console에서 이 스니펫을 실행한 다음, 이름이 Smith인 연락처가 더 이상 없는지 확인합니다.

Contact[] contactsDel = [SELECT Id FROM Contact WHERE LastName='Smith']; 
delete contactsDel;

 

메모

이 스니펫에는 연락처를 검색하는 쿼리(SOQL 쿼리)가 포함되어 있습니다. 다른 단원에서 SOQL에 대해 자세히 알아볼 것입니다.

DML 문 예외

DML 작업이 실패하면 다음 유형의 예외를 반환합니다. DmlException. 코드에서 예외를 포착하여 오류 조건을 처리할 수 있습니다.

이 예는 다음을 생성합니다. DmlException필수 이름 필드 없이 계정을 삽입하려고 시도하기 때문입니다. catch 블록에서 예외가 포착됩니다.

try {
    // This causes an exception because 
    //   the required Name field is not provided.
    Account acct = new Account();
    // Insert the account 
    insert acct;
} catch (DmlException e) {
    System.debug('A DML exception has occurred: ' +
                e.getMessage());
}

 

데이터베이스 방법

Apex에는 DML 작업을 수행하고 DML 문 대응물을 미러링하는 메서드를 제공하는 기본 제공 Database 클래스가 포함되어 있습니다.

이러한 데이터베이스 메서드는 정적이며 클래스 이름에서 호출됩니다.

  • Database.insert()
  • Database.update()
  • Database.upsert()
  • Database.delete()
  • Database.undelete()
  • Database.merge()

DML 문과 달리 데이터베이스 메서드에는 작업이 부분적으로 성공해야 하는지 여부를 지정할 수 있는 선택적 allOrNone 매개 변수가 있습니다. 이 매개변수가 다음으로 설정되면거짓, 일부 레코드 집합에서 오류가 발생하면 성공한 레코드가 커밋되고 실패한 레코드에 대해 오류가 반환됩니다. 또한 부분 성공 옵션에서는 예외가 발생하지 않습니다.

이렇게 부른다. 끼워 넣다allOrNone이 다음으로 설정된 메소드 거짓.

Database.insert(recordList, false);

복사

데이터베이스 메서드는 각 레코드에 대한 성공 또는 실패 정보가 포함된 결과 개체를 반환합니다. 예를 들어 삽입 및 업데이트 작업은 각각 다음 배열을 반환합니다. 데이터베이스.저장 결과 사물.

Database.SaveResult[] results = Database.insert(recordList, false);

복사

메모

Upsert 반환 Database.UpsertResult 객체 및 삭제 반환 데이터베이스.삭제 결과 사물.

기본적으로 allOrNone 매개변수는진실, 이는 Database 메서드가 DML 문 대응물처럼 동작하고 실패가 발생하면 예외를 throw함을 의미합니다.

다음 두 문장은 다음과 같습니다. 레코드 목록 삽입; 성명.

Database.insert(recordList);

복사

그리고:

Database.insert(recordList, true);

복사

기본을 넘어

이러한 메서드 외에도 Database 클래스에는 DML 문으로 제공되지 않는 메서드가 포함되어 있습니다. 예를 들어 트랜잭션 제어 및 롤백, 휴지통 비우기 및 SOQL 쿼리와 관련된 메서드에 사용됩니다. 다른 단원에서 SOQL에 대해 배웁니다.

예: 부분적으로 성공한 레코드 삽입

Database 메서드를 사용하는 예를 살펴보겠습니다. 이 예제는 대량 DML 예제를 기반으로 하지만 DML 문을 Database 메서드로 대체합니다. NS 데이터베이스.삽입()메서드는 부분 성공 옵션과 함께 호출됩니다. 목록의 한 연락처에는 의도적으로 필드가 없으며 필수 LastName 필드 없이 연락처를 저장할 수 없기 때문에 오류가 발생 합니다. 세 개의 연락처가 커밋되고 필드가 없는 연락처는 오류를 생성합니다. 이 예제의 마지막 부분은 반환된 결과를 반복하고 디버그 메시지를 디버그 로그에 씁니다.

  1. Developer Console의 Execute Anonymous 창에서 이 예제를 실행합니다.
    // Create a list of contacts
    List<Contact> conList = new List<Contact> {
            new Contact(FirstName='Joe',LastName='Smith',Department='Finance'),
            new Contact(FirstName='Kathy',LastName='Smith',Department='Technology'),
            new Contact(FirstName='Caroline',LastName='Roth',Department='Finance'),
            new Contact()};
                
    // Bulk insert all contacts with one DML call
    Database.SaveResult[] srList = Database.insert(conList, false);
    // Iterate through each returned result
    for (Database.SaveResult sr : srList) {
        if (sr.isSuccess()) {
            // Operation was successful, so get the ID of the record that was processed
            System.debug('Successfully inserted contact. Contact ID: ' + sr.getId());
        } else {
            // Operation failed, so get all errors
            for(Database.Error err : sr.getErrors()) {
                System.debug('The following error has occurred.');
                System.debug(err.getStatusCode() + ': ' + err.getMessage());
                System.debug('Contact fields that affected this error: ' + err.getFields());
     }
        }
    }
  2. 디버그 메시지를 확인하십시오(필터에 DEBUG 키워드 사용).하나의 실패가 보고되어야 하고 세 개의 접점이 삽입되어야 합니다.

DML 문 또는 데이터베이스 방법을 사용해야 합니까?

  • 대량 DML 처리 중에 발생하는 오류가 제어 흐름을 즉시 중단하는 Apex 예외로 throw되도록 하려면 DML 문을 사용합니다( 노력하다. . .잡다블록). 이 동작은 대부분의 데이터베이스 절차 언어에서 예외가 처리되는 방식과 유사합니다.
  • 대량 DML 작업의 부분적인 성공을 허용하려면 데이터베이스 클래스 메서드를 사용합니다. 레코드가 실패하더라도 나머지 DML 작업은 계속 성공할 수 있습니다. 그러면 애플리케이션에서 거부된 레코드를 검사하고 작업을 재시도할 수 있습니다. 이 양식을 사용하면 DML 예외 오류가 발생하지 않는 코드를 작성할 수 있습니다. 대신 코드에서 적절한 결과 배열을 사용하여 성공 또는 실패를 판단할 수 있습니다. Database 메서드에는 DML 문과 유사하게 throw된 예외를 지원하는 구문도 포함되어 있습니다.

관련 레코드 작업

관계를 통해 서로 연결된 레코드를 생성하고 관리합니다.

관련 레코드 삽입

조회 또는 마스터-세부 사항 관계와 같이 두 개체 간에 관계가 이미 정의된 경우 기존 레코드와 관련된 레코드를 삽입할 수 있습니다. 레코드는 외래 키 ID를 통해 관련 레코드와 연결됩니다. 예를 들어, 새 연락처를 삽입하는 경우 다음 값을 설정하여 연락처의 관련 계정 레코드를 지정할 수 있습니다. 계정 ID 들.

이 예에서는 다음을 설정하여 계정(관련 레코드)에 연락처를 추가하는 방법을 보여줍니다. 계정 ID연락처의 필드입니다. 연락처와 계정은 조회 관계를 통해 연결됩니다.

  1. 개발자 콘솔의 Anonymous Apex 창에서 이 스니펫을 실행합니다.
    Account acct = new Account(Name='SFDC Account');
    insert acct;
    // Once the account is inserted, the sObject will be 
    // populated with an ID.
    // Get this ID.
    ID acctID = acct.ID;
    // Add a contact to this account.
    Contact mario = new Contact(
        FirstName='Mario',
        LastName='Ruiz',
        Phone='415.555.1212',
        AccountId=acctID);
    insert mario;
  2. 조직의 연락처를 검사합니다.새 계정(SFDC 계정)이 생성되었으며 계정의 연락처 관련 목록에 Mario Ruiz 연락처가 있습니다.

관련 레코드 업데이트

관련 레코드의 필드는 DML 작업에 대한 동일한 호출로 업데이트할 수 없으며 별도의 DML 호출이 필요합니다. 예를 들어, 새 연락처를 삽입하는 경우 다음 값을 설정하여 연락처의 관련 계정 레코드를 지정할 수 있습니다.계정 ID들. 그러나 별도의 DML 호출로 계정 자체를 업데이트하지 않고는 계정 이름을 변경할 수 없습니다. 마찬가지로 연락처를 업데이트할 때 연락처의 관련 계정도 업데이트하려면 DML 호출을 두 번 해야 합니다. 다음 예에서는 두 가지를 사용하여 연락처 및 관련 계정을 업데이트합니다.업데이트 진술.

// Query for the contact, which has been associated with an account.
Contact queriedContact = [SELECT Account.Name 
                          FROM Contact 
                          WHERE FirstName = 'Mario' AND LastName='Ruiz'
                          LIMIT 1];
// Update the contact's phone number
queriedContact.Phone = '(415)555-1213';
// Update the related account industry
queriedContact.Account.Industry = 'Technology';
// Make two separate calls 
// 1. This call is to update the contact's phone.
update queriedContact;
// 2. This call is to update the related account's Industry field.
update queriedContact.Account; 

 

관련 기록 삭제

NS 삭제작업은 계단식 삭제를 지원합니다. 상위 개체를 삭제하면 각 하위 레코드를 삭제할 수 있는 한 자동으로 하위 개체를 삭제합니다.

예를 들어 이전에 생성한 계정(SFDC 계정)을 삭제하면 관련 연락처도 삭제됩니다.

  1. 개발자 콘솔의 Anonymous Apex 창에서 이 스니펫을 실행합니다.
    Account[] queriedAccounts = [SELECT Id FROM Account WHERE Name='SFDC Account'];
    delete queriedAccounts;
  2. 조직의 계정 및 연락처를 확인합니다.계정과 관련 연락처가 모두 삭제된 것을 볼 수 있습니다.

거래 정보

DML 작업은 트랜잭션 내에서 실행됩니다. 트랜잭션의 모든 DML 작업이 성공적으로 완료되거나 한 작업에서 오류가 발생하면 전체 트랜잭션이 롤백되고 데이터베이스에 커밋된 데이터가 없습니다. 트랜잭션의 경계는 트리거, 클래스 메서드, 익명 코드 블록, Apex 페이지 또는 사용자 지정 웹 서비스 메서드가 될 수 있습니다. 예를 들어, 트리거 또는 클래스가 두 개의 계정을 만들고 하나의 연락처를 업데이트하고 유효성 검사 규칙 실패로 인해 연락처 업데이트가 실패한 경우 전체 트랜잭션이 롤백되고 Salesforce에서 어떤 계정도 유지되지 않습니다.

Create a method for inserting accounts.
To pass this challenge, create an Apex class that inserts a new account named after an incoming parameter. If the account is successfully inserted, the method should return the account record. If a DML exception occurs, the method should return null.
  • The Apex class must be called AccountHandler and be in the public scope
  • The Apex class must have a public static method called insertNewAccount
    • The method must accept an incoming string as a parameter, which will be used to create the Account name
    • The method must insert the account into the system and then return the record
    • The method must also accept an empty string, catch the failed DML and then return null
public class AccountHandler {

    public static Account insertNewAccount(String actName){
        Account act = new Account(Name=actName);
        try{
            insert act;
            return act;
        }catch(DMLException e){
            system.debug('DML Exception: ' + e);
            return null;
        }
    }
}

SOQL 쿼리 작성

학습 목표

이 단원을 완료하면 다음을 수행할 수 있습니다.

  • Apex에서 SOQL 쿼리를 작성합니다.
  • 개발자 콘솔에서 쿼리 편집기를 사용하여 SOQL 쿼리를 실행합니다.
  • Anonymous Apex를 사용하여 Apex에 포함된 SOQL 쿼리를 실행합니다.
  • 관련 레코드를 조회합니다.

SOQL 쿼리 작성

Salesforce에서 레코드를 읽으려면 쿼리를 작성해야 합니다. Salesforce는 저장된 레코드를 읽는 데 사용할 수 있는 Salesforce Object Query Language 또는 SOQL을 제공합니다. SOQL은 표준 SQL 언어와 유사하지만 Lightning Platform에 맞게 사용자 정의됩니다.

Apex는 데이터베이스에 저장된 Salesforce 레코드에 직접 액세스할 수 있으므로 Apex 코드에 SOQL 쿼리를 포함하고 간단한 방식으로 결과를 얻을 수 있습니다. SOQL이 Apex에 포함된 경우 인라인 SOQL 이라고 합니다 .

Apex 코드에 SOQL 쿼리를 포함하려면 SOQL 문을 대괄호로 묶고 반환 값을 sObject 배열에 할당합니다. 예를 들어 다음은 Name 및 Phone이라는 두 필드가 있는 모든 계정 레코드를 검색하고 Account sObject의 배열을 반환합니다.

Account[] accts = [SELECT Name,Phone FROM Account];

복사

전제 조건

이 단위의 일부 쿼리는 조직에 계정과 연락처가 있을 것으로 예상합니다. 쿼리를 실행하기 전에 몇 가지 샘플 데이터를 만드십시오.

  1. 개발자 콘솔의 디버그 메뉴 에서 익명 실행 창을 엽니다 .
  2. 창에 아래 스니펫을 삽입하고 실행을 클릭 합니다 .
    // Add account and related contact
    Account acct = new Account(
        Name='SFDC Computing',
        Phone='(415)555-1212',
        NumberOfEmployees=50,
        BillingCity='San Francisco');
    insert acct;
    // Once the account is inserted, the sObject will be 
    // populated with an ID.
    // Get this ID.
    ID acctID = acct.ID;
    // Add a contact to this account.
    Contact con = new Contact(
        FirstName='Carol',
        LastName='Ruiz',
        Phone='(415)555-1212',
        Department='Wingo',
        AccountId=acctID);
    insert con;
    // Add account with no contact
    Account acct2 = new Account(
        Name='The SFDC Query Man',
        Phone='(310)555-1213',
        NumberOfEmployees=50,
        BillingCity='Los Angeles',
        Description='Expert in wing technologies.');
    insert acct2;

 

쿼리 편집기 사용

개발자 콘솔은 SOQL 쿼리를 실행하고 결과를 볼 수 있는 쿼리 편집기 콘솔을 제공합니다. 쿼리 편집기는 데이터베이스를 검사하는 빠른 방법을 제공합니다. SOQL 쿼리를 Apex 코드에 추가하기 전에 테스트하는 좋은 방법입니다. 쿼리 편집기를 사용하는 경우 SOQL 문만 제공해야 하며 이를 둘러싼 Apex 코드는 포함되지 않습니다.

다음 SOQL 예제를 실행해 보겠습니다.

  1. 개발자 콘솔에서 쿼리 편집기 탭을 클릭합니다 .
  2. 쿼리 편집기 아래의 첫 번째 상자에 다음을 복사하여 붙여넣고 실행 을 클릭 합니다 .

SELECT Name,Phone FROM Account

복사

조직의 모든 계정 레코드는 쿼리 결과 섹션에 필드가 있는 행으로 나타납니다.

기본 SOQL 구문

다음은 기본 SOQL 쿼리의 구문입니다.

SELECT fields FROM ObjectName [WHERE Condition]

복사

WHERE 절은 선택 사항입니다. 아주 간단한 쿼리부터 시작하겠습니다. 예를 들어 다음 쿼리는 계정을 검색하고 각 계정에 대한 이름 및 전화 필드를 가져옵니다.

SELECT Name,Phone FROM Account

복사

쿼리는 두 부분으로 구성됩니다.

  1. 이름, 전화번호 선택: 이 부분은 검색하려는 필드를 나열합니다. 필드는 쉼표로 구분된 목록에서 SELECT 키워드 뒤에 지정됩니다. 또는 쉼표가 필요하지 않은 경우 필드를 하나만 지정할 수 있습니다(예:전화 선택).
  2. 계좌로부터: 이 부분은 검색하려는 표준 또는 사용자 정의 개체를 지정합니다. 이 예에서는 계정입니다. Invoice_Statement라는 사용자 정의 개체의 경우 Invoice_Statement__c입니다.

기본을 넘어

다른 SQL 언어와 달리 모든 필드에 *를 지정할 수는 없습니다. 명시적으로 가져오려는 모든 필드를 지정해야 합니다. SELECT 절에 지정하지 않은 필드에 액세스하려고 하면 해당 필드가 검색되지 않았기 때문에 오류가 발생합니다.

쿼리에 Id 필드가 지정되었는지 여부에 관계없이 Apex 쿼리에 항상 반환되기 때문에 쿼리에 Id 필드를 지정할 필요가 없습니다. 예를 들어: 계정에서 ID, 전화번호 선택 그리고 계정에서 전화 선택동등한 진술입니다. 최소한 하나의 필드를 나열해야 하기 때문에 검색하는 유일한 필드인 경우 Id 필드를 지정할 수 있는 유일한 경우:계정에서 ID 선택. 지정하지 않으면 ID 필드가 표시되지 않으므로 쿼리 편집기에서 쿼리를 실행할 때도 ID 필드를 지정할 수 있습니다.

조건으로 쿼리 결과 필터링

조직에 둘 이상의 계정이 있는 경우 모두 반환됩니다. 특정 조건을 충족하는 계정으로 반환되는 계정을 제한하려는 경우 WHERE 절 안에 이 조건을 추가할 수 있습니다. 다음 예에서는 이름이 SFDC Computing인 계정만 검색합니다. 문자열에 대한 비교는 대소문자를 구분하지 않습니다.

SELECT Name,Phone FROM Account WHERE Name='SFDC Computing'

복사

WHERE 절에는 논리 연산자(AND, OR)와 괄호를 사용하여 그룹화된 여러 조건이 포함될 수 있습니다. 예를 들어, 이 쿼리는 이름이 SFDC Computing이고 직원이 25명 이상인 모든 계정을 반환합니다.

SELECT Name,Phone FROM Account WHERE (Name='SFDC Computing' AND NumberOfEmployees>25)

복사

이것은 더 복잡한 조건을 가진 또 다른 예입니다. 이 쿼리는 모든 SFDC 컴퓨팅 계정 또는 청구 도시가 로스앤젤레스인 직원이 25명 이상인 모든 계정을 반환합니다.

SELECT Name,Phone FROM Account WHERE (Name='SFDC Computing' OR (NumberOfEmployees>25 AND BillingCity='Los Angeles'))

복사

기본을 넘어

등호 연산자(=) 비교를 위해 다음을 사용하여 퍼지 일치를 수행할 수 있습니다. 처럼운영자. 예를 들어 다음 조건을 사용하여 이름이 SFDC로 시작하는 모든 계정을 검색할 수 있습니다.WHERE 이름(예: 'SFDC%'). % 와일드카드 문자는 문자와 일치하거나 일치하지 않습니다. 대조적으로 _ 문자는 하나의 문자만 일치시키는 데 사용할 수 있습니다.

쿼리 결과 주문하기

쿼리가 실행되면 특정 순서 없이 Salesforce에서 레코드를 반환하므로 쿼리가 실행될 때마다 반환된 배열의 레코드 순서가 동일하다고 신뢰할 수 없습니다. 그러나 ORDER BY 절을 추가하고 레코드 세트를 정렬할 필드를 지정하여 반환된 레코드 세트를 정렬하도록 선택할 수 있습니다. 이 예에서는 이름 필드를 기준으로 검색된 모든 계정을 정렬합니다.

SELECT Name,Phone FROM Account ORDER BY Name

복사

기본 정렬 순서는 ASC로 지정된 알파벳 순서입니다. 이전 문은 다음과 같습니다.

SELECT Name,Phone FROM Account ORDER BY Name ASC

복사

순서를 반대로 하려면 내림차순으로 DESC 키워드를 사용하십시오.

SELECT Name,Phone FROM Account ORDER BY Name DESC

복사

숫자 및 텍스트 필드를 포함한 대부분의 필드에서 정렬할 수 있습니다. 서식 있는 텍스트 및 다중 선택 선택 목록과 같은 필드는 정렬할 수 없습니다.

쿼리 편집기에서 이러한 SOQL 문을 시도하고 이름 필드에 따라 반환된 레코드의 순서가 어떻게 변경되는지 확인합니다.

반환되는 레코드 수 제한

다음을 추가하여 임의의 수로 반환되는 레코드 수를 제한할 수 있습니다. 제한 n여기서 n은 반환하려는 레코드 수입니다. 결과 집합을 제한하는 것은 반환되는 레코드에 신경 쓰지 않고 레코드의 하위 집합으로 작업하려는 경우에 편리합니다. 예를 들어, 이 쿼리는 반환된 첫 번째 계정을 검색합니다. 반환 값은 하나의 계정이며 사용할 때 배열이 아닙니다.제한 1.

Account oneAccountOnly = [SELECT Name,Phone FROM Account LIMIT 1];

복사

모든 조각을 함께 결합

다음 순서로 하나의 쿼리에서 선택적 절을 결합할 수 있습니다.

SELECT Name,Phone FROM Account 
                   WHERE (Name = 'SFDC Computing' AND NumberOfEmployees>25)
                   ORDER BY Name
                   LIMIT 10

 

개발자 콘솔의 익명 실행 창을 사용하여 Apex에서 다음 SOQL 쿼리를 실행합니다. 그런 다음 디버그 로그에서 디버그 문을 검사합니다. 하나의 샘플 계정을 반환해야 합니다.

Account[] accts = [SELECT Name,Phone FROM Account 
                   WHERE (Name='SFDC Computing' AND NumberOfEmployees>25)
                   ORDER BY Name
                   LIMIT 10];
System.debug(accts.size() + ' account(s) returned.');
// Write all account array info
System.debug(accts);

 

 

SOQL 쿼리의 변수 액세스

Apex의 SOQL 문은 앞에 콜론(:)이 있는 경우 Apex 코드 변수 및 표현식을 참조할 수 있습니다. SOQL 문 내에서 지역 변수를 사용하는 것을 바인드 라고 합니다 .

이 예는 사용 방법을 보여줍니다. 대상부서 WHERE 절의 변수.

String targetDepartment = 'Wingo';
Contact[] techContacts = [SELECT FirstName,LastName 
                          FROM Contact WHERE Department=:targetDepartment];

 

관련 레코드 쿼리

Salesforce의 레코드는 조회 관계 또는 마스터-디테일 관계와 같은 관계를 통해 서로 연결할 수 있습니다. 예를 들어, 연락처는 계정에 대한 조회 관계가 있습니다. 연락처를 만들거나 업데이트할 때 계정과 연결할 수 있습니다. 동일한 계정과 연결된 연락처가 계정 페이지의 관련 목록에 나타납니다. Salesforce 사용자 인터페이스에서 관련 레코드를 볼 수 있는 것과 같은 방식으로 SOQL에서 관련 레코드를 쿼리할 수 있습니다.

상위 레코드와 관련된 하위 레코드를 가져오려면 하위 레코드에 대한 내부 쿼리를 추가하십시오. 내부 쿼리의 FROM 절은 Salesforce 개체 이름이 아닌 관계 이름에 대해 실행됩니다. 이 예에는 반환된 각 계정과 연결된 모든 연락처를 가져오는 내부 쿼리가 포함되어 있습니다. FROM 절은 계정과 연락처를 연결하는 계정의 기본 관계인 연락처 관계를 지정합니다.

SELECT Name, (SELECT LastName FROM Contacts) FROM Account WHERE Name = 'SFDC Computing'

복사

다음 예는 Apex에 예제 SOQL 쿼리를 포함하고 sObject에서 연락처 관계 이름을 사용하여 SOQL 결과에서 하위 레코드를 가져오는 방법을 보여줍니다.

Account[] acctsWithContacts = [SELECT Name, (SELECT FirstName,LastName FROM Contacts)
                               FROM Account 
                               WHERE Name = 'SFDC Computing'];
// Get child records
Contact[] cts = acctsWithContacts[0].Contacts;
System.debug('Name of first associated contact: ' 
             + cts[0].FirstName + ', ' + cts[0].LastName);

 

점 표기법을 사용하여 자식 개체(연락처)에서 부모(Account.Name)의 필드로 관계를 트래버스할 수 있습니다. 예를 들어 다음 Apex 조각은 이름이 Carol인 연락처 레코드를 쿼리하고 계정과 연락처 간의 관계를 탐색하여 Carol과 연결된 계정의 이름을 검색할 수 있습니다.

Contact[] cts = [SELECT Account.Name FROM Contact 
                 WHERE FirstName = 'Carol' AND LastName='Ruiz'];
Contact carol = cts[0];
String acctName = carol.Account.Name;
System.debug('Carol\'s account name is ' + acctName);

 

메모

이 섹션의 예제는 표준 개체를 기반으로 합니다. 사용자 정의 관계를 사용하여 사용자 정의 개체를 함께 연결할 수도 있습니다. 사용자 지정 관계 이름은 __r 접미사로 끝납니다. 예를 들어 송장 명세서는 Invoice_Statement__c 사용자 지정 개체의 Line_Items__r 관계를 통해 개별 항목에 연결됩니다.

SOQL For 루프를 사용하여 일괄 레코드 쿼리

SOQL for 루프를 사용하면 다음 내에 SOQL 쿼리를 포함할 수 있습니다. ~을위한고리. SOQL 쿼리의 결과는 루프 내에서 반복될 수 있습니다. 루프용 SOQL은 레코드 검색을 위해 다른 방법을 사용합니다. 즉, SOAP API의 query 및 queryMore 메서드를 호출하여 효율적인 청킹을 사용하여 레코드를 검색합니다. SOQL for 루프를 사용하면 힙 크기 제한에 도달하는 것을 방지할 수 있습니다.

SOQL ~을위한루프는 SOQL 쿼리에서 반환된 모든 sObject 레코드를 반복합니다. SOQL의 구문 ~을위한 루프는 다음 중 하나입니다.

for (variable : [soql_query]) { code_block }

복사

또는

for (variable_list : [soql_query]) { code_block }

복사

둘 다 변하기 쉬운 그리고 변수 목록 에서 반환하는 sObject와 동일한 유형이어야 합니다. soql_query.

루프는 200개의 sObject 배치에 대해 한 번씩 실행되므로 SOQL for 루프의 sObject 목록 형식을 사용하는 것이 좋습니다. 이렇게 하면 레코드 배치에서 작업하고 DML 작업을 배치로 수행할 수 있으므로 거버너 제한에 도달하는 것을 방지하는 데 도움이 됩니다.

insert new Account[]{new Account(Name = 'for loop 1'), 
                     new Account(Name = 'for loop 2'), 
                     new Account(Name = 'for loop 3')};
// The sObject list format executes the for loop once per returned batch
// of records
Integer i=0;
Integer j=0;
for (Account[] tmp : [SELECT Id FROM Account WHERE Name LIKE 'for loop _']) {
    j = tmp.size();
    i++;
}
System.assertEquals(3, j); // The list should have contained the three accounts
                       // named 'yyy'
System.assertEquals(1, i); // Since a single batch can hold up to 200 records and,
                       // only three records should have been returned, the 
                       // loop should have executed only once

 

Create an Apex class that returns contacts based on incoming parameters.
For this challenge, you will need to create a class that has a method accepting two strings. The method searches for contacts that have a last name matching the first string and a mailing postal code matching the second. It gets the ID and Name of those contacts and returns them.
  • The Apex class must be called ContactSearch and be in the public scope
  • The Apex class must have a public static method called searchForContacts
    • The method must accept two incoming strings as parameters
    • The method should then find any contact that has a last name matching the first string, and mailing postal code (API name: MailingPostalCode) matching the second string
    • The method should finally return a list of Contact records of type List that includes the ID and Name fields
public class ContactSearch{
public static List<Contact> searchForContacts(String s,String sh){
return [select LastName,MailingPostalCode from Contact order by LastName,MailingPostalCode desc];
}
}

SOSL 쿼리 작성

학습 목표

이 단원을 완료하면 다음을 수행할 수 있습니다.

  • SOSL과 SOQL의 차이점을 설명합니다.
  • SOSL 쿼리를 사용하여 여러 개체에서 필드를 검색합니다.
  • 개발자 콘솔에서 쿼리 편집기를 사용하여 SOSL 쿼리를 실행합니다.

SOSL 쿼리 작성

SOSL(Salesforce Object Search Language)은 레코드에서 텍스트 검색을 수행하는 데 사용되는 Salesforce 검색 언어입니다. SOSL을 사용하여 Salesforce의 여러 표준 및 사용자 정의 개체 레코드에서 필드를 검색합니다. SOSL은 Apache Lucene과 유사합니다.

Apex에 SOSL 쿼리를 추가하는 것은 간단합니다. SOSL 쿼리를 Apex 코드에 직접 포함할 수 있습니다. SOSL이 Apex에 포함된 경우 인라인 SOSL 이라고 합니다 .

이것은 'SFDC'라는 단어가 있는 필드가 있는 계정 및 연락처를 검색하는 SOSL 쿼리의 예입니다.

List<List<SObject>> searchList = [FIND 'SFDC' IN ALL FIELDS 
                                      RETURNING Account(Name), Contact(FirstName,LastName)];

 

SOQL과 SOSL의 차이점과 유사점

SOQL과 마찬가지로 SOSL을 사용하면 조직의 기록에서 특정 정보를 검색할 수 있습니다. 한 번에 하나의 표준 또는 사용자 정의 개체만 쿼리할 수 있는 SOQL과 달리 단일 SOSL 쿼리는 모든 개체를 검색할 수 있습니다.

또 다른 차이점은 SOSL은 단어 일치를 기반으로 필드를 일치시키는 반면 SOQL은 기본적으로 정확히 일치를 수행한다는 것입니다(와일드 카드를 사용하지 않는 경우). 예를 들어, SOSL에서 'Digital'을 검색하면 필드 값이 'Digital' 또는 'The Digital Company'인 레코드가 반환되지만 SOQL은 필드 값이 'Digital'인 레코드만 반환합니다.

SOQL과 SOSL은 구문이 다른 두 개의 별도 언어입니다. 각 언어에는 고유한 사용 사례가 있습니다.

  • SOQL을 사용하여 단일 개체에 대한 레코드를 검색합니다.
  • SOSL을 사용하여 여러 개체에서 필드를 검색합니다. SOSL 쿼리는 개체에서 대부분의 텍스트 필드를 검색할 수 있습니다.

전제 조건

이 단위의 일부 쿼리는 조직에 계정과 연락처가 있을 것으로 예상합니다. SOQL 단위에서 샘플 데이터를 생성하지 않았다면 이 단위에서 샘플 데이터를 생성합니다. 그렇지 않으면 이 섹션에서 샘플 데이터 생성을 건너뛸 수 있습니다.

  1. 개발자 콘솔의 디버그 메뉴 에서 익명 실행 창을 엽니다 .
  2. 창에 아래 스니펫을 삽입하고 실행을 클릭 합니다 .
    // Add account and related contact
    Account acct = new Account(
        Name='SFDC Computing',
        Phone='(415)555-1212',
        NumberOfEmployees=50,
        BillingCity='San Francisco');
    insert acct;
    // Once the account is inserted, the sObject will be 
    // populated with an ID.
    // Get this ID.
    ID acctID = acct.ID;
    // Add a contact to this account.
    Contact con = new Contact(
        FirstName='Carol',
        LastName='Ruiz',
        Phone='(415)555-1212',
        Department='Wingo',
        AccountId=acctID);
    insert con;
    // Add account with no contact
    Account acct2 = new Account(
        Name='The SFDC Query Man',
        Phone='(310)555-1213',
        NumberOfEmployees=50,
        BillingCity='Los Angeles',
        Description='Expert in wing technologies.');
    insert acct2;

 

쿼리 편집기 사용

개발자 콘솔은 SOSL 쿼리를 실행하고 결과를 볼 수 있는 쿼리 편집기 콘솔을 제공합니다. 쿼리 편집기는 데이터베이스를 검사하는 빠른 방법을 제공합니다. Apex 코드에 추가하기 전에 SOSL 쿼리를 테스트하는 좋은 방법입니다. 쿼리 편집기를 사용하는 경우 주변에 Apex 코드 없이 SOSL 문만 제공하면 됩니다.

다음 SOSL 예제를 실행해 보겠습니다.

  1. 개발자 콘솔에서 쿼리 편집기 탭을 클릭합니다 .
  2. 쿼리 편집기 아래의 첫 번째 상자에 다음을 복사하여 붙여넣고 실행 을 클릭 합니다 .

FIND {Wingo} IN ALL FIELDS RETURNING Account(Name), Contact(FirstName,LastName,Department)

복사

기준을 충족하는 조직의 모든 계정 및 연락처 레코드는 쿼리 결과 섹션에 필드가 있는 행으로 표시됩니다. 결과는 각 개체(계정 또는 연락처)에 대한 탭으로 그룹화됩니다. SOSL 쿼리는 값이 Wingo와 일치하는 필드가 있는 레코드를 반환합니다. 샘플 데이터에 따르면 하나의 연락처에만 Wingo 값이 있는 필드가 있으므로 이 연락처가 반환됩니다.

메모

쿼리 편집기 및 API의 검색 쿼리는 중괄호({윙고}). 대조적으로, Apex에서 검색 쿼리는 작은따옴표('윙고').

기본 SOSL 구문

SOSL을 사용하면 다음 검색 기준을 지정할 수 있습니다.

  • 검색할 텍스트 표현식(단어 또는 구)
  • 검색할 필드 범위
  • 검색할 개체 및 필드 목록
  • 소스 개체의 행 선택 조건

다음은 기본 SOSL 쿼리의 구문입니다.

FIND 'SearchQuery' [IN SearchGroup] [RETURNING ObjectsAndFields]

 

SearchQuery 는 검색할 텍스트입니다(단일 단어 또는 구). 검색어는 논리 연산자(AND, OR)와 괄호로 그룹화할 수 있습니다. 또한 검색어에 와일드카드 문자(*, ?)가 포함될 수 있습니다. * 와일드카드는 검색어의 중간이나 끝에 있는 0개 이상의 문자와 일치합니다. NS ? 와일드카드는 검색어의 중간이나 끝에 있는 하나의 문자와만 일치합니다.

텍스트 검색은 대소문자를 구분하지 않습니다. 예를 들어고객, 고객, 또는 고객 모두 동일한 결과를 반환합니다.

SearchGroup 은 선택 사항입니다. 검색할 필드의 범위입니다. 지정하지 않으면 기본 검색 범위는 모든 필드입니다. SearchGroup 은 다음 값 중 하나를 사용할 수 있습니다.

  • ALL FIELDS
  • NAME FIELDS
  • EMAIL FIELDS
  • PHONE FIELDS
  • SIDEBAR FIELDS

ObjectsAndFields 는 선택 사항입니다. 검색 결과에 반환할 정보는 하나 이상의 sObject 목록과 각 sObject 내에서 필터링할 선택적 값이 있는 하나 이상의 필드 목록입니다. 지정하지 않으면 검색 결과에 발견된 모든 개체의 ID가 포함됩니다.

단일 단어 및 구문

및 SearchQuery는 텍스트의 두 가지 유형이 포함되어 있습니다

  • 단일 단어 — 다음과 같은 단일 단어시험 또는 안녕하십니까. 의 단어검색어공백, 구두점 및 문자에서 숫자로(또는 그 반대로) 변경으로 구분됩니다. 단어는 항상 대소문자를 구분하지 않습니다.
  • 구문 — 다음과 같이 큰따옴표로 묶인 단어 및 공백 모음 "존 스미스". 여러 단어를 논리 및 그룹화 연산자와 함께 결합하여 보다 복잡한 쿼리를 형성할 수 있습니다.

검색 예

SOSL 검색이 작동하는 방식에 대해 알아보기 위해 다양한 검색 문자열을 사용하여 샘플 데이터를 기반으로 출력이 무엇인지 살펴보겠습니다. 이 표에는 다양한 예제 검색 문자열과 SOSL 검색 결과가 나와 있습니다.

모든 필드에서 검색:검색 설명일치하는 레코드 및 필드

Search in all fields for:Search DescriptionMatched Records and Fields

The Query This search returns all records whose fields contain both words: The and Query, in any location of the text. The order of words in the search term doesn’t matter. Account: The SFDC Query Man (Name field matched)
Wingo OR Man This search uses the OR logical operator. It returns records with fields containing the word Wingo or records with fields containing the word Man. Contact: Carol Ruiz, Department: 'Wingo'Account: The SFDC Query Man (Name field matched)
1212 This search returns all records whose fields contain the word 1212. Phone fields that end with -1212 are matched because 1212 is considered a word when delimited by the dash. Account: The SFDC Query Man, Phone: '(415)555-1212'Contact: Carol Ruiz, Phone: '(415)555-1212'
wing* This is a wildcard search. This search returns all records that have a field value starting with wing. Contact: Maria Ruiz, Department: 'Wingo'Account: The SFDC Query Man, Description: 'Expert in wing technologies.'

 

SOSL Apex 예제

이 예는 Apex에서 SOSL 쿼리를 실행하는 방법을 보여줍니다. 이 SOSL 쿼리는 OR 논리 연산자를 사용하여 두 개의 검색어를 결합합니다. 즉, 모든 필드에서 Wingo 또는 SFDC를 검색합니다. 이 예에서는 각 샘플 계정에 단어 중 하나가 포함된 필드가 있기 때문에 모든 샘플 계정을 반환합니다. SOSL 검색 결과는 목록 목록으로 반환됩니다. 각 목록에는 반환된 레코드의 배열이 포함됩니다. 이 경우 목록에는 두 개의 요소가 있습니다. 인덱스 0에서 목록은 계정 배열을 포함합니다. 인덱스 1에서 목록은 연락처 배열을 포함합니다.

개발자 콘솔의 익명 실행 창에서 이 스니펫을 실행합니다. 그런 다음 디버그 로그를 검사하여 모든 레코드가 반환되었는지 확인합니다.

List<List<sObject>> searchList = [FIND 'Wingo OR SFDC' IN ALL FIELDS 
                   RETURNING Account(Name),Contact(FirstName,LastName,Department)];
Account[] searchAccounts = (Account[])searchList[0];
Contact[] searchContacts = (Contact[])searchList[1];
System.debug('Found the following accounts.');
for (Account a : searchAccounts) {
    System.debug(a.Name);
}
System.debug('Found the following contacts.');
for (Contact c : searchContacts) {
    System.debug(c.LastName + ', ' + c.FirstName);
}

 

좀 더 이야기 해줘...

SOSL 쿼리의 반환 결과를 필터링, 재정렬 및 ​​제한할 수 있습니다. SOSL 쿼리는 여러 sObject를 반환할 수 있으므로 해당 필터는 RETURNING 절 내의 각 sObject 내에 적용됩니다.

개체에 대한 WHERE 절에 조건을 추가하여 SOSL 결과를 필터링할 수 있습니다. 예를 들어 산업이 의류인 계정만 반환됩니다.반환 계정(이름, 업종 WHERE 업종='의류')

마찬가지로 하나의 sObject에 대한 순서 지정 결과는 개체에 대한 ORDER BY를 추가하여 지원됩니다. 예를 들어 이렇게 하면 반환된 계정이 이름 필드를 기준으로 정렬됩니다. 반환 계정(이름, 업종별 주문).

반환된 레코드의 수는 레코드의 하위 집합으로 제한될 수 있습니다. 이 예에서는 반환된 계정을 10개로만 제한합니다.반환 계정(이름, 업종 제한 10)

Create an Apex class that returns both contacts and leads based on a parameter.
To pass this challenge, create an Apex class that returns both contacts and leads that have first or last name matching the incoming parameter.
The Apex class must be called ContactAndLeadSearch and be in the public scope
The Apex class must have a public static method called searchContactsAndLeads
The method must accept an incoming string as a parameter
The method should then find any contact or lead that matches the string as part of either the first or last name
The method should finally use a return type of List<List< SObject>>

NOTE: Because SOSL indexes data for searching, you must create a Contact record and Lead record before checking this challenge. Both records must have the last name Smith. The challenge uses these records for the SOSL search
public class ContactAndLeadSearch
{
    public static List<List<SObject>> searchContactsAndLeads(String str)
    {
        List<List<sObject>> searchContactsAndLeadsList = [FIND :str IN ALL FIELDS RETURNING Contact(FirstName,LastName) ,Lead(FirstName,Lastname)];
        return searchContactsAndLeadsList ;
    }

}

ContactAndLeadSearch.searchContactsAndLeads('Smith');

Contact , Lead 화면에서 lastName Smith 건 각각 1건 씩 등록 합니다.

 

 

 

반응형