使用多个行项目创建 NetSuite 保存的搜索
Creating NetSuite Saved Searches with Multiple Line Items
我正在使用具有多个行项目的 Kit/Package(项目)记录处理 NetSuite 保存的搜索。例如,每个 Kit/Package 由两个商品 SKU 组成。
目前,我的“已保存搜索”正在将每个商品 SKU 拉入其各自的行中。如何将每个 Kit/Package 保持在一行,并将不同的 Item SKU 拉入它们自己的列?我可以创建一个总是包含商品 SKU #1 的列,而另一个列总是包含商品 SKU #2 吗?
我要提取的记录是 {memberitem}。有没有办法让它将 {memberitem}、{memberitem1} 和 {memberitem2} 拉入不同的列?
首先 - 我看到将 2 个成员项目组合在一行中的唯一方法是对字段进行分组,即 - 创建摘要搜索。
如果您需要将此搜索用作高级 PDF 模板的基础,唯一的方法是编写脚本(因为高级 PDF/HTML 模板中不允许摘要搜索)。
我在这里为您创建了一个 suitelet 脚本,用于执行此 PDF 生成。当然我的代码里面有 xml,但是你可以从文件柜中加载预先保存的 XML 文件。此外,您可以创建保存的搜索并将其加载到脚本中。请记住,ITEM 级别的所有字段都应具有摘要类型 "GROUP"
/**
* @NApiVersion 2.x
* @NScriptType Suitelet
* @NModuleScope SameAccount
*/
define(['N/render','N/search'],
function(render, search) {
function onRequest(context) {
var kititemSearchObj = search.create({
type: "kititem",
filters: [
["type","anyof","Kit"]
],
columns: [
search.createColumn({
name: "itemid",
summary: "GROUP"
}),
search.createColumn({
name: "displayname",
summary: "GROUP"
}),
search.createColumn({
name: "salesdescription",
summary: "GROUP"
}),
search.createColumn({
name: "baseprice",
summary: "GROUP"
}),
search.createColumn({
name: "formulatext",
summary: "MAX",
formula: "CASE WHEN {memberline}=1 THEN {memberitem} ELSE null END"
}),
search.createColumn({
name: "formulatext",
summary: "MAX",
formula: "CASE WHEN {memberline}=2 THEN {memberitem} ELSE null END"
})
]
});
var myCustomObject = {
KitItems : []
};
kititemSearchObj.run().each(function(r){
var aRow = {
linenum : myCustomObject.KitItems.length + 1,
itemid : r.getValue({
name: "itemid",
summary: "GROUP"
}),
displayname : r.getValue({
name: "displayname",
summary: "GROUP"
}),
salesdescription : r.getValue({
name: "salesdescription",
summary: "GROUP"
}),
baseprice : r.getValue({
name: "baseprice",
summary: "GROUP"
}),
memberitem1 : r.getValue({
name: "formulatext",
summary: "MAX",
}),
memberitem2 : r.getValue({
name: "formulatext_1",
summary: "MAX",
})
};
myCustomObject.KitItems.push(aRow);
return true;
});
var renderer = render.create();
var xmlStr =
'<?xml version="1.0"?>\n'+
'<!DOCTYPE pdf PUBLIC "-//big.faceless.org//report" "report-1.1.dtd">\n' +
'<pdf>\n<body size="A4">\n'+
'<#if results.KitItems?has_content>'+
'<table><!-- start rows --><#list results.KitItems as line>'+
' <tr><td>${line.linenum}</td>'+
' <td>${line.itemid}</td>'+
' <td>${line.displayname}</td>'+
' <td>${line.salesdescription}</td>'+
' <td>${line.baseprice}</td>'+
' <td>${line.memberitem1}</td>'+
' <td>${line.memberitem2}</td>'+
' </tr>'+
' </#list>'+
'</table>'+
'</#if>'+
'</body>\n</pdf>';
renderer.templateContent = xmlStr;
renderer.addCustomDataSource({
format: render.DataSource.OBJECT,
alias: "results",
data: myCustomObject
});
var pdfResult = renderer.renderAsPdf();
pdfResult.name = 'kitItems.pdf';
context.response.writeFile({
file: pdfResult,
isInline : true
});
}
return {
onRequest: onRequest
};
});
我正在使用具有多个行项目的 Kit/Package(项目)记录处理 NetSuite 保存的搜索。例如,每个 Kit/Package 由两个商品 SKU 组成。
目前,我的“已保存搜索”正在将每个商品 SKU 拉入其各自的行中。如何将每个 Kit/Package 保持在一行,并将不同的 Item SKU 拉入它们自己的列?我可以创建一个总是包含商品 SKU #1 的列,而另一个列总是包含商品 SKU #2 吗?
我要提取的记录是 {memberitem}。有没有办法让它将 {memberitem}、{memberitem1} 和 {memberitem2} 拉入不同的列?
首先 - 我看到将 2 个成员项目组合在一行中的唯一方法是对字段进行分组,即 - 创建摘要搜索。
如果您需要将此搜索用作高级 PDF 模板的基础,唯一的方法是编写脚本(因为高级 PDF/HTML 模板中不允许摘要搜索)。
我在这里为您创建了一个 suitelet 脚本,用于执行此 PDF 生成。当然我的代码里面有 xml,但是你可以从文件柜中加载预先保存的 XML 文件。此外,您可以创建保存的搜索并将其加载到脚本中。请记住,ITEM 级别的所有字段都应具有摘要类型 "GROUP"
/**
* @NApiVersion 2.x
* @NScriptType Suitelet
* @NModuleScope SameAccount
*/
define(['N/render','N/search'],
function(render, search) {
function onRequest(context) {
var kititemSearchObj = search.create({
type: "kititem",
filters: [
["type","anyof","Kit"]
],
columns: [
search.createColumn({
name: "itemid",
summary: "GROUP"
}),
search.createColumn({
name: "displayname",
summary: "GROUP"
}),
search.createColumn({
name: "salesdescription",
summary: "GROUP"
}),
search.createColumn({
name: "baseprice",
summary: "GROUP"
}),
search.createColumn({
name: "formulatext",
summary: "MAX",
formula: "CASE WHEN {memberline}=1 THEN {memberitem} ELSE null END"
}),
search.createColumn({
name: "formulatext",
summary: "MAX",
formula: "CASE WHEN {memberline}=2 THEN {memberitem} ELSE null END"
})
]
});
var myCustomObject = {
KitItems : []
};
kititemSearchObj.run().each(function(r){
var aRow = {
linenum : myCustomObject.KitItems.length + 1,
itemid : r.getValue({
name: "itemid",
summary: "GROUP"
}),
displayname : r.getValue({
name: "displayname",
summary: "GROUP"
}),
salesdescription : r.getValue({
name: "salesdescription",
summary: "GROUP"
}),
baseprice : r.getValue({
name: "baseprice",
summary: "GROUP"
}),
memberitem1 : r.getValue({
name: "formulatext",
summary: "MAX",
}),
memberitem2 : r.getValue({
name: "formulatext_1",
summary: "MAX",
})
};
myCustomObject.KitItems.push(aRow);
return true;
});
var renderer = render.create();
var xmlStr =
'<?xml version="1.0"?>\n'+
'<!DOCTYPE pdf PUBLIC "-//big.faceless.org//report" "report-1.1.dtd">\n' +
'<pdf>\n<body size="A4">\n'+
'<#if results.KitItems?has_content>'+
'<table><!-- start rows --><#list results.KitItems as line>'+
' <tr><td>${line.linenum}</td>'+
' <td>${line.itemid}</td>'+
' <td>${line.displayname}</td>'+
' <td>${line.salesdescription}</td>'+
' <td>${line.baseprice}</td>'+
' <td>${line.memberitem1}</td>'+
' <td>${line.memberitem2}</td>'+
' </tr>'+
' </#list>'+
'</table>'+
'</#if>'+
'</body>\n</pdf>';
renderer.templateContent = xmlStr;
renderer.addCustomDataSource({
format: render.DataSource.OBJECT,
alias: "results",
data: myCustomObject
});
var pdfResult = renderer.renderAsPdf();
pdfResult.name = 'kitItems.pdf';
context.response.writeFile({
file: pdfResult,
isInline : true
});
}
return {
onRequest: onRequest
};
});