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

devtools/2025/1/18 2:17:33/

在 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.ppmy.cn/devtools/151432.html

相关文章

第三章:HTML的字符实体,meta标签以及全局属性

目录 一、字符实体 二、meta元信息 三、全局属性 四、总结 一、字符实体 在 HTML 中&#xff0c;某些字符是预留的&#xff0c;不能直接使用。例如&#xff0c;小于号&#xff08;<&#xff09;和大于号&#xff08;>&#xff09;会被浏览器误认为是标签&#xff0c…

数据库(MySQL)练习

数据库&#xff08;MySQL&#xff09;练习 一、练习1.15练习1.16练习 二、注意事项2.1 第四天 一、练习 1.15练习 win11安装配置MySQL超详细教程: https://baijiahao.baidu.com/s?id1786910666566008458&wfrspider&forpc 准备工作&#xff1a; mysql -uroot -p #以…

Android 播放SMB共享视频

表面上看MediaPlayer只能播放本地和http协议视频。没有直接支持smb://协议。那还能播放smb视频呢&#xff1f;也可以的&#xff01; MediaPlayer有一个方法叫&#xff1a;setDataSource(MediaDataSource)。 /*** Sets the data source (MediaDataSource) to use.** param data…

Vue3 Element-Plus el-tree 右键菜单组件

参考代码&#xff1a;实现Vue3Element-Plus(tree、table)右键菜单组件 这篇文章的代码确实能用&#xff0c;但是存在错误&#xff0c;修正后的代码&#xff1a; <template><div style"text-align: right"><el-icon size"12" color"#…

网络学习记录5

二、学习网络知识&#xff1a; 1、透传&#xff1a; ①“透传”指的是数据在传输过程中不被交换机或其他网络设备解析、修改或处理&#xff0c;而是直接从一个端口传输到另一个端口。这种传输方式保持了数据的原始性和完整性&#xff0c;常用于需要高速、低延迟的数据传输场景…

golang 在线词典

前言 输入一个英语单词&#xff0c;返回它的发音&#xff0c;解释&#xff0c;同义词&#xff0c;反义词&#xff0c;以及例子 使用的是免费翻译网站&#xff0c;彩云小译 注意&#xff0c;彩云小译更新&#xff0c;博主并没有找到dict响应&#xff0c;但是写这个却能调用 步骤…

Kibana:ES|QL 编辑器简介

作者&#xff1a;来自 Elastic drewdaemon ES|QL 很重要 &#x1f4aa; 正如你可能已经听说的那样&#xff0c;ES|QL 是 Elastic 的新查询语言。我们对 ES|QL 寄予厚望。它已经很出色了&#xff0c;但随着时间的推移&#xff0c;它将成为与 Elasticsearch 中的数据交互的最强大…

RabbitMQ-消息消费确认

我们一般使用的是消费者作为被动方接收 RabbitMQ 推送消息&#xff0c;另一种是消费者作为主动方可以主动拉取消息。 RabbitMq 服务器推送消息分为隐式(自动)确认和显示确认。 1 消费者拉取消息 消费者作为主动方拉取消息&#xff0c;每次只能获取一条。 using (var channel c…