2009年8月23日星期日

CRM 自定义页面 DLL 路径

将DLL放入Bin的子目录中
当一个站点的Bin目录中DLL过多的时候,非常希望将所有的DLL按照一定的规则整理一下,这样更新网站的时候就会方便很多。
1、计划如下调整
主项目\Web.config
主项目\bin\A.dll
主项目\bin\B\B.dll
2、首先修改Web.Config文件,加入下面一段(告知dll存在的目录)

......






3、然后修改对应的*.aspx添加如下(指定AssemblyName)
<%@ Assembly Name="B" %>
如果不指定AssemblyName的话,是找不到相应的类的。

2009年4月29日星期三

CRM 4.0 升级后知识库无法使用

为了解决客户的一个Bug,升级了CRM 4.0的最新的UR3,结果升级之后,知识库(KB)不能使用了。解决的办法是将旧版本的c:\program files\Microsoft Dynamics CRM\Server\ApplicationFIles\treeSubject.xsl文件覆盖新的UR3版本的对应文件。
看来微软还是一贯的风格,解决了一个Bug,又导致了新的Bug产生。

2009年4月28日星期二

Inactive(禁用) 的组织记录显示在CRM的Lookup里

当我们在CRM 4.0里将一个BusinessUnit禁用后,我们会发现引用BusinessUnit的Lookup类型的字段里,这些被禁用的组织单位依然显示在列表中,解决个问题很简单,就是有点繁琐;按照如下步骤即可解决:

1. Customization -> Custom Entities -> Account -> Forms and View -> Main form -> Change the Form Properties -> OnLoad event
Function OnLoad ()
{
var oLookup=crmForm.new_hfi7658id;
oLookup.lookupclass="BasicOwner";
}
Note that new_hfi7658id is the lookup field referencing to businessunit

2. Save and publish the customization

CRM 4.0 菜单无法点击

我们的一家CRM客户反映,在部分的客户端的机器上,CRM中的所有菜单均无法点击;现象是菜单可以弹出来,但把鼠标移上去之后菜单就消失了,无法点击,但用键盘的上下键是可以操作的。
因为是部分机器有问题,所以问题肯定是出在这些的机器的IE上,试了很多方法,IE也换了好几个版本,把IE中的加载项都禁用掉,还是解决不了问题。
最后,微软的客服人员提供了如下方法将问题解决了。运行如下脚本将IE的所有DLL重新注册一遍就OK了。
脚本如下:
regsvr32 urlmon.dll
regsvr32 mshtml.dll
regsvr32 browseui.dll
regsvr32 vbscript.dll
regsvr32 jscript.dll
regsvr32 scrrun.dll
regsvr32 msxml.dll
regsvr32 actxprxy.dll
regsvr32 softpub.dll
regsvr32 wintrust.dll
regsvr32 dssenh.dll
regsvr32 rsaenh.dll
regsvr32 gpkcsp.dll
regsvr32 sccbase.dll
regsvr32 slbcsp.dll
regsvr32 cryptdlg.dll
regsvr32 oleaut32.dll
regsvr32 ole32.dll
regsvr32 shell32.dll
regsvr32 initpki.dll
regsvr32 msjava.dll
regsvr32 Scrobj.dll
regsvr32 Dispex.dll
regsvr32 Msscript.ocx

2009年1月5日星期一

CRM 3.0升级CRM 4.0 后originalPicklistOptions

近期将一个客户的CRM由3.0升级到了4.0后,发现有一些的客户端的JavaScript脚本不能使用了。其中一个是根据省份来过滤城市的,省份和城市都是PickList类型的字段;原来的脚本使用了城市字段的originalPicklistOptions这个属性,升级到4.0后发现这个属性竟然没有了。解决这个问题,要么是把整个的脚本重写,以适应4.0,或者采用一些小的技巧;用如下的小技巧就可以解决问题。
在代码的最开始添加如下的代码行:
if(window.city==null)
{
window.city = crmForm.all.new_city.Options;
}
用这个的代码行模拟originalPicklistOptions这个属性,然后将代码中所有用到originalPicklistOptions这个属性的地方换成window.city就OK了。

2008年12月26日星期五

如何在CRM4.0里过滤Lookup字段

    在CRM4.0里很多时候我们有根据一定的条件对Lookup里的内容进行过滤,比如说编辑客户实体的主要联系人是,我们想只显示这个客户的联系人供选择,而非所有的联系人。
    在3.0里,微软有提供方法来解决这个需求,但在4.0了该方法已经不起作用了。
    满足如上的需求也很简单,只需要两个步骤就可以解决:
步骤1:在客户实体Form的Onload事件中增加如下的Javascript代码,
var field = crmForm.all.primarycontactid;
if(crmForm.ObjectId == null)
{
    field.Disabled = true;
}else
{
    field.lookupbrowse = 1;
    field.AddParam("search", "<fetch mapping='logical'><entity name='contact'>" + "<filter><condition attribute='parentcustomerid' operator='eq' value='" + crmForm.ObjectId + "' /></filter></entity></fetch>");
}

步骤2,修改 CRM站点\_controls\lookup\lookupsingle.aspx,在文件中的任何地方添加如下代码
<script runat="server">
protected override void OnLoad( EventArgs e )
{
    base.OnLoad(e);
    crmGrid.PreRender += new EventHandler( crmgrid_PreRender );
}
void crmgrid_PreRender( object sender , EventArgs e )
{
    if (crmGrid.Parameters["search"] != null
    && crmGrid.Parameters["search"].StartsWith("<fetch>"))
    {
        crmGrid.Parameters.Add("fetchxml", crmGrid.Parameters["search"]);
        crmGrid.Parameters.Remove("searchvalue");
        this._showNewButton = false;
    }
}
</script>

OK,enjoy

2008年12月25日星期四

如何在CRM关联视图里显示Inactive的记录

微软的CRM 4.0的关联视图(associated view)中,Inactive的记录默认是不显示的;在3.0中微软曾经提供了一个工具来解决这个问题,但4.0中微软官方已经不提供方法来修正这个问题。
不过在4.0中解决这个问题也很简单,只需要写一个Plugin就可以解决所有问题。
Plugin的基本思路是:将我们自己的代码嵌入到RetieveMultiple 消息中,修改其中的查询条件,将过滤Inactive记录的ConditionExpression去掉。

简单代码如下:

using Microsoft.Crm.Sdk;
using Microsoft.Crm.Sdk.Query;

namespace RekTec.Crm.Plugins
{
public class AssociatedViewPlugin : IPlugin
{
public void Execute(IPluginExecutionContext context)
{
if (context.InputParameters.Contains(ParameterName.Query))
{
QueryExpression qe = context.InputParameters[ParameterName.Query] as QueryExpression;
if (qe.EntityName == context.PrimaryEntityName
&& qe.Criteria != null
&& qe.Criteria.Conditions != null
&& qe.Criteria.Conditions.Count == 2)
{
//找到针对statecode的过滤条件
ConditionExpression ce = qe.Criteria.Conditions[0] as ConditionExpression;
if (ce != null
&& ce.AttributeName == "statecode"
&& ce.Operator == ConditionOperator.Equal
&& ((int)ce.Values[0]) == 0)
{
//去掉对statecode的过滤
qe.Criteria.Conditions.Remove(ce);
}
}
}
}
}
}

编译如上的代码生成DLL文件,然后通过CRM的Plugin注册工具将这个Plugin注册到需要显示Inactive记录的实体的RetrieveMultiple Message中就OK啦。