Chinaunix首页 | 论坛 | 博客
  • 博客访问: 8236898
  • 博文数量: 444
  • 博客积分: 10593
  • 博客等级: 上将
  • 技术积分: 3852
  • 用 户 组: 普通用户
  • 注册时间: 2006-05-09 15:26
文章分类

全部博文(444)

文章存档

2014年(1)

2013年(10)

2012年(18)

2011年(35)

2010年(125)

2009年(108)

2008年(52)

2007年(72)

2006年(23)

分类: 系统运维

2010-03-21 13:53:57

场景: SharePoint 2007 InfoPath Forms Services

读者: 适合对InfoPath表单设计有一定经验的朋友

在浏览器中使用InfoPath表单时, 经常要使用数据连接从数据源调用数据, 在浏览器中, 能使用参数查询(筛选)的就只有Web Service可以实现, 用参数查询数据库是要写代码了(如Dosboy翻译的 http://kb.cnblogs.com/a/1600492/ 谢谢!), 查询SharePoin的列表数据虽然可以直接使用, 但要实现筛选就比较困难, 在不写代码的情况下, 可以使用表单节控件的条件格式进行筛选, 但如果数据量大, 客户端浏览器的CPU占用就经常100%(客户端的AJAX代码), 返回数据量大, 也明显不是办法. SharePoint本身有Web Service, 但InfoPath数据连接不能直接调用(不知微软怎么想的!), 那只有写代码了(园子里有相关示例, 如: http://www.cnblogs.com/sean_zhang/archive/2009/07/23/1529436.html 谢谢!). 折腾了一番以后, 发现还是直接使用SharePoint本身的Web Service是比较好的办法, 返回数据量少, 查询性能也好, 为了更好地重用代码, 我比较建议在服务器上部署Web Service Proxy. 就以参数查询列表数据为例, CodePlex有个好的代码(), 本文就以此为例.

核心代码(VB.NET)

Public Class GetListItems

     _
    Public Function GetListItems(ByVal listName As String, ByVal viewID As String, ByVal query As String, ByVal viewFields As String, ByVal rowLimit As String, ByVal queryOptions As String, ByVal webID As String) As XmlNode
        Dim service As SharePointListsWS.Lists = GetWebServiceInstance(webID)

        Dim queryElement As XmlNode = CreateNode("Query", query)
        Dim viewFieldsElement As XmlNode = CreateNode("ViewFields", viewFields)
        Dim queryOptionsElement As XmlNode = CreateNode("QueryOptions", queryOptions)

        Return service.GetListItems(listName, viewID, queryElement, viewFieldsElement, rowLimit, queryOptionsElement, webID)

    End Function

    Private Function GetWebServiceInstance(ByVal webID As String) As SharePointListsWS.Lists
        Dim service As New SharePointListsWS.Lists
        service.Credentials = System.Net.CredentialCache.DefaultCredentials

        service.Url = SPContext.Current.Web.Url + "/_vti_bin/Lists.asmx"

        Return service
    End Function

    Private Function CreateNode(ByVal name As String, ByVal innerXml As String)
        Dim document As New XmlDocument
        Dim node As XmlNode = document.CreateElement(name)
        node.InnerXml = innerXml
        Return node
    End Function
End Class

  1. 首先在服务器上部署Codeplex下载的解决方案包(具体步骤就不写了), 此时服务器就有了一个可以调用的Proxy.asmx的Web Service.
  2. 在InfoPath模板设计中调用此Web Service
    image 
    image 
    webID是指要连接的网站ID(也可以不填)
    image 
    image
  3. 设计的示例模板如下
    其中"查找ID” 是我们需要输入的参数, 使用主数据源, 重复表的数据则来自于查询返回的结果, 使用刚建立的来自于Web Service的数据源, “确定”按钮无实质意义, 目的只是让焦点从 "查找ID” 中移开, 让其规则生效.
    image 
  4. 查找ID 的更新规则如下:
    image 
    其中前两个规则对Web Service的两个参数进行设置, rowLimit 是返回的行数, 可按实际设置(最好不要设置成1). query 是查询参数, 是设置的重点, 使用CAML查询, 并调用表单中的 [查找ID] 字段作为参数变量, 公式中输出为字符串即可, 公式如下:
    image 
    最后一个规则 [使用数据连接进行查询] 是对刚才输入的参数进行查询.
  5. 表单内不需要写任何代码, 设计好后发布到SharePoint表单库, 并设置为在浏览器中打开(具体步骤不写了)
  6. 在浏览器中打开表单并填写 [查找ID] 后点击 [确定] 就可以返回相应的值, 效果如下:
    image 

    查询后的结果

    image

在实际的应用中, 可以使用此方法实行精确或模糊查询, 只要是CAML能使用的查询方法都行, 可以调用多个参数变量. 也可以实现多级联动的下拉列表查询, 且不用在表单中写代码, 功能还是很强大的, 性能比起在表单中写代码也要好.

阅读(3081) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

yangjian20142014-05-18 18:27:03

博主有试过这个方案,为什么我总是失败。能交流下吗?