设为首页 收藏本站
查看: 1356|回复: 0

[经验分享] InfoPath与SharePoint结合动态查询数据

[复制链接]

尚未签到

发表于 2015-9-24 09:25:48 | 显示全部楼层 |阅读模式
  最近的一个项目中,客户提出需求,希望在SharePoint进行工作计划与工作总结的填写。初看时觉得这是一个简单到不行的需求,但客户同时还提出了希望在填写工作总结时能够查看工作计划,对照着计划来写总结。这也没有什么,用数据视图也可以很好的解决。不过事情往往没那么简单......
     我们先来看下客户以前的工作计划与总结的填写方式。根据客户所说,他们是每周写一次工作计划与总结,原先就是在Word中进行填写,格式如下:
    DSC0000.png
     客户提出的最终要求就是希望能够仍然保持这种表格式的填写方式。
     无奈啊~~~
     考虑再三还是用InfoPath实现起来比较简单。
     好了,废话说的差不多了,开始正式的内容。
     先在SharePoint中建两个表单库,并分别命名为WorkPlain与WorkSummary,留待备用。
     接着我们先设计工作计划表单,这个表单比较简单,不需要什么代码。
   DSC0001.png
     需要注意两点:
     一定要选上“仅启用浏览器功能”;
  为表单进行属性提升,位置在“工具”>“表单选项”>“属性提升”, 这里是设置在SharePoint表单库中与该表单向对应的字段的地方。设置的方式很简单,不过有一个地方要注意,由于我们的表单中使用了重复表,因此在为重复表中的字段进行属性提升时,在函数一栏一定要选择合并。(切记切记,关系到未来从工作总结表读取数据的问题,如果选择第一个或最后一个,那么以后读取的数据也仅仅是第一个或最后一个)
      DSC0002.png
     最后将这个表单发布到我们刚才建立好的WorkPlain表单库就OK了。
     在发布成功后我们就可以着手设计工作总结表单了,总结表单要比计划表单复杂很多,我将一步一步的进行说明:
     第一步:设计工作总结表单布局,这步不难,与刚才我们创建的计划表单类似,不过在下方多了工作计划查询的部分。
    DSC0003.png
     第二步,建立数据源。
  在设计好表单后,还需要建立相应的数据源,用来提交表单数据或从SharePoint中读取数据。在这张工作总结表单中我们需要建立四个数据源。
      DSC0004.gif
     其中WorkPlain与WorkContent这两个数据源除了名字不同,其他完全相同,他们都是用来读取WorkPlain表单库中数据的。      
      DSC0005.gif
     该数据源中包含的字段要与前面上传的WorkPlain表单中进行属性提升的字段相对应,同时还应选择创建者这个字段,以用来在填写表单时来筛选出当前用户所填写的表单。
     建立好WorkPlain与WorkContent两个数据连接后,还需要建立一个用于取得当前用户的数据连接。
     建立新数据连接,在数据来源选项中,选择来自Web服务。
      DSC0006.gif
  在Web服务位置处输入:http://moss服务器名称/_vti_bin/UserProfileService.asmx?WSDL
DSC0007.gif
  选择GetUserProfileByName操作,随后一直下一步即可。
DSC0008.gif
  最后还有一个作为提交数据的数据连接,因为比较简单就不详述了。
  接下来,打开工作计划选择下拉框的属性设置界面
DSC0009.gif
  选择从外部数据源查找值,并将刚才建立的WorkPlain数据连接做为数据源,将标题字段作为该下来列表的值字段。设置好后我们还需要实现根据当前用户来对该数据源进行筛选,使下拉框中出现的仅是由当前用户所创建的工作计划的标题。
  由于表单采用了与浏览器兼容模式,所以InfoPath自带的数据源筛选功能就不能用了,只能靠代码来实现这部分功能。
  选择工具>编程,为表单的Loading事件编写代码。
  代码部分如下:

