Micro publicaciones guía para Power Apps, Power Automate, SharePoint y ademas algunos temas de Azure Dev Ops, Desarrollo Web, SQL Server, Asp.net.
miércoles, 20 de julio de 2016
Error Attempted to perform an unauthorized operation al intentar obtener el nombre de un grupo de SharePoint 2010
jueves, 30 de junio de 2016
[RETURN TO BASICS] Modificando en un solo lugar el codigo a través de la asignación de variables
Esta técnica establece la forma de realizar cambios que mejoran a lo interno el código sin afectar su comportamiento externo, con el objetivo que el código sea mas fácil de cambiar y entender.
Este código está escrito en C# y es una solución de granja de SharePoint.
A continuación un segmento de código que evaluaremos en este caso:
public string ObtenerLeyendaMaterialEstudioDerechosReservados()
{
var valorRetornado = _configuracionRepositorio.ObtenerConfiguracionPorId(_configuracionAplicacion.LeyendaMaterialEstudioDerechosReservados);
if (valorRetornado != null) return valorRetornado.Valor;
_configuracionRepositorio.CrearLlave(_configuracionAplicacion.LeyendaMaterialEstudioDerechosReservados);
valorRetornado = _configuracionAplicacion.LeyendaMaterialEstudioDerechosReservados;
return valorRetornado.Valor;
}
A primera vista podríamos valorar que no requiere ninguna mejora y que lo que hace básicamente es obtener un valor y validar si es nulo crear este valor para luego retornarlo. Pero cuadno el código se repite hay una oportunidad de mejora siempre dentro del código.
Si observamos detenidamente hay una referencia que se repite 3 veces y es la siguiente:
_configuracionAplicacion.LeyendaMaterialEstudioDerechosReservados
Y si por algún motivo necesitamos cambiar esta referencia tendriamos que modificar 3 líneas de código. Pero el número de veces hacerlo no esta tan grande, pero el error si puede suceder si no cambiamos las 3.
Entonces vez de cambiarla 3 veces podemos asignarla a una variable y luego reemplazar esta variable donde hace referencia por lo que si la referencia cambia solo la cambiamos una vez de la siguiente forma:
public string ObtenerLeyendaMaterialEstudioDerechosReservados()
{
var leyenda = _configuracionAplicacion.LeyendaMaterialEstudioDerechosReservados;
var valorRetornado = _configuracionRepositorio.ObtenerConfiguracionPorId(leyenda);
if (valorRetornado != null) return valorRetornado.Valor;
_configuracionRepositorio.CrearLlave(leyenda);
valorRetornado = leyenda;
return valorRetornado.Valor;
}
Code4Fun!,
Juan Manuel Herrera Ocheita
[RETURN TO BASICS] Modificando en un solo lugar el codigo a través de la asignación de variables
Esta técnica establece la forma de realizar cambios que mejoran a lo interno el código sin afectar su comportamiento externo, con el objetivo que el código sea mas fácil de cambiar y entender.
Este código está escrito en C# y es una solución de granja de SharePoint.
A continuación un segmento de código que evaluaremos en este caso:
public string ObtenerLeyendaMaterialEstudioDerechosReservados()
{
var valorRetornado = _configuracionRepositorio.ObtenerConfiguracionPorId(_configuracionAplicacion.LeyendaMaterialEstudioDerechosReservados);
if (valorRetornado != null) return valorRetornado.Valor;
_configuracionRepositorio.CrearLlave(_configuracionAplicacion.LeyendaMaterialEstudioDerechosReservados);
valorRetornado = _configuracionAplicacion.LeyendaMaterialEstudioDerechosReservados;
return valorRetornado.Valor;
}
A primera vista podríamos valorar que no requiere ninguna mejora y que lo que hace básicamente es obtener un valor y validar si es nulo crear este valor para luego retornarlo. Pero cuadno el código se repite hay una oportunidad de mejora siempre dentro del código.
Si observamos detenidamente hay una referencia que se repite 3 veces y es la siguiente:
_configuracionAplicacion.LeyendaMaterialEstudioDerechosReservados
Y si por algún motivo necesitamos cambiar esta referencia tendriamos que modificar 3 líneas de código. Pero el número de veces hacerlo no esta tan grande, pero el error si puede suceder si no cambiamos las 3.
Entonces vez de cambiarla 3 veces podemos asignarla a una variable y luego reemplazar esta variable donde hace referencia por lo que si la referencia cambia solo la cambiamos una vez de la siguiente forma:
public string ObtenerLeyendaMaterialEstudioDerechosReservados()
{
var leyenda = _configuracionAplicacion.LeyendaMaterialEstudioDerechosReservados;
var valorRetornado = _configuracionRepositorio.ObtenerConfiguracionPorId(leyenda);
if (valorRetornado != null) return valorRetornado.Valor;
_configuracionRepositorio.CrearLlave(leyenda);
valorRetornado = leyenda;
return valorRetornado.Valor;
}
Code4Fun!,
Juan Manuel Herrera Ocheita
[RETURN TO BASICS] Modificando en un solo lugar el codigo a través de la asignación de variables
Esta técnica establece la forma de realizar cambios que mejoran a lo interno el código sin afectar su comportamiento externo, con el objetivo que el código sea mas fácil de cambiar y entender.
Este código está escrito en C# y es una solución de granja de SharePoint.
A continuación un segmento de código que evaluaremos en este caso:
public string ObtenerLeyendaMaterialEstudioDerechosReservados()
{
var valorRetornado = _configuracionRepositorio.ObtenerConfiguracionPorId(_configuracionAplicacion.LeyendaMaterialEstudioDerechosReservados);
if (valorRetornado != null) return valorRetornado.Valor;
_configuracionRepositorio.CrearLlave(_configuracionAplicacion.LeyendaMaterialEstudioDerechosReservados);
valorRetornado = _configuracionAplicacion.LeyendaMaterialEstudioDerechosReservados;
return valorRetornado.Valor;
}
A primera vista podríamos valorar que no requiere ninguna mejora y que lo que hace básicamente es obtener un valor y validar si es nulo crear este valor para luego retornarlo. Pero cuadno el código se repite hay una oportunidad de mejora siempre dentro del código.
Si observamos detenidamente hay una referencia que se repite 3 veces y es la siguiente:
_configuracionAplicacion.LeyendaMaterialEstudioDerechosReservados
Y si por algún motivo necesitamos cambiar esta referencia tendriamos que modificar 3 líneas de código. Pero el número de veces hacerlo no esta tan grande, pero el error si puede suceder si no cambiamos las 3.
Entonces vez de cambiarla 3 veces podemos asignarla a una variable y luego reemplazar esta variable donde hace referencia por lo que si la referencia cambia solo la cambiamos una vez de la siguiente forma:
public string ObtenerLeyendaMaterialEstudioDerechosReservados()
{
var leyenda = _configuracionAplicacion.LeyendaMaterialEstudioDerechosReservados;
var valorRetornado = _configuracionRepositorio.ObtenerConfiguracionPorId(leyenda);
if (valorRetornado != null) return valorRetornado.Valor;
_configuracionRepositorio.CrearLlave(leyenda);
valorRetornado = leyenda;
return valorRetornado.Valor;
}
Code4Fun!,
Juan Manuel Herrera Ocheita
[RETURN TO BASICS]Sabias que Error List en VS te sirve para validar el codigo sin necesidad de compliar
lunes, 23 de mayo de 2016
Como resolver el Error /_vti_bin/client.svc/ProcessQuery UnauthorizedAccessException: Access is denied.
Una app de SharePoint o Add-in de SharePoint como Microsoft denomina ahora las apps en SharePoint dejo repentinamente de desplegar a todos los usuarios el contenido del app.
Esto no solo aplica a las apps sino a cualquier lista dentro de la Aplicación web de SharePoint, como veremos más adelante. Así que si repentinamente dejo de ver un contenido pueda que este sea su caso.
El usuario me notificó que al agregar el usuario de red como administrador local del servidor, ya le mostraba el contenido del app. Aún más confuso y extraño este comportamiento que al parecer eran permisos que no tenían los usuarios en el servidor, pero como descubrir si alguien hizo alguna modificación en el servidor ya que es un ambiente de un cliente administrador por el personal del cliente.
Después de revisar la configuración y servicios de Aplicaciones de la granja de SharePoint y constatar que todo estaba bien configurado y funcionando, procedí a indagar en los logs de SharePoint. Para ello es necesario habilitar los siguientes eventos:
sábado, 30 de abril de 2016
Asignando valor predeterminado a una propiedad de un elemento Web de forma declarativa SharePoint 2013
Para agregar un valor predeterminado a una propiedad de un elemento web debemos de ir al código de servidor o Code Behind del control de usuario, como se muestra en la imagen de abajo.
Debemos definir una propiedad pública de la clase del control de usuario. Y agregar los atributos: WebBrowsable,WebDisplayName, WebDescription,Category y Personalizable, como se muestra en el código de abajo.
Luego vamos a definir un módulo dentro del proyecto, esto nos permitirá adicionar páginas y elementos web a las páginas cuando se instale la solución y agregar el valor predeterminado a la propiedad.
Luego creamos una Application Page como plantilla para entonces crear una instancia de la página donde definamos el elemento web.
En la página se define las zonas de los elementos web para poner distribución de los elementos Web dentro de la página.
Ahora vamos a modificar el archivo elements.xml donde se define la instancia de la página y los elementos web dentro de ella.
Y través del nodo properties, definimos los nombres de cada propiedad con su respectivo valor.
Y eso es todo!
SharePoint4Fun!,
Juan Manuel Herrera Ocheita
sábado, 26 de diciembre de 2015
Analizando como podemos consumir SharePoint OData con javascript
Cree una lista personalizada de SharePoint llamada Banners y adicione un par de columnas Url y Link.
Y el contenido es el siguiente: un solo elemento con una image y un enlace.
Si consumimos el servicio enviando la siguiente instrucción con jquery:
Lo que me devuelve al consumir json es lo siguiente:
{"odata.metadata":"https://infowareplus.sharepoint.com/sites/prueba/_api/$metadata#SP.ListData.BannersListItems"
,"value":[{"odata.type":"SP.Data.BannersListItem"
,"odata.id":"0589cb7b-2bb2-4ced-a7ea-704cd8e0dcea"
,"odata.etag":"\"4\""
,"odata.editLink":"Web/Lists(guid'2b6b9d83-4eeb-4716-86e4-5f6ee03a577e')/Items(1)"
,"FileSystemObjectType":0
,"Id":1
,"ContentTypeId":"0x01002C49C3B57506B541ABE2A829193FF712"
,"Title":"Noticias"
,"Imagen":{"Description":"Evento"
,"Url":"https://infowareplus.sharepoint.com/sites/prueba/SiteAssets/EventoMicrosoftAzureComunidadTecnica2.jpg"}
,"Link":{"Description":"Dirección de Prueba"
,"Url":"http://www.google.com"}
,"ID":1
,"Modified":"2015-12-14T19:54:56Z"
,"Created":"2015-12-10T20:47:48Z"
,"AuthorId":9
,"EditorId":9
,"OData__UIVersionString":"1.0"
,"Attachments":false
,"GUID":"f6a6e965-8f1a-436e-86c8-682e4f6368d5"}]}
Ahora observemos la siguiente prueba a tavés de javascript:
Create Object from JSON String
{"odata.metadata":"https://infowareplus.sharepoint.com/sites/PRUEBA/_api/$metadata#SP.ListData.BannersListItems","value":[{"odata.type":"SP.Data.BannersListItem","odata.id":"0589cb7b-2bb2-4ced-a7ea-704cd8e0dcea","odata.etag":"'4'","odata.editLink":"Web/Lists(guid\'2b6b9d83-4eeb-4716-86e4-5f6ee03a577e\')/Items(1)","FileSystemObjectType":0,"Id":1,"ContentTypeId":"0x01002C49C3B57506B541ABE2A829193FF712","Title":"Noticias","Imagen":{"Description":"Evento","Url":"https://infowareplus.sharepoint.com/sites/prueba/SiteAssets/EventoMicrosoftAzureComunidadTecnica2.jpg"},"Link":{"Description":"Dirección de Prueba","Url":"http://www.google.com"},"ID":1,"Modified":"2015-12-14T19:54:56Z","Created":"2015-12-10T20:47:48Z","AuthorId":9,"EditorId":9,"OData__UIVersionString":"1.0","Attachments":false,"GUID":"f6a6e965-8f1a-436e-86c8-682e4f6368d5"}]}Si accedemos a la propiedad odata.detadata:
var obj = JSON.parse(text);
document.getElementById("demo2").innerHTML = obj["odata.metadata"];
Me retorna lo siguiente:
https://infowareplus.sharepoint.com/sites/prueba/_api/$metadata#SP.ListData.BannersListItemsSi accedemos la propiedad value obtendremos otro objeto de json que podemos acceder sus propiedades, de la siguiente forma:
var obj2 = obj["value"];
document.getElementById("demo3").innerHTML = obj2[0]["odata.type"];
Lo que nos retorna es lo siguiente:
SP.Data.BannersListItemAsi podemos obtener otros atributos:
document.getElementById("demo4").innerHTML = obj2[0]["odata.id"];
document.getElementById("demo5").innerHTML = obj2[0]["odata.etag"];
document.getElementById("demo6").innerHTML = obj2[0]["odata.editLink"];
Lo que nos retorna es lo siguiente:
0589cb7b-2bb2-4ced-a7ea-704cd8e0dceaY por ultimo vamos acceder la propiedad Imagen y Link de la siguiente forma:
'4'
Web/Lists(guid'2b6b9d83-4eeb-4716-86e4-5f6ee03a577e')/Items(1)
var obj3 = obj2[0]["Imagen"];Y los resultados serán las URL siguientes:
document.getElementById("demo7").innerHTML = obj3["Url"];
var obj4 = obj2[0]["Link"];
document.getElementById("demo8").innerHTML = obj4["Url"];
https://infowareplus.sharepoint.com/sites/PRUEBA/SiteAssets/EventoMicrosoftAzureComunidadTecnica2.jpgBueno como vemos podemos acceder con javascript la información que me devuelve el servicio OData de SharePoint, y como esta construído la estructura de datos de una lista Personalizada de SharePoint. Para que observemos mejor la estructura lo mostraré de la siguiente forma:
http://www.google.com
'{
"odata.metadata":"https://infowareplus.sharepoint.com/sites/prueba/_api/$metadata#SP.ListData.BannersListItems"
,"value":[
{"odata.type":"SP.Data.BannersListItem"
,"odata.id":"0589cb7b-2bb2-4ced-a7ea-704cd8e0dcea"
,"odata.etag":"\'4\'"
,"odata.editLink":"Web/Lists(guid\'2b6b9d83-4eeb-4716-86e4-5f6ee03a577e\')/Items(1)"
,"FileSystemObjectType":0
,"Id":1
,"ContentTypeId":"0x01002C49C3B57506B541ABE2A829193FF712"
,"Title":"Noticias"
,"Imagen":{"Description":"Evento","Url":"https://infowareplus.sharepoint.com/sites/prueba/SiteAssets/EventoMicrosoftAzureComunidadTecnica2.jpg"}
,"Link":{"Description":"Dirección de Prueba" ,"Url":"http://www.google.com"}
,"ID":1
,"Modified":"2015-12-14T19:54:56Z"
,"Created":"2015-12-10T20:47:48Z"
,"AuthorId":9
,"EditorId":9
,"OData__UIVersionString":"1.0"
,"Attachments":false
,"GUID":"f6a6e965-8f1a-436e-86c8-682e4f6368d5"}
]
}'
Espero que con eso los haya ayudado a comprender la estructura de las listas en SharePoint en formato JSON.
Hasta la próxma,
Juan Manuel Herrera Ocheita
P.D. utilice para las pruebas el siguiente enlace: http://www.w3schools.com/json/tryit.asp?filename=tryjson_parse .
martes, 13 de octubre de 2015
Dando formato a una carta en un elemento Web de SharePoint
Hay veces que necesitamos construir el formato de una carta para ser desplegada en un elemento Web. Para darle formato necesitamos escribir código HTML de forma dinámica y luego desplegarla al momento que elemento Web es cargado en la página de SharePoint.
Lo primero es definir un control asp.net Literal ya que este escribe exactamente lo que le enviemos sin realizar ninguna conversión, esto nos permitirá enviar código HTML dentro del texto. Asi como se demuestra a continuación:
<asp:Literal runat="server" ID="uiCarta"></asp:Literal>
En el código adyacente o Code Behind podemos encontrar la siguiente declaración.
public string Carta
{
set
{
uiCarta.Text = value;
}
}
Definimos una propiedad tipo String y definimos el valor a ingresar es para la propiedad Text del control Literal.
Para facilitar su comprensión asumiremos de la definición al obtendremos de codigo definido a continuacion.
var carta = @”
Señores
<b>[NombreUsuario]</b>
<br>
[Departamento]
<br><div style=”text-align:justify”>
Por este medio deseo indicarle…. blalablalallal
</div><br>
<table style=”width=100%;”>
<tr>
<td style=”width=50%;”>
Vo.Bo.
</td>
<td style=”width=50%;”>
Revisado
</td>
</tr>
</table>
”;
carta= carta.replace(“[Usuairo]”,SPContext.Current.Web.CurrentUser.Name).Replace(“[Departamento]”,userDepartmentVariable);
_vista.Carta = carta;
El Resultado es el siguiente:
Eso es todo. Una solución sencilla para un requerimiento común.
Code4Fun!,
Juan Manuel Herrera Ocheita
miércoles, 16 de septiembre de 2015
Clases Fuertemente Tipados en una ListView para un WebPart en SharePoint
El control ListView nos permite desplegar colecciones de Clases definidas en codigo (Ej.:List<MiEntidad> ).
Normalmente utlizamos el metodo Eval(“Atributo de la Clase”) para desplegar la información que enlazamos en el control con el evento miListView.DataBind().
Una mejor forma es utilizando el Atributo ItemType del control ListView. De la siguiente forma:
<asp:ListView ID="uiListado" runat="server" ItemPlaceholderID="DetalleListado"
OnPagePropertiesChanged="uiListado_PagePropertiesChanged"
ItemType="Infoware.Comun.Dominio.Entidad.MiClase">
En el detalle lo definimos de la siguiente forma:
<ItemTemplate>
<tr class="">
<td id="Td2" runat="server"><%#: Item.Perfil %></td>
<td id="Td3" runat="server"><%#: Item.Plazas %></td>
<td id="Td4" runat="server"><%#: Item.Seccion %></td>
<td id="Td10" runat="server"><%#: Item.Departamento %></td>
<td id="Td7" runat="server"><%#: Item.PlazasTotal %></td>
<td id="Td9" runat="server"> Del: <%#: Item.InscripcionesFechaInicial.HasValue? Item.InscripcionesFechaInicial.Value.ToString("dd/MM/yyyy"):"" %>
Al: <%#: Item.InscripscionesFechaFin.HasValue?Item.InscripscionesFechaFin.Value.ToString("dd/MM/yyyy"):"" %></td>
<td id="Td8" runat="server"><%#: Item.InscripscionesFechaFin.HasValue? Item.InscripscionesFechaFin.Value.ToString("dd/MM/yyyy"):"" %></td>
<td id="Td1" runat="server"><%#: Item.ExamenLugar %></td>
<td id="Td5" runat="server"><%#: Item.TipoConvocatoria %></td>
<td class="clasebotones">
<asp:LinkButton ID="uiVer" runat="server" ToolTip="Ver"
OnClick="evento_ver" CommandArgument='<%#: Item.Id %>' ValidationGroup='<%#: Item.CircularNo %>'
OnClientClick="javascript:setFormSubmitToFalse()">Circular PDF</asp:LinkButton>
<asp:LinkButton ID="LinkButton3" runat="server" ToolTip="Ver"
OnClick="evento_Recrear" CommandArgument='<%#: Item.Id %>' ValidationGroup='<%#: Item.CircularNo %>'
OnClientClick="javascript:setFormSubmitToFalse()">Recrear Circular PDF</asp:LinkButton>
</td>
</tr>
</ItemTemplate>
Como podemos observar utilizamos la clase Item.NombreAtributoClaseDefiniaEnItemType.
Uselo es práctico y evita errores de escritura.
SharePoint4Fun!,
Juan Manuel Herrera Ocheita