在MS CRM系统中,有一种字段类型是partylist,该类型的字段可以存储多个lookup值,例如电子邮件实体中的收件人、抄送以及密件抄送等字段都是partylist类型的。PartyList类型字段的使用效果截屏如下图所示。

MS CRM 4中模拟PartyList字段的方法

    点击控件右侧的MS CRM 4中模拟PartyList字段的方法 图标,进行查找时,PartyList类型的字段所对应的查找对话框是lookupmulti对话框,而普通的lookup类型字段所对应的查找对话框是lookupsingle对话框。两种对话框的对比如下图所示。

MS CRM 4中模拟PartyList字段的方法 MS CRM 4中模拟PartyList字段的方法

LookupMulti对话框

LookupSingle对话框

 

    很不幸的是,CRM实施人员无法创建PartyList类型的字段——在创建字段时,字段的数据类型列表中没有PartyList这一条目。字段数据类型列表如下图所示

MS CRM 4中模拟PartyList字段的方法

     而很多时候,最终用户希望能够使用PartyList类型的字段。怎么办呢,首先是试图说服客户,这种字段我们无能为力;其次呢,在客户坚持需要的情况下,只好模拟一个吧——客户总是上帝,上帝都说话了,我们就遵守吧——虽然,我的信仰是佛祖。

    创建PartyList字段的步骤,主要是两步,第一,创建字段,用于存储数据;第二,创建脚本,完成界面渲染以及数据保存。

    工作目标:在电子邮件表单中,添加架构名称为new_partylistfield的字段,该字段具有收件人的外观特性,而且,该字段对应的查找对话框的数据类型只能够是系统用户。

    为了上面的目标努力吧:

    第一步, 在电子邮件实体中添加两个字段,架构名称分别是new_partylistfield以及new_partylistcontent,两个字段的属性信息如下图所示。

MS CRM 4中模拟PartyList字段的方法 MS CRM 4中模拟PartyList字段的方法

new_partylistfield字段信息

new_partylistcontent字段信息

 

  向电子邮件表单中添加这两个字段,最终的界面效果如下图。

MS CRM 4中模拟PartyList字段的方法

    第二步,编写脚本,

    OnLoad事件的脚本如下所示

function onLoad()
{
    var fieldName = "new_partylistfield";
    var input = document.getElementById(fieldName);
    var tabIndex = input.tabIndex;
    var label = document.getElementById(fieldName + "_c").innerText;
    var str = "<TABLE style='TABLE-LAYOUT: fixed' class=ms-crm-Lookup cellSpacing=0 cellPadding=0 width='100%'>" +
            "<TBODY>" +
            "<TR>" +
            "<TD>";
    if (crmForm.all.new_partylistcontent.DataValue != null)
    {
        str += "<DIV class=ms-crm-Lookup tabIndex=" + (parseInt(tabIndex) + 1).toString() + " ime-mode='auto'>";
        //<r><u ;
    }

    str += "<LABEL class=ms-crm-Hidden-NoBehavior for=" + fieldName + "_ledit>" + label + "</LABEL>";
    str += "<INPUT ;
    input.parentNode.innerHTML = str;
}

    这段函数主要的作用就是根据new_partylistcontent字段中的内容填充new_partylistfield字段的展现样式以及其中包含的数据。

    OnSave事件的脚本如下:

function onSave()
{
    var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
    xmlDoc.loadXML("<r></r>");
    var root = xmlDoc.firstChild;

    var fieldName = "new_partylistfield";
    var tbl = document.getElementById(fieldName + "_d").firstChild;
    var div = tbl.rows[0].cells[0].firstChild;
    for (var i = 0; i < div.childNodes.length; i++)
    {
        var uNode = root.appendChild(xmlDoc.createElement("u"));
        uNode.setAttribute("id", div.childNodes[i].oid);
        uNode.setAttribute("n", div.childNodes[i].firstChild.innerText);
    }
    crmForm.all.new_partylistcontent.DataValue = xmlDoc.xml;
    crmForm.all.new_partylistfield.DataValue = null;
}

    这段代码,就是解析new_partylistfield字段中的数据信息,将其转换为xml格式的字符串,以保存到new_partylistcontent字段中。

 

    为表单创建了事件处理脚本后,保存,发布,打开电子邮件表单,看一下效果。如下图所示:

MS CRM 4中模拟PartyList字段的方法

    当然,为了界面显示的需要,可以将new_partylistcontent字段进行隐藏。

相关文章: