NetSuite GPT的辅助编程实践

news2024/11/24 20:56:17

 作为GPT综合症的一种表现,我们今朝来探究下GPT会不会抢了我们SuiteScript的编程饭碗,以及如何与之相处。以下内容来自我个人的实践总结。

我们假设一个功能场景:

为了让用户能够在报价单上实现“一键多行”功能,也就是在报价中可以通过“一键多行”按钮,一次添加多行。其中数据源来自一个自定义记录,我们把它称为“数据模板”。通过用户自己维护数据源,在报价时可以把数据源中的记录,通过点个按钮,一次性的导入当前的行上去。在报价单上放个超链接,可以打开那个数据模板。

设想中的界面如下所示:

结合chatGPT,就是OpenAI的3.5版本,我们开始了GPT辅助编程的实践。

Prompt & chatGPT

Prompt:
使用NetSuite suitescript Client脚本,搜索一个自定义记录中匹配的Item数据,将结果插入当前的estimate的行中。请给出具体代码。


chatGPT:

以下是一个示例代码,用于搜索一个自定义记录中匹配的Item数据,并将结果插入当前的estimate的行中:

```javascript
/**
 * @NApiVersion 2.x
 * @NScriptType ClientScript
 * @NModuleScope SameAccount
 */

define(['N/search', 'N/record'], function (search, record) {
  
  function addCustomRecordItemsToEstimate() {
    
    // 获取当前estimate的ID
    var estimateId = record.getCurrentRecord().id;
    
    // 定义自定义记录的ID
    var customRecordId = 123;
    
    // 创建一个查询自定义记录的搜索
    var customRecordSearch = search.create({
      type: 'customrecord_' + customRecordId,
      filters: [
        ['isinactive', 'is', 'F']
      ],
      columns: [
        'name',
        'custrecord_item',
        'custrecord_quantity'
      ]
    });
    
    // 运行搜索并处理结果
    customRecordSearch.run().each(function (result) {
      
      // 获取自定义记录中的Item和Quantity字段
      var item = result.getValue('custrecord_item');
      var quantity = result.getValue('custrecord_quantity');
      
      // 创建一个新的estimate行
      var line = record.getCurrentRecord().selectNewLine({
        sublistId: 'item'
      });
      
      // 设置行上的Item和Quantity字段
      record.getCurrentRecord().setCurrentSublistValue({
        sublistId: 'item',
        fieldId: 'item',
        value: item
      });
      
      record.getCurrentRecord().setCurrentSublistValue({
        sublistId: 'item',
        fieldId: 'quantity',
        value: quantity
      });
      
      // 保存新行并继续处理下一个结果
      record.getCurrentRecord().commitLine({
        sublistId: 'item'
      });
      
      return true;
    });
  }
  
  return {
    pageInit: function (context) {
      addCustomRecordItemsToEstimate();
    }
  };
});
```

Prompt:
NetSuite Userevent Script,在estimate的Item list的位置添加一个Button,名字叫做“一键导入”。当用户点击时,执行前面所说的Client Script。请给出详细代码。

chatGPT:

下面是一个可能的NetSuite UserEvent Script:

```javascript
/**
 * @NApiVersion 2.x
 * @NScriptType UserEventScript
 * @NModuleScope SameAccount
 */
define(['N/ui/serverWidget', 'N/url'], function (serverWidget, url) {

  function beforeLoad(context) {
    if (context.type === context.UserEventType.VIEW) {
      var form = context.form;
      var sublist = form.getSublist({ id: 'item' });
      sublist.addButton({
        id: 'custpage_import_button',
        label: '一键导入',
        functionName: 'addCustomRecordItemsToEstimate'
      });
      var scriptUrl = url.resolveScript({
        scriptId: 'customscript_my_client_script',
        deploymentId: 'customdeploy_my_client_script',
        returnExternalUrl: false
      });
      form.clientScriptModulePath = scriptUrl;
    }
  }

  return {
    beforeLoad: beforeLoad
  };

});
```

这个UserEvent Script会在estimate页面加载前执行,将一个名为“一键导入”的按钮添加到Item sublist中。当用户点击这个按钮时,会执行名为“importEstimateItems”的客户端脚本。同时,这个UserEvent Script也会将客户端脚本的URL添加到estimate表单中,以便客户端脚本能够被正确加载和执行。

