如何根据ID遍历多个相关对象并返回一些相关字段?

问题描述 投票:0回答:2

我有点卡住了。

我正在尝试生成一份报告,以确定是否有人对我们的订单框架内的某些字段进行了手动更改。我已经弄清楚了要审计的正确字段和结构,甚至如何制作报告,但我结合使用了数据加载器和 Excel xlookups 的提取来制作报告。现在,我被要求找到一种自动生成报告的方法,我怀疑这意味着我需要编写 SOQL 查询来解决这个问题。我无法根据这些 ID 字段遍历多个关系。本质上,我想做的是根据 18 位 Salesforce ID 进行多个“左连接”,并从其他对象中提取一些相关信息。

例如,如果我从 order_product_history (使用 OrderProductID 字段来标识订单产品)开始,并且我想引入“产品名称”,我必须首先将 OrderProductID 与 order_product “表”中的 ID 字段进行匹配,然后我必须将 order_product“表”中的 Product2ID 字段与产品“表”中的 ID 进行匹配,然后我必须将匹配的产品名称作为报告中的一列:

Matching/Traversal Process

Desired Result

这是一个领域的一个例子。我还必须从用户“表”中引入诸如用户名和订单表中的订单号之类的内容,但是一旦我掌握了总体思路,我想我就可以了。我还想过滤结果以仅包含我的 Fee__c 和 UnitPrice 字段,忽略自动用户并设置日期过滤器 - 不确定是否必须在主查询中使用 WHERE 子句来执行此操作,或者是否必须也过滤子查询。

不是程序员,并且我没有接受过正式的 Salesforce 培训;我只是一名偏向技术的分析师,有点属于 Salesforce 管理员的角色。我熟悉编程概念,并且一直在使用流程应用程序编写东西,甚至尝试过一些 Apex 东西,但这可能有点困难。我并不是要求你为我做我的工作,我愿意解决问题并学习;任何帮助表示赞赏。对链接感到抱歉;所以还不让我嵌入图像。

salesforce apex soql
2个回答
1
投票

您很有可能不需要为其编写任何代码。我会给你一些提示,尝试一下并编辑问题或发布新问题?

此图可能有帮助:https://developer.salesforce.com/docs/atlas.en-us.api.meta/api/sforce_api_erd_products.htm

开发者之路

这一切都是为了编写正确的查询。例如,您可以在开发者控制台或工作台中使用它。阅读 SF 中的关系查询。

https://developer.salesforce.com/docs/atlas.en-us.soql_sosl.meta/soql_sosl/sforce_api_calls_soql_relationships_understanding.htm

https://developer.salesforce.com/docs/atlas.en-us.soql_sosl.meta/soql_sosl/sforce_api_calls_soql_relationships_query_hist.htm

我没有启用订单的组织,但这应该是一个好的开始:

SELECT CreatedById, Created.Name, 
    Parent.Name, Parent.Product2.Name, Parent.Order.Name, 
    Field, OldValue, NewValue, CreatedDate
FROM OrderItemHistory

如果它抛出有关“Parent”的错误,请查看“OrderItem”是否有效。一旦你拥有它 -

WHERE Field IN ('UnitPrice', 'Fee__c') AND CreatedDate = LAST_WEEK
下一步可能会很好。 (日期可以按日期过滤,但也有一些“常量”更易于人类阅读)

您甚至可以使用数据加载器导出此数据,只需在订单产品历史表上启动向导即可。但您可以忽略整个查询创建器并粘贴您创建的查询。

管理方式

您曾经在 Salesforce 中创建过报表吗?有自定进度的培训(针对 Lightning 和 Classic UI)和大量 YouTube 视频。体验一下做少量报告的感觉。

您想要的可能可以通过内置报告类型来实现(查看是否有新报告 - >订购产品历史记录)。如果没有什么令人兴奋的 - 作为管理员,您可以在设置中创建新的报告类型。例如订单 -> 订购产品 -> 订购产品历史记录。来自此处的屏幕截图可能会有所帮助。


1
投票

只是想为将来寻找解决方案的任何人更新此内容。

事实证明,您可以在 SOQL 查询中将它们作为父子关系进行遍历。这是我最终使用的查询:

SELECT CreatedBy.Name, FORMAT(CreatedDate), 
       OrderItem.Order.OrderNumber, OrderItem.Product2.Name, 
       OrderItem.Product2.ProductCode, Field, OldValue, NewValue
FROM OrderItemHistory
WHERE (Field = 'Fee__c' OR UnitPrice) 
      AND (CreatedBy.Name != 'Integration User') 
      AND (Created Date >= 2020-11-24T00:00:00.000Z) 
ORDER BY CreatedDate DESC
© www.soinside.com 2019 - 2024. All rights reserved.