我正在进行一些CRM 2011在线定制,我需要使用javascript获取实体.
我需要的实体将基于另一个字段(联系人实体)的ID值 - 这个联系人ID我可以很好.
我想要的实体是一个自定义实体.根据联系人ID可能有多个匹配项,所以我只想获取列表中的第一个匹配项(顺序并不重要)
到目前为止,我已经研究了几种方法来做到这一点......
OData - 关于我可以创建哪些查询表达式,我找不到足够的示例,我也不知道是否/如何使这个工作适用于自定义实体
FetchXML - 我也可以使用内置的"高级查找"创建一个很好的FetchXML查询,如果有人可以提供帮助,我很乐意通过javascript调用它吗?我在这里找到了一个有希望的答案,但我看不出"结果"如何设置返回数据(Service.Fetch函数)
SOAP请求 - 我尝试的第一件事是我在CRM 4中可以做的类似方法,但这似乎不起作用.虽然请求执行,但我的结果数据似乎是空的.这就是我所有的代码所以,如果任何人可以发现下面的代码的问题,那将是伟大的.
编辑:我发现了一些冗余的查询数据(我已经删除了链接开始标记,但留下了结束标记) - 因为删除这个我现在获取XML结果数据...但是,where子句似乎不适用(只需获取所有列表)实体)
var xml = "<?xml version='1.0' encoding='utf-8'?>" +
"<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">" +
GenerateAuthenticationHeader() +
"<soap:Body>" +
"<RetrieveMultiple xmlns=\"http://schemas.microsoft.com/crm/2007/WebServices\">" +
"<query xmlns:q1=\"http://schemas.microsoft.com/crm/2006/Query\" xsi:type=\"q1:QueryExpression\">" +
"<q1:EntityName>new_vehicle</q1:EntityName>" +
"<q1:ColumnSet xsi:type='q1:ColumnSet'>" +
"<q1:Attributes>" +
"<q1:Attribute>new_vehicleid</q1:Attribute>" +
"<q1:Attribute>new_primarydriver</q1:Attribute>" +
"<q1:Attribute>statuscode</q1:Attribute>" +
"<q1:Attribute>new_registration</q1:Attribute>" +
"</q1:Attributes>" +
"</q1:ColumnSet>" +
"<q1:Distinct>false</q1:Distinct>" +
"<q1:Conditions>" +
"<q1:Condition>" +
"<q1:AttributeName>new_primarydriver</q1:AttributeName>" +
"<q1:Operator>Equal</q1:Operator>" +
"<q1:Values>" +
"<q1:Value …Run Code Online (Sandbox Code Playgroud) json dynamics-crm odata dynamics-crm-2011 dynamics-crm-online
有几次我被告知CRM 2011中的业务部门"很棘手",不应轻易设置,因为它们对CRM 2011实施有不可逆转的后果.
另一方面,CRM 2011中的团队在管理记录安全性方面似乎更加灵活.
出于什么原因,我仍然会选择在CRM 2011中设置业务单位?对于我不能与团队合作的业务部门,我能做些什么(反之亦然)?
我有一个需要与Dynamic CRM 365 Web API对话的Web应用程序.动态CRM在ADFS上配置为依赖方.服务器是Windows Server 2016,一切都是内部部署,而不是Azure.
我为获取有效令牌所做的工作如下:
1)在ADFS中,转到应用程序组并添加新的服务器应用程序,获取ClientID并为我的Web应用程序生成客户机密钥.
2)在Active Directory中添加新的用户webAppUser
3)在CRM中使用应用程序ID 将此用户添加为应用程序用户 ID,这是我在将Web应用程序注册到ADFS时之前获得的ClientID.还创建了一个具有实体帐户完全权限的新角色,并将此角色分配给此应用程序用户
4)我正在使用以下代码来检索承载令牌并将其添加到我的HttpClient Authorization标头中.
public class CrmWebApiClient
{
private HttpClient _httpClient;
public CrmWebApiClient()
{
_httpClient = new HttpClient();
_httpClient.BaseAddress = new Uri("https://crmbaseaddress.com");
}
internal async Task Initialize()
{
try
{
var authority = "https://adfsServerUrl/adfs/";
var authContext = new AuthenticationContext(authority,false);
var credentials = new ClientCredential(clientID,clientSecret);
var authResult = await authContext.AcquireTokenAsync("https://crmbaseaddress.com", credentials);
_httpClient.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Bearer", authResult.AccessToken);
}
catch (Exception ex)
{
var error = ex;
} …Run Code Online (Sandbox Code Playgroud) 我创建了以下代码,并将其作为Web资源包含在CRM 2011表单上,以便在查找字段的字段onchange事件上调用.$.ajax({...在行之前一切正常,然后我有一个错误" $未定义".我不太熟悉脚本,所以请帮忙.
function GetAddress() {
var accountId;
var dataArray;
var accountRequestUrl;
if (crmForm.all.regardingobjectid.DataValue != null) {
dataArray = crmForm.all.regardingobjectid.DataValue;
accountId = dataArray[0].id;
if (typeof GetGlobalContext == "function") {
var context = GetGlobalContext();
accountRequestUrl = context.getServerUrl();
}
else {
if (typeof Xrm.Page.context == "object") {
accountRequestUrl = Xrm.Page.context.getServerUrl();
}
}
accountRequestUrl = Xrm.Page.context.getServerUrl();
accountRequestUrl += "/XRMServices/2011/OrganizationData.svc/AccountSet(guid'" +
accountId + "')";
crmForm.all.maxlife_addressname.DataValue = accountRequestUrl;
GetAccountRecord(accountRequestUrl);
}
else {
alert("null");
}
}
function GetAccountRecord(accountRequestUrl) {
$.ajax({
type: "GET",
url: …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Azure AD oAuth 2身份验证访问Dynamics CRM Online REST API.为了做到这一点,我按照以下步骤操作:
- 我在Azure中注册了一个Web应用程序和/或web api
- 将动态CRM的权限配置为具有委派权限"以组织用户身份访问CRM Online"
- 并创建了一个密钥1年到期并保留客户ID.
在Azure上配置Web应用程序后,我在.NET/C#中创建了一个控制台应用程序,它使用ADAL发出简单请求,在这种情况下检索帐户列表:
class Program
{
private static string ApiBaseUrl = "https://xxxxx.api.crm4.dynamics.com/";
private static string ApiUrl = "https://xxxxx.api.crm4.dynamics.com/api/data/v8.1/";
private static string ClientId = "2a5dcdaf-2036-4391-a3e5-9d0852ffe3f2";
private static string AppKey = "symCaAYpYqhiMK2Gh+E1LUlfxbMy5X1sJ0/ugzM+ur0=";
static void Main(string[] args)
{
AuthenticationParameters ap = AuthenticationParameters.CreateFromResourceUrlAsync(new Uri(ApiUrl)).Result;
var clientCredential = new ClientCredential(ClientId, AppKey);
var authenticationContext = new AuthenticationContext(ap.Authority);
var authenticationResult = authenticationContext.AcquireToken(ApiBaseUrl, clientCredential);
var httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", authenticationResult.AccessToken); …Run Code Online (Sandbox Code Playgroud) 在Dynamics 365 9.0中,关于如何访问表单属性和控件(而不是Xrm.Page命名空间)有很大的变化,我们应该传递executionContext给函数并formContext使用getFormContext()函数.这工作正常,我使用这种方法从来没有问题.
但是我还没想出如何正确访问formContext从Ribbon调用的函数.文档说这应该是非常简单的:
function myFunction(executionContext) {
var formContext = executionContext.getFormContext();
var focusFieldValue = formContext.ui.controls.get(PrimaryControlId).getAttribute().getValue();
}
Run Code Online (Sandbox Code Playgroud)
但它没有说如何传递executionContext给Ribbon功能.在普通函数中有一个复选框"将执行上下文作为第一个参数"但是功能区呢?我们可以将这些参数传递给这些函数,但它们只是所选记录的GUID,或所选记录的类型,甚至是对象列表,但如果参数等于,我在文档中找不到executionContext.有人已经解决了这个问题吗?
另外我知道我可以使用Xrm.Page并且它可以工作(至少现在......)但是我想知道如何使用版本9.0中的最新指南来完成它
更新1:
根据Scott的建议和本文,我将PrimaryControl传递给我的Ribbon命令但不幸的是,参数是类型的Mscrm.FormControlLite,它没有getAttribute函数或任何允许访问formContext的函数(至少我没有看到任何有用的东西).Developer工具的一些截图:

因此它看起来像某种形式的表单,但可能与formContext无关(我假设如果从记录列表中调用Ribbon,则此项可以是网格类型或类似的东西)
我使用CRM 2011 RC(v5)LINQ-to-CRM提供程序编写了一个Linq to CRM查询.我有一个本地声明的List <T>,我想加入CRM实体,我希望查询在CRM服务器上执行.一个例子可能有帮助:
MyObject myObject = new MyObject();
List<myAccount> myAccountsList = new List<myAccount>();
myAccountsList.Add(new myAccount() {AccountNumber = "123"};
myAccountsList.Add(new myAccount() {AccountNumber = "456"};
myObject.ListOfAccounts = myAccountsList;
var accountsQuery = from ax in myObject.ListOfAccounts
join a in orgContext.CreateQuery<customAccountEntity>() on ax.AccountNumber equals a.account_number
select a;
foreach(var item in accountsQuery)
{
Console.WriteLine("Id of record retrieved: " + a.Id.ToString());
}
Run Code Online (Sandbox Code Playgroud)
上面的代码编译并执行,但是,在检索整个CRM实体记录集之后,本地执行记录的过滤.显然,当CRM实体包含数千行时,查询将执行不佳甚至超时.
我已阅读有关IQueryable和IEnumerable的内容,并尝试使用AsQueryable()扩展方法转换List,该方法无效.我需要上面的Linq查询来运行SQL,如下所示:
SELECT a.*
FROM customAccountEntity AS a
WHERE a.account_number IN ('123', '456');
Run Code Online (Sandbox Code Playgroud)
如果想要加入多个字段,可以使用临时表.我怎么能做到这一点?
我们能够创建没有任何问题的新实体,但是更新插件中的现有实体似乎不起作用.这适用于CRM 2011.
var crmContext = new CustomCrmContext(service);
var contact = crmContext.Contact.FirstOrDefault(c=>c.Id == targetEntity.Id);
contact.new_CustomField = "Updated";
crmContext.SaveChanges();
Run Code Online (Sandbox Code Playgroud) 每当我点击机会来定制它
窗口波纹管打开
看来自定义窗口正在尝试打开一个活动窗口,它应该打开一个机会图表窗口.显示的唯一错误是"无效的用户授权传递给平台的用户身份验证无效",并且调试窗口中没有错误.
注意:
---更新1 ---
回应@ConorGallagher
是机会图表还是特定图表?
这是所有机会图表.他们中没有人会打开.
您是否尝试过打开开发人员工具并检查网络以查看究竟是什么失败了?
我有,开发人员工具不会发现任何错误.
或者使用fiddler做分析并找出究竟是什么失败?
当我点击图表时,这就是我从小提琴手那里得到的:
生产和开发之间是否存在不同的加密设置?
两者之间的加密设置相同.
开发组织是生产数据库副本还是新安装?
开发组织是在现场升级之前正在进行的生产的副本.
当您直接登录到服务器并尝试自定义图表时,是否会发生这种情况?
它发生在PC上,直接发生在服务器上.
---更新2 ---
回应@ConorGallagher
我在开发人员工具的网络选项卡上预计会出现401(或某些http错误).您可以仔细检查该标签只是为了看.
我也会,但网络选项卡中的所有内容都是200.除了第一个是302.请参阅fiddler输出贝娄v.
回应@Pawel Gradecki
1)您不应该检查开发人员工具是否有脚本错误,将选项卡切换到"网络"并检查那里的任何HTTP错误.
请参阅上面的snapshoot到我网络窗口的@ConorGallagher ^.
你也没有在fiddler上启用HTTPS解密,所以你的日志不是很有意义,你应该首先启用它,然后重新检查fiddler
我在这里道歉是启用了解密的小提琴输出:
这更有帮助.页面似乎无法找到源地图(404),然后重定向到错误页面(302).我不确定它是否重定向,因为它无法找到源地图或因为其他一些错误.
2)检查服务器跟踪日志,他们可以显示一些可用于故障排除的其他信息
4)您可以打开一些工作图表设计器(例如帐户)并复制完整的URL并将其粘贴到单独的窗口.对机会图表执行相同操作(将其复制并粘贴到单独的窗口).如果仍然没有为Opportunity工作比较两个URL,请尝试稍微使用它们(交换一些查询字符串参数).
我玩了网址
现在,如果我将网址更改为:
https://crmcanada-dev.url.com/main.aspx?appSolutionId=%7bFD140AAF-4DF4-11DD-BD17-0019B9312238%7d&extraqs=etc%3d 3%26id%3d%7bA3A9EE47-5093-DE11-97D4-00155DA3B01E%图7d&网页类型= vizdesigner#665349499
(因为1是Company对象,3是机会对象).我仍然被重定向到无效的用户页面.
记得仔细检查服务器Trace,因为它可以告诉你一些有意义的东西.如果你有什么东西,请把它贴在这里,这样我们也可以看一下.
见上面链接^.
我想到了另一个想法 - 尝试备份您的组织数据库,以不同的名称还原它,以不同的名称导入它(因此您应该在DEV上有一个单独的组织).有时在组织导入期间会出现错误,这些错误不会阻止导入本身,但会导致CRM的某些奇怪行为.检查此重新导入的组织是否存在同样的问题.
这将是最后的手段.
microsoft-dynamics authorization crm dynamics-crm dynamics-crm-365
使用CRM 2011 SDK(v5.0.10)我遇到了少数Lookup字段的问题,其中目标没有填充,我希望有人可以帮助我确定在这些情况下确定引用实体的最佳方法.
具体来说,我正在使用此调用检索实体,属性和关系元数据:
var entityRequest = new RetrieveAllEntitiesRequest
{
RetrieveAsIfPublished = true,
EntityFilters = EntityFilters.Entity | EntityFilters.Attributes | EntityFilters.Relationships
};
var entityResponse = (RetrieveAllEntitiesResponse)_organizationService.Execute(entityRequest);
return entityResponse.EntityMetadata.ToList();
Run Code Online (Sandbox Code Playgroud)
稍后,在使用从该调用返回的EntityMetadata对象时,我检查Attributes集合,对于LookupAttributeMetadata对象,我尝试使用LookupAttributeMetadata对象的Targets属性确定查找引用的实体.
但是,在某些情况下,LookupAttributeMetadata对象具有空的Targets集合.例如,Campaign活动(逻辑名称:campaignactivity)实体将Service字段(逻辑名称:serviced)定义为Lookup字段,但LookupAttributeMetadata对象上的Targets属性为空.
当我查看实体的Web UI Customizations屏幕并打开Service字段时,在Type部分下显示Type:Lookup,Target Record Type:Account,Relationship Name:campaignactivity_account.
这些信息来自哪里?
另请注意:Campaign活动或帐户实体上没有名为"campaignactivity_account"的关系.
更新:我正在运行Dynamics CRM 2011 Rollup 8的库存安装(尽管我在Rolloup 7上也看到了这一点).虽然"广告系列活动"是我在我的示例中使用的字段,但总共有14个问题,如下所示.我正在寻找一个通用的解决方案(针对每个解决方案的一次性解决方案),以避免if (entityName=="rollupfield" && fieldName=="organizationid")...在我的代码中使用一堆逻辑,因为我正在使用的实体和字段是由用户在运行时选择的,我不知道我必须提前知道我会被交给谁.
更新:以下控制台应用程序可用于重现该问题.
//Requires the following Referenses:
// Microsoft.CSharp
// Microsoft.IdentityModel
// Microsoft.xrm.sdk
// System
// System.Core
// System.Data
// …Run Code Online (Sandbox Code Playgroud) dynamics-crm ×10
c# ×2
crm ×2
adal ×1
adfs ×1
azure ×1
dynamics-365 ×1
javascript ×1
json ×1
linq ×1
oauth-2.0 ×1
odata ×1
plugins ×1
rest ×1
token ×1