viernes, 10 de mayo de 2013

Exportar vistas de datos a otros sitios en Sharepoint 2010

Hoy nos han solicitado visualizar una vista de datos que ya teníamos creada en otro sitio, que jérarquicamente es paralelo al que residía dicha vista de datos.

La respuesta inicial ha sido no se puede hacer... Lo tenemos que hacer por medio de una consulta de contenido.

Pero un compañero me ha comentado, que una vez había leido un artículo sobre esto y que se podía hacer. Y tenía razón.

Tras buscar en San Google, he descubierto como hacerlo y que la única limitación que tiene es que no puede hacerse entre colecciones de sitios.

La idea básica es definir un parámetro donde resida la url, referenciarnos a la lista por medio de su nombre y borrar cualquier referencia del ID de la cabecera.

Para ello, he copiado todo el código de la vista de datos de una ventana de Designer a otra.

Y en la parte final de la webpart he localizado la parte de Datasources:

<DataSources>
<SharePoint:SPDataSource runat="server" DataSourceMode="List" SelectCommand="&lt;View&gt;&lt;Query&gt;&lt;Where&gt;&lt;Eq&gt;&lt;FieldRef Name=&quot;Boardposition&quot;/&gt;&lt;Value Type=&quot;Text&quot;&gt;Chairman of the Board&lt;/Value&gt;&lt;/Eq&gt;&lt;/Where&gt;&lt;/Query&gt;&lt;/View&gt;" UseInternalName="True" UseServerDataFormat="True" ID="dataformwebpart5">

<SelectParameters>
<WebPartPages:DataFormParameter ParameterKey="ListID" PropertyName="ParameterValues" DefaultValue="{A4E0CBBA-E3F2-4437-BE7D-3889E53AC63A}" Name="ListID">
</WebPartPages:DataFormParameter><asp:Parameter DefaultValue="0" Name="StartRowIndex">
</asp:Parameter>
<asp:Parameter DefaultValue="0" Name="nextpagedata">
</asp:Parameter>
<asp:Parameter DefaultValue="1" Name="MaximumRows">
</asp:Parameter>
</SelectParameters>

<UpdateParameters>
<WebPartPages:DataFormParameter ParameterKey="ListID" PropertyName="ParameterValues" DefaultValue="{A4E0CBBA-E3F2-4437-BE7D-3889E53AC63A}" Name="ListID">
</WebPartPages:DataFormParameter></UpdateParameters>
<InsertParameters>
<WebPartPages:DataFormParameter ParameterKey="ListID" PropertyName="ParameterValues" DefaultValue="{A4E0CBBA-E3F2-4437-BE7D-3889E53AC63A}" Name="ListID">
</WebPartPages:DataFormParameter></InsertParameters>
<DeleteParameters>
<WebPartPages:DataFormParameter ParameterKey="ListID" PropertyName="ParameterValues" DefaultValue="{A4E0CBBA-E3F2-4437-BE7D-3889E53AC63A}" Name="ListID">
</WebPartPages:DataFormParameter>
</DeleteParameters>
</SharePoint:SPDataSource>
</DataSources>

Lo primero que hago es quitar toda la parte de UpdateParameters, InsertParameters y DeleteParameters, que tiene referencias directas al ID de la lista.

Lo siguiente introduzco un DataFormParameter para facilitar la URL del sitio donde reside la lista que queremos mostrar (en mi caso /areas/boardgovernorspublic/ (en varios hilos de discusión de internet recomiendan no poner rutas incluyendo el servidor, porque puede dar problemas)):

<WebPartPages:DataFormParameter Name="WebURL" ParameterKey="WebURL" PropertyName="ParameterValues" DefaultValue="/areas/boardgovernorspublic/"/>

Después de esto ha sido sustituir en la linea de ListId:
<WebPartPages:DataFormParameter ParameterKey="ListID" PropertyName="ParameterValues" DefaultValue="{A4E0CBBA-E3F2-4437-BE7D-3889E53AC63A}" Name="ListID">

Las referencias por ListName:
<WebPartPages:DataFormParameter ParameterKey="ListName" PropertyName="ParameterValues" DefaultValue="Members of the Board of Governors" Name="ListName">

Poniendo el nombre de la lista (en mi caso Members of the Board of Governors).

Quedándome toda esa parte:
<DataSources>
<SharePoint:SPDataSource runat="server" DataSourceMode="List" SelectCommand="&lt;View&gt;&lt;Query&gt;&lt;Where&gt;&lt;Eq&gt;&lt;FieldRef Name=&quot;Boardposition&quot;/&gt;&lt;Value Type=&quot;Text&quot;&gt;Chairman of the Board&lt;/Value&gt;&lt;/Eq&gt;&lt;/Where&gt;&lt;/Query&gt;&lt;/View&gt;" UseInternalName="True" UseServerDataFormat="True" ID="dataformwebpart5">

