Creando usuarios con Power Shell

Se abre el telón, salgo yo en jueves santo con media empresa de vacaciones. En eso que entra un ticket mas o menos urgente que hay que resolver de un cliente con el que más o menos no trabajo habitualmente. Me conecto al entorno de desarrollo, hago el cambio y cuando voy a probarlo… ZAS! En toda la boca. Mi usuario no está creado en la base de datos. Soy administrador del servidor, del SQL, puedo tocar objetos, etc. Pero como mi usuario no esta creado en la base de datos y no tiene roles activos… en definitiva, no puedo ni llegar a listar las empresas que hay en la base de datos.

Entonces viene CMD se mete en una cabina de teléfonos, se quita las gafas de pasta y sale Power Shell! Guapooo! Salaooo! (Creo que me estoy creando un problema de la ostia si algún día decido traducir este blog).

Aquí vienen los pasos que he seguido para crear un usuario en NAV sin entrar en NAV:

  • Ponte el antifaz de malo: Un gorro de lana negro combina a la perfección. Vas a darte acceso a algo a lo que no tienes acceso. Es lo más cerca que has estado o vas a estar nunca de ser un hacker así que disfrútalo.
  • Abre Power Shell en modo Administrador: Que te voy a contar. Te vas al servidor donde tengas instalado el servicio de NAV, Botón derecho en el icono de Power Shell y ejecutar como administrador.
  • Cargar la librería de funciones de NAV: Esto es algo que se les olvida explicar a muchos blogs o manuales de ayuda de Microsoft. El primer comando que tenemos que picar sirve para agregar funciones en la sesión de Power Shell que nos permitan interactuar con NAV:

    Import-Module 'C:Program FilesMicrosoft Dynamics NAV71ServiceNavAdminTool.ps1'

    Actualización: Si este paso ta da problemas, es posible que primero tengas que permitirte usar scripts de PowerShell. He encontrado por ahí que se hace metiendo este comando:

    Set-ExecutionPolicy RemoteSigned

    Hijos míos, no hace falta que os diga que esa ruta es dónde yo he encontrado el fichero y que necesitaréis adaptarla a vuestro servidor.

  • Crea tu usuario en NAV: Con este comando estarás creando un usuario sin permisos en NAV:

    New-NAVServerUser NOMBRE_DE_LA_INSTANCIA_DE_NAV -WindowsAccount DOMINIOUSUARIO_NUEVO

    Felicidades. Ya estás en Matrix.

  • Dáte permisos: Tienes barra libre y te pides un agua del grifo? Nos vamos a dar permisos de SUPER usando este comando:

    New-NAVServerUserPermissionSet

    Verás que Power Shell te empieza a pedir los parámetros básicos como usuario, rol e Instancia.

Ya está. Seguramente ya puedes entrar. Si no, siempre puedes usar esta herramienta. No os olvidéis de sacaros el antifaz y el gorro. A la empresas no les suele gustar tener gente con antifaz junto a la máquina del café.

RTF a Texto Plano

Siguiendo con mis batallas de integraciones de NAV con otros sistemas, me he topado con largas notas de texto, que una vez importadas en NAV, he visto que tenían una serie de metatags asociados. Indagando un poco he visto que se trataba de Rich Text Format. Por el momento NAV no tiene un editor nativo RTF y, aunque había visto que hay add-ons para 2009 he pensado que no era necesario llegar a tanto, dado que los datos solo son necesarios para consultas puntuales. Necesitaba el texto plano.

Es casi imposible que tantos planetas queden alienados, pero si andas buscando la forma de pasar de RTF a texto plano en NAV, la solución pasa por utilizar el dotNet System.Windows.Forms.RichTextBox. A continuación os dejo con el ejemplo en NAV 2013 R2:

GetPlainNoteText() : Text

l_txtComment := '';
CALCFIELDS(NoteText);
IF NOT NoteText.HASVALUE THEN BEGIN
  l_txtComment := '';
END ELSE BEGIN
  NoteText.CREATEINSTREAM(l_instStream);
  REPEAT
    l_instStream.READTEXT(l_txtComment250,250);
    l_txtComment += l_txtComment250;
  UNTIL l_instStream.EOS;

  l_dnetRichTextBox := l_dnetRichTextBox.RichTextBox();
  l_dnetRichTextBox.Rtf(l_txtComment);
  l_txtComment := l_dnetRichTextBox.Text;