Prompt:
NetSuite Userevent Script,请刚才的Button旁边,添加一个超链接。这个链接可以打开某个自定义记录的界面。

chatGPT:


下面是一个可能的NetSuite UserEvent Script:

```javascript
/**
 * @NApiVersion 2.x
 * @NScriptType UserEventScript
 * @NModuleScope SameAccount
 */
define(['N/ui/serverWidget', 'N/url'], function (serverWidget, url) {

  function beforeLoad(context) {
    if (context.type === context.UserEventType.VIEW) {
      var form = context.form;
      var sublist = form.getSublist({ id: 'item' });
      sublist.addButton({
        id: 'custpage_import_button',
        label: '一键导入',
        functionName: 'importEstimateItems'
      });
      // 添加自定义记录链接
      var linkUrl = url.resolveRecord({
        recordType: 'customrecord_my_custom_record',
        isEditMode: true
      });
      var link = '<a href=\ + linkUrl + '\打开自定义记录</a>';
      sublist.addField({
        id: 'custpage_custom_record_link',
        label: '自定义记录',
        type: serverWidget.FieldType.INLINEHTML
      }).defaultValue = link;
      // 添加客户端脚本链接
      var scriptUrl = url.resolveScript({
        scriptId: 'customscript_my_client_script',
        deploymentId: 'customdeploy_my_client_script',
        returnExternalUrl: false
      });
      form.clientScriptModulePath = scriptUrl;
    }
  }

  return {
    beforeLoad: beforeLoad
  };

});
```

这个UserEvent Script会在estimate页面加载前执行,将一个名为“一键导入”的按钮添加到Item sublist中,并在这个按钮旁边添加一个超链接,用于打开自定义记录的界面。注意,这里的自定义记录类型为`customrecord_my_custom_record`,应该替换为实际的自定义记录类型。

同时,这个UserEvent Script也会将客户端脚本的URL添加到estimate表单中,以便客户端脚本能够被正确加载和执行。

请注意,这个UserEvent Script中的代码与之前的回答中的代码是相同的,只是添加了一个新的字段来显示自定义记录链接。

分析与心得

代码问题:

  • 我的意图是进行增加行,但是chatGPT给出context.UserEventType.VIEW的代码建议。
  • chatGPT把Record和CurrentRecord两个类搞错了,导致了类方法调用失败。
  • 在Client Script中未建立Page Init函数。
  • 在Item Tab中添加serverWidget.FieldType.INLINEHTML的建议失败,系统不允许。
  • 在一直无法正确的添加多行的情况下,chatGPT给出了提示了两个重要提示:一是有可能是因为必填字段没有赋值导致的,二是通过网页调试工具来检查错误来源。这最终帮助了我们发现了错误来源。

心得:

  • 代码建议出现错误的概率很高,需要有代码经验的人才能驾驭。
  • 代码建议的框架是完整的,特别在注释习惯上好过人工。在解决了关键问题的错误后,能够帮助提升效率。
  • 虽然NetSuite用户手册给出了代码Samples,但是chatGPT并没有采用之 。如果能将chatGPT作为问答入口,将NetSuite的Sample Codes作为知识库,则较好。
  • chatGPT在解决JS相关的通用语法的问答上准确度高。例如,“netsuite脚本中,如何表示在本级目录?”
  • 不同的Prompt,会带来回答的差异。所以应该从Prompt Engineering的角度来做问题优化。
  • 采用chatGPT来实现功能的骨干,然后人工去概念性错误,细节调整。这是有效的配合模式。
  • 在ERP顾问领域,可以有效赋能独立实施顾问和甲方系统管理员,来实现轻量级开发。这将深刻的改变这两类人的工作状态。让顾问更加专注在业务流程的创新上,方便的进行概念验证。
  • 由于涉及SuiteScript的代码,有概念性错误,可以判断chatGPT在SuiteScript上的语料库还不是很充沛,训练不足。如果能够建立私有化的GPT,用NetSuite的专用脚本数据去训练,应该可以有很大改善。

结合GPT的代码模式

基于上述的实践,我们初步总结出如下的最佳实践:

