[Salesforce] Apex 시간 지연 함수

  wait(10000);//Wait

    //Wait
    public static void wait(Integer millisec) {

        if(millisec == null || millisec < 0) {
            millisec = 0;
        }
        
        Long startTime = DateTime.now().getTime();
        Long finishTime = DateTime.now().getTime();
        while ((finishTime - startTime) < millisec) {
            //sleep for parameter x millisecs
            finishTime = DateTime.now().getTime();
        }
        // System.debug(‘>>> Done from ‘ + startTime + ‘ to ‘ + finishTime);
    }

[Salesforce]@RemoteAction

Salesforce의 @RemoteAction에 대해 공유합니다.

특징

· JavaScript에서 Apex 클래스의 처리를 실행할 수 있습니다.

· actionFunction과 같은 기능이지만, 이것은 JavaScript 내에서 처리의 반환 값을 사용할 수 있습니다.

예를 들어, 거래처 취득 처리를 실행해 취득한 거래처 리스트를 사용한 처리를 실시할 수 있습니다.

샘플 코드

· Apex 클래스

 global with sharing class SampleRemoteController {
    @RemoteAction
    global static String setString(String str) {
        return  '----- ' + str + ' -----';
    }
    
    @RemoteAction
    global static List<sObject> exequery(String str){
        return Database.query(str);
    }
}

· Visualforce 페이지

 <apex:page controller="SampleRemoteController">
    <apex:form >
        <!-- @RemoteActionSample:StringSet -->
        <apex:commandButton value=" String " onClick="return  setString('Yaho');" />
         
        <!-- @RemoteActionSample:SOQLGet -->
        <apex:commandButton value=" GetAcc " onClick="return getAcc();" />
        <hr/>
        <div id="output">Output</div>
    </apex:form>

    <script type="text/javascript">
        /*
         * @RemoteActionSample
         * StringSet
         */
        function setString(str) {
            {!$RemoteAction.SampleRemoteController.setString}(str, function(result, event){
                if(event.status) {
                    document.getElementById("output").innerHTML = result;
                }
            });
            return false;
        }
        
        /*
         * @RemoteActionSample
         * SOQLAccountGet
         */
        function getAcc() {
            var query = 'select Id,Name from Account limit 10';
            {!$RemoteAction.SampleRemoteController.exequery}(query, function(result, event){
                if(event.status) {
                    var names = '';
                    for (var i = 0; i < result.length; i++) {
                        names = names + result[i].Name + ' | ';
                    }
                    document.getElementById("output").innerHTML = names;
                }
            });
            return false;
        }
    </script>
</apex:page>   

[Salesforce]TestMethod로 정의된 메서드는 웹 서비스 콜아웃을 지원하지 않습니다.

TestMethod로 정의된 메서드는 웹 서비스 콜아웃을 지원하지 않습니다.

오류가 발생한 예

@isTest
private class PostTest {
    @isTest
    static void test() {

        Test.startTest();
        Service.execute();
        Test.stopTest();
    }
}

public with sharing class Service {
  @future(callout=true)
  public static void execute() {
    ServiceC sc = new ServiceC();
    sc.post();
   }

}

public with sharing class ServiceC {

  private HttpResponse post() {
    HttpRequest request = new HttpRequest();

    (생략)

    HttpResponse response = new Http().send(request);

    return response;
  }

}

오류 해결 예

@isTest
private class PostTest {
    @isTest
    static void test() {

        Test.startTest();
        Test.setMock(HttpCalloutMock.class, new ServiceHttpCalloutMock());
        Service.execute();
        Test.stopTest();
    }
}

@isTest
public class ServiceHttpCalloutMock implements HttpCalloutMock {
  public HTTPResponse respond(HTTPRequest req) {
    HttpResponse res = new HttpResponse();
    res.setStatusCode(200);
    res.setBody('test');
    return res;
  }
}

[Salesforce]Failed to run tests synchronously.: Your query request was running for too long.

테스트 클래스 실행 시 “Failed to run tests synchronously.: Your query request was running for too long.” 오류 대응

Summary
Test classes failing with QUERY_TIMEOUT Failed to run tests synchronously when running in synchronous mode

Login to the org which has quite number of managed package apex classes.
Run the Apex Test Class from Developer Console in Sync Mode
You may notice below exception when running the apex test class:
Error Message:

“QUERY_TIMEOUT Failed to run tests synchronously: Your query request was running for too long”

Workaround
As a workaround, please try to run the test class in asynchronous mode.

[Salesforce] SOQL 문의 HAVING 사용법

SOQL 문의 HAVING

HAVING에서는 GROUP BY로 그룹화한 결과에 대해 좁혀 조건을 넣을 수 있습니다.

좁힌 조건이라는 의미에서는 WHERE와 비슷하지만, WHERE에서는 그룹핑하기 전, HAVING은 그룹핑한 후입니다.

다음 샘플은 기회의 리드 소스로 그룹화하고 동일한 값의 레코드 수가 1 이상인 리드 소스별 금액을 표시합니다.

AggregateResult[] results = [SELECT LeadSource, SUM(Amount) summary 
                               FROM Opportunity 
                               GROUP BY LeadSource 
                               HAVING Count(LeadSource) > 1];
for(AggregateResult ar: results){
  System.debug('LeadSource='+ ar.get('LeadSource') 
                   + ':Amount='+ ar.get('summary'));
}

디버그 결과

LeadSource=LeadSource1:Amount=2
LeadSource=LeadSource2:Amount=3

[Salesforce]JSENCODE

JSENCODE

백슬래시 () 등의 이스케이프 문자를 아포스트로피 (‘) 등의 안전하지 않은 JavaScript 문자의 전에 삽입해, JavaScript 로 사용하는 텍스트 캐릭터 라인이나 편지 병합 항목치를 encode 합니다.

페이지를 로드할 때 JavaScript가 실행되고 경고가 표시됩니다.

<script>var ret = "foo";alert('xss');//";</script>

이 경우 JavaScript가 실행되지 않도록 JSENCODE 함수를 사용하십시오.

<script>var ret = "{!JSENCODE($CurrentPage.parameters.retURL)}";</script>

[Salesforce]CANNOT_EXECUTE_FLOW_TRIGGER

CANNOT_EXECUTE_FLOW_TRIGGER

테스트 클래스 런타임에 오류 세부 사항

System.DmlException: Insert failed. First exception on row 0; first error:
CANNOT_EXECUTE_FLOW_TRIGGER,
Campaign Create, Member Status Auto Set 처리 실패로 인해 이 레코드를 저장할 수 없습니다.
Salesforce 시스템 관리자에게 다음 세부 정보를 보고하십시오.
Salesforce에는 삭제 기준과 일치하는 레코드가 없습니다.
Salesforce에는 삭제 기준과 일치하는 레코드가 없습니다. : []

대응안의 하나는 이하입니다.

@isTest(SeeAllData=true)
※경우에 따라서 효과가 있다.