需求: 在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);
}
注意点
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的图层显示出来。
参考文章
https://developer.salesforce.com/docs/atlas.en-us.ajax.meta/ajax/sforce_api_ajax_introducing.htm
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
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
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