•充分熟悉NetSuite的SuiteScript Samples
•Prompt代码意图,获得GPT建议的代码框架
•甄别其中错误,进行在线调试
•针对API语法问题检查NetSuite Script手册
•针对通用Coding问题,Prompt GPT寻求分析和解决方案
•完成的代码可以Prompt给GPT,让其返回注释

以上是我们结合GPT进行NetSuite代码的实践。基本结论是还是得有编程基础以及NetSuite SuiteScript的底子,否则效率无法提升。NetSuite开发的小伙伴可以暂时松一口气了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/429810.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【精华】AIGC之文生视频及实践应用

AIGC之文生视频及实践应用 &#xff08;一&#xff09;序言 从 Stable Diffusion 到 Midjourney&#xff0c;再到 DALLE-2&#xff0c;文生图模型已经变得非常流行&#xff0c;并被更广泛的受众使用。随着对多模态模型的不断拓展以及生成式 AI 的研究&#xff0c;业内近期的工…

78-Linux_tcp服务器客户端编程流程

tcp服务器客户端编程流程一.c/s模型1.什么是c/s模型?2.c/s模型的逻辑二.TCP服务器端和TCP客户端的工作流程1.流程2.TCP三次握手3.TCP四次挥手一.c/s模型 1.什么是c/s模型? 答:(c/s)模型即(客户端/服务器端)模型 所有的客户都通过服务器端访问所需资源. 模型如图所示: 2.c…

Python样条插值和坐标映射

文章目录样条插值基本原理scipy实现坐标映射样条插值基本原理 由于数组本身是格点化了的&#xff0c;所以对数组的旋转、平移和缩放&#xff0c;并不像实数空间中那么简单。以一维的平移为例&#xff0c;现有三个点&#xff0c;坐标为0,1,2&#xff0c;值对应为a,b,c&#xff…

小黑子—多媒体技术与运用基础知识二:数字音频处理技术

多媒体技术与运用2.0多媒体系列第二章1. 音频处理概述1.1 什么是声音1.2 声音的基本参数1.3 人的听觉特性1.4 音频信号处理过程2.音频的数字化2.1 音频的采样2.2 音频的量化2.3 声道数2.3 音频的编码与压缩2.4 数字音频的质量3.音频文件格式及标准3.1 波形文件格式3.2 MPEG音频…

打造高效Android应用,从Hilt注入框架开始

概述 在 Android 开发中&#xff0c;注入解耦是一种设计模式&#xff0c;用于解决代码耦合的问题。通过使用注入技术&#xff0c;可以将应用程序中的不同部分解耦&#xff0c;从而使得代码更加灵活、易于维护和升级。 在 Android 中&#xff0c;注入解耦通常使用依赖注入&…

R -- 如何处理缺失数据

brief 识别缺失值 当传入向量&#xff0c;返回的是包含逻辑向量的等长向量。complete.cases()用来识别矩阵或者数据框有没有包含缺失值的行&#xff0c;若整行数据完整则返回TRUE&#xff0c;若行数据包含缺失值&#xff0c;不管几个缺失值则返回FALSE。 探索缺失值模式 列表图…

高速存储器

由于CPU和主存储器之间的速度上的不匹配限制了计算机系统的工作速度&#xff0c;为了提高CPU和主存之间的数据传输率&#xff0c;可以采用并行技术的存储器&#xff1a; 双端口存储器多模块交叉存储器 双端口存储器 同一个存储器具有两组相互独立的读写控制线路&#xff0c;…

Direct3D 12——灯光——聚光灯光

一个与聚光灯光源&#xff08;spotlight&#xff09;相近的现实实例是手电筒。从本质上来说&#xff0c;聚光灯由位置Q向方向d 照射出范围呈圆锥体的光。 一个聚光灯以位置Q向方向d发射出半顶角为Φmax 的圆锥体范围的光 其中&#xff0c;P为被照点的位置&#xff0c;Q是聚光…

基于html+css的盒子展示8

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

一文4000字使用JavaScript+Selenium玩转Web应用自动化测试

自动化测试 在软件开发过程中, 测试是功能验收的必要过程, 这个过程往往有测试人员参与, 提前编写测试用例, 然后再手动对测试用例进行测试, 测试用例都通过之后则可以认为该功能通过验收. 但是软件中多个功能之间往往存在关联或依赖关系, 某一个功能的新增或修改可能或影响到…

