salesforce在opportunity的opportunity products页面增加一个按钮,可以批量删除products

在 Salesforce 中,如果想在「Opportunity > Opportunity Products」列表页面上增加一个“批量删除产品”的按钮,并实现勾选多条产品后统一删除,大体可以考虑以下几种实现思路。由于环境和版本(Classic / Lightning)不同,具体操作也略有差异,下面分别做介绍。


一、在 Lightning 环境中实现

1. 使用 Flow + 自定义按钮/自定义操作(推荐做法)

  1. 创建 Flow(屏幕流 Screen Flow)

    • 在 Flow 中先添加一个“获取记录”(Get Records)元素,用于获取 Opportunity Product(即 OpportunityLineItem)的数据。
    • 在界面上提供一个可供多选的列表控件(可以使用 Data Table 或者 Checkbox 的方式),让用户勾选需要删除的 Opportunity Products。
    • 用户确认后,调用“删除记录”(Delete Records)元素删除选中的记录。
  2. 创建自定义按钮/操作(Action)

    • 在「对象管理 > Opportunity > Buttons, Links, and Actions」中,点击“New Action”或“New Button or Link”。
    • 如果使用的是 Lightning Action,则可以选择调用刚才创建好的 Flow(Screen Flow)。
    • 将此按钮/操作添加到页面布局(Page Layout)或 Lightning Record Page 中,让用户能够在 Opportunity 的页面上点击打开。
  3. 效果

    • 用户在 Opportunity Record Page 里点击该自定义操作(或按钮),弹出 Flow 屏幕,看到与该 Opportunity 相关的所有 Products 列表,勾选需要删除的产品,确认后执行删除。
注意要点
  • Flow 中最好先做一下权限或错误处理,比如如果没有选择任何产品,也要提示用户。
  • 如果列表数据量非常大,使用可分页的方式或者限制查询的数量也是值得考虑的。

2. 使用 LWC / Aura Component + 自定义按钮

如果需求更复杂,或对交互有更高要求,可以创建一个自定义 Lightning Web Component (LWC) 或 Aura Component,放到 Opportunity Record Page 上,具体步骤如下:

  1. 创建 LWC / Aura Component

    • 在组件中编写逻辑,从后台(Apex Controller)查询当前 Opportunity 的所有 OpportunityLineItem。
    • 在前端显示一个可多选的列表供用户勾选。
    • 提供一个“Delete”按钮来执行批量删除的 Apex 方法。
  2. Apex Controller

    • 创建一个带 @AuraEnabled 的 Apex 方法,接收要删除的 OpportunityLineItem Id 列表。
    • 在方法中执行 delete 语句或 Database.delete() 方法,完成删除操作,并处理可能的异常。
  3. 页面布局

    • 将该自定义组件添加到 Lightning Record Page 的相关位置(例如使用 App Builder)中。
  4. 效果

    • 用户可以在组件中多选 Opportunity Products,然后点击“Delete”按钮,实现批量删除。

二、在 Classic 环境中实现

如果仍在使用 Salesforce Classic,可以使用自定义列表按钮和 JavaScript 的方式来实现批量删除。需要注意,官方已不再推荐使用 JavaScript 按钮,但在 Classic 中依然是常见方案。

