Javascript Netsuite自定义Netsuite事务摘要

Javascript Netsuite自定义Netsuite事务摘要,javascript,netsuite,Javascript,Netsuite,我试图弄清楚如何更改销售订单UI上的交易摘要。 我一直在做一些研究,我得到的印象是我需要创建一个用户事件脚本 例如:我想添加更多细节,如加价/运费/等 我对这个很陌生,但请告诉我我的方向是否正确 /** *@NApiVersion 2.0 *@NScriptType UserEventScript */ 定义[],函数{ 返回{ 后提交:函数上下文{ var salesorder=context.newRecord; var total=salesorder.getValue'total';

我试图弄清楚如何更改销售订单UI上的交易摘要。 我一直在做一些研究,我得到的印象是我需要创建一个用户事件脚本

例如:我想添加更多细节,如加价/运费/等

我对这个很陌生,但请告诉我我的方向是否正确

/** *@NApiVersion 2.0 *@NScriptType UserEventScript */ 定义[],函数{ 返回{ 后提交:函数上下文{ var salesorder=context.newRecord; var total=salesorder.getValue'total'; var小计=salesorder.getValue“小计”; var tbl=document.getElementByIDTotalingTable; log.debug'total',total; 调试“小计”,小计; } };
}; NetSuite不支持通过DOM访问本机UI。你可以在客户端这样做,但这绝对会打破记录。因此,我建议:

在销售订单记录上创建一个HTML字段,并编写HTML/CSS以模拟交易摘要框。最好将其放在自己的子选项卡中;类似于事务细节,并在pageInit上使用客户端脚本写入

在加载前用户事件上向销售订单记录添加按钮。让该按钮打开一个Suitelet,该Suitelet基本上模仿HTML/CSS弹出窗口,以模仿示例1中所述的事务摘要

仔细想想,我认为第二种选择更好

如果你需要更多的帮助,请回复,我很乐意为你提供帮助。我一步一步地完成代码没有问题,即使是很小的步骤

编辑: 根据下面的对话,第二种选择似乎更适合您的业务需求

在我们深入研究之前,我做了一些研究,相信你也在尝试做类似的事情。这种方法可能非常有效,但我不会这样做,引用NetSuite帮助文档中的以下摘录:

SuiteScript不支持通过文档对象模型DOM直接访问NetSuite UI。您只能使用SuiteScript API访问NetSuite UI

NetSuite帮助文档:SuiteScript 2.0自定义页面

此外,我在这篇文章中添加了一些关于整个事情的注释。我会在这里说一次,最后提醒你一次。但请记住,它适用于任何地方

首先,如果你不明白什么,不要犹豫问问题。唯一愚蠢的问题是你在任何时候都不会问的问题,即使这是你第i次问,因为问问题是学习任何东西的基本部分。第二,做出合理的编码决策。我无法知道这个代码是否仍然是您所需要的,特别是因为我不知道您的业务或您的帐户设置。但是,我一定会本着帮助的精神尽我最大的努力去帮助别人

在这个例子中,请按顺序执行以下操作。一旦你掌握了窍门,你就可以根据自己的喜好处理细微差别。我不会在这里讨论任何细微差别。我希望我能,但这有点像解释如何骑自行车。我们走

在SuiteScripts文件夹中创建一个子文件夹,名为Transaction\u Details,确保使用下划线。我们将把所有内容都上传到这里,所有内容都在一个文件夹中,该文件夹位于脚本运行所需的文件夹下,即SuiteScripts文件夹。从管理员角色,即:

文档>文件>SuiteScripts>添加文件夹 创建一个HTML文件,该文件显示在localhost上打开时要查找的内容。将该文件命名为Transaction_Details.html。NetSuite稍后将默认使用此文件名,我们将在示例中多次使用它。所以,不要把文件命名为其他名称。您可能希望在一些浏览器中测试该文件,尤其是在支持Internet Explorer的情况下。因为我们试图模拟事务摘要,所以让我们将其作为我们的目标。对我来说,它看起来像一个带有CSS的表格,让它显得与众不同。事务摘要也是一个原生NetSuite术语,因此我们将其称为事务详细信息。这样,当有人说“我在交易摘要中没有看到它”时,您可以说单击“交易详细信息”按钮,该按钮显示的详细信息多于摘要。我们希望将一些数字传递到这个HTML中,这些数字与我们的详细信息有关。我们实际上不需要语法来做这件事,但是如果我们提醒自己,在这个地方应该放的东西都有某种标记,它可以帮助我们的可读性。因此,我们将任意将其标记为[VARIABLE_TO_REPLACE]。下面是一个示例文件,让您开始学习。当您以自己喜欢的方式拥有该文件时,将其上载到您的Transaction_Details子文件夹。从管理员角色,即:

文档>文件>套件说明>交易详细信息>添加文件 选择Transaction_Details.html f 从您的计算机上rom并将文件夹设置为SuiteScripts:Transaction\u Details 交易详情 总的 [毛额] 折扣 [折扣] 要替换的变量 [变量\u至\u替换] 使用所需的任何信息创建保存的搜索。让我们为保存的搜索事务详细信息命名,并给它一个_Transaction_Details的ID。您可能需要多个已保存的搜索才能获取所有内容。但是,在许多情况下,您可以在一次保存的搜索中获取数据。大多数情况下,这是使用SQL完成的。不幸的是,我不知道你在这里需要什么,所以我不得不把这一步的大部分留给你;这里有很多细微差别。但是,你应该考虑的是使用一个过滤器来过滤只与记录的内部ID相关的结果。这将确保你只在一个记录上搜索信息。在保存的搜索中,您可以从销售订单中选择相关记录的任何内部ID,并且很可能对其进行测试。一旦您的结果符合您的要求,请删除内部ID筛选器,因为我们将在步骤4中的Suitelet中将其作为对象动态推送。最终,您需要提供对已保存搜索的访问权限。通过使用“访问群体”子选项卡和“公共”复选框,可以在保存的搜索本身上控制访问。您将知道哪种访问方式最适合您的业务。但是,请注意,要让任何人看到我们正在构建的交易详细信息,他们至少需要访问搜索。访问权限与NetSuite完全是另一回事;细微差别。要从管理员角色创建保存的搜索,请执行以下操作:

列表>搜索>保存的搜索>新建>事务 警告:这是一大步,但实际上是一步。创建一个Suitelet,加载我们的HTML文件,并将占位符文本替换为该占位符的正确文本。调用此文件Transaction\u Details\u Suitelet.js。我们将通过运行已保存的搜索来替换文本,我们创建了一个内部ID过滤器,该过滤器指向我们的事务并过滤数据,从而更容易提取。现在,我在这里做一个假设,我们需要的数据只有一行结果。如果有多行,这很好,但您必须自己设置格式,或者给我一个结果的屏幕截图,以便我可以再次编辑我的答案。下面是一个让您开始学习的示例。这将需要一些配置,因此最好将至少通过代码检查的内容放入NetSuite中,该检查是在您尝试上载文件时完成的。上传后,您可以从脚本部署打开脚本的URL,如果没有错误,将呈现我们在步骤2中编写的HTML。如果没有,您会感到沮丧,只需上传脚本,如下面的示例1所示。示例1所说的是,在HTML格式正确的情况下呈现我的HTML。如果这样做有效,您就知道Transaction_Details.html很好,所以您可以转到示例2。如果示例2中断,则问题可能出在Transaction\u Details\u Suitelet.js上。要从管理员角色上载Suitelet,请执行以下操作:

自定义>脚本>脚本>新建>从计算机中选择事务\u详细信息\u Suitelet.js 将文件夹设置为SuiteScripts:Transaction\u Details 现在将进行一些错误检查。 如果通过,将其命名为Transaction Details Suitelet,并给它一个ID _Transaction_Details_sl是Suitelet的缩写 单击部署子选项卡,并将部署事务详细信息命名为Suitelet。给它一个_transaction\u details\u sl的id。 因此,脚本及其部署应该在名称上相互模仿。这将是我们下一步的重要内容

例1:

/** *@NScriptType Suitelet *@NApiVersion 2.x */ 定义[N/file],函数文件{ 函数onRequestcontext{ 如果context.request.method===GET{ var fileTransactionDetails=file.load{ id:/SuiteScripts/Transaction\u Details/Transaction\u Details.html }.getContents; //告诉NetSuite获取事务_Details.HTML文件中的HTML并进行呈现。我们将在步骤5中导航到呈现HTML文件的Suitelet。 context.response.writefileTransactionDetails; } } 返回{onRequest:onRequest} } 例2

/** *@NScriptType Suitelet *@NApiVersion 2.x */ 定义[N/file],函数文件{ 函数onRequestcontext{ 如果context.request.method===GET{ var fileTransactionDetails=file.load{ id:/SuiteScripts/Transaction\u Details/Transaction\u Details.html }.getContents; var searchTransactionDetails=search.load{ id:customsearch\u交易\u详细信息 }; searchTransactionDetails.filters.pushsearch.createFilter{ 姓名:internalid, 操作员:search.operator.EQUALTO, 值:context.request.params
.我喜欢你的第二种选择。你之前的回答是不是让piggy放弃了那条路线?嗨@alyssajean!是的,我的第二个选择是从我链接的内容中提取一大笔钱。我的第二个选项中的设计模式在NetSuite中也非常有用。你可以做很多事情。这是一个很大的旁白,也许是一个咆哮,但是你会发现NetSuite的真正好处是承认SuiteScript/JavaScript非常棒,但是你必须超越API和它们提供的很棒的工具来拓展你的视野。基本上,通过一个ODBC连接器和一台云计算机器,或者一些网络,您可以将数据和代码带走。安威,这是我的咆哮。我很快就会联系你的!