<SelectParameters>
<WebPartPages:DataFormParameter ParameterKey="ListName" PropertyName="ParameterValues" DefaultValue="Members of the Board of Governors" Name="ListName">
</WebPartPages:DataFormParameter>
<asp:Parameter DefaultValue="0" Name="StartRowIndex">
</asp:Parameter>
<asp:Parameter DefaultValue="0" Name="nextpagedata">
</asp:Parameter>
<asp:Parameter DefaultValue="1" Name="MaximumRows">
</asp:Parameter>
<WebPartPages:DataFormParameter Name="WebURL" ParameterKey="WebURL" PropertyName="ParameterValues" DefaultValue="/areas/boardgovernorspublic/"/>
</SelectParameters>
</SharePoint:SPDataSource>
</DataSources>


Y por último he ido a la parte de la cabecera y eliminando cualquier referencia a ListID y ListName:

<WebPartPages:DataFormWebPart runat="server" Description="" ListDisplayName="" PartOrder="8" HelpLink="" AllowRemove="True" IsVisible="True" AllowHide="True" UseSQLDataSourcePaging="True" ExportControlledProperties="True" IsIncludedFilter="" DataSourceID="" Title="Members of the Board of Governors" ViewFlag="8" NoDefaultStyle="TRUE" AllowConnect="True" FrameState="Normal" PageSize="1" PartImageLarge="" AsyncRefresh="False" ExportMode="All" Dir="Default" DetailLink="" ShowWithSampleData="False" ListId="a4e0cbba-e3f2-4437-be7d-3889e53ac63a" ListName="{A4E0CBBA-E3F2-4437-BE7D-3889E53AC63A}" FrameType="None" PartImageSmall="" IsIncluded="True" SuppressWebPartChrome="False" AllowEdit="True" EnableOriginalValue="False" ChromeType="None" AutoRefresh="False" AutoRefreshInterval="60" AllowMinimize="True" ViewContentTypeId="" InitialAsyncDataFetch="False" MissingAssembly="Cannot import this Web Part." HelpMode="Modeless" ListUrl="" ID="g_6cce0ebf_15e1_4302_8901_638be1ef03cd" ConnectionID="00000000-0000-0000-0000-000000000000" AllowZoneChange="True" ManualRefresh="False" __MarkupType="vsattributemarkup" __WebPartId="{6CCE0EBF-15E1-4302-8901-638BE1EF03CD}" __AllowXSLTEditing="true" WebPart="true" Height="" Width="">

Quedando de la siguiente manera:

<WebPartPages:DataFormWebPart runat="server" Description="" ListDisplayName="" PartOrder="2" HelpLink="" AllowRemove="True" IsVisible="True" AllowHide="True" UseSQLDataSourcePaging="True" ExportControlledProperties="True" IsIncludedFilter="" DataSourceID="" Title="Members of the Board of Governors" ViewFlag="8" NoDefaultStyle="TRUE" AllowConnect="True" FrameState="Normal" PageSize="1" PartImageLarge="" AsyncRefresh="False" ExportMode="All" Dir="Default" DetailLink="" ShowWithSampleData="False" FrameType="None" PartImageSmall="" IsIncluded="True" SuppressWebPartChrome="False" AllowEdit="True" EnableOriginalValue="False" ChromeType="None" AutoRefresh="False" AutoRefreshInterval="60" AllowMinimize="True" ViewContentTypeId="" InitialAsyncDataFetch="False" MissingAssembly="Cannot import this Web Part." HelpMode="Modeless" ListUrl="" ID="g_6cce0ebf_15e1_4302_8901_638be1ef03cd" ConnectionID="00000000-0000-0000-0000-000000000000" AllowZoneChange="True" ManualRefresh="False" __MarkupType="vsattributemarkup" __WebPartId="{6CCE0EBF-15E1-4302-8901-638BE1EF03CD}" __AllowXSLTEditing="true" WebPart="true" Height="" Width="">

Y con eso he conseguido mostrar el dataview, en un sitio distinto al que se encuentra la lista.
Como referencia he utilizado los siguientes artículos en inglés:
http://sympmarc.com/2010/11/02/using-a-datasource-in-a-data-view-web-part-dvwp-in-a-different-site-in-sharepoint-designer-2010/
http://sympmarc.com/2008/12/16/replacing-listids-with-listnames-in-data-view-web-parts/