1. 创建自定义列表按钮(Custom List Button)

  1. 进入「对象管理 > Opportunity > Buttons, Links, and Actions」

    • 点击“New Button or Link”。
  2. 按钮类型

    • 在“Display Type”选择“List Button”。
    • 在“Behavior”中选择“Display in existing window without sidebar or header”或者“Display in new window”皆可。
    • 在“Content Source”中选择“OnClick JavaScript”。
  3. 编写 OnClick JavaScript 代码

    • 代码功能大致包括:
      1. 获取 Opportunity Product 列表页面中选中的记录(!REQUIRESCRIPT("/soap/ajax/xx/connection.js") 通常用在 Classic 中)。
      2. 若没有选中记录,弹窗提示需要先选择。
      3. 若有选择记录,弹窗确认后调用 sforce.connection.deleteIds() 或调用自定义 Apex Web Service 来删除。

    下面是一段示例 JavaScript(仅供参考,注意需要按实际环境进行调整):

    {!REQUIRESCRIPT("/soap/ajax/36.0/connection.js")}
    {!REQUIRESCRIPT("/soap/ajax/36.0/apex.js")}var records = {!GETRECORDIDS($ObjectType.OpportunityLineItem)};
    if (records.length === 0) {alert("请先勾选需要删除的产品!");
    } else {if (confirm("确定要删除选择的产品吗?")) {// 调用 SFDC AJAX API 直接删除sforce.connection.deleteIds(records);// 刷新页面window.location.reload();}
    }
    
    • 这里的 !GETRECORDIDS() 能够获取在列表中勾选的记录的 Id 列表。
  4. 将此按钮添加到相关的 Related List

    • 打开「对象管理 > Opportunity > Page Layout」,找到“Related List”配置。
    • 在 Opportunity Page Layout 的“Opportunity Product”列表配置中,将刚才创建的 List Button 加进“Custom Buttons”区域。
  5. 效果

    • 在 Opportunity 的「Related List」里,会多出一个自定义按钮。
    • 用户在列表中勾选部分产品,点击按钮后执行 JavaScript 逻辑,即可批量删除。

三、综合对比

  • Lightning Flow 方式

    • 优点:无需写太多代码,配置为主,维护简单,可视化好。
    • 缺点:UI 交互可能不如自定义组件灵活。
  • LWC / Aura Component 方式

    • 优点:UI 体验好,功能灵活,可以配合更多复杂需求。
    • 缺点:需要一定的开发能力(前端 + Apex)。
  • Classic JavaScript List Button 方式

    • 优点:实现简单、快速,可直接在列表上批量操作。
    • 缺点:JavaScript 按钮在 Lightning 中已不再被支持,今后升级可能需要重构。

总之,如果在 Lightning 环境下,最推荐的方式是使用Flow + 自定义按钮(Action),或者若有更丰富的界面需求,可以使用自定义组件 (LWC)。如果还停留在 Classic 环境,则可以使用自定义列表按钮 + JavaScript 的方式来实现批量删除。

根据以上思路设置好按钮后,就能满足在「Opportunity > Opportunity Products」页面,批量勾选并删除多条产品记录的需求了。

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

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

相关文章

卷积神经网络的底层是傅里叶变换

1 卷积神经网络的底层是傅里叶变换,傅里叶变换的底层是希尔伯特空间坐标变换_哔哩哔哩_bilibili 卷积神经网络的底层是傅里叶变换,傅里叶变换的底层是希尔伯特空间坐标变换_哔哩哔哩_bilibili从“卷积”、到“图像卷积操作”、再到“卷积神经网络”&…

攻防世界_SQL注入

inget 尝试万能钥匙。 输入?id1or11# supersqli 1.找注入点 输入框 2.判断字符型,数字型 输入1 and 11 和1 and 12,发现两次提交后页面一样,判断出为字符型注入 3.判断闭合符号 输入1,回显正常 输入1,报错 加上…

idea 如何安装 github copilot

idea 如何安装 github copilot 要在 IntelliJ IDEA 中安装 GitHub Copilot,可以按照以下步骤操作: 打开 IntelliJ IDEA: 启动 IntelliJ IDEA。 打开插件管理器: 点击菜单栏中的 File。 选择 Settings(Windows/Linux)或 Prefere…

怎么把文章发表到网上?在平台上投稿文章会有哪些常见问题?

怎么把文章发表到网上?在发表文章的过程中,我们可能会碰到各种各样的问题。这些问题要么导致发表时间被拖长,要么可能导致文章被拒稿。 就让我们来了解下文章发表过程中需要注意的一些细节,知晓怎么顺利地把文章发表到网上。 一、…

检验统计量与p值笔记

一、背景 以雨量数据为例,当获得一个站点一年的日雨量数据后,我们需要估计该站点的雨量的概率分布情况,因此我们利用有参估计的方式如极大似然法估计得到了假定该随机变量服从某一分布的参数,从而得到该站点的概率密度函数&#x…

【Flink系列】6. Flink中的时间和窗口

6. Flink中的时间和窗口 在批处理统计中,我们可以等待一批数据都到齐后,统一处理。但是在实时处理统计中,我们是来一条就得处理一条,那么我们怎么统计最近一段时间内的数据呢?引入“窗口”。 所谓的“窗口”&#xff…

主链和Layer2之间资产转移

主链和Layer2之间资产转移 主链和Layer2之间资产转移是实现Layer2技术的关键环节,以下是资产转移的流程、流行解决方案及原理: 资产从主链转移到Layer2 用户在主链上发起一笔交易,将资产发送到一个特定的智能合约地址,这个合约是主链与Layer2之间的桥梁。智能合约会锁定用…

mybatis xml sql

1. mybatis根据某一个字段根据以及集合中的列表进行模糊匹配 mapper List<Message> selectByLinkList(Param("userId") String userId, Param("messageName") String messageName, Param("anJinGoodsNameList") List<String> anJi…

C#轻松实现条形码二维码生成及识别

一、前言 大家好&#xff01;我是付工。 今天给大家分享一下&#xff0c;如何基于C#来生成并识别条形码或者二维码。 二、ZXing.Net 实现二维码生成的库有很多&#xff0c;我们这里采用的是http://ZXing.Net。 ZXing是一个开放源码的&#xff0c;用Java实现的多种格式的一…

OpenCV实现Kuwahara滤波

Kuwahara滤波是一种非线性的平滑滤波技术&#xff0c;其基本原理在于通过计算图像模板中邻域内的均值和方差&#xff0c;选择图像灰度值较为均匀的区域的均值来替代模板中心像素的灰度值。以下是Kuwahara滤波的详细原理说明&#xff1a; 一、基本思想 Kuwahara滤波的基本思想…

24-25-1-单片机开卷部分习题和评分标准

依据相关规定试卷必须按评分标准进行批改。 给分一定是宽松的&#xff0c;能给分一定给&#xff0c;如有疑问也可以向学院教务办申请查卷。 一部分学生期末成绩由于紧张或其他原因导致分数过低&#xff0c;也是非常非常遗憾的。 个人也是非常抱歉的。 开卷考试 简答题 第一…

使用opencv.js 的时候报错 Uncaught 1022911432

需求&#xff1a; -如题 进程&#xff1a; 这个报错是opencv 内存溢出了可以在开始的时候分配更多的内存cv.setMemoryManagement(1024 * 1024 * 50)OpenCV.js 中&#xff0c;很多对象&#xff08;如 Mat&#xff09;需要手动释放。如果你频繁创建矩阵或图像对象而不释放&…

Android SystemUI——服务启动流程(二)

在 Andorid 系统源码中,package/apps下放的是系统内置的一些 APP,例如 Settings、Camera、Phone、Message 等等。而在 framework/base/package 下,它们也是系统的 APP,SystemUI 就在此目录下。它控制着整个 Android 系统的界面,但其实他也是一个 APP,不同于一般的 APP,它…

AI学习之自然语言处理(NLP)

自然语言处理&#xff08;Natural Language Processing&#xff0c;NLP&#xff09;是计算机科学、人工智能和语言学领域的交叉学科&#xff0c;旨在让计算机能够理解、处理和生成人类语言。以下为你详细介绍&#xff1a; 自然语言处理的关键技术 词法分析&#xff1a;将文本…

linux之进程信号(初识信号,信号的产生)

目录 引入一、初识信号(信号预备知识)1.生活中的信号2.Linux中的信号3.信号进程得出的初步结论 二、信号的产生1.通过终端输入产生信号拓展: 硬件中断2.调用系统函数向进程发信号3.硬件异常产生信号4.软件条件产生信号拓展: 核心转储技术总结一下&#xff1a; 引入 一、初识信…

【工具类】获取日出日落时间的Java工具类

博主介绍&#xff1a;✌全网粉丝22W&#xff0c;CSDN博客专家、Java领域优质创作者&#xff0c;掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围&#xff1a;SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…

Open FPV VTX开源之betaflight配置

Open FPV VTX开源之betaflight配置 1. 源由2. 配置3. 总结4. 参考资料5. 补充 - 飞控固件版本 1. 源由 飞控嵌入式OSD - ardupilot配置使用betaflight配套OSD图片。 Choose correct font depending on Flight Controller SW. ──> /usr/share/fonts/├──> font_btfl…

(双系统)Ubuntu+Windows解决grub引导问题和启动黑屏问题

Introduction ‍ 解决双系统的 Windows 的启动项失踪和grub正常的情况下启动 Windows 系统出现黑屏的问题。 ‍ Note: ‍ 我的系统是 Ubuntu 24.04 LTS desktop​&#xff0c;安装了双系统&#xff08;先安装 Win &#xff0c;再安装 Ubuntu&#xff09; ‍ 文章目录 In…

Python从0到100(八十三):神经网络-使用残差网络RESNET识别手写数字

前言: 零基础学Python:Python从0到100最新最全教程。 想做这件事情很久了,这次我更新了自己所写过的所有博客,汇集成了Python从0到100,共一百节课,帮助大家一个月时间里从零基础到学习Python基础语法、Python爬虫、Web开发、 计算机视觉、机器学习、神经网络以及人工智能…

docker安装和测试redis步骤

docker安装和测试redis步骤 一、官方推荐安装方式&#xff1a; 1、执行 docker pull redis:4.0.1 命令&#xff0c;下载 redis 镜像&#xff0c;如下所示&#xff1a; 2、执行命令&#xff0c;创建并启动redis容器 docker run - -rm -d - -name redis6379 -p 6379:6379 r…