在客户端使用Ajax Tookit的sforce.connection.query取得Salesforce数据
2023年09月17日
文章浏览:397
需求: 在Visualforce页面中,如果数据 量太多放在List里面超ViewState的话,那么我们可以用Ajax Tookit

我们可能使用CustomButton想要取得Salesforce的数据

或者在Visualforce页面里面,想通过Javascript来取得Salesforce的数据。

那么我们就可以使用Ajax Tookit的功能。

※注: SiteGuest用户不能使用Ajax Tookit

详细可参照如下文章

 http://salesforcegogogo.com/QuestionItem.aspx?id=125 

如何实现: 在Visualforce页面中


    <!-- Salesforceのjsライブラリをインクルードする -->
    <script src="../../soap/ajax/42.0/connection.js" type="text/javascript"></script>
    <script src="../../soap/ajax/42.0/apex.js" type="text/javascript"></script>
    
    //Javascriptでデータ取得対応----------Start
    // セッションIDないとエラーなので、この行を記載しとくこと
    sforce.connection.sessionId = '{!$Api.Session_ID}'; 
    sforce.connection.batchSize = 2000;
    // クエリ発行batchSize
    
    var result = sforce.connection.query("{!queryStr}");
    // レコード取得
    var records = result.getArray("records");
    
    
    for (var i = 0; i < records.length; i++) {
         var DrawingManagerItem = records[i];
         LatLngInfo = DrawingManagerItem.MapTech__POLYGON_LatLngInfo__c;
         console.log('LatLngInfo------------>'+LatLngInfo);

    }


注意点

  1. 1每次最多只能取得1000件数据,如果想要取得更多的数据,那么可以使用SOQL的OffSetSize功能
  2. 2connection.js和apex.js的版本不一样的话,能够使用的功能也不一样。比如说,在22版本中,不能使用OffSet的功能
Select Id ,MapTech__POLYGON_LatLngInfo__c ,MapTech__LineColor__c ,MapTech__FilColor__c 
From  MapTech__DrawingManager__c  
Where MapTech__GyouseiKubun__c = 'null' LIMIT 1000 OFFSET 1000

    如下代码,就可以从Salesforce数据库上动态取得多余1000件的数据

    为了方便大家开发,直接可以Copy这些代码。

       <!-- Salesforceのjsライブラリをインクルードする -->
        <script src="../../soap/ajax/42.0/connection.js" type="text/javascript"></script>
        <script src="../../soap/ajax/42.0/apex.js" type="text/javascript"></script>
        
         // クエリ発行batchSize
            var resultCount = sforce.connection.query("{!queryStrAllRecords}");
            console.log('resultCount.size------------>'+resultCount.size);
            
            
            var result;
            var records; 
            var resultMoreThanOnce;
            var recordsMoreThanOnce; 
            var intLoopCount = resultCount.size / 1000;
            console.log('intLoopCount------------>'+intLoopCount);
            for (var index = 0; index < intLoopCount; index++) {
            	console.log('index------------>'+index);
    	        
    	        if(index>0){
    		        // クエリ発行(2回目以上)
    		        resultMoreThanOnce = sforce.connection.query("{!queryStr}"+" LIMIT 1000 OFFSET "+1000*index);
    		        // レコード取得(2回目以上)
    	        	recordsMoreThanOnce = resultMoreThanOnce.getArray("records");
    	        
    			    records = [].concat(records, recordsMoreThanOnce);
    			    console.log('records.length結合した後------------>'+records.length);
    	        }else if(index == 0){
    	        	result = sforce.connection.query("{!queryStr}");
    	        	console.log('queryStr------------>'+"{!queryStr}");
    		        // レコード取得
    		        records = result.getArray("records");
    		        console.log('records.length------------>'+records.length);
    	        }
            }
            console.log('records.length88888------------>'+records.length);


    下面的截图是执行的效果。从数据库中取得1000件以上的数据,放到Array中。


    但是尝试了大数据量之后,还是发现有问题。

    使用了14000件数据测试之后,发现这个OffSet最大可以使用2000,

    也就是说只能查询3次,最多能够查询出3000件数据可以使用。

    这是一个很大的问题,不知道有没有好的解决办法,如果大家知道的话,请务必告诉我一声。



    倒是能显示3000个GoogleMap的图层了,还是不太够,至少能够显示1万个图层就好了。



    继续来解决上面方法的最多3000件的问题

    无意间,发现有queryMore的方法,可以解决大批数据量的问题。

    代码如下


    //////////////////////
            var result = sforce.connection.query("{!queryStr}");//全てのデータを格納する変数である	
            console.log('queryStr------------>'+"{!queryStr}");
            
            
            var records; 
            var resultMoreThanOnce;
            var recordsMoreThanOnce=[]; 
    		var queryMore = true;//複数回検索する必要があるかどうかのフラグ
    		while (queryMore) {
    			var records = result.getArray("records");
    			recordsMoreThanOnce = [].concat(recordsMoreThanOnce, records);
    			console.log('records.length----init-------->'+records.length);
    			console.log('recordsMoreThanOnce.length----init-------->'+recordsMoreThanOnce.length);
    			
    			
    			for (var i = 0; i < records.length; i++) {
    				//process records[i]
    			}
    			
    			console.log('検索処理が終わりました------------>'+result.getBoolean("done"));
    			if (result.getBoolean("done")) {
    				queryMore = false;
    			} else {
    				result = sforce.connection.queryMore(result.queryLocator);
    			}
    		}
    		
    		console.log('records.length----Final1-------->'+records.length);
    		records = recordsMoreThanOnce;
    		delete recordsMoreThanOnce;
    		console.log('records.length----Final2-------->'+records.length);
    		/////////////////////////////


    Debug效果如下,大家看到了,能够把全件查询出来。放到Javascript的Array变量中。


    下面是APP的最终效果,把GoogleMap的图层显示出来。



    参考文章

    AJAX Toolkit Developer Guide

     https://developer.salesforce.com/docs/atlas.en-us.ajax.meta/ajax/sforce_api_ajax_introducing.htm 

    Workaround for offset 2000 limit on SOQL query

     https://help.salesforce.com/s/articleView?id=000387840&type=1 

     https://developer.salesforce.com/docs/atlas.en-us.api.meta/api/sforce_api_calls_querymore.htm 

    Workaround for Offset 2000 limit on SOQL Query

     https://salesforce.stackexchange.com/questions/22631/workaround-for-offset-2000-limit-on-soql-query 

     https://qiita.com/comefigo/items/5b5ff1f5f9e652f4bf6f 

     https://jsforce.github.io/document/#event-driven-style 

    Examples of Synchronous Calls

     https://developer.salesforce.com/docs/atlas.en-us.ajax.meta/ajax/sforce_api_ajax_more_samples.htm 

    AJAX Toolkit Developer Guide

     https://blog.bessereau.eu/assets/pdfs/apex_ajax.pdf 


    关注 收藏