所以,我有这个新项目.我公司使用SalesForce.com云存储有关日常运营的信息.我的工作是编写一个新的应用程序,除其他外,它将这个数据的CRUD操作与现有的内部应用程序功能更加无缝地集成.
Salesforce WSDL API的核心是一组"query()"Web方法,它们将查询命令作为字符串.查询的语法是SQL-ish,但不完全(他们称之为SOQL).我不是"魔术字符串"的粉丝,所以我想在代码库中使用Linq,并将IQueryable解析为我在服务包装器中需要的SOQL查询.这当然是可能的(L2E,L2Sql),但我想知道是否有快捷方式,因为如果我说它需要花费一两天才能推出我自己的,我会被"鼓励"找到另一种方法(很可能是每个通用查询的方法,这是旧应用程序中使用的方法).如果我成功创建了一个通用的SOQL解析器,我们可以在其他几个即将推出的应用程序中使用它,我将成为英雄.
以下是我看到的选项:
你们有什么感想?为一个人构建一个Linq解析器超过两天的任务?涉及现有Linq提供商的提升解决方案可能会这样做吗?切断表达式字符串并以这种方式构造我的查询会不会很糟糕?
编辑:感谢Kirk的接地.我更多地了解了即使是基本的SOQL解析器我还需要做些什么,而且我的工作应用程序代码在任何可行的时间表上编写都超出了我的范围.例如,我必须从我的WSDL对象的所有已知列中的Select()方法lambda或默认的一个构建一个选择列表,这个任务我甚至都没想过(我更关注Where解析) .我敢肯定还有很多其他"未知的未知数"可能会把这变成一个非常重要的事情.我找到了几个链接,它们显示了编写Linq提供程序的基础知识,尽管它们都试图使它变得简单,但现在只是时间不可行.我现在将构建我的存储库,使用封装命名查询的命名方法(格式化查询字符串的常量类应该减少维护中的头部刮擦量).不完美,但更可行.如果Linq2SOQL提供商在内部或开源时启动,我们可以重构.
对于寻找Linq提供者参考的其他人,以下是我发现的有用链接:
总行数在10k到100k行范围内.我可以在force.com上使用RAND()吗?不幸的是,尽管所有行都有唯一的数字标识符,但仍有许多空白,我常常想从过滤后的子集中选择一个随机行.
我怀疑没有特别有效的方法来做到这一点,但它有可能吗?
最终,我想做的就是随机从表中(或基于特定过滤条件的子集)中提取一行.
如果force.com不允许我选择一个随机行,那么我可以查询要选择的行,并为所有行分配顺序ID,比如1-1,035,然后在本地选择该范围内的随机数,比如说349,然后得到第349行?
我在SalesForce中有一个自定义日期字段:LastCheckedDate(API名称:LastCheckedDate__c)
我正在尝试使用SalesForce Enterprise API根据该字段查询帐户.它返回结果,我可以在查询的WHERE部分中使用自定义字段,但我无法让它实际显示结果中自定义字段的值.
这个PHP代码应该为我提供2011年检查过的任何帐户的ID,名称和LastCheckedDate:
$query = "SELECT Id,Name,LastCheckedDate__c FROM Account WHERE LastCheckedDate__c > 2011-01-01";
$response = $salesforceConnection->query($query);
foreach ($response->records as $record) {
print_r($record);
}
Run Code Online (Sandbox Code Playgroud)
它正确地仅返回2011年已检查过的帐户,但结果不包括该自定义字段的值:
stdClass Object
(
[Id] => 0015000000abcdefgh
[Name] => Bob's Widget Factory
)
Run Code Online (Sandbox Code Playgroud)
如何才能将LastCheckedDate包含在结果对象中?
我试图根据部分匹配检索案例的所有者,我们选择与部分匹配匹配的最新案例.
这是我正在尝试的查询:
SELECT User.CustomField__c
FROM User
WHERE User.Id IN (
SELECT OwnerId
FROM Case
WHERE Case.CaseNumber LIKE '%1026'
ORDER BY Case.CreatedDate DESC LIMIT 1)
Run Code Online (Sandbox Code Playgroud)
以下查询单独工作,但作为子查询的一部分似乎不高兴:
SELECT OwnerId
FROM Case
WHERE Case.CaseNumber LIKE '%1026'
ORDER BY Case.CreatedDate DESC LIMIT 1
Run Code Online (Sandbox Code Playgroud)
同样,如果我放弃它ORDER BY
,LIMIT
它的工作原理:
SELECT User.NVMContactWorld__NVM_Agent_Id__c
FROM User
WHERE User.Id IN (
SELECT OwnerId FROM Case
WHERE Case.CaseNumber LIKE '%1026')
Run Code Online (Sandbox Code Playgroud)
SOQL子查询中是否不允许订单/限制查询?
为了澄清这个问题,我正在处理的场景看起来像这样......
Salesforce组织可以为案例编号配置"显示格式".如果他们选择"4"数字,您将获得如下情况编号:
可以重新配置您的案例编号,以获得以下案例编号以及上面的案例编号......
我不希望人们对这个LIKE
陈述感到困惑,问题是001234和1234是不同的情况,所以如果一个客户提供1234并且我找到两个记录,我想开始假设它们是最近的情况.
所以要么考虑声明,要么考虑包含LIKE
的 …
我正在查询ActivityHistory,看起来你只能将它作为SUBQUERY的对象查询到其他对象.这没关系 - 我改变了我的查询以查询Account对象,在子查询中使用ActivityHistory.似乎工作正常.但在测试中,我发现了一个ActivityHistory子查询返回超过200个结果的情况.我开始收到此错误:
FATAL_ERROR|System.QueryException: entity type ActivityHistory does not support query
...在调试日志中.这似乎只是一个帐户在ActivityHistory对象中有超过199个相关条目的问题.为了查看这是否是原因,我尝试在子查询中放置LIMIT 199和LIMIT 200子句.果然,当我使用199(或任何更低)时,它工作正常.使用200(或更高的任何值)会导致上述错误.
我的代码如下.需要注意的一点是查询是在FOR循环中.我得到的一个理论是,为什么它为LIMIT子句的高值产生错误,可能200是FOR循环将查询批处理为单独的块的点 - 也许第二个块不符合'子查询'的条件(因为它是单独运行的?) - 并且SalesForce不喜欢它.
哦,还有一件事:相同的代码似乎在Anonymous Apex编辑器中运行良好(尽管我必须做一些修改 - 用显式值替换内联变量).奇怪的是,匿名编辑对它非常满意,但SFDC服务器并不喜欢它.
无论如何,我要做更多的故障排除.有人有任何见解吗?
谢谢!
码:
// ActivityHistory's on Account for (Account a : [ // you can't query ActivityHistory directly; only in a subquery against another object type SELECT Id ,Name ,( SELECT ActivityDate ,ActivityType ,CRM_Meeting_Type__c ,Description ,CreatedBy.Name ,Status ,WhatId FROM ActivityHistories WHERE ActivityType IN :included_activity_history_types //LIMIT 200 ) FROM Account WHERE Id = :accountId ]) { for (ActivityHistory …
我正在尝试查询价格不是整数(没有小数)或价格不是10的倍数的所有商机.
我试图找到价格:U $ S 34,801.23 - U $ S 56,103.69 - U $ S 50,000.12等但不是:U $ S 49,500.00 - U $ S 19,110.00等
数据库中有很多机会,我可以通过代码查看它们,但想知道你们中是否有人能想到通过查询实现这一点的方法.
我试图使用SOQL从Task对象获取联系/领导电子邮件(我正在PHP中创建一个接口来备份具有特定主题的消息)。这是我现在的查询:
SELECT Subject,Who.FirstName,Who.LastName,Who.Email,Who.Phone,Description FROM Task
Run Code Online (Sandbox Code Playgroud)
这行得通/不会抛出错误并给我结果,但Who.Email
始终为空(并且碰巧Who.Phone
也是如此,但这并不是很重要)。如果仅尝试使用,Email
则会收到该字段不存在的错误消息,这很奇怪,因为该字段Email
在“任务字段”下为标准字段。
我也尝试了几种Google搜索,但没有找到任何帮助。
我的最终目标是从Salesforce帐户中提取数据,以便在R中使用.我发现了RForcecom软件包(https://hiratake55.wordpress.com/2013/03/28/rforcecom/),这看起来非常有用,谢谢@ hiratake55写它!不幸的是我遇到了一个小问题.
我可以登录我的帐户,然后访问内部和存储对象,data.frame
就像介绍说明一样.
问题是我想访问SOQL对象中的某些字段,我不知道这些字段的名称.
这是我到目前为止:
library(RForcecom)
username <- "" # my email address
password <- "" # my website password + security token
instanceURL <- "https://eu5.salesforce.com/"
apiVersion <- "34.0"
session <- rforcecom.login(username, password, instanceURL, apiVersion)
# R Query
objectName <- "Contact"
fields <- c("Id", "Name", "Phone")
rforcecom.retrieve(session, objectName, fields)
Run Code Online (Sandbox Code Playgroud)
这工作正常,并返回data.frame
正如RForcecom在锡上所说的那样.现在我还想提取例如字段"Contact Owner Alias"(该字段在SalesForce的Web界面上具有此名称).我尝试了以下方法:
fields <- c("Id", "Name", "Phone", "Contact Owner Alias")
rforcecom.retrieve(session, objectName, fields)
Run Code Online (Sandbox Code Playgroud)
这给出了一个错误:
Error in rforcecom.query(session, soqlQuery) :
MALFORMED_QUERY: Id, Name, Phone, Contact …
Run Code Online (Sandbox Code Playgroud) 我执行 SOQL 请求以获取 SObject 'ObjectPermissions' 的所有可用记录 ID。
然后我使用请求来
GET /services/data/v48.0/sobjects/ObjectPermissions/{id}
获取特定记录的所有必要信息。
正如您在第一张图片中看到的,我收到了总共 960 条记录的回复。问题是对于 285 个条目,我无法获取信息。以下是我收到的 285 个答案之一的示例:
我突出显示了这条记录的标识符。可能这个id不对。
我对以下 SObject 观察到相同的情况:
TaskStatus
TaskPriority
SolutionStatus
PartnerRole
OrderStatus
FlowDefinitionView
FieldSecurityClassification EntityDefinition
ContractStatus
CaseStatus
我可以使用常规对象(例如,事件、任务和登录历史记录)观察不同 Salesforce 组织的相同行为。但这种行为并不总是在每个组织中都能重现。
是 Salesforce 做错了什么还是我不明白?
我正在尝试检索在01-01-2011和06-30-2011之间创建的机会.
Select o.CreatedDate, o.Id, o.LastModifiedDate
from Opportunity o
where o.CreatedDate > '1/1/2011' and o.CreatedDate < '12/31/2011'
order by o.LastModifiedDate
Run Code Online (Sandbox Code Playgroud)
因为createdate是一个日期时间,我得到一个错误,说createDate是datetime,不应该用引号括起来.
有人可以帮助如何使这个查询工作.我只是想让这个查询在apex资源管理器中运行,这不是顶点代码的一部分