手把手教你搭建ROS阿克曼转向小车之(霍尔编码器数据读取与速度计算)

上一篇文章已经介绍了如何驱动直流有刷电机转动起来&#xff0c;这篇文章讲解如何获取编码器的计数值&#xff0c;并且计算出速度信息。在实际的运行中&#xff0c;随着机器的重量不一样&#xff0c;电机受到的阻力就会不一样&#xff0c;给定同样的PWM在不同载重的情况下速度会…

Alien Skin ExposureX8最新ps中文版调色滤镜插件

Exposure是用于创意照片编辑的最佳图像编辑器。Exposure结合了专业级照片调整&#xff0c;庞大的华丽照片外观库以及高效的设计&#xff0c;使其使用起来很愉悦。新的自动调整功能可简化您的工作流程&#xff0c;并使您进入创意区。 Alien Skin Exposure 拥有超过500种预设效果…

基于线性支持向量机的词嵌入文本分类torch案例

一、前言 简介线性支持向量机,并使用线性支持向量机实现文本分类, 输入文本通过词嵌入方法转换成浮点张量,给出torch案例 线性支持向量机&#xff08;Linear Support Vector Machine&#xff0c;简称Linear SVM&#xff09;是一种常用的分类算法&#xff0c;它通过一个超平面来…

TiDB实战篇-TiDB Cluster部署

简介 部署TiDB Cluster部署&#xff0c;熟系集群的基础操作。 集群规划 机器拓扑 3pd,3tikv,1tidb_server.1tiflash,监控。 192.168.66.10192.168.66.20192.168.66.21 pd_servers tikv_servers tidb_servers tiflash_servers pd_servers tikv_servers monitoring_servers…

MySQL中使用IN()查询到底走不走索引?

MySQL中使用IN&#xff08;&#xff09;查询到底走不走索引&#xff1f; 看数据量 EXPLAIN SELECT * from users WHERE is_doctor in (0,1); 很明显没走索引&#xff0c;下面再看一个sql。 EXPLAIN SELECT * from users WHERE is_doctor in (2,1);又走索引了&#xff0c;所以…

Yolov5一些知识

1 Yolov5四种网络模型 Yolov5官方代码中&#xff0c;给出的目标检测网络中一共有4个版本&#xff0c;分别是Yolov5s、Yolov5m、Yolov5l、Yolov5x四个模型。 1.1Yolov5网络结构图 eg:Yolov5s 2.1 Yolov3&Yolov4网络结构图 2.1.1 Yolov3网络结构图 Yolov3的网络结构是…

Matlab论文插图绘制模板第86期—带置信区间的折线图

在之前的文章中&#xff0c;分享了很多Matlab折线图的绘制模板&#xff1a; 进一步&#xff0c;分享一种特殊的折线图&#xff1a;带置信区间的折线图。 先来看一下成品效果&#xff1a; 特别提示&#xff1a;本期内容『数据代码』已上传资源群中&#xff0c;加群的朋友请自行…

【C++技能树】快速文本匹配 --正则表达式介绍与C++正则表达式使用

Halo&#xff0c;这里是Ppeua。平时主要更新C语言&#xff0c;C&#xff0c;数据结构算法…感兴趣就关注我吧&#xff01;你定不会失望。 0.正则表达式存在必要性 在日常生活,或者刷题过程中我们难免需要检测一段字符是否需要是否符合规定,或在一大段字符中寻找自己想要的信息…

Mysql 数据库介绍

数据库介绍 数据库&#xff08;Database&#xff09;是按照数据结构来组织、存储和管理数据的仓库&#xff0c;每个数据库都有一个或多个不同的API接口用于创建&#xff0c;访问&#xff0c;管理&#xff0c;搜索和复制所保存的数据。 我们也可以将数据存储在文件中&#xff0…

支持m2的主板换m2硬盘无法识别的问题,主板:七彩虹H410-T

记录一下我的电脑换m2硬盘遇到无法读取的问题&#xff0c;也给有同样问题的人留个参考&#xff0c;特别是七彩虹主板 主板&#xff1a;七彩虹H410-T 遇到的问题&#xff1a; m2 硬盘插上主板后&#xff0c;开机无法识别&#xff0c;打开我的电脑没有相应的盘&#xff0c;设备…