Menús personalizados en la versión 8 de nexus

menuspersonalizadosUno de los cambios más notables de cara al desarrollador e implantador de soluciones a medida con Nexus, traído de la mano del cambio visual, es el nuevo formato del fichero de menú personalizable. Ha llegado el momento de que mostremos como manipular el menú de Nexus en la nueva versión.

Hagamos algo de memoria. Anteriormente se trataba de dos ficheros XML, menu.xml y opciones.xml. En el primero se indicaba la estructura visual (jerárquica, en menús y submenus) y en el segundo se completaba cada una de las opciones visuales del primero con la acción que debían realizar al ser seleccionadas por el usuario. Estas opciones podían ser  llamadas a pantallas de Nexus, a funciones de dlls del sistema (win32), a métodos de ActiveX o comandos de la shell (ejecutables, ficheros de comandos…).

Diferencias con la versión 7

Los dos ficheros se han fusionado en uno solo, ajustándose a la nueva estructura visual de nuestros menús.

El ejemplo más claro es el propio fichero que usa Nexus “nexusV8.xml” y que podéis consultar en la carpeta de menús.

Visualización clásica VS nueva

La versión 8 incorpora, para aquellos acostumbrados a la interfaz antigua, una opción que permite recuperar el menú en la configuración usual de las versiones anteriores (versión 7). Desgraciadamente, en este modo (versión 7), los nuevos ficheros de menú no se aplican. Se siguen usando los viejos menu.xml y opciones.xml. ¿Qué quiere decir esto? Si en una instalación se van a usar indistintamente tanto el menú versión 7 como el 8 (ya sea en la misma máquina como en distintas estando centralizado), se tendrá que preparar un menú en la versión 7  y otro con el formato nuevo (.menu).

El fichero .menu

Este fichero debe tener extensión “.menu” y debe estar alojado en la carpeta de menús de la instalación de Nexus. Por ejemplo “Mi.menu”.

Una ventaja de esta unificación es que ahora se permiten varios menús adicionales. Así, podría existir un “Mi.menu” y un “Su.menu”, actuando los dos (aparte del que trae el Nexus de serie).

Estructura del fichero

Se trata, al igual que en el pasado, de un fichero XML con nodo raíz <NAVEGADOR> con dos elementos. Estos indican la ubicación final de las opciones que introducimos:

Barra lateral

Se trata de la barra tipo Outlook de la nueva interfaz de Nexus (situada a la izquierda de la pantalla principal). Equivale al menú principal de la anterior versión.

Elemento Significado Cardinalidad
<MENUS> Elemento raíz 0..1
<GRUPO> Cada uno de los apartados del navegador (barra lateral). Equivale a los elementos de primer nivel del menú principal de la anterior versión.IdOrd: ID del ítem.

Titulo: Descripción del grupo.

0..n
<CATEGORIAS> Lista de elementos <CATEGORIA> 1
<CATEGORIA> Cada uno de los subapartados que hay dentro de un grupo del navegador. Equivale a un submenú en un desplegable del menú principal.IdOrd: ID del ítem.

Título: Descripción de la categoría.

0..n
<OPCIONES> Lista de elementos <OPCION> 1
<OPCION> Cada una de las opciones seleccionables en una categoría. Equivale a un elemento de menú invocable.

IdOrd: ID del ítem.

Titulo: Descripción de la opción. Opcional. Si se especifica Id, se inicializa con la descripción Nexus de dicha Id.

Id: ID de la pantalla Nexus a llamar o Id que le queremos da a una llamada externa.

Externa: Indica si se trata de una llamada externa. (Opcional)

Programa: Cadena que especifica la llamada externa a realizar (ver más adelante). (Opcional. Obligatorio si Externa)

Parametros: Cadena de parámetros del comando de la shell invocado mediante la propiedad “Programa”.  Solo se aplica si en Programa se invoca un comando de la shell.(Opcional)

En la cadena de parámetros, se pueden poner las siguientes marcas que Nexus las sustituirá al llamar a la aplicación que se invoca mediante la shell (Opcional).

:TIPOCONTABLE: Tipo contable por defecto.

:CARPETA: Carpeta en la que se encuentra Nexus.

:EMPRESA: Empresa activa.

:USUARIO: Id del usuario.

Categoría: Uso interno. Las llamadas de terceros entran automáticamente en la categoría de opciones externas.

 

0..n
<SEPARADOR> Crea una separación entre dos opciones (entre dos OPCION)IdOrd: ID del ítem. 0..n

Barras menú superior

Nos referimos al conjunto de barras de menú (flotantes o incrustadas en la barra de menú superior). Es un “segundo” menú principal.

Elemento Significado Cardinalidad
<GRUPONAVBAR> Elemento raíz 0..1
<NAVBAR> Cada una de las barras adicionales que añadiremos en la barra superior de la pantalla principal.

IdOrd: ID del ítem.

Título: Descripción del menú

0..n
<BUSCADOR> Elemento de sistema. Crea un buscador de opciones Nexus (incluye las que demos de alta con el menú). Se puede crear en cualquier <NAVBAR>IdOrd: ID del ítem 0..n
<NVITEM> Cada una de las opciones seleccionables en la barra. Equivale a una opción de menú invocable.IdOrd: ID del ítem

Id: Identificador de la pantalla Nexus a llamar. Opcional.

Titulo: Descripción del menú. Si se rellena Id, por defecto se tomará la descripción de la pantalla. Opcional.

Imagen: Ruta de fichero a usar como imagen del ítem. Si se rellena Id, por defecto se indicará la que se use para ella. Opcional.

0..n
<NVITEMS> Lista de NVITEMS de la barra adicional. Equivale a un menú desplegable.IdOrd: ID del ítem.

Título: Descripción del menú

0..n
<NVITEM> Cada una de las opciones seleccionables en la barra. Equivale a una opción de submenú invocable.IdOrd: ID del ítem

Id: Identificador de la pantalla Nexus a llamar. Opcional.

Titulo: Descripción del menú. Si se rellena Id, por defecto se tomará la descripción de la pantalla. Opcional.

Imagen: Ruta de fichero a usar como imagen del ítem. Si se rellena Id, por defecto se indicará la que se use para ella. Opcional.

0..n
<SEPARADOR> Crea un elemento para separar visualmente opciones dentro del menú actual.IdOrd: ID del ítem.

Titulo: Descripción del menú. Si no se rellena, solo aparecerá una línea horizontal. Opcional.

