如何使用来自连接查询的数据在Sharepoint中创建数据视图?

时间:2009-01-22 03:21:09

标签: sharepoint dataview

我在Sharepoint中有3个列表。

我想创建一个数据视图,它是3个表的连接。

Table1与FieldA上的Table2连接在一起 表2加入了FieldB上的表3

Table1在FieldA中有重复的值,所以我只需要返回一个值来加入Table2。

在Access中,我的查询如下所示: SELECT DISTINCT WRK_InputWorkOrders.WorkOrder,Production1。[Part Number],Production1。[Work Order],Production1.Location,StationItems.Station,Production1.Description,Production1.Revision,WRK_InputWorkOrders.Status FROM StationItems INNER JOIN(WRK_InputWorkOrders INNER JOIN Production1 ON WRK_InputWorkOrders.WorkOrder = Production1。[Work Order])ON StationItems.Item = Production1。[Part Number] WHERE(((WRK_InputWorkOrders.Status)<>“关闭”));

有没有办法为数据视图编写类似sql的查询?

我有Sharepoint Designer 2007和Access。

目标是获取用户可以在Internet Explorer中查看的报告。 我尝试过使用this方法。但它返回重复记录 我找到了this的建议。它建议使用XPath过滤器 不(@yourvalue = preceding-sibling :: dfs:YourRepeatingRowName / @ yourvalue)

但是无法让它发挥作用。我不知道输入什么作为YourRepeatingRowName

我找到了this链接。有谁知道它是否可以用于执行这样的连接?

5 个答案:

答案 0 :(得分:1)

您的问题更多的是ADO.NET问题。不幸的是,ADO.NET没有一种简单的方法可以做到这一点,这就是像Bamboo Solutions这样的公司构建他们的Cross List Web部件的原因: http://store.bamboosolutions.com/pc-42-1-cross-list-web-part.aspx

否则我会尝试使用LINQ来查询表。你可能会有更多的运气。

以下是MS提供的JOIN查询示例(我只更改了前两个DataTable行以表示使用SPListItemCollection对象填充DataTable)

DataTable orders = spListCol1.ToDataTable();
DataTable details = spListCol2.ToDataTable();

var query =
    from order in orders.AsEnumerable()
    join detail in details.AsEnumerable()
    on order.Field<int>("SalesOrderID") equals
        detail.Field<int>("SalesOrderID")
    where order.Field<bool>("OnlineOrderFlag") == true
    && order.Field<DateTime>("OrderDate").Month == 8
    select new
    {
        SalesOrderID =
            order.Field<int>("SalesOrderID"),
        SalesOrderDetailID =
            detail.Field<int>("SalesOrderDetailID"),
        OrderDate =
            order.Field<DateTime>("OrderDate"),
        ProductID =
            detail.Field<int>("ProductID")
    };

DataTable orderTable = query.CopyToDataTable(); 

答案 1 :(得分:1)

微软有一个视频演示和一个可能正是你想要的写作:

在单个数据视图中显示来自多个来源的数据 http://office.microsoft.com/en-us/sharepointdesigner/HA103511401033.aspx

使用Microsoft Office SharePoint Designer 2007,您可以链接包含相关数据的两个或多个数据源,然后创建一个显示来自这些链接数据源的数据的数据视图。

答案 2 :(得分:0)

您想在SharePoint Designer中显示查询结果吗?我相信,SPD合并了数据源。看看那个。

答案 3 :(得分:0)

我发现第三部分添加

  

Enesys RS数据扩展允许您从任何SharePoint列表中查询(检索,加入,合并......)数据,并使用结果来构建“Reporting Services”报告,就像使用任何其他数据源一样。 http://www.enesyssoftware.com/

我无法使用它,因为我目前正在运行使用内部数据库的基本Sharepoint版本。

答案 4 :(得分:0)

我做过类似的事情,但我无法使用数据视图。我最后编写了一个自定义Web部件来完成它。方法是:

  1. 使用SPQuery对象为每个列表获取SPListItemCollection。使用CAML查询来限制返回的项目。
  2. 使用SPListItemCollection对象的GetDataTable()方法为每个列表检索ADO.NET DataTable对象。
  3. 将表添加到DataSet对象。
  4. 在表格之间创建关系。
  5. 使用DataListRepeater或其他方式呈现您喜欢的数据。
  6. 以下是一些显示广泛笔画的代码:

    protected DataTable GetDataTableFromQuery(string camlQry, SPList theList) {
      SPQuery listQry = new SPQuery();  
      listQry.Query = camlQry;  
      SPListItemCollection listItems = theList.GetItems(listQry);  
      return listItems.GetDataTable();
    }
    
    protected void BuildDataSet() {  
      // get SPList objects for the lists in questions ... left as an exercise for the dev -- call them list1, list2, and list3  
      string camlQry = "the CAML necessary to retreive the ites from list1";  
      DataTable table1 = GetDataTable(camlQry, list1);  
      table1.TableName = "Table1";  
      camlQry = "the CAML necessary to retreive the ites from list2";  
      DataTable table2 = GetDataTable(camlQry, list2);  
      table1.TableName = "Table2";  
      camlQry = "the CAML necessary to retreive the ites from list3";  
      DataTable table3 = GetDataTable(camlQry, list3);  
      table1.TableName = "Table3";  
    
      // now build the DataSet
      DataSet ds = new DataSet();  
      ds.Tables.Add(table1);  
      ds.Tables.Add(table2);  
      ds.Tables.Add(table3);  
      ds.Relations.Add("Table1_2", ds.Tables["Table1"].Columns["FieldA"], ds.Tables["Table2"].Columns["FieldA"]);  
      ds.Relations.Add("Table2_3", ds.Tables["Table2"].Columns["FieldB"], ds.Tables["Table3"].Columns["FieldB"]);  
    
      // now you can do something with these, like store them in the web part class and bind them to repeaters in the web part's Render() method
    }