在Microsoft Dynamics CRM 4.0中创建插件时,您可以使用以下内容检查导致插件触发的事件的来源.
public void Execute(IPluginExecutionContext context)
{
if (context.CallerOrigin.GetType() == CallerOrigin.WebServiceApi.GetType())
{
return;
}
plugin code here...
}
Run Code Online (Sandbox Code Playgroud)
这将允许您检查操作是由表单中的用户,Web服务还是工作流等引起的...
我有一个同步应用程序,它通过WCF创建和更新实体,并且不希望插件在发生这种情况时执行,只有当用户编辑实体时(以防止同步过程中出现无限循环).
IExecutionContext.CallerOrigin已在MS Dynamics CRM 2011中删除,那么新的方法是什么?
我当时认为可能有一种方法可以设置IExecutionContext.CorrelationIdWCF调用,然后检查插件中的特定Guid,但我还没有运气.
我从CRM生成实体,如下所示:
CrmSvcUtil.exe /url:http://<servername>/<organizationname>/XRMServices/2011/Organization.svc
/out:<outputfilename>.cs /username:<username> /password:<password> /domain:<domainname>
/namespace:CRMEntities /serviceContextName:XrmServiceContext
Run Code Online (Sandbox Code Playgroud)
对于serviceContextName,我设置了XrmServiceContext.我想使用下一个代码从CRM中检索一些实体:
var context = new XrmServiceContext(myorgserv);
var marketingList = context.ListSet.Where(item => item.Id == new Guid("SOME GUID"));
Run Code Online (Sandbox Code Playgroud)
我收到错误:
Message "Unable to cast object of type 'Microsoft.Xrm.Sdk.Entity' to type 'CRMEntities.List'."
Run Code Online (Sandbox Code Playgroud)
在"添加到监视"之后,我看到上下文中的每组实体都有相同的消息.我错过了什么?
有没有办法从CRM"高级查找"编辑XML文件,然后将其重新更改?
当我在一个字段类型上插入大量值时,我已经厌倦了使用高级查找(例如,zipcode = 45211),并且想要一种加速过程的方法,而不会将其交给写入它的人. SQL.
所以我的想法是使用"Advance Find"创建查询的开头,然后使用Download Fetch XML导出该查询,然后修改XML文件,(不确定如何或是否可以完成下一部分>>)然后导入该XML将文件重新导入CRM以用于我的新查询或替换相关的XML文件,无论它位于何处.
对XML的示例更改:
<filter type="or">
<condition attribute="address1_postalcode" operator="like" value="45211%" />
<condition attribute="address1_postalcode" operator="like" value="45213%" />
<condition attribute="address1_postalcode" operator="like" value="45219%" />
etc…
</filter>
Run Code Online (Sandbox Code Playgroud) 我正在提取营销列表清单.正如我这样做,根据我使用intellisense的检查,这似乎是一次成功的操作.当我寻找时,...Entities[0].Attributes["nick"]我得到一个对象(在其中的某个地方有正确的数据).但是我不能以编程方式访问它(相反,我必须像猴子一样点击,通过优点来折叠好东西).
事实上,我得到的实体应该使用下面的代码.问题是它们不Strings符合计算机.它们属于类型Microsoft.Xrm.Sdk.AliasedValue,我不知道如何访问其中的实际缺口.
new Contact
{
Name = element.Attributes["nick"] as String,
Mail = element.Attributes["mail"] as String
}
Run Code Online (Sandbox Code Playgroud)
Intellisense说Value它就在那里(而且它也是正确的值)但是我无法通过输入来访问它.Value.我怀疑我需要使用"as"或类似的东西,但此刻我被卡住了.任何提示?As它String应该起作用,它给了我null......
我已经读过这篇文章以及其他几个喜欢它和我看到它的方式,我应该能够访问那里所有有趣的东西.我不能......
我注意到下面的代码得到我的数据,我这么拼命试图让,但这个不能成为一个专业的语法,可以吗?!说真的,它看起来像一个患有多动症和宿醉的高中生试图这样做......
new Contact
{
Name = ((Microsoft.Xrm.Sdk.AliasedValue)result.Entities[0].Attributes["nick"]).Value,
Mail = ((Microsoft.Xrm.Sdk.AliasedValue)result.Entities[0].Attributes["mail"]).Value
}
Run Code Online (Sandbox Code Playgroud)
我的意思是,认真 - 这是一段丑陋的代码......必须有一个更好的方法!但是,我担心没有,因为这个讨论似乎也在使用这种语法......
我试图在Dynamics CRM 2011中表示大于100,000,000,000(Decimal数据类型的最大值)的数字.看起来这样做的唯一方法是使用Currency字段或使用文本字段.这些选项都不是很吸引人.
在Dynamics CRM中表示大数字的最佳方法是什么?
CRM 2011在前提下.
我有一个用C#编写的插件.它可能会抛出异常或在生产中表现不佳.
当发生这种情况时,我想捕获有关状态和最近代码执行的信息,以帮助我分析问题.
理想情况下,我想要以下内容:
如果代码决定我应该知道一个问题,那么我希望它能够告诉我尽快出现问题,而我没有看到问题是否已经发生.
我希望能够轻松获取有关该问题的信息.我不想让RDP到另一台机器并搜索文件.
我不希望日志记录对性能产生太大影响.
我想我正在寻找这样的东西:
我对CRM很新,但我以前开发过这样的系统.由于CRM已经存在多年,我希望它可以用于它.
我知道从CRM外部执行批量更新时,ExecuteMultipleRequest是一个巨大的性能助推器.我不知道的是从CRM插件中调用它是否有益.
我目前的理解是,使用ExecuteMultipleRequest获得的主要性能是实际的SOAP消息传递成本.因此(用于更新5000条记录)而不是发送5000条单独的Soap消息(每条消息必须被序列化,验证,传输等),所有这些都必须发送到服务器,您只能发送一条包含5000条记录的消息.但是当从插件调用时,您已经在服务器上,因此不必进行SOAP调用,因此使用它没有任何好处.
我还没有看到其他一些潜在的好处吗?
我正在寻找包含MS Dynamics CRM系统视图或保存的高级查找视图的条件记录的表.每个保存的视图(系统视图或自定义视图)都有一些用于过滤结果的条件.我想在数据库中找到包含此条件的表作为记录.
我正在向 CRM 2011 表单添加一些 JavaScript,但我看到了我不明白的行为。(我已经从根本上简化了这个例子来解决问题的核心。)
我有一个名为“new_myfield”的字段,它是单选按钮,我正在触发一个 JavaScript 函数 OnChange 将其设置为 false。如果我使用以下脚本,一切正常,我可以一次又一次地运行脚本,并且每次将字段设置回 false:
var myField = Xrm.Page.getAttribute("new_myfield");
myField.setValue(false);
Run Code Online (Sandbox Code Playgroud)
当然,实际发生的情况是脚本触发了两次,因为当该字段设置为 false 时,这将再次触发脚本,而脚本又将其设置为 false。我已经通过在脚本中放置警报来验证这一点。
但实际上我只想在用户将该字段设置为“true”时运行此脚本,因此我将其更改为:
var myField = Xrm.Page.getAttribute("new_myfield");
if (myField.getValue() == true) {
myField.setValue(false);
}
Run Code Online (Sandbox Code Playgroud)
该脚本按预期运行一次并将字段设置为“false”,但是下次我手动将单选按钮设置为“true”时,脚本不会运行。它甚至不火。就像 onchange 事件处理程序没有识别出任何事情发生一样。只有当我手动将按钮设置回“false”时,脚本才能按预期再次运行。
就好像脚本需要运行两次(如第一个示例中所示)才能使其工作。
有人知道为什么会这样吗?
我需要能够从ODataQueryOptions转换为RestRequest,以便能够使用指定的过滤器发出RestRequest,并创建了以下帮助程序类:
public static class ODataQueryFilterToRestClient
{
public static RestRequest Map(ODataQueryOptions odataQuery)
{
var restRequest = new RestRequest();
if (odataQuery.Filter != null)
{
restRequest.AddQueryParameter(@"$filter", odataQuery.Filter.RawValue);
}
if (odataQuery.Top != null)
{
restRequest.AddQueryParameter(@"$top", odataQuery.Top.RawValue);
}
if (odataQuery.Skip != null)
{
restRequest.AddQueryParameter(@"$skip", odataQuery.Skip.RawValue);
}
if (odataQuery.OrderBy != null)
{
restRequest.AddQueryParameter(@"$orderby", odataQuery.OrderBy.RawValue);
}
//etc
return restRequest;
}
}
Run Code Online (Sandbox Code Playgroud)
鉴于OdataQueryOptions支持以下内容:
有没有更简单的方法在ODataQueryOptions与RestClient或其他其他客户端代理之间进行转换?
另外,我不知道是否有更好的方法通过控制器接受参数而不是ODataQueryOptions?