0..n
<NVITEMS> Dentro de un NVITEMS, es un submenú del anterior. Puede contener todos los elementos que contiene un NVITEMS de primer nivel (osea, NVITEMs, SEPARADORes y más submenús NVITEMS.IdOrd: ID del ítem.

Titulo: Descripción del menú

0..n

Una consideración: “IdOrd”, o ID (identificador) del ítem debe ser numérico. Bueno, en realidad puede ser alfanumérico, siempre que no contenga espacios ni caracteres acentuados, comas, tildes, puntos, etc…

Resumiendo de manera esquemática, la estructura tipo de un fichero de menú es algo parecido a:

<?xml version="1.0" encoding="UTF8"?>
<NAVEGADOR>
 <MENUS>
  <GRUPO>
   <CATEGORIAS>
    <CATEGORIA>
	 <OPCIONES>
	  <OPCION>
	  <SEPARADOR>
	  <OPCION>
	  ...
	</CATEGORIA>
   <CATEGORIA>
   ...
  </CATEGORIAS>
 </GRUPO>
 <GRUPO>
 ...
 </GRUPO>
 </MENUS>
 <GRUPONAVBAR>
  <NAVBAR>
   <NVITEMS>
    <NVITEM>
	<SEPARADOR>
	...
	<NVITEMS>
	 <NVITEMS>
	  <NVITEMS>
	   ...
	</NVITEMS>
	<BUSCADOR>
   </NAVBAR>
  <NAVBAR>
  ...
 </GRUPONAVBAR>
</NAVEGADOR>

Vamos a realizar un pequeño ejemplo para explicar de forma “más gráfica” la nueva estructura:

<?xml version="1.0" encoding="ISO-8859-1"?>
<NAVEGADOR>
  <MENUS>
    <GRUPO Titulo="Mis Ficheros" Imagen="Imágenes/iconos/Ficheros16x16.bmp" IdOrd="90000">
      <CATEGORIAS>
        <CATEGORIA Titulo="Mis favoritos" Imagen="" IdOrd="90100">
          <OPCIONES>
            <OPCION Titulo="Clientes" Id="manClientes" IdOrd="90101"/>
            <SEPARADOR IdOrd="90102"/>
            <OPCION Titulo="Proveedores" Id="manProveed" IdOrd="90103"/>
          </OPCIONES>
        </CATEGORIA>
      </CATEGORIAS>
    </GRUPO>
  </MENUS>
  <GRUPONAVBAR>
    <NAVBAR Titulo ="Mi barra principal" IdOrd="91000">
      <NVITEMS Titulo="Mis elementos" Imagen="" IdOrd="91100">
        <NVITEM Id="GestionEmp" IdOrd="91101"/>
        <NVITEM Id="Compactar" IdOrd="91102"/>
        <SEPARADOR IdOrd="91103"/>
        <NVITEM Id="ManMasivo" IdOrd="91104"/>
        <NVITEM Id="LisMaestros" IdOrd="91105"/>
        <SEPARADOR IdOrd="91103" Titulo="SubElementos"/>
        <NVITEMS Titulo="Mis Sub-elementos" IdOrd="91200">
          <NVITEM Id="ManMasivo" IdOrd="91201"/>
          <NVITEM Id="LisMaestros" IdOrd="91202"/>
        </NVITEMS>
      </NVITEMS>
      <BUSCADOR IdOrd="91999"/>
    </NAVBAR>
  </GRUPONAVBAR>
</NAVEGADOR>

Con este menú montamos un nuevo GRUPO (aparecerá al final de los que trae Nexus), de la barra lateral tipo Outlook (MENUS), con descripción “Mis Ficheros”. En su interior encontraremos una CATEGORIA (lo que vendría a ser un submenú) con dos OPCIONES con un separador entre ellos con un SEPARADOR. Estas llamarán a los mantenimientos de Clientes y Proveedores respectivamente.

En la barra superior (GRUPONAVBAR) añadimos una barra (NAVBAR) que tendrá un submenú “Mis elementos” y un BUSCADOR de opciones. El submenú consta de cuatro opciones (NVITEM separadas en dos por medio de un SEPARDOR) y un submenú (NVITEMS) “Mis Sub-elementos”, distinguido de las anteriores opciones con otro separador, con otras dos llamadas a opciones del estándar.

Nota: Es un documento XML, pero Nexus no lo manipula siguiendo el estándar. Por ejemplo, a la propiedad “encoding” no se le hace caso. Los valores se toman en codificación ANSI. Así, que si ponemos el encoding UTF8, no pasa nada, pero los valores en realidad deberán estar en ANSI.
Para evitar problemas con editores estrictos, en el ejemplo he puesto “ISO-8859-1″. Así no se quejará de la existencia de acentos (en UTF8 se “escriben” de otra manera) ese editor que estoy usando (por estar en ascii).

Además, el orden de los elementos, por defecto, es el con el que aparecen en el fichero XML.

Llamadas externas

Hasta ahora nos hemos limitado a crear llamadas a opciones de Nexus desde nuestras propias opciones. En los antiguos menús podíamos llamar a comandos de la shell (ejecutables, ficheros de comandos, etc…), a funciones de dlls win32 y a métodos de objetos ActiveX.

Para realizar estas llamadas, hay que crear un nodo <OPCION> (por el momento NVITEM no lo implementa aunque desde Nexus se pueden dar de alta, pero lo hará con los siguientes parámetros (aparte de los ya obligatorios):

Id: Id que queremos que tenga. Es como definir una nueva opción del estándar.

Externa=”T” (Valor fijo)

Programa:  Llamada  externa de la forma:

  • DLLs win32: NombreDeLaDll@FuncionALlamar
    • NombreDeLaDll: Nombre de la dll (ej: MiDll.dll) si está en el directorio del nexus o ruta completa si está en otro lugar.
    • FuncionALlamar: El nombre (imprescindible que la dll exporte los nombres de las funciones) de la función a llamar. Es sensible a mayúsculas y minúsculas.
  • ActiveX:  @NombreClaseActiveX@Metodo
    • NombreClaseActiveX: Nombre de la clase cuyo método “OPCION” vamos a llamar. Generalmente vienen precedidas por el nombre de la dll que la contiene (VB6, Delphi) o el namespace (.net).
    • Metodo: En Dlls, es la función que se llama (stdcall, sin parámetros, devuelve void, o lo que es lo mismo, un procedure stdcall en delphi). Con ActiveX es el valor del parámetro cadena que se le pasa a la función “Opción” que se invoca del objeto.
  • Shell: Nombre del comando (si está en el path) o ruta completa del mismo.

Parametros: Son los parámetros de línea de comando que el mandato de la shell que estamos lanzando requiere.

Ejemplo:

<GRUPO Titulo="Ejemplo externas" Imagen="" IdOrd="90300">
  <CATEGORIAS>
    <CATEGORIA Titulo="Llamadas externas" IdOrd="90310">
      <OPCIONES>
        <OPCION Titulo="DLL win32" Id="MiDllWin32" Externa="T" Programa="MiDll.dll@MIFUNCION" IdOrd="90314"/>
        <OPCION Titulo="ActiveX" Id="MiActiveX" Externa="T" Programa="@MiActiveX.MiClase@MiMetodo" IdOrd="90312"/>
        <OPCION Titulo="Shell" Id="MiShell" Externa="T" Programa="notepad.exe" Parametros="MiFichero.txt" IdOrd="90313"/>
      </OPCIONES>
    </CATEGORIA>
  </CATEGORIAS>
</GRUPO>

Recordemos que en el caso de la llamada a ActiveX, el objeto MiActiveX.MiClase debe tener un método “Opción” a la que se le pase una cadena. Así mismo, no olvidemos registrar la clase (regsvr32 en el caso de ActiveX desarrollado en win32 o regasm si proviene de .net).

Como se puede ver, en realidad, poco ha cambiado.

Modificar elementos existentes

Como ya habremos visto,  lo que podemos hacer con esta estructura es añadir nuevos grupos de menú en la barra lateral tipo Outlook y nuevas barras de accesos directos en el menú superior.

También se pueden hacer algunos cambios estéticos a opciones del menú estándar. Se puede cambiar el texto y/o la imagen. Para ello tendremos que añadir un elemento GRUPO en el menú con el mismo “IdOrd” que tengan en el fichero “nexusV8.xml”, en el que indiquemos el Título, si queremos cambiarlo, y/o la imagen.

Un ejemplo:

<?xml version="1.0" encoding="iso-8859-1"?>
<NAVEGADOR>
  <MENUS>
    <GRUPO Titulo="Cambia texto Mis favoritos" IdOrd="1"/>
    <GRUPO Titulo="Cambia texto Ventas\Mis favoritos" IdOrd="74"/>
    <GRUPO Titulo="Cambia texto e imagen Ventas" Imagen="Imágenes/iconos/Ficheros16x16.bmp" IdOrd="73"/>
  </MENUS>
</NAVEGADOR>

Hay que tener claro que Nexus reutiliza (no vamos a entrar en detalles de implementación de los menús de Nexus) las cadenas de las opciones estandar. Esto es, si define una opción (por ejemplo “manClientes”), allá donde aparezca pondrá la misma cadena de texto como descripción, y la misma imagen. Si en algún lugar indicamos que queremos llamar a esa opción pero cambiamos el texto o la imagen, en todos los lugares del menú (ya sea lateral o superior) aparecerá cambiada. Es decir, allá donde se use la misma opción de Nexus (en nuestro ejemplo, “manClientes”, aunque sea un nodo OPCION o NVITEM distinto) se pondrá ahora el nuevo texto y/o imagen.

Ante una colisión de IdOrd, siempre manda el último que se aplica. Si tenemos solo un menú personalizado, primero se aplica el de Nexus y segundo el nuestro.

Y finalmente

Un ejemplo al completo:

<?xml version="1.0" encoding="iso-8859-1"?>
<NAVEGADOR>
  <MENUS>
    <GRUPO Titulo="Cambia texto Mis favoritos" IdOrd="1"/>
    <GRUPO Titulo="Cambia texto Ventas\Mis favoritos" IdOrd="74"/>
    <GRUPO Titulo="Cambia texto e imagen Ventas" Imagen="Imágenes/iconos/Ficheros16x16.bmp" IdOrd="73"/>
    <GRUPO Titulo="Mis maestros" Imagen="Imágenes/iconos/Ficheros16x16.bmp" IdOrd="90100">
      <CATEGORIAS>
        <CATEGORIA Titulo="Mis favoritos" Imagen="" IdOrd="90110">
          <OPCIONES>
            <OPCION Id="manClientes" IdOrd="90111"/>
            <OPCION Id="manProveed" IdOrd="IdNoNumerico"/>
            <SEPARADOR IdOrd="90112"/>
            <OPCION Titulo="Renombrando Artículos" Id="manArticulo" IdOrd="90113"/>
          </OPCIONES>
        </CATEGORIA>
        <CATEGORIA Titulo="Maestros" Imagen="" IdOrd="90120">
          <OPCIONES>
            <OPCION Id="manClientes" IdOrd="90121"/>
            <OPCION Id="manCargos" IdOrd="90122"/>
            <OPCION Id="manProveed" IdOrd="90123"/>
            <SEPARADOR Titulo="No saldra este texto" IdOrd="90124"/>
            <OPCION Id="manArticulo" IdOrd="90125"/>
          </OPCIONES>
        </CATEGORIA>
      </CATEGORIAS>
    </GRUPO>
    <GRUPO Titulo="Mis documentos" Imagen="Imágenes/iconos/Ventas16x16.bmp" IdOrd="90200">
      <CATEGORIAS>
        <CATEGORIA Titulo="Mis favoritos" Imagen="" IdOrd="90210">
          <OPCIONES>
            <OPCION Id="ManPedidoV" IdOrd="90211"/>
            <OPCION Id="ManAlbaranV" IdOrd="90212"/>
            <SEPARADOR IdOrd="90213"/>
            <OPCION Id="ManFacturaV" IdOrd="90214"/>
          </OPCIONES>
        </CATEGORIA>
        <CATEGORIA Titulo="Documentos" Imagen="" IdOrd="90220">
          <OPCIONES>
            <OPCION Titulo="Mis ofertas de venta" Id="ManOfertaV" IdOrd="90221"/>
            <OPCION Titulo="Mis pedidos de venta" Id="ManPedidoV" IdOrd="90222"/>
            <OPCION Titulo="Mis albaranes de venta" Id="ManAlbaranV" IdOrd="90223"/>
            <OPCION Titulo="Mis depósitos de venta" Id="ManDepositoV" IdOrd="90224"/>
            <OPCION Titulo="Mis facturas de venta" Id="ManFacturaV" IdOrd="90225"/>
          </OPCIONES>
        </CATEGORIA>
      </CATEGORIAS>
    </GRUPO>
    <GRUPO Titulo="Ejemplo externas" Imagen="" IdOrd="90300">
      <CATEGORIAS>
        <CATEGORIA Titulo="Llamadas externas" IdOrd="90310">
          <OPCIONES>
            <OPCION Titulo="DLL win32" Id="MiDllWin32" Externa="T" Programa="MiDll.dll@MIFUNCION" IdOrd="90314"/>
            <OPCION Titulo="ActiveX" Id="MiActiveX" Externa="T" Programa="@MiActiveX.MiClase@MiMetodo" IdOrd="90312"/>
            <OPCION Titulo="Shell" Id="MiShell" Externa="T" Programa="calc.exe" IdOrd="90313"/>
          </OPCIONES>
        </CATEGORIA>
      </CATEGORIAS>
    </GRUPO>
  </MENUS>
  <GRUPONAVBAR>
    <NAVBAR Titulo="Mi barra de menú principal" IdOrd="90500">
      <NVITEM Titulo="Elemento directo" Id="manClientes" IdOrd="90501"/>
      <NVITEMS Titulo="Menú sencillo" Imagen="" IdOrd="90600">
        <NVITEM Id="GestionEmp" IdOrd="90601"/>
        <SEPARADOR IdOrd="90602"/>
        <NVITEM Id="Compactar" IdOrd="90603"/>
      </NVITEMS>
      <NVITEMS Titulo="Menús y submenús" IdOrd="90700">
        <NVITEM Id="manClientes" IdOrd="90701"/>
        <NVITEMS Titulo="Documentos" IdOrd="90710">
          <NVITEM Titulo="Pedidos con otro nombre" Id="manPedidoV" IdOrd="90711"/>
          <NVITEM Id="manAlbaranV" IdOrd="90712"/>
          <NVITEMS Titulo="Todos" IdOrd="90720">
            <NVITEMS Titulo="Ventas" IdOrd="90730">
              <NVITEM Titulo="Ofertas con otro nombre" Id="manOfertaV" IdOrd="90731"/>
              <NVITEM Id="manPedidoV" IdOrd="90732"/>
              <NVITEM Id="manAlbaranV" IdOrd="90733"/>
              <NVITEM Id="manDepositoV" IdOrd="90734"/>
              <NVITEM Id="manFacturaV" IdOrd="90735"/>
            </NVITEMS>
            <SEPARADOR Titulo="Un separador con texto" IdOrd="90639"/>
            <NVITEMS Titulo="Compras" IdOrd="90740">
              <NVITEM Id="manOfertaC" IdOrd="90741"/>
              <NVITEM Id="manPedidoC" IdOrd="90742"/>
              <NVITEM Id="manAlbaranC" IdOrd="90743"/>
              <NVITEM Id="manDepositoC" IdOrd="90744"/>
              <NVITEM Id="manFacturaC" IdOrd="90745"/>
            </NVITEMS>
          </NVITEMS>
        </NVITEMS>
      </NVITEMS>
    </NAVBAR>
  </GRUPONAVBAR>
</NAVEGADOR>

La mejor manera de saber qué hace es… probándolo.

Pero cuidado con:

…poner un elemento del menú fuera del lugar que se espera (por ejemplo, un separador dentro de grupo y no en opciones). Puede que el menú no cargue completamente o salga algún críptico error.

…comentar código xml (tags <!– y –>). No actúan como tal y encima pueden hacer que no cargue nuestro menú.

…añadir cualquier otro tag no definido en el fichero de ayuda que encontraréis en el directorio de menús. Mucho cuidado, Nexus no necesariamente avisa de que algo esté mal.

Si algo va mal, siempre podremos borrar el contenido de la tabla de la base de datos de sistema (generalmente nexus$sistema) __CFGMENUS, donde se guarda los menús para cada usuario, recomendable tener Nexus cerrado, ya que se actualiza la tabla al cerrarlo.Los datos de las posiciones y configuraciones particulares de cada elemento se encuentran en las tablas __cfglogbarras (NVITEM) y  __cfglogmenus (OPCIONES).

Nota: un delete sin restringir borrará cualquier personalización que hayan hecho todos los usuarios.

Advertisement

Acerca de El monstruo de Caerbannog

Temible guardián de la gruta que esconde un temible y obscuro secreto...

Publicado el noviembre 6, 2009 en Desarrolladores, Distribuidores, Implantaciones, Novedades, Nuevas versiones, Versión 8 y etiquetado en , , . Guarda el enlace permanente. Dejar un comentario.

Deja un comentario

Fill in your details below or click an icon to log in:

Gravatar
Logo de WordPress.com

Please log in to WordPress.com to post a comment to your blog.

Twitter picture

You are commenting using your Twitter account. Log Out / Cambiar )

Facebook photo

You are commenting using your Facebook account. Log Out / Cambiar )

Connecting to %s

Seguir

Get every new post delivered to your Inbox.

Únete a otros 97 seguidores