2017-03-07 212 views
1

我要求寫一個文本或圖形進度跟蹤器,而rforcecom的批量更新功能加載最多10,000個批次。rforcecom.checkbatchstatus()的進度條

要設置並完成批量更新,必須創建一些對象 - 不能避免它。我真的不喜歡不得不重新運行代碼來檢查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

要自動重新運行狀態代碼,使用重複循環:

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 
    } 
}