END;

EXIT(l_txtComment);

Las variables utilizadas son:

l_txtComment Text  
l_instStream InStream  
l_txtComment250 Text 250
l_dnetRichTextBox DotNet System.Windows.Forms.RichTextBox.’System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089′

Aclararos que NoteText es un campo BLOB que tengo en la propia tabla donde se aloja la función y que contiene fragmentos RTF.

Como veis lo único que hago es asignar por la propiedad RTF y recoger por la propiedad Text. Tan sencillo como eso. El control se encarga de hacer todo lo necesario en background. Además ahora que por fin podemos crear variables text sin longitud máxima, no es necesario preocuparnos por lo largo que pueda ser el texto.

Galerías de imágenes para NAV

Cuando tengáis que añadir nuevos botones a RTC, es útil que tengáis a mano estas chuletas para conocer todas las imágenes predefinidas que trae el cliente de roles. Ambas imágenes se han extraído de msdn de microsoft:

http://msdn.microsoft.com/en-us/library/dd568709.aspx

http://msdn.microsoft.com/en-us/library/dd568728.aspx

Cómo crear y colocar charts en tus pages

Con la llegada de la versión de roles de NAV, tenemos a nuestra disposición la posibilidad de incluir gráficos a las pages que vayamos creando. La principal duda que se nos plantea a la hora de hacer nuestro primer chart es saber cómo se crean.

En Administración > Configuración de la aplicación > Cliente adaptado a roles > Gráficos hay un formulario preparado para crear nuevos charts:

Desde esta pantalla podemos crear nuevos charts, pero vemos que no hay una forma fácil de diseñarlos. Únicamente disponemos de una opción para importar su estructura definida en un fichero XML. Hay varias páginas y artículos que hablan sobre la estructura que tienen que tener estos ficheros, pero creo que lo mejor es utilizar la herramienta Chart Generation Tool, crear un chart sencillo y después ver el XML que se genera.

Esta herramienta está disponible para su descarga en:
http://blogs.msdn.com/b/nav/archive/2011/06/03/chart-generator-tool-for-rtc-cgtrtc.aspx

Su uso es muy sencillo. Una vez importados los objetos, buscaremos el formulario 72004 – Chart Generator Card. En este caso vamos a suponer que queremos mostrar un gráfico en el listado de clientes que muestre el número de clientes activos que hay en cada país:

Lo primero que vamos a hacer es rellenar una nueva ficha con los siguientes datos: 

En la pantalla de filtros indicaremos que únicamente queremos mostrar los clientes que no tienen ningún tipo de bloqueo:

Para terminar sólo nos queda indicar qué cálculo vamos a mostrar en el eje de las Y. NAV nos permite incluir más de una columna para contabilizar más de un tipo de dato. Una vez hecho esto, desde la ficha procederemos a crear el chart, que directamente será añadido a la pantalla de gráficos que hemos comentado al principio del post:

Ahora únicamente nos queda decidir en qué pagina vamos a mostrar el gráfico. Para ello buscamos la page 22 – Customer List, la editamos y anidamos dentro del contenedor principal una part de tipo chart. En sus propiedades indicaremos a que gráfico nos estamos refiriendo:

Al ejecutar nuestra página, el resultado no puede ser más vistoso:

Campos no editables dinámicamente

Cuando trabajamos con formularios, la forma de indicar si un campo es editable o no de forma dinámica se hace a través del cambio de propiedad editable. Más o menos sería algo así:

CurrForm.MiCampo.EDITABLE(TRUE);

En el caso de las pages es diferente, ya que la forma de acceder a las propiedades de un control ha cambiado. Ahora lo que hacemos es indicar que una propiedad va a seguir un valor estático o un valor dinámico (a través de una variable).

Como podemos ver en la imagen, pasa lo mismo con la propiedad visible o enabled.

NOTA: Recordad, que las variables que utilizamos en la página tienen que tener la propiedad IncludeInDataSet con el valor Yes.