我被分配的任务是从已保存的搜索中提取数据到虚拟机 (VM)。在我的研究过程中,我发现了蒂姆·迪特里希(Tim Dietrich)实现这一目标的方法。我实现了他的方法,其中涉及使用 RESTlet 并通过 Python 脚本调用它。最初,这个过程似乎很成功。
但是,在比较 API 提取和 NetSuite 标准 Excel 导出之间的行数时,我注意到存在显着差异。与 Excel 工作簿相比,API 提取产生的行数要少得多。
这种意外的数据量差异引发了人们对 API 提取方法完整性的担忧。我现在正在寻求了解造成这种差异的原因,并找到解决方案以确保从 NetSuite 保存的搜索中准确完整地提取数据。
经过进一步调查,我发现问题可能与分页有关。我的研究表明分页需要在 RESTlet 本身内实现。根据这些信息,我修改了 RESTlet 的 JavaScript 代码,并将其重新部署到 NetSuite 中。然而,尽管有这些变化,API 提取的行数仍然低于预期。
var
log,
query,
response = new Object();
define( [ 'N/log', 'N/query' ], main );
function main( logModule, queryModule ) {
log = logModule;
query = queryModule;
return { post: postProcess }
}
function postProcess( request ) {
try {
if ( ( typeof request.query == 'undefined' ) || ( request.query === null ) || ( request.query == '' ) ) {
throw { 'type': 'error.SuiteAPIError', 'name': 'INVALID_REQUEST', 'message': 'No query was specified.' }
}
if ( typeof request.params == 'undefined' ) { request.params = new Array(); }
response.rows = query.runSuiteQL( { query: request.query, params: request.params } ).asMappedResults();
return response;
} catch( e ) {
log.debug( { 'title': 'error', 'details': e } );
return { 'error': { 'type': e.type, 'name': e.name, 'message': e.message } }
}
}
您发布的代码没有显示任何分页 API 的使用。
如果它有帮助,一个简单的例子是:
function processQuery(queryStr){
const results = query.runSuiteQLPaged({
query: queryStr,
pageSize: 1000
});
let data = [];
results.iterator().each((res)=>{
data = data.concat(res.value.data.asMappedResults());
return true;
});
return data;
};