具有CAML查询的SharePoint级联下拉列表可过滤其中一个选项

时间:2011-04-14 11:16:04

标签: sharepoint caml

我使用http://spservices.codeplex.com创建了一个级联下拉表单,但是想在第三个级联下拉列表中添加一个过滤器。所以SPServices有一个名为CAMLQuery的函数,我可以在其中添加这个过滤器,但我希望使用表单顶部下拉列表中的值来指定过滤器。

页面上给出的一个例子是:

            CAMLQuery: "<Eq><FieldRef Name='Status'/><Value Type='Text'>Active</Value></Eq>"

我希望此状态列从表单上字段选择的选项中获取其值。这有可能,我该怎么写呢?


编辑:我正在尝试使用级联选项创建资产列表,以便在选择单位和部门后找到正确的资产。 尝试以下答案后的代码示例,并且未在“资产”选择器中显示任何内容。有两个列表,一个包含Units和Departments,另一个包含具有要过滤的Department和Unit键的资产。 如果我用静态查询替换“动态”查询,例如:

CAMLQuery: "<Eq><FieldRef Name='Unit'/><Value Type='Text'>Unit 1</Value></Eq>"

该资产的资产似乎已过滤。目前的代码:

<script language="javascript" type="text/javascript" src="../../Hidden/jquery-1.5.2.min.js"></script>
<script language="javascript" type="text/javascript" src="../../Hidden/jquery.SPServices-0.6.0.min.js"></script>
<script language="javascript" type="text/javascript">
var sCamlQuery = "";

$(document).ready(function() {
    $().SPServices.SPCascadeDropdowns({
        relationshipList: "Departments",
        relationshipListParentColumn: "Unit",
        relationshipListChildColumn: "Title",
        parentColumn: "Unit",
        childColumn: "Department",
        completefunc: function() {
        sCamlQuery = "<Eq><FieldRef Name='Unit'/><Value Type='Text'>" + $("select[title='Unit']").attr("spcascadedropdown_selected_") + "</Value></Eq>";
        }
    });
        $().SPServices.SPCascadeDropdowns({
        relationshipList: "Asset Database",
        relationshipListParentColumn: "Department",
        relationshipListChildColumn: "Title",
        parentColumn: "Department",
        childColumn: "Asset",
        CAMLQuery: sCamlQuery
    });

});

HTML:

<tr>
<td width="190px" valign="top" class="ms-formlabel">
    <H3 class="ms-standardheader"><nobr>Unit</nobr></H3>
</td>
<td width="400px" valign="top" class="ms-formbody">
    <span dir="none">
        <select name="ctl00$PlaceHolderMain$g_c482307d_1a31_4129_8a0a_376d70562746$ff3_1$ctl00$Lookup" id="ctl00_PlaceHolderMain_g_c482307d_1a31_4129_8a0a_376d70562746_ff3_1_ctl00_Lookup" title="Unit">
            <option selected="selected" value="0">(None)</option>
            <option value="1">Unit 1</option>
            <option value="2">Unit 2</option>
        </select>
    </span>¨
</td>
</tr>

<tr>
<td width="190px" valign="top" class="ms-formlabel">
    <H3 class="ms-standardheader"><nobr>Department</nobr></H3>
</td>
<td width="400px" valign="top" class="ms-formbody">
    <span dir="none">
        <select name="ctl00$PlaceHolderMain$g_c482307d_1a31_4129_8a0a_376d70562746$ff4_1$ctl00$Lookup" id="ctl00_PlaceHolderMain_g_c482307d_1a31_4129_8a0a_376d70562746_ff4_1_ctl00_Lookup" title="Department">
            <option selected="selected" value="0">(None)</option>
            <option value="5">Administration</option>
            <option value="4">IT</option>
            <option value="1">Kitchen</option>
            <option value="2">Production</option>
            <option value="7">Production</option>
            <option value="6">Sales</option>
            <option value="3">Warehouse</option>
        </select>
    </span>
</td>
</tr>

<tr>    
<td width="190px" valign="top" class="ms-formlabel">
    <H3 class="ms-standardheader"><nobr>Asset</nobr></H3>
</td>
<td width="400px" valign="top" class="ms-formbody">
    <span dir="none">
        <select name="ctl00$PlaceHolderMain$g_c482307d_1a31_4129_8a0a_376d70562746$ff5_1$ctl00$Lookup" id="ctl00_PlaceHolderMain_g_c482307d_1a31_4129_8a0a_376d70562746_ff5_1_ctl00_Lookup" title="Asset">
            <option selected="selected" value="0">(None)</option>
            <option value="3">Computer</option>
            <option value="2">Copy machine</option>
            <option value="1">Dishwasher</option>
            <option value="5">Dishwasher</option>
            <option value="4">Oven</option>
        </select>
    </span>
