Hoy me ha tocado personalizar algunos formularios de nuevo elemento (NewForm.aspx) de algunas listas en un MOSS (SharePoint 2007). Y al comprobar que todo estaba correcto he visto que el componente de adjuntar elementos no funcionaba correctamente.
Daba un error:
Este formulario se ha personalizado no funciona con archivos adjuntos
O:
No se han habilitado los archivos adjuntos en esta lista
Buscando en San Google he encontrado una entrada del "MVP" Gustavo Velez:
http://support.microsoft.com/kb/953271/es
Como Microsoft suele eliminar sus entradas, replico el contenido que Gustavo nos comenta y que funciona a la perfección:
En el código XSL que hemos generado al insertar nuestro formulario personalizado, buscaremos:
<xsl:template name="dvt_1">
<xsl:variable name="dvt_StyleName">ListForm</xsl:variable>
<xsl:variable name="Rows" select="/dsQueryResponse/Rows/Row"/>
<table border="0" width="100%">
<xsl:call-template name="dvt_1.body">
<xsl:with-param name="Rows" select="$Rows"/>
</xsl:call-template>
</table>
</xsl:template>
Y lo reemplazamos por:
<xsl:template name="dvt_1">
<xsl:variable name="dvt_StyleName">ListForm</xsl:variable>
<xsl:variable name="Rows" select="/dsQueryResponse/Rows/Row"/>
<div>
<span id="part1">
<table border="0" width="100%">
<xsl:call-template name="dvt_1.body">
<xsl:with-param name="Rows" select="$Rows"/>
</xsl:call-template>
</table>
</span>
<SharePoint:AttachmentUpload runat="server" ControlMode="Edit"/>
<SharePoint:ItemHiddenVersion runat="server" ControlMode="Edit"/>
</div>
</xsl:template>
Teniendo en cuenta que el ControlMode, si estamos personalizando un formulario de nuevo tendrá el valor New.
Lo siguiente a buscar es la línea:
<xsl:if test="$dvt_1_automode = '1'" ddwrt:cf_ignore="1">
Y justo antes de ella, insertamos:
<tr id="idAttachmentsRow">
<td nowrap="true" valign="top" class="ms-formlabel" width="20%">
<SharePoint:FieldLabel ControlMode="Edit" FieldName="Attachments" runat="server"/>
</td>
<td valign="top" class="ms-formbody" width="80%">
<SharePoint:FormField runat="server" id="AttachmentsField" ControlMode="Edit" FieldName="Attachments" __designer:bind="{ddwrt:DataBind('u','AttachmentsField','Value','ValueChanged','ID',ddwrt:EscapeDelims(string(@ID)),'@Attachments')}"/>
<script>
var elm = document.getElementById("idAttachmentsTable");
if (elm == null || elm.rows.length == 0)
document.getElementById("idAttachmentsRow").style.display='none';
</script>
</td>
</tr>
Teniendo en cuenta otra vez, que si estamos en un formulario de nuevo elemento, ControlMode tendrá el valor de New y _designer:bind, tendrá como primer parámetro "i" (insert), en lugar de "u" (update) que se utilizaría para los formularios de edición.
Tras esto, guardamos nuestro formulario y magia... Ya se adjuntan los documentos.
Y para ver los documentos adjuntos en un formulario de vista de datos (DispForm.aspx) bastaría con añadir:
<SharePoint:AttachmentsField ControlMode="Display" FieldName="Attachments" runat="server" Visible="true"/>
Nota: Vuelvo a recordar que no he inventado la rueda. Esto es una copia del artículo de Gustavo Velez que a mi me ha resultado muy útil.
miércoles, 18 de diciembre de 2013
sábado, 23 de noviembre de 2013
Vista dinámica en Sharepoint
Normalmente en Sharepoint, las vistas que se hacen sobre las listas y/o bibliotecas, suelen ser estáticas. Es decir, se muestran las entradas de un determinado campo que cumplan una condición. Por ejemplo, mostrar sólo los elementos que tienen un campo con un determinado valor.
El problema que nos presentaba esto, era que no podíamos (por defecto y sin programar) crear un valor dinámico que nos sirviera para filtrar. Pero con un poco tiempo y gracias a los campos [Hoy] ([Today]) y [Yo] ([Me]), podemos crear algún caso dinámico que puede solucionarnos algún que otro problema.
Este era mi problema, durante un proyecto se me pidió que la vista por defecto sólo mostrara los elementos del año actual, sin tener que andar año tras año, modificando la vista.
En mi caso, había un campo llamado Year, en el que el usuario introducía el año de la entrada, ya que mucha de la información subida, era de años anteriores al actual, con lo cual los campos Created y Modified, no me servían.
Con lo que los usuarios sólo tenían que indicar a que año pertenecía el elemento subido. Y luego por medio de dos campos calculados obtenía dos campos de tipo fecha que contenían el 1 de Enero de dicho año (Valid Since) y el 31 de Diciembre del mismo año (Valid Until).
Esto se puede hacer por medio de las fórmulas:
=DATE([Year];1;1)
=DATE([Year];12;31)
Es importante acordarnos, que son columna calculadas de tipo fecha.
Y por último sólo nos quedaría crear la vista filtrada en SharePoint:
Esto nos permitiría ver de manera dinámica los elementos validos para el año actual, sin tener que crear una vista para cada año que comienza.
Otra vista que también nos pidieron fue una vista de los elementos a caducar en los próximos 30 días para ello, utilizamos la columna Valid Until de nuevo y creamos una vista con las siguiente condición:
Esto me evito, tener que hacer vistas donde las condiciones fueran desde el 1/1/2013 al 31/12/2013 y al año siguiente tener que crear otra vista con 2014. Ya que sólo les interesaba ver los elementos del año en curso.
Referencia útil:
http://office.microsoft.com/en-us/windows-sharepoint-services-help/examples-of-common-formulas-HA001160947.aspx
El problema que nos presentaba esto, era que no podíamos (por defecto y sin programar) crear un valor dinámico que nos sirviera para filtrar. Pero con un poco tiempo y gracias a los campos [Hoy] ([Today]) y [Yo] ([Me]), podemos crear algún caso dinámico que puede solucionarnos algún que otro problema.
Este era mi problema, durante un proyecto se me pidió que la vista por defecto sólo mostrara los elementos del año actual, sin tener que andar año tras año, modificando la vista.
En mi caso, había un campo llamado Year, en el que el usuario introducía el año de la entrada, ya que mucha de la información subida, era de años anteriores al actual, con lo cual los campos Created y Modified, no me servían.
Con lo que los usuarios sólo tenían que indicar a que año pertenecía el elemento subido. Y luego por medio de dos campos calculados obtenía dos campos de tipo fecha que contenían el 1 de Enero de dicho año (Valid Since) y el 31 de Diciembre del mismo año (Valid Until).
Esto se puede hacer por medio de las fórmulas:
=DATE([Year];1;1)
=DATE([Year];12;31)
Es importante acordarnos, que son columna calculadas de tipo fecha.
Y por último sólo nos quedaría crear la vista filtrada en SharePoint:
Esto nos permitiría ver de manera dinámica los elementos validos para el año actual, sin tener que crear una vista para cada año que comienza.
Otra vista que también nos pidieron fue una vista de los elementos a caducar en los próximos 30 días para ello, utilizamos la columna Valid Until de nuevo y creamos una vista con las siguiente condición:
Esto me evito, tener que hacer vistas donde las condiciones fueran desde el 1/1/2013 al 31/12/2013 y al año siguiente tener que crear otra vista con 2014. Ya que sólo les interesaba ver los elementos del año en curso.
Referencia útil:
http://office.microsoft.com/en-us/windows-sharepoint-services-help/examples-of-common-formulas-HA001160947.aspx
sábado, 19 de octubre de 2013
¿Dónde esta el botón para vincular una reunión a un espacio de reuniones en Outlook 2010?
En uno de los clientes para los que trabajo, tenían Outlook 2003 y han decidido actualizar a Outlook 2010. La primera duda que me han planteado tras la migración, era como podían vincular una reunión a un espacio de reuniones de SharePoint 2007. No porque no supieran como, sino porque en Outlook 2010 no aparecía la opción.
Pues bien, para habilitar dicha opción es relativamente sencillo, basta con seguir tres pasos. El primero, si nos ponemos en la vista calendario de Outlook, tendremos que acceder al menú contextual superior, para habilitar más comandos:
Esto nos abrirá una nueva ventana en al que debemos buscar el comando de Reunión y agregarlo:
Tras ello, ya tendremos disponible el icono para vincular nuestra convocatoria de reunión a un área de reuniones:
Y así, ya podremos vincular nuestras reuniones con nuestro espacio de reuniones de SharePoint.
Pues bien, para habilitar dicha opción es relativamente sencillo, basta con seguir tres pasos. El primero, si nos ponemos en la vista calendario de Outlook, tendremos que acceder al menú contextual superior, para habilitar más comandos:
Esto nos abrirá una nueva ventana en al que debemos buscar el comando de Reunión y agregarlo:
Y así, ya podremos vincular nuestras reuniones con nuestro espacio de reuniones de SharePoint.
sábado, 21 de septiembre de 2013
Columna calculada de una columna de tipo fecha vacia en SharePoint
En varias entradas anteriores he puesto varios ejemplos de columnas calculadas, basadas en columnas de tipo fecha. Pero lo que no había comentado nunca hasta ahora, es que pasa cuando dicha columna no es obligatoria y el usuario, no la completa.
Pues bien, por una particularidad de SharePoint, trata dicha columna vacía como si fuera el día 30/12/1899 0:00:
Entonces, si estamos tratando de obtener el año, sabemos que sería:
=YEAR([Fecha])
Pero como podemos ver en la anterior captura, no devolvería 1.899. Lo cual es incorrecto.
Para solucionar esto, muy sencillo; Utilizaremos la función IF:
=IF([Fecha]="";"Falta la fecha";YEAR([Fecha]))
Obteniendo algo más real:
sábado, 17 de agosto de 2013
Formateo de teléfonos por medio de Columnas Calculadas
Antiguamente en España, para hacer una llamada telefónica dentro de tu provincia, bastaba con marcar los 6 o 7 dígitos del teléfono deseado. En cambio, si querías llamar a otra provincia, tenías que marcar 9 dígitos, donde los 2 o 3 primeros, correspondían al código de la provincia.
Todo esto cambio y a día de hoy, para llamar dentro de España, tenemos que marcar los 9 dígitos sin importar las provincias.
Pero consecuencia de esto, es que en muchos clientes, no piden que columnas de tipo numérico, quieren que se muestren en listas de SharePoint con un formato determinado, como por ejemplo:
948 11 11 11
en lugar de:
948111111
Para ello, basta con hacer una columna calculada y aplicarle el formato deseado:
En este ejemplo hemos aplicado el formato:
=TEXT(Título;"000 00 00 00")
Pero podría haber sido el que hubiéramos deseado:
=TEXT(Título;"(000)00-00-00")
Todo esto cambio y a día de hoy, para llamar dentro de España, tenemos que marcar los 9 dígitos sin importar las provincias.
Pero consecuencia de esto, es que en muchos clientes, no piden que columnas de tipo numérico, quieren que se muestren en listas de SharePoint con un formato determinado, como por ejemplo:
948 11 11 11
en lugar de:
948111111
Para ello, basta con hacer una columna calculada y aplicarle el formato deseado:
=TEXT(Título;"000 00 00 00")
Pero podría haber sido el que hubiéramos deseado:
=TEXT(Título;"(000)00-00-00")
sábado, 20 de julio de 2013
Mostrar los iconos de los documentos en una Vista de Datos de SharePoint
Muchas veces haremos Vistas de Datos de Bibliotecas de SharePoint, por diferentes razones. Una de las cosas que más rápidamente echarán en falta los usuarios, será el icono que indica la extensión.
Como mostrarlo de una manera automática en nuestra Vista de Datos es muy sencillo. Bastará con poner:
<img alt="Type" src="/_layouts/images/{ddwrt:MapToIcon('', ddwrt:GetFileExtension(string(@FileLeafRef)))}"/>
Lo que esto hará, será llamar a la función ddwrt:GetFileExtension que se queda con la extensión de lo que hay en el campo FileLeafRef, un campo interno de SharePoint donde se almacena el nombre del archivo, seguido por punto y la extensión del archivo.
La segunda función que nos interesa será ddwrt:MapToIcon, que lo que hace básicamente, es buscar en SharePoint que imagen corresponde a esta extensión.
Esto esta recogido en uno archivo de configuración que se encuentra en:
C:/Program Files/Common Files/Microsoft Shared/web server extensions/12/TEMPLATE/XML
Nota: La carpeta 12, puede tener otro número, dependiendo de la versión de SharePoint con la que estemos trabajando.
En dicha ruta nos encontraremos un archivo llamado Docicon.xml, que contendrá la relación entre el tipo de documento y la imagen asociada:
<Mapping Key="doc" Value="icdoc.gif" EditText="Microsoft Office Word" OpenControl="SharePoint.OpenDocuments" />
Así como entre el ID de tipo de documento y la imagen asociada:
<Mapping Key="Word.Document" Value="ichtmdoc.gif" EditText="Microsoft Office Word" OpenControl="SharePoint.OpenDocuments" />
Para los tipos de documentos que no están definidos por defecto, se les aplicará la imagen genérica icgen.gif.
Si por el contrario, queremos modificar los iconos existentes bastaría con subir el nuevo, con el mismo nombre y extensión a:
C:/Program Files/Common Files/Microsoft Shared/web server extensions/12/TEMPLATE/IMAGES
Si lo que nos interesa es asociar un nuevo icono a una extensión no contemplada, bastaría con subir la imagen a esta última ruta y crear una entrada para la extensión en el Docicon.xml.
Espero que esto solucione algunas dudas, como fue mi caso.
La fuente que utilice fue:
http://sympmarc.com/2008/09/10/displaying-the-document-type-icon-in-a-dvwp-in-sharepoint/
Como mostrarlo de una manera automática en nuestra Vista de Datos es muy sencillo. Bastará con poner:
<img alt="Type" src="/_layouts/images/{ddwrt:MapToIcon('', ddwrt:GetFileExtension(string(@FileLeafRef)))}"/>
Lo que esto hará, será llamar a la función ddwrt:GetFileExtension que se queda con la extensión de lo que hay en el campo FileLeafRef, un campo interno de SharePoint donde se almacena el nombre del archivo, seguido por punto y la extensión del archivo.
La segunda función que nos interesa será ddwrt:MapToIcon, que lo que hace básicamente, es buscar en SharePoint que imagen corresponde a esta extensión.
Esto esta recogido en uno archivo de configuración que se encuentra en:
C:/Program Files/Common Files/Microsoft Shared/web server extensions/12/TEMPLATE/XML
Nota: La carpeta 12, puede tener otro número, dependiendo de la versión de SharePoint con la que estemos trabajando.
En dicha ruta nos encontraremos un archivo llamado Docicon.xml, que contendrá la relación entre el tipo de documento y la imagen asociada:
<Mapping Key="doc" Value="icdoc.gif" EditText="Microsoft Office Word" OpenControl="SharePoint.OpenDocuments" />
Así como entre el ID de tipo de documento y la imagen asociada:
<Mapping Key="Word.Document" Value="ichtmdoc.gif" EditText="Microsoft Office Word" OpenControl="SharePoint.OpenDocuments" />
Para los tipos de documentos que no están definidos por defecto, se les aplicará la imagen genérica icgen.gif.
Si por el contrario, queremos modificar los iconos existentes bastaría con subir el nuevo, con el mismo nombre y extensión a:
C:/Program Files/Common Files/Microsoft Shared/web server extensions/12/TEMPLATE/IMAGES
Si lo que nos interesa es asociar un nuevo icono a una extensión no contemplada, bastaría con subir la imagen a esta última ruta y crear una entrada para la extensión en el Docicon.xml.
Espero que esto solucione algunas dudas, como fue mi caso.
La fuente que utilice fue:
http://sympmarc.com/2008/09/10/displaying-the-document-type-icon-in-a-dvwp-in-sharepoint/
sábado, 22 de junio de 2013
Autonumeración con reseteo anual en SharePoint
Por ponernos en situación. Un cliente nos pidió un sistema donde sus usuarios hicieran una solicitud y SharePoint le autoasignará un número único.
Hasta aquí todo bien, pues podemos utilizar la columna ID, propia de cualquier lista o biblioteca de SharePoint. Pero querían que el 1 de enero se reiniciará dicho indice. Además querían que el número asignado, se correspondiera a Número-Año, por ejemplo 289-2013.
Para esto, vamos a utilizar algo que ya he comentado en otra entrada anterior:
http://sharepointyamigos.blogspot.com.es/2013/04/uso-de-listas-auxiliares-en-flujos-de.html
Es decir, vamos a utilizar una lista auxiliar, para llevar el conteo del elemento en el que vamos.
Tendremos nuestra lista de recepción (Solicitudes), con tres campos a rellenar por los solicitantes:
Título, Descripción y Área.
También tendrá un campo de una línea de texto oculto llamado Número de solicitud y otro calculado, llamado Año.
Para ocultar una columna bastará con entrar en la administración de la lista:
Una vez dentro, iremos a la columna Configuración general y seleccionaremos la opción Configuración avanzada:
Lo primero que nos preguntarán en la Configuración avanzada, es si deseamos permitir la administración de tipos de contenido. Responderemos que Sí:
Esto nos habilitará la opción de gestionar las columnas, en la zona Tipos de contenido:
Sí hacemos clic sobre nuestro Tipo de contenido, podremos ver las columnas que lo forman y su Estado:
Al hacer clic en la columna Número de solicitud, podremos cambiar su Estado a Oculta:
La columna Año, en cambio será una columna calculada de tipo Número, a la que le asignaremos el año asociado al año de creación de la solicitud:
Hasta aquí todo bien, pues podemos utilizar la columna ID, propia de cualquier lista o biblioteca de SharePoint. Pero querían que el 1 de enero se reiniciará dicho indice. Además querían que el número asignado, se correspondiera a Número-Año, por ejemplo 289-2013.
Para esto, vamos a utilizar algo que ya he comentado en otra entrada anterior:
http://sharepointyamigos.blogspot.com.es/2013/04/uso-de-listas-auxiliares-en-flujos-de.html
Es decir, vamos a utilizar una lista auxiliar, para llevar el conteo del elemento en el que vamos.
Tendremos nuestra lista de recepción (Solicitudes), con tres campos a rellenar por los solicitantes:
Título, Descripción y Área.
También tendrá un campo de una línea de texto oculto llamado Número de solicitud y otro calculado, llamado Año.
Para ocultar una columna bastará con entrar en la administración de la lista:
Una vez dentro, iremos a la columna Configuración general y seleccionaremos la opción Configuración avanzada:
Lo primero que nos preguntarán en la Configuración avanzada, es si deseamos permitir la administración de tipos de contenido. Responderemos que Sí:
Sí hacemos clic sobre nuestro Tipo de contenido, podremos ver las columnas que lo forman y su Estado:
Al hacer clic en la columna Número de solicitud, podremos cambiar su Estado a Oculta:
La columna Año, en cambio será una columna calculada de tipo Número, a la que le asignaremos el año asociado al año de creación de la solicitud:
Y nuestra lista auxiliar (Contador) constará de dos campos. Año y Último número. En nuestro caso, ambos serán de tipo número.
Deberemos rellenar nuestra lista con elementos de la forma:
Esta lista nos servirá para que el flujo lanzado por la creación de un elemento en la lista Solicitudes, venga a esta lista, busque la entrada que coincida con el año actual, recoja el número de Solicitudes creadas para este año y lo incremente en uno y lo guarde de nuevo en la lista Contador.
Todo ello, lo haremos creando un flujo asociado a la lista Solicitudes:
Lo primero que haremos será seleccionar la Acción de Realizar el cálculo:
Primero definiremos que es lo que queremos sumar, en nuestro caso será el valor del campo Último Número de la entrada cuyo Año coincide con nuestro Año actual (obtenido en la columna calculada de Solicitudes):
SharePoint Designer nos advertirá de que puede darse que haya varios elementos que cumplan dicha condición de búsqueda, pero no tenemos nada que temer, ya que nosotros hemos definido un único elemento por cada año en la lista Contador:
Lo siguiente que haremos será sumarle 1 y guardarlo en una variable del flujo:
Lo último que nos queda es guardar ese número calculado en la variable en nuestra lista auxiliar. Para que así el valor de Último Número recoja nuestra ejecución:
También deberemos guardar el número asignado en la lista Solicitudes en el campo Número de solicitud, pero para ello, lo guardaremos ya con el formato deseado Número-Año, para ello utilizaremos una Cadena dinámica:
Ya sólo nos queda guardar el Número de solicitud en el elemento:
Adicionalmente, nos pidieron que se le notificará al peticionario vía correo electrónico, por eso añadimos un nuevo paso donde incluíamos este valor:
Tras todo este proceso, tendremos almacenado en nuestra lista de Solicitudes, la solicitud, con su Número de solicitud correspondiente y tendremos una lista de control, que nos permitirá saber cuantas peticiones hemos recibido cada año.
Etiquetas:
2007,
2010,
2013,
Columna calculada,
Lista,
MOSS,
Oculto,
Parámetro,
Sharepoint,
Sharepoint 2010,
Sharepoint 2013,
Sharepoint Designer,
Workflow
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="<View><Query><Where><Eq><FieldRef Name="Boardposition"/><Value Type="Text">Chairman of the Board</Value></Eq></Where></Query></View>" 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="<View><Query><Where><Eq><FieldRef Name="Boardposition"/><Value Type="Text">Chairman of the Board</Value></Eq></Where></Query></View>" 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/
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="<View><Query><Where><Eq><FieldRef Name="Boardposition"/><Value Type="Text">Chairman of the Board</Value></Eq></Where></Query></View>" 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="<View><Query><Where><Eq><FieldRef Name="Boardposition"/><Value Type="Text">Chairman of the Board</Value></Eq></Where></Query></View>" 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/
sábado, 20 de abril de 2013
Uso de listas auxiliares en flujos de trabajo
En esta entrada, lo que voy a comentar es una manera de trabajar con listas y flujos de trabajos. No es una característica propia de SharePoint.
Imaginemos que hemos creado una lista para recoger peticiones de un departamento. Ese departamento a su vez, esta dividido en 12 áreas. Y en función del área, el flujo enviará un correo a una dirección diferente.
Lo sencillo es pensar, en hacer el flujo con 12 condiciones y 12 correos, marcando para cada área su destinatario:
Y lo que haremos con el flujo de trabajo, será que para cada elemento que se cree en la lista de incidencias, se lanzará el flujo que irá a buscar en la segunda lista el correo asociado para el área seleccionada.
Para ello, bastará con insertar la acción Enviar correo electrónico y en el Para haremos una Búsqueda de flujo de trabajo.
Cuando nos pida los Detalles de la búsqueda, NO elegiremos el elemento actual, sino que iremos a buscar en la lista Parametros, el campo correo electrónico. Esto hará que nos pida que definamos Buscar el elemento de la lista, esto quiere decir, que definamos que elementos de Parametros, queremos buscar. En este caso el que su área, coincide con el área de la incidencia que ha lanzado el flujo:
Al ir aceptando y cerrando todas las ventanas, de la captura anterior, nos saldrá un mensaje que nos dirá:
Podemos estar tranquilos y darle a Sí, ya que en la lista Parametros sólo habrá un área que cumpla la condición.
Imaginemos que hemos creado una lista para recoger peticiones de un departamento. Ese departamento a su vez, esta dividido en 12 áreas. Y en función del área, el flujo enviará un correo a una dirección diferente.
Lo sencillo es pensar, en hacer el flujo con 12 condiciones y 12 correos, marcando para cada área su destinatario:
Esto es una solución valida, hasta el momento que cambie el nombre del área, cambie el correo de la persona responsable del área y/o se añadan nuevas áreas. En el cual, se deberá tocar el flujo y deberemos tener una persona con conocimientos para ello.
Pues imaginaros un caso con 57 áreas, que cada cuatro años cambian los responsables de cada área y encima renombran las áreas. Pues bien, ese es mi caso.
Solución: Crear una lista auxiliar (la llamaré Parametros), donde recoger todos los valores de área y correo asociado. Con esto conseguimos que un usuario sin conocimientos de SharePoint, pueda administrar los contactos.
Centrando el caso, tenemos una lista de incidencias, donde se dan de alta la incidencia, la descripción y el área:
En otra lista (Parametros) con dos campos (en este caso), el área y el correo electrónico del responsable. Y esta lista tendrá tantos elementos como áreas tengamos.
Y lo que haremos con el flujo de trabajo, será que para cada elemento que se cree en la lista de incidencias, se lanzará el flujo que irá a buscar en la segunda lista el correo asociado para el área seleccionada.
Para ello, bastará con insertar la acción Enviar correo electrónico y en el Para haremos una Búsqueda de flujo de trabajo.
Cuando nos pida los Detalles de la búsqueda, NO elegiremos el elemento actual, sino que iremos a buscar en la lista Parametros, el campo correo electrónico. Esto hará que nos pida que definamos Buscar el elemento de la lista, esto quiere decir, que definamos que elementos de Parametros, queremos buscar. En este caso el que su área, coincide con el área de la incidencia que ha lanzado el flujo:
Podemos estar tranquilos y darle a Sí, ya que en la lista Parametros sólo habrá un área que cumpla la condición.
sábado, 16 de marzo de 2013
Reducir espacio en la barra de acciones de Sharepoint 2010
En los últimos proyectos, se nos está pidiendo que reduzcamos el espacio que hay sobre la ribbon, con la finalidad de optimizar la presentación en tabletas y otros dispositivos móviles:
BODY #s4-ribbonrow{
overflow-y: visible;
margin-top: -6px;
}
En nuestro caso, hemos llegado incluso a prescindir de literales que no consideramos fundamentales, como puede ser HERRAMIENTAS DE BIBLIOTECAS:
Esto en un principio parecía trivial, pero personalmente me costó más tiempo del que hubiera deseado.
Así que tras modificar múltiples estilos y ver como se descuadraban las cosas cuando ajustábamos otras, encontré que la manera más sencilla de hacerlo era incluyendo este estilo en la CSS:
BODY #s4-ribbonrow{
overflow-y: visible;
margin-top: -6px;
}
En nuestro caso, hemos llegado incluso a prescindir de literales que no consideramos fundamentales, como puede ser HERRAMIENTAS DE BIBLIOTECAS:
Por medio de los estilos:
.ms-cui-cg-i{
display:none;
}
.ms-cui-ct-ul{
margin-top:19px;
}
display:none;
}
.ms-cui-ct-ul{
margin-top:19px;
}
jueves, 21 de febrero de 2013
Ocultar el título en DispForm.aspx
En la mayoría de proyectos que trabajo, solemos crearnos Tipos de contenidos, para trabajar correctamente con las listas y bibliotecas.
Es por eso, que muchas veces no utilizamos el campo Title de los mismos. Produciendo que al acceder al DispForm.aspx de un elemento de una lista, tengamos cosas como:
De donde vemos que no nos interesa que salga el literal (sin título). Para ocultarlo editamos la página DispForm.aspx con Sharepoint Designer y buscamos la siguiente línea:
<SharePoint:ListFormPageTitle runat="server"/>
A la cual añadiremos la siguiente propiedad:
<SharePoint:ListFormPageTitle runat="server" Visible="false"/>
Así conseguiremos ocultar el título que aparece en la pestaña del navegador (Nombre de la lista - título de la página), en nuestro caso "Selection process - ":
Pudiendo poner el literal que deseemos, como puede ser el nombre la empresa, quedando el código:
<asp:Content ContentPlaceHolderId="PlaceHolderPageTitle" runat="server">
<SharePoint:ListFormPageTitle runat="server" Visible="false"/>
Nombre de la empresa
</asp:Content>
Y para ocultar el literal (sin título), bastaría con buscar un poco más abajo:
<SharePoint:ListItemProperty id="ID_ItemProperty" maxlength="40" runat="server" />
Y añadir la siguiente propiedad:
<SharePoint:ListItemProperty id="ID_ItemProperty" maxlength="40" runat="server" Visible="false"/>
Con esto, ya tendríamos la pestaña con el nombre de la empresa y sin el literal (sin título) en la página.
Es por eso, que muchas veces no utilizamos el campo Title de los mismos. Produciendo que al acceder al DispForm.aspx de un elemento de una lista, tengamos cosas como:
De donde vemos que no nos interesa que salga el literal (sin título). Para ocultarlo editamos la página DispForm.aspx con Sharepoint Designer y buscamos la siguiente línea:
<SharePoint:ListFormPageTitle runat="server"/>
A la cual añadiremos la siguiente propiedad:
<SharePoint:ListFormPageTitle runat="server" Visible="false"/>
Así conseguiremos ocultar el título que aparece en la pestaña del navegador (Nombre de la lista - título de la página), en nuestro caso "Selection process - ":
Pudiendo poner el literal que deseemos, como puede ser el nombre la empresa, quedando el código:
<asp:Content ContentPlaceHolderId="PlaceHolderPageTitle" runat="server">
<SharePoint:ListFormPageTitle runat="server" Visible="false"/>
Nombre de la empresa
</asp:Content>
Y para ocultar el literal (sin título), bastaría con buscar un poco más abajo:
<SharePoint:ListItemProperty id="ID_ItemProperty" maxlength="40" runat="server" />
Y añadir la siguiente propiedad:
<SharePoint:ListItemProperty id="ID_ItemProperty" maxlength="40" runat="server" Visible="false"/>
Con esto, ya tendríamos la pestaña con el nombre de la empresa y sin el literal (sin título) en la página.
miércoles, 30 de enero de 2013
Abrir elemento de lista en modo Examinar
Muchas veces al hacer personalizaciones de listas de Sharepoint 2010 con Sharepoint Designer, nos puede tocar hacer enlaces a elementos de una lista por medio de consultas de contenido, resultados de búsqueda o vistas de datos.
Por ejemplo, para hacer un enlace dinámico en una vista de datos, solemos poner algo como:
<a href="{concat(@FileDirRef,'/DispForm.aspx?ID=',@ID}">Título</a>
Con lo que enlazamos dinámicamente con la página para ver ese elemento, pero al acceder, vemos que por defecto lo hacemos en modo Vista, es decir, mostrándonos el menú de edición:
<a href="{concat(@FileDirRef,'/DispForm.aspx?ID=',@ID,'&InitialTabId=Ribbon.Read'}">Título</a>
Consiguiendo nuestro objetivo:
Por ejemplo, para hacer un enlace dinámico en una vista de datos, solemos poner algo como:
<a href="{concat(@FileDirRef,'/DispForm.aspx?ID=',@ID}">Título</a>
Con lo que enlazamos dinámicamente con la página para ver ese elemento, pero al acceder, vemos que por defecto lo hacemos en modo Vista, es decir, mostrándonos el menú de edición:
Y más de un cliente, nos ha comentado que preferiría llegar a esa página viendo la vista Examinar. Para poder ver el logo, en lugar de estas opciones.
La manera de conseguir esto es simple, basta con añadir al final de la URL:
&InitialTabId=Ribbon.Read
Con lo que por ejemplo, en nuestra vista de datos de ejemplo, el código final sería:
<a href="{concat(@FileDirRef,'/DispForm.aspx?ID=',@ID,'&InitialTabId=Ribbon.Read'}">Título</a>
Consiguiendo nuestro objetivo:
Suscribirse a:
Entradas (Atom)