当前位置: 首页 > article >正文

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.kler.cn/a/506229.html

相关文章:

  • SparkSQL数据模型综合实践
  • 内存与缓存:保姆级图文详解
  • go chan底层分析
  • HarmonyOS Next 实现登录注册页面(ARKTS) 并使用Springboot作为后端提供接口
  • 玩转随机数:用 JavaScript 掌控不可预测的魔力!
  • SpringMVC——原理简介
  • 前端主流Web3D引擎详解大公司现Web3D业务所用引擎分析
  • UDP报文格式
  • 32单片机综合应用案例——基于GPS的车辆追踪器(三)(内附详细代码讲解!!!)
  • 【网络安全】FortiOS Authentication bypass in Node.js websocket module
  • Gtk-WARNING **: 18:50:42.615: cannot open display:
  • 多态(3)
  • Web3与加密技术的结合:增强个人隐私保护的未来趋势
  • C# 特性(Attributes)详解
  • paimon使用腾讯云cosn作为仓库存储的使用方式
  • C语言的数据库交互
  • SQL-leetcode—619. 只出现一次的最大数字
  • 《Keras 3 在 TPU 上的肺炎分类》
  • 无人机天文导航与卫星导航相结合方面,研究创新点与课题推荐
  • 网络安全 | 什么是CC攻击防护?
  • Redis 中 TTL 的基本知识与禁用缓存键的实现策略(Java)
  • MR30分布式IO:贴标机产线的高效扩展与控制新纪元
  • Maven依赖管理项目构建工具
  • Linux安装Docker教程(详解)
  • 设计模式03:行为型设计模式之策略模式的使用情景及其基础Demo
  • 算法库里的heap算法,仿函数和模版进阶(续)