Javascript 在NetSuite中打印PDF并选择多个事务记录
是否有一种方法可以将多个事务的选择打印到单个PDF文档中?我只看到两个似乎有重大缺点的选项: 1) 将各个记录加载到各自的nlobjTemplateRenderer对象中,然后在呈现为PDF之前将它们全部缝合在标记中。根据在Suitelet中使用时采取的其他操作,限制少于50个事务 2) 根据所选记录的内部ID执行搜索,并将搜索结果传递到NLOBJTemplaterEnderr对象中。这种基于现有文档的方法并不能使我相信它能够在一个文档中完整地将带有行数据的记录显示为结果列 似乎我最好的选择是#1,但将所需的事务分成5-10个记录组,并与小组一起反复调用Suitelet,希望在缝合所有结果并返回最终PDF文档之前满足NLAPIRestURL的45秒超时限制。我基本上认为这是一种基本形式,如下所示:Javascript 在NetSuite中打印PDF并选择多个事务记录,javascript,netsuite,suitescript,bfo,Javascript,Netsuite,Suitescript,Bfo,是否有一种方法可以将多个事务的选择打印到单个PDF文档中?我只看到两个似乎有重大缺点的选项: 1) 将各个记录加载到各自的nlobjTemplateRenderer对象中,然后在呈现为PDF之前将它们全部缝合在标记中。根据在Suitelet中使用时采取的其他操作,限制少于50个事务 2) 根据所选记录的内部ID执行搜索,并将搜索结果传递到NLOBJTemplaterEnderr对象中。这种基于现有文档的方法并不能使我相信它能够在一个文档中完整地将带有行数据的记录显示为结果列 似乎我最好的选择是#
// initial called function that will return completed PDF document file
function buildPdfFromRecords() {
var pdfBuilder = [];
var selectedIDs = [];
var chunks = chunkify(selectedIDs, 10);
for (var c = 0; c < chunks.length; c++) {
var param = { id_list : JSON.stringify(chunks[s]) };
var result = nlapiRequestURL(url, param).getBody();
pdfBuilder.push(result);
}
var finalXML = "<pdfset>" + pdfBuilder.join("") + "</pdfset>";
var pdfDoc = nlapiXMLToPDF(finalXML);
}
// function in suitelet called by url to handle individual groups of record internal IDs
// to mitigate scripting governance limits
function handleRecordIdListRequest(request, reponse) {
var idList = JSON.parse(request.getParameter("id_list"));
var templateXML = nlapiLoadRecord("template.txt").getValue();
var pdfBuilder = [];
for (var i = 0; i < idList.length; i++) {
var transRecord = nlapiLoadRecord("recordtype", idList[i]);
var renderer = nlapiCreateTemplateRenderer();
renderer.setTemplate(templateXML);
renderer.addRecord("record", transRecord);
pdfBuilder.push(renderer.renderToString());
}
response.write(pdfBuilder.join(""));
}
//初始调用的函数将返回已完成的PDF文档文件
函数buildPdfFromRecords(){
var pdfBuilder=[];
var selectedds=[];
var chunks=chunkify(selectedIDs,10);
for(var c=0;c
如果这真的是最好的方法,那就这样吧,但我希望有一个更优雅的解决方案,我只是没有看到。为什么不使用Map Reduce脚本来生成PDF?它需要是一个Suitelet吗?有许多部件可以缝合在一起完成这项工作
const mrTask=task.create({
taskType:task.taskType.SCHEDULED_脚本,
scriptId:'customscript\u knsi\u batch\u products',
deploymentId:deploymentId,
参数:{
custscript_knsi_batch_运算符:user.id,
custscript_knsi_batch_采购:sourcingId
}
});
试一试{
const taskId=mrTask.submit();
setHeader({name:'content-type',value:'application/json'});
context.response.write(JSON.stringify({
成功:没错,
消息:“作为任务排队:”+taskId
}));
}捕获(e){
日志错误({
标题:“+user.email”的“触发”+sourcingId+”,
详细信息:(e.message | | e.toString())+(e.getStackTrace?('\n\n'+e.getStackTrace().join('\n')):'')
});
setHeader({name:'content-type',value:'application/json'});
context.response.write(JSON.stringify({
成功:错,
消息:'安排此脚本时出错\n'+e.message
}))
我从一个Suitelet开始为用户生成一个界面。另外,我不熟悉map/reduce脚本类型,我没有足够的时间检查它。你能传递它的参数并得到一个响应,允许你在浏览器选项卡中向用户显示PDF吗?因为这就是我使用Suitelet的原因。我喜欢这样想法,我一直在测试它。但是现在我从XMLToPDF解析器中得到了奇怪的错误,它说“错误解析XML”,并返回添加的第一个PDF的url,但是url总是以“system.netsuite.com”开头,不管我是否附加“”到文件URL的开头。我已经验证了符号确实被转义了。哦,别管最后的评论了。我忘了将组件PDF文档设置为“Is Online”。进行更改解决了那里的小问题。