viernes, 12 de junio de 2020

Ten cuidado con marcar muchos campos en SharePoint como obligatorios cuando combinas Power Apps y Power Automation

Toda la plataforma Power esta orientada a los datos, esto significa que como definamos los datos así generará los resultados.   

Una fuente de datos entre cientos más es SharePoint para Power Apps y si definimos los campos obligatorios en SharePoint los formularios generados de forma automática cuando seleccionamos la fuente va ser un formulario con las validaciones de campos obligatorios y esto es un beneficio que nos trae ganancias inmediatas pero que luego nos acarrea grandes problemas en Power Automation.

Cuando en Power Automation lee una fuente todos los campos obligatorios deben de ser llenados siempre, entonces si cambiamos de estado a través de un proceso de aprobación por ejemplo en Power Automation, necesitamos llenar todos los campos obligatorios y esto aunque nos lleva mas trabajo trae un riesgo alto de modificar la data de forma incorrecta.   

Ya que si por error mapeamos un campo obligatorio con un dato incorrecto vamos alterar los datos originales cuando realmente lo que queríamos hacer era actualizar un estado.

Mi recomendación es no utilizar los campos obligatorios en las listas de SharePoint y manejar las validaciones a nivel de Power Apps  a nivel de los controles que aunque lleva algo de trabajo al principio una vez configurado nos olvidamos de eso en comparación con el riesgo de alterar los datos originales del usuario por un mal mapeo y que debemos hacer esto en todos los flujos donde modifiquemos la lista de SharePoint que lleva definido los campos obligatorios.

A mi parecer este es un problema de diseño de Power Automation y es una debilidad que potencialmente contiene todas las Apps que utilizan Power Automation.

Un buen diseño toma en cuenta las capacidades y debilidades de las herramientas utilizadas. a veces el camino fácil nos conlleva grandes problemas por lo que nunca debemos de menospreciar el valor que tiene el tiempo para pensar en un buen diseño de la solución que presentamos utilizando las herramientas de alta productividad Office 365.

Power4Fun!,

jmho

jueves, 4 de junio de 2020

Ten cuidado las actualizaciones de SharePoint requieren de dos acciones de parte tuya

Muchas cosas han ido mejorando con el tiempo en la plataforma de colaboración billonaria de Microsoft o sea SharePoint y desde que este producto subio a la nube y a partir de alli las nuevas versiones bajaron para la versión "instalable" o llamada On Premises, se mejoró la forma en que el mismo equipo de producto enfrento el dilema de actualizar su producto de forma recurrente como sucede en la nube que ahora es mensual y no tenemos un mega service pack para corregir los problemas del producto sino entregas mensuales que van corrigiendo y mejorando el producto de forma consistente.

Ahora pienso que hay dos temas importantes que hay que tomar en cuenta en este método de actualización recurrente que ya varios años de estar vigente.

El primero es la versión para actualiza, ya que mensualmente Microsoft muestra dos paquetes de actualizaciones, y dependiendo que tipo de audiencia soporta su granja asi esta antes disponible.  Abajo la imagen de la actualización mas reciente disponible a la fecha de este artículo 


Muestra dos versiones que significa esto.   Bueno si nuestra granja esta en idioma inglés (Estados Unidos) , esta versión es la primera que esta disponible y es para usted.  Pero si su idioma es otro distinto o soporta mas de un idioma deberá esperar a que al versión MUI/language este disponible.

En las mejoras, ahora ya no hay que buscar una versión para Standard o Enterprise o un paquete de idiomas por separado, las actualizaciones incluyen todo para todas las versiones y para todos los idiomas en caso de la versión MUI/language.

El segundo punto importante a tomar en cuenta es el siguiente:

Luego de instalar la actualización en todos los servidores de SharePoint (sin incluir los servidores de bases de datos), deberá ejecutar en cada uno de los servidores de SharePoint el asistente de configuración de SharePoint, pero no la interfaz de usuario sino el siguiente comando:

PSConfig.exe -cmd upgrade -inplace b2b -wait -cmd applicationcontent -install -cmd installfeatures -cmd secureresources

En que servidor empezar:

Bueno dependerá de el número de servidores que tenga  en la granja y la redundancia que tenga.  Si tiene 4 a 6 servidores en la granaja sin contar servidores de bases de datos puede empezar con uno de los servidores de cada rol redundante cuando haya terminado todos los roles de actualizar puede continuar con los "espejos" de cada rol redundate y de esta forma no dejará de dar el servicio a sus usuarios, solo para el caso de los front-end asegurarse de configurar el balanceador para dejar "off-line" el servidor que va actualizar.

Dicho esto le recomiendo esperar por el servidor de Aplicación o donde tenga instalado el Central Administration.

La secuencia recomendada debe de ser la siguiente en caso tenga una granja de 3 o mas servidores en la granja de SharePoint, sin incluir servidores de base de datos.

1) En todos los servidores copiar la actualización descargada en el sitio oficial de SharePoint Updates.

2) Ejecutar el exe en todos los servidodres de SharePoint, esto no detiene ningún servicio, solo pone los bits listos para actualizarlos.

3)Inicie ejecuando el comando psconfig con los parámetros arriba indicados en el Servidor de Aplicación.

4) Vaya al balanceador y saque el servidor de front-end que desea actualizar (offline Server)

5) Inicie ejecutando el comando psconfig con los parámetros arriba indicados en el Servidor de Front-End que esta offline o fuera del balanceador.

6) Vaya al balanceador y meta de nuevo el servidor front-end que esta actualizado (online Server)

7) En el balanceador, luego se verificar que el servidor actualizado ya esta online y ejecutandose de forma esperada, saque el otro servidor front-end (offline server).

8) Inicie ejecutando el comando psconfig con los parámetros arriba indicados en el Servidor de Front-End que esta offline o fuera del balanceador.

9) Si todo ha corrido sin problemas vaya al Central Administration, System Settings y seleccione Servers in this Farm.

Alli debería visualizar que todos estan en orden o compliant, como se muestra abajo:




SharePoint4Fun!,

JMHO



Tip para capturar el log detallado de forma rápida via comandos de powershell para SharePoint

Este tip se lo copie a un ingeniero de Microsoft, que pienso es muy útil y práctico.

El tema aquí es saber donde sacar el log.   Ya que en una granja de SharePoint de mas de un servidor debemos de saber donde ocurre el evento.

Por ejemplo si es una acción del usuario es en el front end pero si tenemos mas de uno tendremos que trabajar un poco mas para direcciónar al usuario por medio del balanceador de cargas como Microsoft Application Request Rounting o ARR al servidor donde vamos a realizar la prueba.

Si ya estamos en el servidor donde sucederá el evento, lo siguiente que tenemos que saber es el directorio donde esta ubicado el Diagnostic Logging que eso a nivel de Central Administration lo podemos ubicar. 

Ya en dicho lugar levantamos como administrador el SharePoint Management Shell y ejecutamos los siguientes comandos:

New-SPLogFile

Set-SPLoglevel -TraceSeverity VerboseEx

New-SPLogFile

Clear-SPLogLevel

Ahora les explico para que sirve cada uno y en que momento ejecutarlo

New-SPLogFile ; Este create un nuevo archivo de Log, este deberia ejecutarse un instante antes de la acción del usuario y seguido ejecutar el comando Set-SPLoglevel -TraceSeverity VerboseEx.  Este llevará el nivel de log a EXTRA detallado es decir registrando todas las acciones posibles del usuario y de lo que esta pasando en el servidor.

Al finalizar las acciones del usuario y se registre el error, deberá ejecutarse el comando New-SPLogFile, lo mas inmediato posible ya que es clave que no generé un archivo muy grande para revisar.  U y por ultimo vamos a devolver el nivel predeterminado de registro de acciones en el log  a través del comando Clear-SPLogLevel.

SharePoint4Fun!

JMHO




Las alertas no llegan cuando se agrega o modifica un elemento en SharePoint 2016

Realmente esto puede suceder hasta donde se, en todas las versiones de SharePoint, porque a mi juicio es un error de diseño en SharePoint.

El tema es que SharePoint tiene un trabajo o Job llamado "Immediate Alerts" que ejecuta de forma predeterminada cada 5 minutos y lo que hace es enviar todas aquellas alertas que cumplan con las condiciones que el usuario definió al momento de subscribirse o subscribir a un usuario dentro de la biblioteca o lista de SharePoint.

El tema es que como fue diseñado este Job de forma errada es que asume que todos los usuarios tiene correos validados e intenta el envío de la alerta indefinidamente, como se muestra en el siguiente log:

Beginning attempt 1 to send mail to recipients
OWSTIMER.EXE SharePoint Foundation E-Mail Medium Attempting to send mail to recipients
Error: SmtpException while sending email: System.Net.Mail.SmtpFailedRecipientException: Mailbox unavailable. The server response was: 5.7.1 Unable to relay    

Beginning attempt 2 to send mail to recipients
OWSTIMER.EXE SharePoint Foundation E-Mail Medium Attempting to send mail to recipients
Error: SmtpException while sending email: System.Net.Mail.SmtpFailedRecipientException: Mailbox unavailable. The server response was: 5.7.1 Unable to relay    

Beginning attempt 3 to send mail to recipients
OWSTIMER.EXE SharePoint Foundation E-Mail Medium Attempting to send mail to recipients
Error: SmtpException while sending email: System.Net.Mail.SmtpFailedRecipientException: Mailbox unavailable. The server response was: 5.7.1 Unable to relay    
 
y así hasta que tenga éxito en enviarlo, pero nunca lo va poder enviar porque no existe Realy definido para la cuenta que intenta enviar, por temas de privacidad no comparto esta información. 

Lo que provoca este problema es que el Job "Immediate Alerts" se queda congelado, ya no avanza mas y el resto de alertas las deja de enviar, solo envia las que estan antes de la cuenta que tiene problema.  Que en el caso que me toco revisar era todas las cuentas de un domino en especial que no tenian un relay especificado para que pudieran irse o dieran salida de SharePoint.

Mientras tecnología se encargada de corregir este tema, lo que hice fue sacar un inventario de las alertas y luego eliminar todas las alertas de dicho dominio.

A continuación les dejo el script del inventario de alertas en powershell:

----GetAllusersAlerts.ps1----
param([string]$url, [string]$scope, [string]$filePath)

"Title;UserName;LoginName;AlertType;List;Frequency;DeliveryChannels;EventType;AlwaysNotify" | Out-File -FilePath $filePath 
function listAlert($SPweb )
{
    $alerts = $SPweb.Alerts
	$alertscount = $alerts.count
	for($i= 0; $i -lt $alertscount;$i++)
	{
	    $alert = $alerts[$i]
		$id = $alert.ID
		write-host -f Green $alert.Title
		"User Name    - " + $alert.User.Name
		"Title        - " + $alert.Title
        "Alert Type   - " + $alert.AlertType 
        "Alert List   - " + $alert.List
		"Frequency    - " + $alert.AlertFrequency
		"Delivery Via - " + $alert.DeliveryChannels
		"Change Type  - " + $alert.EventType
		"Alert User   - " + $alert.User
        "Always Notify- " + $alert.AlwaysNotify    
		Write-Host "=================================="
		$alert.Title+";"+$alert.User.Name+";"+$alert.User+";"+$alert.AlertType+";"+$alert.List+";"+$alert.AlertFrequency+";"+$alert.DeliveryChannels+";"+$alert.EventType+";"+$alert.AlwaysNotify    | Out-File -FilePath $filePath -Append
    }
}

if($url)
{
    if($scope -ne "web")
    {
	    $SPwebApp = Get-SPWebApplication $Url
	    foreach ($SPsite in $SPwebApp.Sites)
	    {
		    foreach($SPweb in $SPsite.AllWebs)
		    {
			   listAlert $SPweb
			   $SPWeb.Dispose()  
		    }
		    $SPsite.Dispose()
        }
	}
    else
    {
        $SPweb = get-spweb $url
        listAlert $SPweb
		$SPWeb.Dispose()  
    }
}
else
{
	write-host "Url es un parametro obligatorio"
}

write-host "End process.."
---end of file----

SharePoint4Fun!,

JMHO

Como extraer de una fecha y hora en solo la fecha en Power Automation

Me sucedio que quise cololocar el valor del campo Created de una lista de SharePoint hacia Excel, pero esta información me la entrega en excel por el formato que la almacena en SharePoint como un text en formato UTC, el cual no puede interpretar Excel de forma correcta, entonces utilice la fórmula formatDateTime de Power Automation para tomar solo la fecha que es la que nececistaba en el archivo Excel que estaba construyendo.

Entonces Defini una viarable llamada FechaCreacion en Power Automation y utilice la siguiente expresión:

formatDateTime(triggerBody()?['Created'],'yyyy-MM-dd')

Y con eso ya en excel me la interpresta como una fecha dentro del archivo.

Power4Fun!

JMHO