DSC00010.gif DSC00011.gif Code
1 DSC00012.gif public void FormEvents_Loading(object sender, LoadingEventArgs e)
2         DSC00013.png {
3            //查询用户
4            string selectUserName = "";
5            string selectSourceName = "GetUserProfileByName";
6            XPathNavigator selectXPath = this.DataSources[selectSourceName].CreateNavigator();
7            string selectXPathString = "/dfs:myFields/dfs:dataFields/s0:GetUserProfileByNameResponse/s0:GetUserProfileByNameResult/s0:PropertyData/s0:Values/s0:ValueData/s0:Value[http://www.cnblogs.com/../s0:Name = 'LastName']";
8            XPathNodeIterator selectItems = selectXPath.Select(selectXPathString, this.NamespaceManager);
9            if (selectItems.Count!=0)
10            {
11                selectUserName = selectXPath.SelectSingleNode(selectXPathString, this.NamespaceManager).ToString();
12            }
13            // 根据当前用户筛选数据。
14            string dataConnectionName = "WorkPlain";
15            string dataSourceName = "WorkPlain";
16            DataConnection dc = this.DataConnections[dataConnectionName];
17            dc.Execute();
18            XPathNavigator xpn = this.DataSources[dataSourceName].CreateNavigator();
19            string xPathString = "/dfs:myFields/dfs:dataFields/dfs:工作计划[@创建者!='" + selectUserName + "']";
20            XPathNodeIterator items = xpn.Select(xPathString, this.NamespaceManager);
21            while (items.Count!=0)
22            {
23                xpn.SelectSingleNode(xPathString, this.NamespaceManager).DeleteSelf();
24                items = xpn.Select(xPathString, this.NamespaceManager);
25            }
26        }  下拉框完成后我们还需为查询按钮编写代码

Code
public void CTRL27_5_Clicked(object sender, ClickedEventArgs e)
        {
            DataConnection dc = this.DataConnections["WorkContent"];
            dc.Execute();
            XPathNavigator xpn = this.DataSources["WorkContent"].CreateNavigator();
            string selectWorkName = this.MainDataSource.CreateNavigator().SelectSingleNode("/my:myFields/my:plainselect", this.NamespaceManager).Value;
            if (selectWorkName != "")
            {
                string xPathString = "/dfs:myFields/dfs:dataFields/dfs:工作计划[@标题!='" + selectWorkName + "']";
                XPathNodeIterator items = xpn.Select(xPathString, this.NamespaceManager);
                while (items.Count != 0)
                {
                    xpn.SelectSingleNode(xPathString, this.NamespaceManager).DeleteSelf();
                    items = xpn.Select(xPathString, this.NamespaceManager);
                }
                string workName = xpn.SelectSingleNode("/dfs:myFields/dfs:dataFields/dfs:工作计划/@工作内容", this.NamespaceManager).Value;
                string[] splitWorkName = workName.Split(' ');
                string workContent = xpn.SelectSingleNode("/dfs:myFields/dfs:dataFields/dfs:工作计划/@工作进度", this.NamespaceManager).Value;
                string[] splitWorkContent = workContent.Split(' ');
                XPathNavigator xMain = this.MainDataSource.CreateNavigator();               
                XPathNodeIterator groupItems = xMain.Select("/my:myFields/my:group8/my:group9", this.NamespaceManager);
                if (groupItems.Count > 1)
                {
                    XPathNavigator first = xMain.SelectSingleNode("/my:myFields/my:group8/my:group9[1]", this.NamespaceManager);
                    XPathNavigator last = xMain.SelectSingleNode("my:myFields/my:group8/my:group9[" + (groupItems.Count - 1) + "]", this.NamespaceManager);
                    xMain.MoveTo(first);
                    xMain.DeleteRange(last);
                }
                XPathNavigator group = xMain.SelectSingleNode("/my:myFields/my:group8/my:group9", this.NamespaceManager);
                for (int i = 0; i < splitWorkContent.Length; i++)
                {
                    if (i == 0)
                    {
                        xMain.SelectSingleNode("/my:myFields/my:group8/my:group9/my:plainname", this.NamespaceManager).SetValue(splitWorkName);
                        xMain.SelectSingleNode("/my:myFields/my:group8/my:group9/my:plaincontent", this.NamespaceManager).SetValue(splitWorkContent);
                        xMain.SelectSingleNode("/my:myFields/my:group8/my:group9/my:id", this.NamespaceManager).SetValue(i.ToString());
                    }
                    else
                    {
                        XPathNavigator newRow = group.Clone();
                        newRow.InsertBefore(group);
                        newRow.SelectSingleNode("my:plainname", this.NamespaceManager).SetValue(splitWorkName);
                        newRow.SelectSingleNode("my:plaincontent", this.NamespaceManager).SetValue(splitWorkContent);
                        newRow.SelectSingleNode("my:id", this.NamespaceManager).SetValue(i.ToString());
                    }
                }
            }
        }  最后一步就是发布了,由于在表单中编写了代码,所以还需要修改下表单的安全性设置。
  选择工具>表单选项>安全和信任,将安全级别选为完全信任

  在发布位置中选择网络位置,然后进入SharePoint管理中心上传表单。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-118036-1-1.html 上篇帖子: Sharepoint学习笔记—ECMAScript对象模型系列-- 8、组与用户操作(一) 下篇帖子: SharePoint中CAML使用的一些总结
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表