我要求编写文本或图形进度跟踪器,而rforcecom的批量更新功能加载最多10,000个批次。
要设置并完成批量更新,必须创建一些对象 - 没有避免它。我真的不喜欢重新运行代码以检查rforcecom.checkBatchStatus()的状态。这需要自动进行,而进度条可以显示实际进度,因为检查全局环境不是首选,并且在再次运行之前它将是静态“状态”更新。
以下是代码的设置方式:
require(Rforcecom)
## Login to Salesforce using your username and password token
## Once ready to update records, use the following:
job<- rforcecom.createBulkJob(session, operation = 'update',
object = 'custom_object__c')
info<- rforcecom.createBulkBatch(session, jobId = job$id, data = entry,
batchSize = 10000)
### Re-run this line if status(in global environment) is "In Progress" for
### updated status
status<- lapply(info, FUN = function(x) {
rforcecom.checkBatchStatus(session, jobId = x$jobId, batchId = x$id)})
###Once complete, check details
details<- lapply(status, FUN = function(x){
rforcecom.getBatchDetails(session, jobId = x$jobId, batchId = x$id)})
close<- rforcecom.closeBulkJob(session, jobId = job$id)
答案 0 :(得分:0)
要自动重新运行状态代码,请使用repeat循环:
repeat {
statements...
if (condition) {
break
}
}
然后,要获得进度更新的视觉效果,请使用基础R中的txtProgressBar()。对于此特定函数,我使用两个简单的伴随函数创建了自己的进度条函数。作为关于progressValue()的注释,rforcecom.checkBatchStatus()作为1和子列表的列表输出。用于检查处理的记录数的子列表名称是“numberRecordsProcessed”。
progressBar<- function(x, start = 0, finish){
# x is your object that is performing a function over a varying time length
# finish is your number of rows of data your function is processing
pb <- txtProgressBar(min = start, max = finish, style = 3)
for (i in 1:finish){
i<- progressValue(x)
setTxtProgressBar(pb, i)
if (progressValue(x)/finish == 1) {
close(pb)
}
}
}
finish<- function(x){
return(as.numeric(nrow(x)))
}
progressValue<- function(x){
x=x[[1]][["numberRecordsProcessed"]]
return(as.numeric(x))
}
现在,把它们放在一起吧!只要您知道自己的条件:“已完成”或“失败”,就可以训练重复循环结束。重复“状态”,这将更新处理的记录数,这样做会更新进度条。当处理的记录数等于数据中的行数时,进度条将退出,重复循环也将退出。
repeat {
status<- lapply(info, FUN = function(x){
rforcecom.checkBatchStatus(session, jobId = x$jobId, batchId = x$id)})
progressBar(status, finish = finish(entry))
if (status[[1]][["state"]]=="Completed") {
break
}
if (status[[1]][["state"]]=="Failed") {
break
}
}