
置顶随笔
摘要: 客户要求picklist能四级联动并且还要在第一级里选好某一项后其他几级多选实现效果如图:图一:图二:多选的效果是参照jimwang的多选改的 代码如下:if(class1 == 1){crmSDKSample.filterChildField("new_class1", "new_class3");crmSDKSample.filterChildField("new_class1", "new_class4");if( PL != null && PLV != null ){ if(documen
阅读全文
posted @ 2010-11-23 17:25 技术小菜鸟 阅读(85) 评论(0)
编辑

2011年5月1日
在 Microsoft Dynamics CRM 4.0 的plugin 开发中常常会遇到引用第三方的dll,如果以磁盘部署的方式不会产生很大影响,如果以数据库的部署方式,插件就会因为引用了第三方的dll而无法运行,我的认为,是因为部署插件工具只把plugin的dll序列化到数据库中,而第三方的dll没在其中。是不是引用了第三方类库的插件就无法以数据库方式部署呢?
解决此问题我现在找到两个方法,第一:把所有的代码迁移到plugin的dll里,第二:就是用ILMerge把多个dll混合在一起。第一种方法在有些情况下显然是不现实的,那我就给大家说第二种方法。
首先我们的去微软下载ILMerge这个工具:
这是下载地址:http://www.microsoft.com/downloads/en/details.aspx?familyid=22914587-B4AD-4EAE-87CF-B14AE6A939B0&displaylang=en
在用此工具把我们要打包plugin,打包成一个dll。
我以我的一个测试插件为例子:
我的这个插件为了查询方便引用了linq to crm的第三方类库,他有两个dll 一个是 LinqtoCRM.dll,第二个是stunnware.CRM.Fetch.dll,再加我自己plugin的dll一共是三个dll需要合并。在这里需要注意的是千万不要把 microsoft.crm.sdk 和 microsoft.crm.sdktypeproxy 这两个dll合并进去。
下面我们就可以通过命令提示来合并dll,首先需要转到ILMerge的安装目录里,然后输入以下命令:

这里要注意的是:/keyfile:这个参数他是给我们新合并的dll强命名这是不可缺的,如果没有它插件也会报错。
到这里我们的三个dll就会合并为一个叫mytest.dll,这样就可以数据库的方式部署,磁盘的也没有问题。
posted @ 2011-05-01 11:22 技术小菜鸟 阅读(1024) 评论(0)
编辑

2010年11月23日
客户要求picklist能四级联动并且还要在第一级里选好某一项后其他几级多选实现效果如图:
图一:

图二:

多选的效果是参照jimwang的多选改的 代码如下:
if(class1 == 1)
{
crmSDKSample.filterChildField("new_class1", "new_class3");
crmSDKSample.filterChildField("new_class1", "new_class4");
if( PL != null && PLV != null )
{
if(document.getElementById('picklist1')!=null)
{
var divlist =document.getElementById('picklist1');
var lnodes = divlist.childNodes;
for (i=0;i<lnodes.length;i++)
{
if(lnodes[i].nodeName=='LABEL')
{
divlist.removeChild(lnodes[i]);
}
}
for (i=0;i<lnodes.length;i++)
{
if(lnodes[i].nodeName=='INPUT')
{
if(lnodes[i].type=='checkbox')
{
divlist.removeChild(lnodes[i]);
}
}
}
for (i=0;i<lnodes.length;i++)
{
if(lnodes[i].nodeName=='BR')
{
divlist.removeChild(lnodes[i]);
}
}
for (i=0;i<lnodes.length;i++)
{
if(lnodes[i].nodeName=='BR')
{
divlist.removeChild(lnodes[i]);
}
}
for (i=0;i<lnodes.length;i++)
{
if(lnodes[i].nodeName=='BR')
{
divlist.removeChild(lnodes[i]);
}
}
}
else
{
// Create a DIV container
var addDiv = document.createElement("<div id='picklist1' style='overflow-y:auto; height:80px;border: 1px #6699cc solid;background-color: #ffffff;' />");
PL.parentNode.appendChild(addDiv);
}
PL.style.display = "none";
//PLV.style.display = "none";
//crmForm.all.new_class2value_c.style.display = "none";
//crmForm.all.new_class2value_d.style.display = "none";
//debugger;
// Initialise checkbox controls
for( var i = 1; i < PL.options.length; i++ )
{
var pOption = PL.options[i];
if( !IsChecked1( pOption.text ) )
var addInput = document.createElement("<input type='checkbox' style='border:none; width:25px; align:left;' />" );
else
var addInput = document.createElement("<input type='checkbox' checked='checked' style='border:none; width:25px; align:left;' / >" );
var addLabel = document.createElement( "<label id=lab1"+ i +"/>");
addLabel.innerText = pOption.text;
var addBr = document.createElement( "<br />");
PL.nextSibling.appendChild(addInput);
PL.nextSibling.appendChild(addLabel);
PL.nextSibling.appendChild(addBr);
}
// Check if it is selected
function IsChecked1( pText )
{
if(PLV.value != "")
{
var PLVT = PLV.value.split("||");
for( var i = 0; i < PLVT.length; i++ )
{
if( PLVT[i] == pText )
return true;
}
}
return false;
}
// Save the selected text, this filed can also be used in Advanced Find
//crmForm.attachEvent( "onsave" , OnSave);
function OnSave()
{
PLV.value = "";
var getInput = PL.nextSibling.getElementsByTagName("input");
for( var i = 0; i < getInput.length; i++ )
{
if( getInput[i].checked)
{
PLV.value += getInput[i].nextSibling.innerText + "||";
}
}
}
}
}
主要加一些代码,在第一级选其他项是移走多选效果 ,还有jimwang的blog里是把多选结果存在隐藏字段里,我的也是只是在保存的代码放在OnSave事件里没在此处启用。
至于picklist如何四级联动在CRMSDK里已经有很好的例子啦。
posted @ 2010-11-23 17:25 技术小菜鸟 阅读(85) 评论(0)
编辑

2010年11月17日
Microsoft Dynamics CRM 4.0 里account实体里面的左侧导航栏按钮在isv里是不能写javascript函数所以如果要连接需要传递参数的报表就有问题。
我想一个办法在account里的onload里面写一个段代码就能改变这种情况。
1.在account里的onload里写入如下代码。
var CRM_FORM_TYPE_CREATE = 1;
var CRM_FORM_TYPE_UPDATE = 2;
var navId="navTransactionsItem"
if(crmForm.FormType ==CRM_FORM_TYPE_CREATE)
{
//debugger;
displayLeftNavItem('客户交易信息', false);
}
else if(crmForm.FormType == CRM_FORM_TYPE_UPDATE )
{
if(document.getElementById(navId) != null)
{
var navElement = document.getElementById(navId);
if(navElement!=null )
{
var accountcode = crmForm.all.accountnumber.DataValue;
//debugger;
if(accountcode!=null)
{
var url=
'https://crmtest.msfunds.com.cn/ReportServer/Pages/ReportViewer.aspx?%2fMSHF-DEV_MSCRM%2f%e5%ae%a2%e6%88%b7%e4%ba%a4%e6%98%93%e6%b5%81%e6%b0%b4&rs:Command=Render&CUSTID='+accountcode;
navElement.onclick = function LoadAreaOverride() {
openIsvWin(url, false, -1, '')
}
}
else
{
setLeftNavItemState('客户交易信息', true);
}
}
}
}
注意:openIsvWin 这个javascript函数是CRM 4.0 特有全局函数,任何地方都可用,就是它让报表再点击左侧栏按钮时加载报表,setLeftNavItemState displayLeftNavItem 这两个函数是我自己定义的用来显示隐藏和启用禁用左侧栏按钮。
实现效果如图:

posted @ 2010-11-17 13:15 技术小菜鸟 阅读(1456) 评论(2)
编辑