</td>
</tr>

验证功能:

<script language="javascript" type="text/javascript" src="../../Hidden/jquery-1.5.2.min.js"></script>
<script language="javascript" type="text/javascript" src="../../Hidden/jquery.SPServices-0.6.0.min.js"></script>
<script language="javascript" type="text/javascript">
var sCamlQuery = "";

$(document).ready(function() {

    $().SPServices.SPCascadeDropdowns({
        relationshipList: "Departments",
        relationshipListParentColumn: "Unit",
        relationshipListChildColumn: "Title",
        parentColumn: "Unit",
        childColumn: "Department",
        completefunc: function() {
        sCamlQuery = window.alert("completefunc");//"<Eq><FieldRef Name='Unit'/><Value Type='Text'>"+ $("select[title='Unit'] option:selected").text() +"</Value></Eq>";
                                }
    });

        $().SPServices.SPCascadeDropdowns({
        relationshipList: "Asset Database",
        relationshipListParentColumn: "Department",
        relationshipListChildColumn: "Title",
        parentColumn: "Department",
        childColumn: "Asset",
        CAMLQuery: sCamlQuery
    });

});
</script>

部门列表:

标题 单位

IT Unit1

销售单位1

IT Unit2

销售单位2

资产数据库:

标题 部门 *单位*

Asset1 IT Unit1

Asset2 IT Unit2

大卫

2 个答案:

答案 0 :(得分:0)

查看SPCascadeDropdowns的文档,您可以指定在父列更改时执行的回调函数。这似乎是您需要连接所需要的钩子。

你没有发布任何代码示例,所以我只需要做些什么。他们的演示页面使用了Region,State和City,所以让我们一起玩吧。

如果我想根据所选的“地区”值向“城市”添加过滤器,我可能会使用这个:

var sCamlQuery = "";

// Cascade definition for State dropdown
$().SPServices.SPCascadeDropdowns({
    relationshipList: "States",
    relationshipListParentColumn: "Region",
    relationshipListChildColumn: "Title",
    relationshipListSortColumn: "Title",
    parentColumn: "Region",
    childColumn: "State" 
    completefunc: function() {
        sCamlQuery = "<Eq><FieldRef Name='Status'/><Value Type='Text'>" + $("select[title='Region'] option:selected").text() + "</Value></Eq>";
    })
});

// Cascade definition for City dropdown
$().SPServices.SPCascadeDropdowns({
    relationshipList: "Cities",
    relationshipListParentColumn: "State",
    relationshipListChildColumn: "Title",
    parentColumn: "State",
    childColumn: "City",
    CAMLQuery: sCamlQuery
});

这是一个非常天真的jQuery选择器来查找SELECT元素(查看TITLE属性),但你应该明白这个想法。每当父列(“Region”)发生更改时,就会运行为completefunc定义的匿名函数,并更新全局变量sCamlQuery的值。当“City”级联运行时,它将使用生成的CAML查询。


编辑:更新了示例以更好地匹配OP场景。当最顶层的级联运行(“区域”)时,它将触发“状态”级联中的completefunc匿名方法。这将设置sCamlQuery变量的值,并在“City”级联运行时使用。


编辑#2:更新了示例代码以使用更通用的jQuery选择器;它将检索所选OPTION的文本值。如果您想要OPTION ,则可以将其简化为:$("select[title='Region']").val()

答案 1 :(得分:0)

大卫:

你真的应该在SPServices site in the Discussions开始问这个!

您在上面的代码中显示的内容不是必需的。如果您按照显示的顺序对SPCascadeDropdowns进行两次调用,那么您不需要

CAMLQuery: "<Eq><FieldRef Name='Unit'/><Value Type='Text'>Unit 1</Value></Eq>" 

这就是级联的工作方式。第一次调用将部门限制为选择单位时所选单位的部门。第二次调用会将资产限制为选择部门时所选部门的资产。

如果您没有得到预期的结果,那么您的关系列表可能没有您需要的值。

微米。

根据列表内容的其他信息进行编辑:

这绝对是一个数据问题。您正在组合部门列表和资产列表中的关系。你应该有这些清单:

  • 部门 - 每个部门 只列出一次。
  • 单位 - 每个单位 在列表中只有一次,带有 列作为标题的查找 部门指示单位的 系。
  • 资产 - 每个资产 列表恰好一次,带有一列 作为单位标题的查找 表明资产的单位。

这使您的列表真正成为关系,然后对SPCascadeDropdowns的调用将按照您所需的方式执行,就像国家/地区/州/城市的文档中的示例一样。