MSCRM客户端开发

[ 1593 浏览 ][手机版]

JavaScript几乎无所不能

中文的crm资料太少,群里论坛里响应的人很少,百度搜到的更少

解决了很多技术上的问题,几乎网上都没有,自己决定记录所有开发过程中遇到的问题。(文/kevin-lee  出处/博客园)

crm下拉菜单闪现问题


鼠标移动到菜单后,无法选中,菜单自动消失

附件: 3056c754d6664878d10906da.png


造成此问题的原因是安装了瑞星2009,此问题出现在大多数人的机器上,可是没人公布为什么,没人回答,汗一个。

解决方案:1、卸载瑞星。2、鼠标移到菜单后停住,用方向键向下选择


CRM表单多个tab页,tab页的切换、名称动态变化,隐藏,定位问题


附件: 404410556b2231e4b745aeb6.png


该页表单7个tab页,tab页的id从0开始,即tabnTab,

隐藏tab页 crmForm.all.tab1Tab.style.display="none";

显示tab页 crmForm.all.tab1Tab.style.display="block";

更改tab页显示名称:crmForm.all.tab2Tab.innerText="商务条款";

ietoolbar抓到的是text,不好使。

默认定位tab页:crmForm.all.tab2Tab.Click=function{alert("aaa")};

同理tab页切换事件也就有了


公共视图显示关联实体的属性列报错问题


微软的bug,报不出真正错误原因,trace跟踪根本看不出哪儿错了

如果关联实体要显示的列存在CRMmoey类型的属性,那么必须加上基础货币,和关联实体的货币列,不知道为什么,印度人有病。

查找视图多级过滤问题,crm自身只支持关键字查找,想要根据字段查找只能用第三方付费插件,解决方法是自己加fetch xml,切记次xml必须是高级查找视图prompt出来的值

方法是在查找结果的地址栏里输入javascript:prompt("", resultRender.FetchXml.value);

按回车

lookupsingle.aspx页面找个位置加上以下代码,别写table里就行
  1. <script runat="server">

  2. protected override void OnLoad( EventArgs e )
  3. {
  4.       base.OnLoad(e);
  5.       crmGrid.PreRender += new EventHandler( crmgrid_PreRender );
  6. }

  7. void crmgrid_PreRender( object sender , EventArgs e )
  8. {
  9.     // As we don't want to break any other lookups, ensure that we use workaround only if
  10.     // search parameter set to fetch xml.
  11.     if (crmGrid.Parameters["search"] != null && crmGrid.Parameters["search"].StartsWith("<fetch"))
  12.     {
  13.         crmGrid.Parameters.Add("fetchxml", crmGrid.Parameters["search"]);

  14.         // searchvalue needs to be removed as it's typically set to a wildcard '*'
  15.         crmGrid.Parameters.Remove("searchvalue");

  16.         // Icing on a cake - ensure that user cannot create new contact outside of the account
  17.         // and then select it.
  18.         this._showNewButton = false;
  19.     }
  20. }

  21. </script>
复制代码
在onload事件里写
  1. var fetchStr = "<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'>"+
  2. "<entity name=‘实体名'/>"+
  3. //"<all-attributes/>"+
  4. "<attribute name='属性名'>"+
  5. "<attribute name='属性名'/>"+
  6.   "<order attribute='属性名' descending='false'/>"+
  7. "<filter type='and'>"+
  8.   "<condition attribute='statecode' operator='eq' value='0'/>"+
  9. "<condition attribute='查询条件的属性名' operator='eq' value='1'/>"+
  10. "</filter >"+
  11. "</entity>"+
  12. "</fetch>";
复制代码
最恶心的是crm的sdk里给出的js拼fetchxml的方法是错的,全部转换成“<”了,极恶心,调试了半天。而且jimmy wang的博客里的方法里是双引号,不知道这位mvp大哥怎么会犯这种语法错误

下面这句话是屏蔽查找框的作用,这句话很有用,业务方的权限限制很明确,通常查找视图里是不允许你随便查的

crmForm.all.lenovo_classoneitem.lookupbrowse = 1;


一些小技巧
  1. //隐藏左侧工作流菜单
  2. if(window.document.getElementById( 'navAsyncOperations')!=null)
  3. {
  4.         window.document.getElementById( 'navAsyncOperations').style.display = 'none';
  5.     }; 

  6. //表单的头名称

  7. document.title,可改,可做变化,不啰嗦了

  8. //整个表单只读

  9. document.body.disabled = true;
复制代码
这个灰掉了,有点难看,但是网上给出的灰掉这个表单的方法太麻烦,作用一样,简单何乐而不为

唯一缺陷,iframe里的关联视图是怎么也灰不掉的,请高手指点
  1. //隐藏isv的buttion

  2. var liBtns = window.document.getElementsByTagName("LI");
  3.   for(var i = 0; i < liBtns.length; i++)
  4.   {
  5.                 if( liBtns.id == "_MBcrmFormSubmitCrmForm59truetruefalse"||
  6.       liBtns.action == "crmForm.Print();"||
  7.       liBtns.id =="action")
  8.                   liBtns.style.display = "none";
  9.   }
复制代码
可用id,可用action,可用alt,估计样式也可以改,用ietoolbar可以抓到

数据验证错误后定位,不刷新表单

一定要:

crmForm.all.字段名.SetFocus();
    event.returnValue = false;
    return false;

隐藏左侧菜单,去掉关联视图的button,等常见方法网上都有,不多说了

Changing the label of a field at runtime

crmForm.all.revenue_c.innerText = "Amount Euro";
TOP